diff --git a/cloudflarespeedtest b/cloudflarespeedtest deleted file mode 160000 index 8131f3e6..00000000 --- a/cloudflarespeedtest +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 8131f3e629af25d5443906adf51a723f7be0b5f7 diff --git a/helloworld b/helloworld deleted file mode 160000 index bc3223c7..00000000 --- a/helloworld +++ /dev/null @@ -1 +0,0 @@ -Subproject commit bc3223c7fa18cc895aa8c9154229ca23823445a1 diff --git a/lua-neturl/Makefile b/lua-neturl/Makefile new file mode 100644 index 00000000..0f6b16f3 --- /dev/null +++ b/lua-neturl/Makefile @@ -0,0 +1,44 @@ +# SPDX-License-Identifier: GPL-3.0-only +# +# Copyright (C) 2022-2023 ImmortalWrt.org + +include $(TOPDIR)/rules.mk + +PKG_NAME:=neturl +PKG_VERSION:=1.1-1 +PKG_RELEASE:=3 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://codeload.github.com/golgote/neturl/tar.gz/v$(PKG_VERSION)? +PKG_HASH:=25f3a94ba9f435ef1395555de2bf17d6f934d789fa515ed965405919e42be27b + +PKG_MAINTAINER:=Tianling Shen +PKG_LICENSE:=MIT +PKG_LICNESE_FILES:=LICENSE.txt + +include $(INCLUDE_DIR)/package.mk + +define Package/lua-neturl + SUBMENU:=Lua + SECTION:=lang + CATEGORY:=Languages + TITLE:=URL and Query string parser, builder, normalizer for Lua + URL:=https://github.com/golgote/neturl + DEPENDS:=+lua + PKGARCH:=all +endef + +define Package/lua-neturl/description + This small Lua library provides a few functions to parse URL with + querystring and build new URL easily. +endef + +define Build/Compile +endef + +define Package/lua-neturl/install + $(INSTALL_DIR) $(1)/usr/lib/lua + $(CP) $(PKG_BUILD_DIR)/lib/net/url.lua $(1)/usr/lib/lua/ +endef + +$(eval $(call BuildPackage,lua-neturl)) diff --git a/lua-neturl/patches/010-userinfo-regex.patch b/lua-neturl/patches/010-userinfo-regex.patch new file mode 100644 index 00000000..9dbd91cc --- /dev/null +++ b/lua-neturl/patches/010-userinfo-regex.patch @@ -0,0 +1,20 @@ +--- a/lib/net/url.lua ++++ b/lib/net/url.lua +@@ -340,7 +340,7 @@ function M:setAuthority(authority) + self.password = v + return '' + end) +- if string.find(userinfo, "^[%w%+%.]+$") then ++ if string.find(userinfo, "^[%p%w%+%.]+$") then + self.user = userinfo + else + -- incorrect userinfo +@@ -369,7 +369,7 @@ function M.parse(url) + comp.fragment = v + return '' + end) +- url =url:gsub('^([%w][%w%+%-%.]*)%:', function(v) ++ url =url:gsub('^([%w][%w%+%-%_%.]*)%:', function(v) + comp.scheme = v:lower() + return '' + end) diff --git a/luci-app-advanced b/luci-app-advanced deleted file mode 160000 index 04376920..00000000 --- a/luci-app-advanced +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 043769207e344e113d7676ba761f549eda2cb633 diff --git a/luci-app-advanced/Makefile b/luci-app-advanced/Makefile new file mode 100644 index 00000000..b1083638 --- /dev/null +++ b/luci-app-advanced/Makefile @@ -0,0 +1,43 @@ +# Copyright (C) 2019 sirpdboy +# +# +# +# This is free software, licensed under the Apache License, Version 2.0 . +# + +include $(TOPDIR)/rules.mk +include $(INCLUDE_DIR)/package.mk + +PKG_NAME:=luci-app-advanced +PKG_VERSION:=1.20 +PKG_RELEASE:=20220218 +define Package/$(PKG_NAME) + SECTION:=luci + CATEGORY:=LuCI + SUBMENU:=3. Applications + DEPENDS:= + TITLE:=LuCI Support for advanced and filebrowser + PKGARCH:=all +endef + +define Build/Compile +endef + +define Package/$(PKG_NAME)/install + $(INSTALL_DIR) $(1)/usr/lib/lua/luci + $(CP) ./luasrc/* $(1)/usr/lib/lua/luci + + $(INSTALL_DIR) $(1)/etc/config + $(INSTALL_CONF) ./root/etc/config/advanced $(1)/etc/config/ + + $(INSTALL_DIR) $(1)/www + cp -pR ./htdocs/* $(1)/www/ + + $(INSTALL_DIR) $(1)/etc/uci-defaults + $(INSTALL_BIN) ./root/etc/uci-defaults/* $(1)/etc/uci-defaults/ + + $(INSTALL_DIR) $(1)/bin + $(INSTALL_BIN) ./root/bin/* $(1)/bin/ +endef + +$(eval $(call BuildPackage,$(PKG_NAME))) diff --git a/luci-app-advanced/README.md b/luci-app-advanced/README.md new file mode 100644 index 00000000..7f0931a0 --- /dev/null +++ b/luci-app-advanced/README.md @@ -0,0 +1,53 @@ +## 访问数:[![](https://visitor-badge.glitch.me/badge?page_id=sirpdboy-visitor-badge)] [![](https://img.shields.io/badge/TG群-点击加入-FFFFFF.svg)](https://t.me/joinchat/AAAAAEpRF88NfOK5vBXGBQ) + +![screenshots](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/说明1.jpg) + +# luci-app-advanced +luci-app-advanced 高级设置,包括smartdns,openclash,防火墙,DHCP等。 + +![screenshots](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/说明2.jpg) + + + +## 使用与授权相关说明 + +- 本人开源的所有源码,任何引用需注明本处出处,如需修改二次发布必告之本人,未经许可不得做于任何商用用途。 + + +# My other project + +- 网络速度测试 :https://github.com/sirpdboy/NetSpeedTest + +- 定时设置插件 : https://github.com/sirpdboy/luci-app-autotimeset + +- 关机功能插件 : https://github.com/sirpdboy/luci-app-poweroffdevice + +- opentopd主题 : https://github.com/sirpdboy/luci-theme-opentopd + +- kucat 主题: https://github.com/sirpdboy/luci-theme-kucat + +- 家长控制: https://github.com/sirpdboy/luci-theme-parentcontrol + +- 系统高级设置 : https://github.com/sirpdboy/luci-app-advanced + +- ddns-go动态域名: https://github.com/sirpdboy/luci-app-ddns-go + +- 进阶设置(系统高级设置+主题设置kucat/agron/opentopd): https://github.com/sirpdboy/luci-app-advancedplus + +- 设置向导: https://github.com/sirpdboy/luci-app-wizard + +- 分区扩容: https://github.com/sirpdboy/luci-app-partexp + +- lukcy大吉: https://github.com/sirpdboy/luci-app-lukcy + +## 捐助 + +![screenshots](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/说明3.jpg) + +| 图飞了😂 | 图飞了😂 | +| :-----------------: | :-------------: | +|![xm1](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/支付宝.png) | ![xm1](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/微信.png) | + + + 图飞了😂 + diff --git a/luci-app-advanced/htdocs/luci-static/resources/fileassistant/fb.css b/luci-app-advanced/htdocs/luci-static/resources/fileassistant/fb.css new file mode 100644 index 00000000..75a30f40 --- /dev/null +++ b/luci-app-advanced/htdocs/luci-static/resources/fileassistant/fb.css @@ -0,0 +1,68 @@ +.fb-container { + margin-top: 1rem; +} +.fb-container .cbi-button { + height: 2.6rem; +} +.fb-container .cbi-input-text { + margin-bottom: 1rem; + width: 100%; +} +.fb-container .panel-title { + padding-bottom: 0; + width: 50%; + border-bottom: none; +} +.fb-container .panel-container { + display: flex; + align-items: center; + justify-content: space-between; + padding-bottom: 1rem; + border-bottom: 1px solid #aaa; +} +.fb-container .upload-container { + display: none; + margin: 1rem 0; +} +.fb-container .upload-file { + margin-right: 2rem; +} +.fb-container .cbi-value-field { + text-align: left; +} +.fb-container .parent-icon strong { + margin-left: 1rem; +} +.fb-container td[class$="-icon"] { + cursor: pointer; +} +.fb-container .file-icon, .fb-container .folder-icon, .fb-container .link-icon { + position: relative; +} +.fb-container .file-icon:before, .fb-container .folder-icon:before, .fb-container .link-icon:before { + display: inline-block; + width: 1.5rem; + height: 1.5rem; + content: ''; + background-size: contain; + margin: 0 0.5rem 0 1rem; + vertical-align: middle; +} +.fb-container .file-icon:before { + background-image: url(file-icon.png); +} +.fb-container .folder-icon:before { + background-image: url(folder-icon.png); +} +.fb-container .link-icon:before { + background-image: url(link-icon.png); +} +@media screen and (max-width: 480px) { + .fb-container .upload-file { + width: 14.6rem; + } + .fb-container .cbi-value-owner, + .fb-container .cbi-value-perm { + display: none; + } +} diff --git a/luci-app-advanced/htdocs/luci-static/resources/fileassistant/fb.js b/luci-app-advanced/htdocs/luci-static/resources/fileassistant/fb.js new file mode 100644 index 00000000..eb97f09f --- /dev/null +++ b/luci-app-advanced/htdocs/luci-static/resources/fileassistant/fb.js @@ -0,0 +1,288 @@ +String.prototype.replaceAll = function(search, replacement) { + var target = this; + return target.replace(new RegExp(search, 'g'), replacement); +}; +(function () { + var iwxhr = new XHR(); + var listElem = document.getElementById("list-content"); + listElem.onclick = handleClick; + var currentPath; + var pathElem = document.getElementById("current-path"); + pathElem.onblur = function () { + update_list(this.value.trim()); + }; + pathElem.onkeyup = function (evt) { + if (evt.keyCode == 13) { + this.blur(); + } + }; + function removePath(filename, isdir) { + var c = confirm('你确定要删除 ' + filename + ' 吗?'); + if (c) { + iwxhr.get('/cgi-bin/luci/admin/system/fileassistant/delete', + { + path: concatPath(currentPath, filename), + isdir: isdir + }, + function (x, res) { + if (res.ec === 0) { + refresh_list(res.data, currentPath); + } + }); + } + } + + function installPath(filename, isdir) { + if (isdir === "1") { + alert('这是一个目录,请选择 ipk 文件进行安装!'); + return; + } + var isipk = isIPK(filename); + if (isipk === 0) { + alert('只允许安装 ipk 格式的文件!'); + return; + } + var c = confirm('你确定要安装 ' + filename + ' 吗?'); + if (c) { + iwxhr.get('/cgi-bin/luci/admin/system/fileassistant/install', + { + filepath: concatPath(currentPath, filename), + isdir: isdir + }, + function (x, res) { + if (res.ec === 0) { + location.reload(); + alert('安装成功!'); + } else { + alert('安装失败,请检查文件格式!'); + } + }); + } + } + + function isIPK(filename) { + var index= filename.lastIndexOf("."); + var ext = filename.substr(index+1); + if (ext === 'ipk') { + return 1; + } else { + return 0; + } + } + + function renamePath(filename) { + var newname = prompt('请输入新的文件名:', filename); + if (newname) { + newname = newname.trim(); + if (newname != filename) { + var newpath = concatPath(currentPath, newname); + iwxhr.get('/cgi-bin/luci/admin/system/fileassistant/rename', + { + filepath: concatPath(currentPath, filename), + newpath: newpath + }, + function (x, res) { + if (res.ec === 0) { + refresh_list(res.data, currentPath); + } + } + ); + } + } + } + + function openpath(filename, dirname) { + dirname = dirname || currentPath; + window.open('/cgi-bin/luci/admin/system/fileassistant/open?path=' + + encodeURIComponent(dirname) + '&filename=' + + encodeURIComponent(filename)); + } + + function getFileElem(elem) { + if (elem.className.indexOf('-icon') > -1) { + return elem; + } + else if (elem.parentNode.className.indexOf('-icon') > -1) { + return elem.parentNode; + } + } + + function concatPath(path, filename) { + if (path === '/') { + return path + filename; + } + else { + return path.replace(/\/$/, '') + '/' + filename; + } + } + + function handleClick(evt) { + var targetElem = evt.target; + var infoElem; + if (targetElem.className.indexOf('cbi-button-remove') > -1) { + infoElem = targetElem.parentNode.parentNode; + removePath(infoElem.dataset['filename'] , infoElem.dataset['isdir']) + } + else if (targetElem.className.indexOf('cbi-button-install') > -1) { + infoElem = targetElem.parentNode.parentNode; + installPath(infoElem.dataset['filename'] , infoElem.dataset['isdir']) + } + else if (targetElem.className.indexOf('cbi-button-edit') > -1) { + renamePath(targetElem.parentNode.parentNode.dataset['filename']); + } + else if (targetElem = getFileElem(targetElem)) { + if (targetElem.className.indexOf('parent-icon') > -1) { + update_list(currentPath.replace(/\/[^/]+($|\/$)/, '')); + } + else if (targetElem.className.indexOf('file-icon') > -1) { + openpath(targetElem.parentNode.dataset['filename']); + } + else if (targetElem.className.indexOf('link-icon') > -1) { + infoElem = targetElem.parentNode; + var filepath = infoElem.dataset['linktarget']; + if (filepath) { + if (infoElem.dataset['isdir'] === "1") { + update_list(filepath); + } + else { + var lastSlash = filepath.lastIndexOf('/'); + openpath(filepath.substring(lastSlash + 1), filepath.substring(0, lastSlash)); + } + } + } + else if (targetElem.className.indexOf('folder-icon') > -1) { + update_list(concatPath(currentPath, targetElem.parentNode.dataset['filename'])) + } + } + } + function refresh_list(filenames, path) { + var listHtml = ''; + if (path !== '/') { + listHtml += ''; + } + if (filenames) { + for (var i = 0; i < filenames.length; i++) { + var line = filenames[i]; + if (line) { + var f = line.match(/(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+([\S\s]+)/); + var isLink = f[1][0] === 'z' || f[1][0] === 'l' || f[1][0] === 'x'; + var o = { + displayname: f[9], + filename: isLink ? f[9].split(' -> ')[0] : f[9], + perms: f[1], + date: f[7] + ' ' + f[6] + ' ' + f[8], + size: f[5], + owner: f[3], + icon: (f[1][0] === 'd') ? "folder-icon" : (isLink ? "link-icon" : "file-icon") + }; + + var install_btn = ' '; + var index= o.filename.lastIndexOf("."); + var ext = o.filename.substr(index+1); + if (ext === 'ipk') { + install_btn = ' '; + } + + listHtml += '' + + '' + + + '' + + '' + + '' + + '' + + ''; + } + } + } + listHtml += "
..返回上级目录
' + + '' + o.displayname + '' + + ''+o.date+''+o.size+''+o.perms+'\ + \ + ' + + install_btn + + '
"; + listElem.innerHTML = listHtml; + } + function update_list(path, opt) { + opt = opt || {}; + path = concatPath(path, ''); + if (currentPath != path) { + iwxhr.get('/cgi-bin/luci/admin/system/fileassistant/list', + {path: path}, + function (x, res) { + if (res.ec === 0) { + refresh_list(res.data, path); + } + else { + refresh_list([], path); + } + } + ); + if (!opt.popState) { + history.pushState({path: path}, null, '?path=' + path); + } + currentPath = path; + pathElem.value = currentPath; + } + }; + + var uploadToggle = document.getElementById('upload-toggle'); + var uploadContainer = document.getElementById('upload-container'); + var isUploadHide = true; + uploadToggle.onclick = function() { + if (isUploadHide) { + uploadContainer.style.display = 'inline-flex'; + } + else { + uploadContainer.style.display = 'none'; + } + isUploadHide = !isUploadHide; + }; + var uploadBtn = uploadContainer.getElementsByClassName('cbi-input-apply')[0]; + uploadBtn.onclick = function (evt) { + var uploadinput = document.getElementById('upload-file'); + var fullPath = uploadinput.value; + if (!fullPath) { + evt.preventDefault(); + } + else { + var formData = new FormData(); + var startIndex = (fullPath.indexOf('\\') >= 0 ? fullPath.lastIndexOf('\\') : fullPath.lastIndexOf('/')); + formData.append('upload-filename', fullPath.substring(startIndex + 1)); + formData.append('upload-dir', concatPath(currentPath, '')); + formData.append('upload-file', uploadinput.files[0]); + var xhr = new XMLHttpRequest(); + xhr.open("POST", "/cgi-bin/luci/admin/system/fileassistant/upload", true); + xhr.onload = function() { + if (xhr.status == 200) { + var res = JSON.parse(xhr.responseText); + refresh_list(res.data, currentPath); + uploadinput.value = ''; + } + else { + alert('上传失败,请稍后再试...'); + } + }; + xhr.send(formData); + } + }; + + document.addEventListener('DOMContentLoaded', function(evt) { + var initPath = '/'; + if (/path=([/\w]+)/.test(location.search)) { + initPath = RegExp.$1; + } + update_list(initPath, {popState: true}); + }); + window.addEventListener('popstate', function (evt) { + var path = '/'; + if (evt.state && evt.state.path) { + path = evt.state.path; + } + update_list(path, {popState: true}); + }); + +})(); diff --git a/luci-app-advanced/htdocs/luci-static/resources/fileassistant/file-icon.png b/luci-app-advanced/htdocs/luci-static/resources/fileassistant/file-icon.png new file mode 100644 index 00000000..f156dc1c Binary files /dev/null and b/luci-app-advanced/htdocs/luci-static/resources/fileassistant/file-icon.png differ diff --git a/luci-app-advanced/htdocs/luci-static/resources/fileassistant/folder-icon.png b/luci-app-advanced/htdocs/luci-static/resources/fileassistant/folder-icon.png new file mode 100644 index 00000000..1370df3a Binary files /dev/null and b/luci-app-advanced/htdocs/luci-static/resources/fileassistant/folder-icon.png differ diff --git a/luci-app-advanced/htdocs/luci-static/resources/fileassistant/link-icon.png b/luci-app-advanced/htdocs/luci-static/resources/fileassistant/link-icon.png new file mode 100644 index 00000000..03cc82cd Binary files /dev/null and b/luci-app-advanced/htdocs/luci-static/resources/fileassistant/link-icon.png differ diff --git a/luci-app-advanced/luasrc/controller/advanced.lua b/luci-app-advanced/luasrc/controller/advanced.lua new file mode 100644 index 00000000..4764dabd --- /dev/null +++ b/luci-app-advanced/luasrc/controller/advanced.lua @@ -0,0 +1,9 @@ +module("luci.controller.advanced",package.seeall) +function index() +if not nixio.fs.access("/etc/config/advanced")then +return +end +local e +e=entry({"admin","system","advanced"},cbi("advanced"),_("高级设置"),60) +e.dependent=true +end diff --git a/luci-app-advanced/luasrc/controller/fileassistant.lua b/luci-app-advanced/luasrc/controller/fileassistant.lua new file mode 100644 index 00000000..69c1b8bb --- /dev/null +++ b/luci-app-advanced/luasrc/controller/fileassistant.lua @@ -0,0 +1,228 @@ +module("luci.controller.fileassistant", package.seeall) + +function index() + + local page + page = entry({"admin", "system", "fileassistant"}, template("fileassistant"), _("文件管理"), 84) + page.i18n = "base" + page.dependent = true + + page = entry({"admin", "system", "fileassistant", "list"}, call("fileassistant_list"), nil) + page.leaf = true + + page = entry({"admin", "system", "fileassistant", "open"}, call("fileassistant_open"), nil) + page.leaf = true + + page = entry({"admin", "system", "fileassistant", "delete"}, call("fileassistant_delete"), nil) + page.leaf = true + + page = entry({"admin", "system", "fileassistant", "rename"}, call("fileassistant_rename"), nil) + page.leaf = true + + page = entry({"admin", "system", "fileassistant", "upload"}, call("fileassistant_upload"), nil) + page.leaf = true + + page = entry({"admin", "system", "fileassistant", "install"}, call("fileassistant_install"), nil) + page.leaf = true + +end + +function list_response(path, success) + luci.http.prepare_content("application/json") + local result + if success then + local rv = scandir(path) + result = { + ec = 0, + data = rv + } + else + result = { + ec = 1 + } + end + luci.http.write_json(result) +end + +function fileassistant_list() + local path = luci.http.formvalue("path") + list_response(path, true) +end + +function fileassistant_open() + local path = luci.http.formvalue("path") + local filename = luci.http.formvalue("filename") + local io = require "io" + local mime = to_mime(filename) + + file = path..filename + + local download_fpi = io.open(file, "r") + luci.http.header('Content-Disposition', 'inline; filename="'..filename..'"' ) + luci.http.prepare_content(mime) + luci.ltn12.pump.all(luci.ltn12.source.file(download_fpi), luci.http.write) +end + +function fileassistant_delete() + local path = luci.http.formvalue("path") + local isdir = luci.http.formvalue("isdir") + path = path:gsub("<>", "/") + path = path:gsub(" ", "\ ") + local success + if isdir then + success = os.execute('rm -r "'..path..'"') + else + success = os.remove(path) + end + list_response(nixio.fs.dirname(path), success) +end + +function fileassistant_rename() + local filepath = luci.http.formvalue("filepath") + local newpath = luci.http.formvalue("newpath") + local success = os.execute('mv "'..filepath..'" "'..newpath..'"') + list_response(nixio.fs.dirname(filepath), success) +end + +function fileassistant_install() + local filepath = luci.http.formvalue("filepath") + local isdir = luci.http.formvalue("isdir") + local ext = filepath:match(".+%.(%w+)$") + filepath = filepath:gsub("<>", "/") + filepath = filepath:gsub(" ", "\ ") + local success + if isdir == "1" then + success = false + elseif ext == "ipk" then + success = installIPK(filepath) + else + success = false + end + list_response(nixio.fs.dirname(filepath), success) +end + +function installIPK(filepath) + luci.sys.exec('opkg --force-depends install "'..filepath..'"') + luci.sys.exec('rm -rf /tmp/luci-*') + return true; +end + +function fileassistant_upload() + local filecontent = luci.http.formvalue("upload-file") + local filename = luci.http.formvalue("upload-filename") + local uploaddir = luci.http.formvalue("upload-dir") + local filepath = uploaddir..filename + + local fp + luci.http.setfilehandler( + function(meta, chunk, eof) + if not fp and meta and meta.name == "upload-file" then + fp = io.open(filepath, "w") + end + if fp and chunk then + fp:write(chunk) + end + if fp and eof then + fp:close() + end + end + ) + + list_response(uploaddir, true) +end + +function scandir(directory) + local i, t, popen = 0, {}, io.popen + + local pfile = popen("ls -lh \""..directory.."\" | egrep '^d' ; ls -lh \""..directory.."\" | egrep -v '^d|^l'") + for fileinfo in pfile:lines() do + i = i + 1 + t[i] = fileinfo + end + pfile:close() + pfile = popen("ls -lh \""..directory.."\" | egrep '^l' ;") + for fileinfo in pfile:lines() do + i = i + 1 + linkindex, _, linkpath = string.find(fileinfo, "->%s+(.+)$") + local finalpath; + if string.sub(linkpath, 1, 1) == "/" then + finalpath = linkpath + else + finalpath = nixio.fs.realpath(directory..linkpath) + end + local linktype; + if not finalpath then + finalpath = linkpath; + linktype = 'x' + elseif nixio.fs.stat(finalpath, "type") == "dir" then + linktype = 'z' + else + linktype = 'l' + end + fileinfo = string.sub(fileinfo, 2, linkindex - 1) + fileinfo = linktype..fileinfo.."-> "..finalpath + t[i] = fileinfo + end + pfile:close() + return t +end + +MIME_TYPES = { + ["txt"] = "text/plain"; + ["conf"] = "text/plain"; + ["ovpn"] = "text/plain"; + ["log"] = "text/plain"; + ["js"] = "text/javascript"; + ["json"] = "application/json"; + ["css"] = "text/css"; + ["htm"] = "text/html"; + ["html"] = "text/html"; + ["patch"] = "text/x-patch"; + ["c"] = "text/x-csrc"; + ["h"] = "text/x-chdr"; + ["o"] = "text/x-object"; + ["ko"] = "text/x-object"; + + ["bmp"] = "image/bmp"; + ["gif"] = "image/gif"; + ["png"] = "image/png"; + ["jpg"] = "image/jpeg"; + ["jpeg"] = "image/jpeg"; + ["svg"] = "image/svg+xml"; + + ["zip"] = "application/zip"; + ["pdf"] = "application/pdf"; + ["xml"] = "application/xml"; + ["xsl"] = "application/xml"; + ["doc"] = "application/msword"; + ["ppt"] = "application/vnd.ms-powerpoint"; + ["xls"] = "application/vnd.ms-excel"; + ["odt"] = "application/vnd.oasis.opendocument.text"; + ["odp"] = "application/vnd.oasis.opendocument.presentation"; + ["pl"] = "application/x-perl"; + ["sh"] = "application/x-shellscript"; + ["php"] = "application/x-php"; + ["deb"] = "application/x-deb"; + ["iso"] = "application/x-cd-image"; + ["tgz"] = "application/x-compressed-tar"; + + ["mp3"] = "audio/mpeg"; + ["ogg"] = "audio/x-vorbis+ogg"; + ["wav"] = "audio/x-wav"; + + ["mpg"] = "video/mpeg"; + ["mpeg"] = "video/mpeg"; + ["avi"] = "video/x-msvideo"; +} + +function to_mime(filename) + if type(filename) == "string" then + local ext = filename:match("[^%.]+$") + + if ext and MIME_TYPES[ext:lower()] then + return MIME_TYPES[ext:lower()] + end + end + + return "application/octet-stream" +end diff --git a/luci-app-advanced/luasrc/model/cbi/advanced.lua b/luci-app-advanced/luasrc/model/cbi/advanced.lua new file mode 100644 index 00000000..0cc14c67 --- /dev/null +++ b/luci-app-advanced/luasrc/model/cbi/advanced.lua @@ -0,0 +1,340 @@ +local e=require"nixio.fs" +local t=require"luci.sys" +local t=luci.model.uci.cursor() +m=Map("advanced",translate("高级进阶设置"),translate("配置文档是直接编辑的除非你知道自己在干什么,否则请不要轻易修改这些配置文档。配置不正确可能会导致不能开机等错误。
")) +m.apply_on_parse=true +s=m:section(TypedSection,"advanced") +s.anonymous=true + +if nixio.fs.access("/etc/dnsmasq.conf")then + +s:tab("dnsmasqconf",translate("dnsmasq"),translate("本页是配置/etc/dnsmasq.conf的文档内容。应用保存后自动重启生效")) + +conf=s:taboption("dnsmasqconf",Value,"dnsmasqconf",nil,translate("开头的数字符号(#)或分号的每一行(;)被视为注释;删除(;)启用指定选项。")) +conf.template="cbi/tvalue" +conf.rows=20 +conf.wrap="off" +conf.cfgvalue=function(t,t) +return e.readfile("/etc/dnsmasq.conf")or"" +end +conf.write=function(a,a,t) +if t then +t=t:gsub("\r\n?","\n") +e.writefile("/tmp/dnsmasq.conf",t) +if(luci.sys.call("cmp -s /tmp/dnsmasq.conf /etc/dnsmasq.conf")==1)then +e.writefile("/etc/dnsmasq.conf",t) +luci.sys.call("/etc/init.d/dnsmasq restart >/dev/null") +end +e.remove("/tmp/dnsmasq.conf") +end +end +end +if nixio.fs.access("/etc/config/network")then +s:tab("netwrokconf",translate("网络"),translate("本页是配置/etc/config/network包含网络配置文档内容。应用保存后自动重启生效")) +conf=s:taboption("netwrokconf",Value,"netwrokconf",nil,translate("开头的数字符号(#)或分号的每一行(;)被视为注释;删除(;)启用指定选项。")) +conf.template="cbi/tvalue" +conf.rows=20 +conf.wrap="off" +conf.cfgvalue=function(t,t) +return e.readfile("/etc/config/network")or"" +end +conf.write=function(a,a,t) +if t then +t=t:gsub("\r\n?","\n") +e.writefile("/tmp/network",t) +if(luci.sys.call("cmp -s /tmp/network /etc/config/network")==1)then +e.writefile("/etc/config/network",t) +luci.sys.call("/etc/init.d/network restart >/dev/null") +end +e.remove("/tmp/network") +end +end +end +if nixio.fs.access("/etc/config/wireless")then +s:tab("wirelessconf",translate("无线"), translate("本页是/etc/config/wireless的配置文件内容,应用保存后自动重启生效.")) + +conf=s:taboption("wirelessconf",Value,"wirelessconf",nil,translate("开头的数字符号(#)或分号的每一行(;)被视为注释;删除(;)启用指定选项。")) +conf.template="cbi/tvalue" +conf.rows=20 +conf.wrap="off" +conf.cfgvalue=function(t,t) +return e.readfile("/etc/config/wireless")or"" +end +conf.write=function(a,a,t) +if t then +t=t:gsub("\r\n?","\n") +e.writefile("/etc/config/wireless.tmp",t) +if(luci.sys.call("cmp -s /etc/config/wireless.tmp /etc/config/wireless")==1)then +e.writefile("/etc/config/wireless",t) +luci.sys.call("wifi reload >/dev/null &") +end +e.remove("/tmp//tmp/wireless.tmp") +end +end +end + +if nixio.fs.access("/etc/hosts")then +s:tab("hostsconf",translate("hosts"),translate("本页是配置/etc/hosts的文档内容。应用保存后自动重启生效")) + +conf=s:taboption("hostsconf",Value,"hostsconf",nil,translate("开头的数字符号(#)或分号的每一行(;)被视为注释;删除(;)启用指定选项。")) +conf.template="cbi/tvalue" +conf.rows=20 +conf.wrap="off" +conf.cfgvalue=function(t,t) +return e.readfile("/etc/hosts")or"" +end +conf.write=function(a,a,t) +if t then +t=t:gsub("\r\n?","\n") +e.writefile("/tmp/hosts.tmp",t) +if(luci.sys.call("cmp -s /tmp/hosts.tmp /etc/hosts")==1)then +e.writefile("/etc/hosts",t) +luci.sys.call("/etc/init.d/dnsmasq restart >/dev/null") +end +e.remove("/tmp/hosts.tmp") +end +end +end + +if nixio.fs.access("/etc/config/arpbind")then +s:tab("arpbindconf",translate("ARP绑定"),translate("本页是配置/etc/config/arpbind包含APR绑定MAC地址文档内容。应用保存后自动重启生效")) +conf=s:taboption("arpbindconf",Value,"arpbindconf",nil,translate("开头的数字符号(#)或分号的每一行(;)被视为注释;删除(;)启用指定选项。")) +conf.template="cbi/tvalue" +conf.rows=20 +conf.wrap="off" +conf.cfgvalue=function(t,t) +return e.readfile("/etc/config/arpbind")or"" +end +conf.write=function(a,a,t) +if t then +t=t:gsub("\r\n?","\n") +e.writefile("/tmp/arpbind",t) +if(luci.sys.call("cmp -s /tmp/arpbind /etc/config/arpbind")==1)then +e.writefile("/etc/config/arpbind",t) +luci.sys.call("/etc/init.d/arpbind restart >/dev/null") +end +e.remove("/tmp/arpbind") +end +end +end + +if nixio.fs.access("/etc/config/firewall")then +s:tab("firewallconf",translate("防火墙"),translate("本页是配置/etc/config/firewall包含防火墙协议设置文档内容。应用保存后自动重启生效")) +conf=s:taboption("firewallconf",Value,"firewallconf",nil,translate("开头的数字符号(#)或分号的每一行(;)被视为注释;删除(;)启用指定选项。")) +conf.template="cbi/tvalue" +conf.rows=20 +conf.wrap="off" +conf.cfgvalue=function(t,t) +return e.readfile("/etc/config/firewall")or"" +end +conf.write=function(a,a,t) +if t then +t=t:gsub("\r\n?","\n") +e.writefile("/tmp/firewall",t) +if(luci.sys.call("cmp -s /tmp/firewall /etc/config/firewall")==1)then +e.writefile("/etc/config/firewall",t) +luci.sys.call("/etc/init.d/firewall restart >/dev/null") +end +e.remove("/tmp/firewall") +end +end +end + +if nixio.fs.access("/etc/config/mwan3")then +s:tab("mwan3conf",translate("负载均衡"),translate("本页是配置/etc/config/mwan3包含负载均衡设置文档内容。应用保存后自动重启生效")) +conf=s:taboption("mwan3conf",Value,"mwan3conf",nil,translate("开头的数字符号(#)或分号的每一行(;)被视为注释;删除(;)启用指定选项。")) +conf.template="cbi/tvalue" +conf.rows=20 +conf.wrap="off" +conf.cfgvalue=function(t,t) +return e.readfile("/etc/config/mwan3")or"" +end +conf.write=function(a,a,t) +if t then +t=t:gsub("\r\n?","\n") +e.writefile("/tmp/mwan3",t) +if(luci.sys.call("cmp -s /tmp/mwan3 /etc/config/mwan3")==1)then +e.writefile("/etc/config/mwan3",t) +luci.sys.call("/etc/init.d/mwan3 restart >/dev/null") +end +e.remove("/tmp/mwan3") +end +end +end +if nixio.fs.access("/etc/config/dhcp")then +s:tab("dhcpconf",translate("DHCP"),translate("本页是配置/etc/config/DHCP包含机器名等设置文档内容。应用保存后自动重启生效")) +conf=s:taboption("dhcpconf",Value,"dhcpconf",nil,translate("开头的数字符号(#)或分号的每一行(;)被视为注释;删除(;)启用指定选项。")) +conf.template="cbi/tvalue" +conf.rows=20 +conf.wrap="off" +conf.cfgvalue=function(t,t) +return e.readfile("/etc/config/dhcp")or"" +end +conf.write=function(a,a,t) +if t then +t=t:gsub("\r\n?","\n") +e.writefile("/tmp/dhcp",t) +if(luci.sys.call("cmp -s /tmp/dhcp /etc/config/dhcp")==1)then +e.writefile("/etc/config/dhcp",t) +luci.sys.call("/etc/init.d/network restart >/dev/null") +end +e.remove("/tmp/dhcp") +end +end +end + +if nixio.fs.access("/etc/config/ddns")then +s:tab("ddnsconf",translate("DDNS"),translate("本页是配置/etc/config/ddns包含动态域名设置文档内容。应用保存后自动重启生效")) +conf=s:taboption("ddnsconf",Value,"ddnsconf",nil,translate("开头的数字符号(#)或分号的每一行(;)被视为注释;删除(;)启用指定选项。")) +conf.template="cbi/tvalue" +conf.rows=20 +conf.wrap="off" +conf.cfgvalue=function(t,t) +return e.readfile("/etc/config/ddns")or"" +end +conf.write=function(a,a,t) +if t then +t=t:gsub("\r\n?","\n") +e.writefile("/tmp/ddns",t) +if(luci.sys.call("cmp -s /tmp/ddns /etc/config/ddns")==1)then +e.writefile("/etc/config/ddns",t) +luci.sys.call("/etc/init.d/ddns restart >/dev/null") +end +e.remove("/tmp/ddns") +end +end +end + +if nixio.fs.access("/etc/config/parentcontrol")then +s:tab("parentcontrolconf",translate("家长控制"),translate("本页是配置/etc/config/parentcontrol包含家长控制配置文档内容。应用保存后自动重启生效")) +conf=s:taboption("parentcontrolconf",Value,"parentcontrolconf",nil,translate("开头的数字符号(#)或分号的每一行(;)被视为注释;删除(;)启用指定选项。")) +conf.template="cbi/tvalue" +conf.rows=20 +conf.wrap="off" +conf.cfgvalue=function(t,t) +return e.readfile("/etc/config/parentcontrol")or"" +end +conf.write=function(a,a,t) +if t then +t=t:gsub("\r\n?","\n") +e.writefile("/tmp/parentcontrol",t) +if(luci.sys.call("cmp -s /tmp/parentcontrol /etc/config/parentcontrol")==1)then +e.writefile("/etc/config/parentcontrol",t) +luci.sys.call("/etc/init.d/parentcontrol restart >/dev/null") +end +e.remove("/tmp/parentcontrol") +end +end +end + +if nixio.fs.access("/etc/config/autotimeset")then +s:tab("autotimesetconf",translate("定时设置"),translate("本页是配置/etc/config/autotimeset包含定时设置任务配置文档内容。应用保存后自动重启生效")) +conf=s:taboption("autotimesetconf",Value,"autotimesetconf",nil,translate("开头的数字符号(#)或分号的每一行(;)被视为注释;删除(;)启用指定选项。")) +conf.template="cbi/tvalue" +conf.rows=20 +conf.wrap="off" +conf.cfgvalue=function(t,t) +return e.readfile("/etc/config/autotimeset")or"" +end +conf.write=function(a,a,t) +if t then +t=t:gsub("\r\n?","\n") +e.writefile("/tmp/autotimeset",t) +if(luci.sys.call("cmp -s /tmp/autotimeset /etc/config/autotimeset")==1)then +e.writefile("/etc/config/autotimeset",t) +luci.sys.call("/etc/init.d/autotimeset restart >/dev/null") +end +e.remove("/tmp/autotimeset") +end +end +end + +if nixio.fs.access("/etc/config/wolplus")then +s:tab("wolplusconf",translate("网络唤醒"),translate("本页是配置/etc/config/wolplus包含网络唤醒配置文档内容。应用保存后自动重启生效")) +conf=s:taboption("wolplusconf",Value,"wolplusconf",nil,translate("开头的数字符号(#)或分号的每一行(;)被视为注释;删除(;)启用指定选项。")) +conf.template="cbi/tvalue" +conf.rows=20 +conf.wrap="off" +conf.cfgvalue=function(t,t) +return e.readfile("/etc/config/wolplus")or"" +end +conf.write=function(a,a,t) +if t then +t=t:gsub("\r\n?","\n") +e.writefile("/tmp/wolplus",t) +if(luci.sys.call("cmp -s /tmp/wolplus /etc/config/wolplus")==1)then +e.writefile("/etc/config/wolplus",t) +luci.sys.call("/etc/init.d/wolplus restart >/dev/null") +end +e.remove("/tmp/wolplus") +end +end +end + +if nixio.fs.access("/etc/config/smartdns")then +s:tab("smartdnsconf",translate("SMARTDNS"),translate("本页是配置/etc/config/smartdns包含smartdns配置文档内容。应用保存后自动重启生效")) +conf=s:taboption("smartdnsconf",Value,"smartdnsconf",nil,translate("开头的数字符号(#)或分号的每一行(;)被视为注释;删除(;)启用指定选项。")) +conf.template="cbi/tvalue" +conf.rows=20 +conf.wrap="off" +conf.cfgvalue=function(t,t) +return e.readfile("/etc/config/smartdns")or"" +end +conf.write=function(a,a,t) +if t then +t=t:gsub("\r\n?","\n") +e.writefile("/tmp/smartdns",t) +if(luci.sys.call("cmp -s /tmp/smartdns /etc/config/smartdns")==1)then +e.writefile("/etc/config/smartdns",t) +luci.sys.call("/etc/init.d/smartdns restart >/dev/null") +end +e.remove("/tmp/smartdns") +end +end +end + +if nixio.fs.access("/etc/config/bypass")then +s:tab("bypassconf",translate("BYPASS"),translate("本页是配置/etc/config/bypass包含bypass配置文档内容。应用保存后自动重启生效")) +conf=s:taboption("bypassconf",Value,"bypassconf",nil,translate("开头的数字符号(#)或分号的每一行(;)被视为注释;删除(;)启用指定选项。")) +conf.template="cbi/tvalue" +conf.rows=20 +conf.wrap="off" +conf.cfgvalue=function(t,t) +return e.readfile("/etc/config/bypass")or"" +end +conf.write=function(a,a,t) +if t then +t=t:gsub("\r\n?","\n") +e.writefile("/tmp/bypass",t) +if(luci.sys.call("cmp -s /tmp/bypass /etc/config/bypass")==1)then +e.writefile("/etc/config/bypass",t) +luci.sys.call("/etc/init.d/bypass restart >/dev/null") +end +e.remove("/tmp/bypass") +end +end +end + +if nixio.fs.access("/etc/config/openclash")then +s:tab("openclashconf",translate("openclash"),translate("本页是配置/etc/config/openclash的文档内容。应用保存后自动重启生效")) +conf=s:taboption("openclashconf",Value,"openclashconf",nil,translate("开头的数字符号(#)或分号的每一行(;)被视为注释;删除(;)启用指定选项。")) +conf.template="cbi/tvalue" +conf.rows=20 +conf.wrap="off" +conf.cfgvalue=function(t,t) +return e.readfile("/etc/config/openclash")or"" +end +conf.write=function(a,a,t) +if t then +t=t:gsub("\r\n?","\n") +e.writefile("/tmp/openclash",t) +if(luci.sys.call("cmp -s /tmp/openclash /etc/config/openclash")==1)then +e.writefile("/etc/config/openclash",t) +luci.sys.call("/etc/init.d/openclash restart >/dev/null") +end +e.remove("/tmp/openclash") +end +end +end + +return m diff --git a/luci-app-advanced/luasrc/view/fileassistant.htm b/luci-app-advanced/luasrc/view/fileassistant.htm new file mode 100644 index 00000000..09430418 --- /dev/null +++ b/luci-app-advanced/luasrc/view/fileassistant.htm @@ -0,0 +1,20 @@ +<%+header%> + + +

文件管理【集成上传删除及安装,非专业人员请谨慎操作】

+
+ +
+
文件列表
+ +
+
+ + +
+
+
+ + + +<%+footer%> diff --git a/luci-app-advanced/luasrc/view/filebrowser.htm b/luci-app-advanced/luasrc/view/filebrowser.htm new file mode 100644 index 00000000..d11028b4 --- /dev/null +++ b/luci-app-advanced/luasrc/view/filebrowser.htm @@ -0,0 +1,20 @@ +<%+header%> + + +

文件管理

+
+ +
+
文件列表:
+ +
+
+ + +
+
+
+ + + +<%+footer%> diff --git a/luci-app-advanced/root/bin/ipmode4 b/luci-app-advanced/root/bin/ipmode4 new file mode 100644 index 00000000..de44affb --- /dev/null +++ b/luci-app-advanced/root/bin/ipmode4 @@ -0,0 +1,26 @@ +#!/bin/sh +uci set network.@globals[0].ula_prefix='' +uci set network.lan.delegate='0' +uci set network.wan.mtu=1460 +uci set network.wan.metric='41' +uci set network.wan.delegate='0' +uci set network.wan.ipv6='0' +uci commit network +uci set dhcp.@dnsmasq[0].cachesize='15000' +uci set dhcp.@dnsmasq[0].min_ttl='3600' +uci set dhcp.@dnsmasq[0].filter_aaaa='1' +uci set dhcp.@dnsmasq[0].localservice='0' +uci set dhcp.@dnsmasq[0].nonwildcard='0' +uci set dhcp.@dnsmasq[0].rebind_protection='0' +uci set dhcp.@dnsmasq[0].noresolv='0' +uci set dhcp.lan.ra='' +uci set dhcp.lan.ndp='' +uci set dhcp.lan.dhcpv6='' +uci set dhcp.lan.ignore='0' +uci set dhcp.lan.ra_management='1' +uci set dhcp.lan.ra_default='1' +uci set dhcp.lan.force='1' +uci commit dhcp +sed -i "/list server/d" /etc/config/dhcp +/etc/init.d/network restart +/etc/init.d/dnsmasq restart diff --git a/luci-app-advanced/root/bin/ipmode6 b/luci-app-advanced/root/bin/ipmode6 new file mode 100644 index 00000000..1c4e5a68 --- /dev/null +++ b/luci-app-advanced/root/bin/ipmode6 @@ -0,0 +1,27 @@ +#!/bin/sh + +uci set dhcp.@dnsmasq[0].cachesize='15000' +uci set dhcp.@dnsmasq[0].min_ttl='3600' +uci set dhcp.@dnsmasq[0].filter_aaaa='0' +uci set dhcp.@dnsmasq[0].localservice='0' +uci set dhcp.@dnsmasq[0].nonwildcard='0' +uci set dhcp.@dnsmasq[0].rebind_protection='0' +uci set dhcp.@dnsmasq[0].noresolv='1' +uci set dhcp.lan.ra='server' +uci set dhcp.lan.ndp='' +uci set dhcp.lan.dhcpv6='' +uci set dhcp.lan.ignore='0' +uci set dhcp.lan.ra_management='1' +uci set dhcp.lan.ra_default='1' +uci set dhcp.lan.force='1' +uci commit dhcp +uci set network.@globals[0].ula_prefix='' +uci set network.lan.delegate='0' +uci set network.wan.mtu=1460 +uci set network.wan.metric='41' +uci set network.wan.delegate='0' +uci set network.wan.ipv6='auto' +uci commit network +sed -i "/list server/d" /etc/config/dhcp +/etc/init.d/network restart +/etc/init.d/dnsmasq restart diff --git a/luci-app-advanced/root/bin/normalmode b/luci-app-advanced/root/bin/normalmode new file mode 100644 index 00000000..8d714670 --- /dev/null +++ b/luci-app-advanced/root/bin/normalmode @@ -0,0 +1,30 @@ +#!/bin/sh + +uci set system.@system[0].hostname="Openwrt" +uci commit + +cat > /etc/config/network <> /etc/firewall.user +echo "iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 53" >> /etc/firewall.user +reboot diff --git a/luci-app-advanced/root/bin/nuc b/luci-app-advanced/root/bin/nuc new file mode 100644 index 00000000..587e4ae5 --- /dev/null +++ b/luci-app-advanced/root/bin/nuc @@ -0,0 +1,80 @@ +#!/bin/sh +ip=/usr/sbin/ip +vconfig=/sbin/vconfig +ifconfig=/sbin/ifconfig + +uci set system.@system[0].hostname="Openwrt" +uci commit +cat > /etc/config/network <> /etc/firewall.user +reboot \ No newline at end of file diff --git a/luci-app-advanced/root/etc/config/advanced b/luci-app-advanced/root/etc/config/advanced new file mode 100644 index 00000000..2ed8a3c1 --- /dev/null +++ b/luci-app-advanced/root/etc/config/advanced @@ -0,0 +1,2 @@ +config advanced + option enabled '1' diff --git a/luci-app-advanced/root/etc/uci-defaults/40_luci-fb b/luci-app-advanced/root/etc/uci-defaults/40_luci-fb new file mode 100644 index 00000000..ee5f1336 --- /dev/null +++ b/luci-app-advanced/root/etc/uci-defaults/40_luci-fb @@ -0,0 +1,7 @@ +#!/bin/sh + +ver=$(date +%s) +sed -i "s/@ver/$ver/g" /usr/lib/lua/luci/view/filebrowser.htm + +rm -f /tmp/luci-indexcache +exit 0 diff --git a/luci-app-advanced/root/usr/share/rpcd/acl.d/luci-app-advanced.json b/luci-app-advanced/root/usr/share/rpcd/acl.d/luci-app-advanced.json new file mode 100644 index 00000000..8cb0ef85 --- /dev/null +++ b/luci-app-advanced/root/usr/share/rpcd/acl.d/luci-app-advanced.json @@ -0,0 +1,11 @@ +{ + "luci-app-advanced": { + "description": "Grant UCI access for luci-app-advanced", + "read": { + "uci": [ "advanced" ] + }, + "write": { + "uci": [ "advanced" ] + } + } +} diff --git a/luci-app-aliddns b/luci-app-aliddns deleted file mode 160000 index 560350b1..00000000 --- a/luci-app-aliddns +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 560350b1cb330d1cd1b7f6b72ecef63ff4ea093e diff --git a/luci-app-aliddns/LICENSE b/luci-app-aliddns/LICENSE new file mode 100644 index 00000000..e09a55e3 --- /dev/null +++ b/luci-app-aliddns/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 chenhw2 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/luci-app-aliddns/Makefile b/luci-app-aliddns/Makefile new file mode 100644 index 00000000..356f58d7 --- /dev/null +++ b/luci-app-aliddns/Makefile @@ -0,0 +1,84 @@ +# +# Copyright (C) 2018-2021 chenhw2 +# +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=luci-app-aliddns +PKG_VERSION:=0.4.0 +PKG_RELEASE:=1 + +PKG_LICENSE:=MIT +PKG_LICENSE_FILES:=LICENSE +PKG_MAINTAINER:=chenhw2 + +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) + +include $(INCLUDE_DIR)/package.mk + +define Package/luci-app-aliddns + SECTION:=luci + CATEGORY:=LuCI + SUBMENU:=3. Applications + TITLE:=LuCI Support for aliddns + PKGARCH:=all + DEPENDS:=+openssl-util +curl +endef + +define Package/luci-app-aliddns/description + LuCI Support for ALiDDNS. +endef + +define Build/Prepare + $(foreach po,$(wildcard ${CURDIR}/files/luci/i18n/*.po), \ + po2lmo $(po) $(PKG_BUILD_DIR)/$(patsubst %.po,%.lmo,$(notdir $(po)));) +endef + +define Build/Configure +endef + +define Build/Compile +endef + +define Package/luci-app-aliddns/postinst +#!/bin/sh +if [ -z "$${IPKG_INSTROOT}" ]; then + if [ -f /etc/uci-defaults/luci-aliddns ]; then + ( . /etc/uci-defaults/luci-aliddns ) && \ + rm -f /etc/uci-defaults/luci-aliddns + fi + rm -rf /tmp/luci-indexcache /tmp/luci-modulecache +fi +exit 0 +endef + +define Package/luci-app-aliddns/prerm +#!/bin/sh +/etc/init.d/aliddns stop +exit 0 +endef + +define Package/luci-app-aliddns/conffiles +/etc/config/aliddns +endef + +define Package/luci-app-aliddns/install + $(INSTALL_DIR) $(1)/usr/lib/lua/luci/i18n + $(INSTALL_DATA) $(PKG_BUILD_DIR)/aliddns.*.lmo $(1)/usr/lib/lua/luci/i18n/ + $(INSTALL_DIR) $(1)/usr/lib/lua/luci/controller + $(INSTALL_DATA) ./files/luci/controller/*.lua $(1)/usr/lib/lua/luci/controller/ + $(INSTALL_DIR) $(1)/usr/lib/lua/luci/model/cbi/aliddns + $(INSTALL_DATA) ./files/luci/model/cbi/*.lua $(1)/usr/lib/lua/luci/model/cbi/ + $(INSTALL_DIR) $(1)/etc/config + $(INSTALL_DATA) ./files/root/etc/config/aliddns $(1)/etc/config/aliddns + $(INSTALL_DIR) $(1)/etc/init.d + $(INSTALL_BIN) ./files/root/etc/init.d/aliddns $(1)/etc/init.d/aliddns + $(INSTALL_DIR) $(1)/etc/uci-defaults + $(INSTALL_BIN) ./files/root/etc/uci-defaults/luci-aliddns $(1)/etc/uci-defaults/luci-aliddns + $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_BIN) ./files/root/usr/sbin/aliddns $(1)/usr/sbin/aliddns +endef + +$(eval $(call BuildPackage,luci-app-aliddns)) diff --git a/luci-app-aliddns/README.md b/luci-app-aliddns/README.md new file mode 100644 index 00000000..62ed84d4 --- /dev/null +++ b/luci-app-aliddns/README.md @@ -0,0 +1,68 @@ +# luci-app-aliddns +LEDE/OpenWrt LuCI for AliDDNS +=== + +简介 +--- + +本软件包是 AliDDNS 的 LuCI 控制界面, + +软件包文件结构: +``` +/ +├── etc/ +│   ├── config/ +│   │   └── aliddns // UCI 配置文件 +│   │── init.d/ +│   │   └── aliddns // init 脚本 +│   └── uci-defaults/ +│      └── luci-aliddns // uci-defaults 脚本 +└── usr/ + ├── sbin/ + │   └── aliddns // 主程序 + └── lib/ + └── lua/ + └── luci/ // LuCI 部分 + ├── controller/ + │   └── aliddns.lua // LuCI 菜单配置 + ├── i18n/ // LuCI 语言文件目录 + │   └── aliddns.zh-cn.lmo + └── model/ + └── cbi/ + └── aliddns.lua // LuCI 基本设置 +``` + +依赖 +--- + +软件包的正常使用需要依赖 `openssl-util` 和 `curl`. + +配置 +--- + +软件包的配置文件路径: `/etc/config/aliddns` +此文件为 UCI 配置文件, 配置方式可参考 [Wiki][uci] + +编译 +--- + +从 LEDE 的 [SDK][lede-sdk] 编译 +```bash +# 解压下载好的 SDK +tar axvf lede-sdk-17.01.*-ar71xx-generic_gcc-5.4.0_musl-1.1.16.Linux-x86_64.tar.xz +cd lede-sdk-17.01.*-ar71xx-* +# Clone 项目 +mkdir -p package/feeds +git clone https://github.com/chenhw2/luci-app-aliddns.git package/feeds/luci-app-aliddns +# 编译 po2lmo (如果有po2lmo可跳过) +pushd package/feeds/luci-app-aliddns/tools/po2lmo +make && sudo make install +popd +# 选择要编译的包 LuCI -> 3. Applications +make menuconfig +# 开始编译 +make package/feeds/luci-app-aliddns/compile V=s +``` + + [lede-sdk]: https://lede-project.org/docs/guide-developer/compile_packages_for_lede_with_the_sdk + [uci]: https://lede-project.org/docs/user-guide/introduction_to_lede_configuration diff --git a/luci-app-aliddns/files/luci/controller/aliddns.lua b/luci-app-aliddns/files/luci/controller/aliddns.lua new file mode 100644 index 00000000..9a169ef2 --- /dev/null +++ b/luci-app-aliddns/files/luci/controller/aliddns.lua @@ -0,0 +1,4 @@ +module("luci.controller.aliddns",package.seeall) +function index() +entry({"admin","services","aliddns"},cbi("aliddns"),_("AliDDNS"),58) +end diff --git a/luci-app-aliddns/files/luci/i18n/aliddns.zh-cn.po b/luci-app-aliddns/files/luci/i18n/aliddns.zh-cn.po new file mode 100644 index 00000000..f0be976b --- /dev/null +++ b/luci-app-aliddns/files/luci/i18n/aliddns.zh-cn.po @@ -0,0 +1,56 @@ +msgid "" +msgstr "Content-Type: text/plain; charset=UTF-8\n" + +msgid "AliDDNS" +msgstr "阿里DDNS" + +msgid "enable" +msgstr "启用" + +msgid "Clean Before Update" +msgstr "清除所有同名记录" + +msgid "Enabled IPv6" +msgstr "启用 IPv6" + +msgid "Base" +msgstr "基本设置" + +msgid "WAN-IP Source" +msgstr "WAN-IP来源" + +msgid "Select WAN-IP Source" +msgstr "选择WAN-IP来源" + +msgid "Select the WAN-IP Source for AliDDNS, like wan/internet" +msgstr "动态域名的IP来源,如wan/internet" + +msgid "WAN6-IP Source" +msgstr "WAN6-IP来源" + +msgid "Select WAN6-IP Source" +msgstr "选择WAN6-IP来源" + +msgid "Select the WAN6-IP Source for AliDDNS, like wan6/internet" +msgstr "动态域名的IPv6来源,如wan6/internet" + +msgid "Main Domain" +msgstr "主域名" + +msgid "Sub Domain" +msgstr "子域名" + +msgid "For example: test.github.com -> github.com" +msgstr "例如: test.github.com 则填: github.com" + +msgid "For example: test.github.com -> test" +msgstr "例如: test.github.com, 则填: test" + +msgid "Inspection Time" +msgstr "检查时间" + +msgid "Unit: Minute, Range: 1-59" +msgstr "域名检查间隔时间,单位分钟,范围1-59" + +msgid "Update Log" +msgstr "更新记录" diff --git a/luci-app-aliddns/files/luci/model/cbi/aliddns.lua b/luci-app-aliddns/files/luci/model/cbi/aliddns.lua new file mode 100644 index 00000000..f04ffbcd --- /dev/null +++ b/luci-app-aliddns/files/luci/model/cbi/aliddns.lua @@ -0,0 +1,71 @@ +local a = require"luci.sys" +local e = luci.model.uci.cursor() +local e = require"nixio.fs" +require("luci.sys") +local t, e ,o + +t = Map("aliddns", translate("AliDDNS")) + +e = t:section(TypedSection, "base", translate("Base")) +e.anonymous = true + +enable = e:option(Flag, "enable", translate("enable")) +enable.rmempty = false + +enable = e:option(Flag, "clean", translate("Clean Before Update")) +enable.rmempty = false + +ipv6 = e:option(Flag,"ipv6",translate("Enabled IPv6")) +ipv6.rmempty=false + +token = e:option(Value, "app_key", translate("Access Key ID")) + +email = e:option(Value, "app_secret", translate("Access Key Secret")) + +iface = e:option(ListValue, "interface", translate("WAN-IP Source"), translate("Select the WAN-IP Source for AliDDNS, like wan/internet")) +iface:value("", translate("Select WAN-IP Source")) +iface:value("internet") +iface:value("wan") +iface.rmempty = false + +iface6 = e:option(ListValue, "interface6", translate("WAN6-IP Source"),translate("Select the WAN6-IP Source for AliDDNS, like wan6/internet")) +iface6:value("",translate("Select WAN6-IP Source")) +iface6:value("internet") +iface6:value("wan") +iface6:value("wan6") +iface6.rmempty = true + +main = e:option(Value, "main_domain", translate("Main Domain"), translate("For example: test.github.com -> github.com")) +main.rmempty = false + +sub = e:option(Value, "sub_domain", translate("Sub Domain"), translate("For example: test.github.com -> test")) +sub.rmempty = false + +time = e:option(Value, "time", translate("Inspection Time"), translate("Unit: Minute, Range: 1-59")) +time.rmempty = false + +e = t:section(TypedSection, "base", translate("Update Log")) +e.anonymous = true +local a = "/var/log/aliddns.log" +tvlog = e:option(TextValue,"sylogtext") +tvlog.rows = 16 +tvlog.readonly = "readonly" +tvlog.wrap = "off" + +function tvlog.cfgvalue(e,e) + sylogtext = "" + if a and nixio.fs.access(a) then + sylogtext = luci.sys.exec("tail -n 100 %s"%a) + end + return sylogtext +end + +tvlog.write = function(e,e,e) +end + +local e = luci.http.formvalue("cbi.apply") +if e then + io.popen("/etc/init.d/aliddns restart") +end + +return t diff --git a/luci-app-aliddns/files/root/etc/config/aliddns b/luci-app-aliddns/files/root/etc/config/aliddns new file mode 100644 index 00000000..10ae1fef --- /dev/null +++ b/luci-app-aliddns/files/root/etc/config/aliddns @@ -0,0 +1,4 @@ + +config base 'base' + option enable '0' + option time '10' diff --git a/luci-app-aliddns/files/root/etc/init.d/aliddns b/luci-app-aliddns/files/root/etc/init.d/aliddns new file mode 100644 index 00000000..8740c0c0 --- /dev/null +++ b/luci-app-aliddns/files/root/etc/init.d/aliddns @@ -0,0 +1,78 @@ +#!/bin/sh /etc/rc.common + +START=80 +NAME=aliddns +EXTRA_COMMANDS="status" +EXTRA_HELP=" status Service status" + +NE_TIPS='AliDDNS NOT ENABLED' + +restart() { + start +} + +uci_get_by_name() { + local ret=$(uci get $NAME.$1.$2 2>/dev/null) + echo ${ret:=$3} +} + +uci_bool_by_name() { + case "$(uci_get_by_name $1 $2)" in + 1|on|true|yes|enabled) return 0;; + esac + return 1 +} + +add_hotplug() { + cat < "/etc/hotplug.d/iface/${START}-${NAME}" +#!/bin/sh /etc/rc.common + +[ "Z\$ACTION" = "Zifup" -a "Z\$INTERFACE" = "Zwan" ] || exit 0 + +DATE=\$(date +'%Y-%m-%d %H:%M:%S') +( sleep 10 && ( echo "\$DATE IFUP-WAN" && /usr/sbin/aliddns ) >> /var/log/aliddns.log 2>&1 ) & + +exit 0 +EOF + chmod +x "/etc/hotplug.d/iface/${START}-${NAME}" +} + +start() { + $(uci_bool_by_name base enable) || { + stop + return 0 + } + + add_hotplug + + sed -i "/${NE_TIPS}/d" /var/log/aliddns.log + + time=$(uci_get_by_name base time 10) + [ 0 -lt $time -a $time -lt 60 ] || time=10 + + [ -f /etc/crontabs/root ] || mkdir -p /etc/crontabs && touch /etc/crontabs/root + sed -i '/aliddns/d' /etc/crontabs/root + echo "*/$time * * * * /usr/sbin/aliddns >> /var/log/aliddns.log 2>&1" >> /etc/crontabs/root + if [ "$(/etc/init.d/cron status)" = "running" ]; then + /etc/init.d/cron reload + fi + + ( /usr/sbin/aliddns >> /var/log/aliddns.log 2>&1 ) & +} + +stop() { + rm -rf "/etc/hotplug.d/iface/${START}-${NAME}" + sed -i '/aliddns/d' /etc/crontabs/root >/dev/null 2>&1 + if [ "$(/etc/init.d/cron status)" = "running" ]; then + /etc/init.d/cron reload + fi + echo "${NE_TIPS}" > /var/log/aliddns.log +} + +status() { + if [ "$(/etc/init.d/cron status)" != "running" ]; then + echo "inactive" && false + else + grep -q aliddns /etc/crontabs/root && echo "running" || echo "inactive" && false + fi +} diff --git a/luci-app-aliddns/files/root/etc/uci-defaults/luci-aliddns b/luci-app-aliddns/files/root/etc/uci-defaults/luci-aliddns new file mode 100644 index 00000000..15bd1040 --- /dev/null +++ b/luci-app-aliddns/files/root/etc/uci-defaults/luci-aliddns @@ -0,0 +1,10 @@ +#!/bin/sh + +uci -q batch <<-EOF >/dev/null + delete ucitrack.@aliddns[-1] + add ucitrack aliddns + set ucitrack.@aliddns[-1].init=aliddns + commit ucitrack +EOF + +exit 0 diff --git a/luci-app-aliddns/files/root/usr/sbin/aliddns b/luci-app-aliddns/files/root/usr/sbin/aliddns new file mode 100755 index 00000000..086d1103 --- /dev/null +++ b/luci-app-aliddns/files/root/usr/sbin/aliddns @@ -0,0 +1,286 @@ +#!/bin/sh + +NAME=aliddns +log_file=/var/log/$NAME.log + +uci_get_by_name() { + local ret=$(uci get $NAME.$1.$2 2>/dev/null) + echo ${ret:=$3} +} + +uci_bool_by_name() { + case "$(uci_get_by_name $1 $2)" in + 1|on|true|yes|enabled) return 0;; + esac + return 1 +} + +intelnetip() { + tmp_ip=`curl -sL --connect-timeout 3 members.3322.org/dyndns/getip` + if [ "Z$tmp_ip" == "Z" ]; then + tmp_ip=`curl -sL --connect-timeout 3 api-ipv4.ip.sb/ip` + fi + if [ "Z$tmp_ip" == "Z" ]; then + tmp_ip=`curl -sL --connect-timeout 3 v4.myip.la` + fi + if [ "Z$tmp_ip" == "Z" ]; then + tmp_ip=`curl -sL --connect-timeout 3 whatismyip.akamai.com` + fi + echo -n $tmp_ip +} + +intelnetip6() { + tmp_ip6=`curl -sL --connect-timeout 3 ipv6.whatismyip.akamai.com` + if [ "Z$tmp_ip6" == "Z" ]; then + tmp_ip6=`curl -sL --connect-timeout 3 speed.neu6.edu.cn/getIP.php` + fi + if [ "Z$tmp_ip6" == "Z" ]; then + tmp_ip6=`curl -sL --connect-timeout 3 v6.ident.me` + fi + if [ "Z$tmp_ip6" == "Z" ]; then + tmp_ip6=`curl -sL --connect-timeout 3 api-ipv6.ip.sb/ip` + fi + echo -n $tmp_ip6 +} + +resolve2ip() { + # resolve2ip domain + domain=$1 + tmp_ip=`nslookup $domain ns1.alidns.com 2>/dev/null | sed '/^Server/d; /#53$/d' | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | tail -n1` + if [ "Z$tmp_ip" == "Z" ]; then + tmp_ip=`nslookup $domain ns2.alidns.com 2>/dev/null | sed '/^Server/d; /#53$/d' | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | tail -n1` + fi + if [ "Z$tmp_ip" == "Z" ]; then + tmp_ip=`nslookup $domain 114.114.115.115 2>/dev/null | sed '/^Server/d; /#53$/d' | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | tail -n1` + fi + if [ "Z$tmp_ip" == "Z" ]; then + tmp_ip=`curl -sL --connect-timeout 3 "119.29.29.29/d?dn=$domain"` + fi + echo -n $tmp_ip +} + +resolve2ip6() { + # resolve2ip6 domain + domain=$1 + tmp_ip6=`nslookup $domain ns1.alidns.com 2>/dev/null | sed '/^Server/d; /#53$/d' | grep -oE '([0-9A-Fa-f]{0,4}:){2,7}([0-9A-Fa-f]{1,4}$|((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4})' | tail -n1` + if [ "Z$tmp_ip6" == "Z" ]; then + tmp_ip6=`nslookup $domain ns2.alidns.com 2>/dev/null | sed '/^Server/d; /#53$/d' | grep -oE '([0-9A-Fa-f]{0,4}:){2,7}([0-9A-Fa-f]{1,4}$|((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4})' | tail -n1` + fi + if [ "Z$tmp_ip6" == "Z" ]; then + tmp_ip6=`nslookup $domain 114.114.115.115 2>/dev/null | sed '/^Server/d; /#53$/d' | grep -oE '([0-9A-Fa-f]{0,4}:){2,7}([0-9A-Fa-f]{1,4}$|((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4})' | tail -n1` + fi + if [ "Z$tmp_ip6" == "Z" ]; then + tmp_ip6=`curl -sL --connect-timeout 3 "119.29.29.29/d?dn=$domain&type=AAAA"` + fi + echo -n $tmp_ip6 +} + +check_aliddns() { + echo "$DATE WAN-IP: ${ip}" + if [ "Z$ip" == "Z" ]; then + echo "$DATE ERROR, cant get WAN-IP..." + return 0 + fi + current_ip=$(resolve2ip "$dm_real") + if [ "Z$current_ip" == "Z" ]; then + rrid='' # NO Resolve IP Means new Record_ID + fi + echo "$DATE DOMAIN-IP: ${current_ip}" + if [ "Z$ip" == "Z$current_ip" ]; then + echo "$DATE IP dont need UPDATE..." + return 0 + else + echo "$DATE UPDATING..." + return 1 + fi +} + +check_aliddns6() { + echo "$DATE WAN6-IP: ${ip6}" + if [ "Z$ip6" == "Z" ]; then + echo "$DATE ERROR, cant get WAN6-IP..." + return 0 + fi + current_ip6=$(resolve2ip6 "$dm_real") + + #urlencode current_ip6 + current_ip6_urlencode=$(urlencode "$current_ip6") + if [ "Z$current_ip6_urlencode" == "Z" ]; then + rrid6='' # NO Resolve IP Means new Record_ID + fi + echo "$DATE DOMAIN-IP6: ${current_ip6_urlencode}" + if [ "Z$ip6" == "Z$current_ip6_urlencode" ]; then + echo "$DATE IPv6 dont need UPDATE..." + return 0 + else + echo "$DATE UPDATING AAAA..." + return 1 + fi +} + + +urlencode() { + # urlencode url + out='' + for c in $(echo -n $1 | sed 's/[^\n]/&\n/g'); do + case $c in + [a-zA-Z0-9._-]) out="$out$c" ;; + *) out="$out$(printf '%%%02X' "'$c")" ;; + esac + done + echo -n $out +} + +send_request() { + # send_request action args + local args="AccessKeyId=$ak_id&Action=$1&Format=json&$2&Version=2015-01-09" + local hash=$(urlencode $(echo -n "GET&%2F&$(urlencode $args)" | openssl dgst -sha1 -hmac "$ak_sec&" -binary | openssl base64)) + curl -sSL --connect-timeout 10 "http://alidns.aliyuncs.com/?$args&Signature=$hash" +} + +get_recordid() { + sed 's/RR/\n/g' | sed -n 's/.*RecordId[^0-9]*\([0-9]*\).*/\1\n/p' | sort -ru | sed /^$/d +} + +query_recordid() { + send_request "DescribeSubDomainRecords" "SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&SubDomain=$dm_escape&Timestamp=$timestamp&Type=A" +} + +query_recordid6() { + send_request "DescribeSubDomainRecords" "SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&SubDomain=$dm_escape&Timestamp=$timestamp&Type=AAAA" +} + +update_record() { + send_request "UpdateDomainRecord" "RR=$sub_dm_escape&RecordId=$1&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&Timestamp=$timestamp&Type=A&Value=$ip" +} + +add_record() { + send_request "AddDomainRecord&DomainName=$main_dm" "RR=$sub_dm_escape&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&Timestamp=$timestamp&Type=A&Value=$ip" +} + +update_record6() { + send_request "UpdateDomainRecord" "RR=$sub_dm_escape&RecordId=$1&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&Timestamp=$timestamp&Type=AAAA&Value=$ip6_escape" +} + +add_record6() { + send_request "AddDomainRecord&DomainName=$main_dm" "RR=$sub_dm_escape&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&Timestamp=$timestamp&Type=AAAA&Value=$ip6_escape" +} + +del_record() { + send_request "DeleteDomainRecord" "RecordId=$1&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&Timestamp=$timestamp" +} + +do_ddns_record() { + if uci_bool_by_name base clean ; then + query_recordid | get_recordid | while read rr; do + echo "$DATE Clean record $dm_show: $rr" + del_record $rr >/dev/null + timestamp=$(date -u "+%Y-%m-%dT%H%%3A%M%%3A%SZ") + done + rrid='' + fi + if [ "Z$rrid" == "Z" ]; then + rrid=`query_recordid | get_recordid` + fi + if [ "Z$rrid" == "Z" ]; then + rrid=`add_record | get_recordid` + echo "$DATE ADD record $rrid" + else + update_record $rrid >/dev/null 2>&1 + echo "$DATE UPDATE record $rrid" + fi + if [ "Z$rrid" == "Z" ]; then + # failed + echo "$DATE # ERROR, Please Check Config/Time" + else + # save rrid + uci set aliddns.base.record_id=$rrid + uci commit aliddns + echo "$DATE # UPDATED($ip)" + fi +} + +do_ddns_record6() { + if uci_bool_by_name base clean ; then + query_recordid6 | get_recordid | while read rr; do + echo "$DATE Clean record $dm_show: $rr" + del_record $rr >/dev/null + timestamp=$(date -u "+%Y-%m-%dT%H%%3A%M%%3A%SZ") + done + rrid6='' + fi + if [ "Z$rrid6" == "Z" ]; then + rrid6=`query_recordid6 | get_recordid` + fi + if [ "Z$rrid6" == "Z" ]; then + rrid6=`add_record6 | get_recordid` + echo "$DATE ADD record $rrid6" + else + update_record6 $rrid6 >/dev/null 2>&1 + echo "$DATE UPDATE record $rrid6" + fi + if [ "Z$rrid6" == "Z" ]; then + # failed + echo "$DATE # ERROR, Please Check Config/Time" + else + # save rrid6 + uci set aliddns.base.record_id6=$rrid6 + uci commit aliddns + echo "$DATE # UPDATED($ip6)" + fi +} + +clean_log() { + if [ $(cat $log_file 2>/dev/null | wc -l) -ge 16 ]; then + rm -f $log_file && touch $log_file + echo "$DATE Log Cleaned" + fi +} + +[ -x /usr/bin/openssl -a -x /usr/bin/curl -a -x /bin/sed ] || { + echo "Need [ openssl + curl + sed ]" + exit 1 +} + +ak_id=$(uci_get_by_name base app_key) +ak_sec=$(uci_get_by_name base app_secret) +rrid=$(uci_get_by_name base record_id) +rrid6=$(uci_get_by_name base record_id6) +main_dm=$(uci_get_by_name base main_domain) +sub_dm=$(uci_get_by_name base sub_domain) + +if [ "Z$sub_dm" == "Z@" -o "Z$sub_dm" == "Z" ]; then + dm_real="$main_dm" +else + dm_real="$sub_dm.$main_dm" +fi +dm_show="$sub_dm.$main_dm" +dm_escape=`urlencode "$sub_dm.$main_dm"` +sub_dm_escape=`urlencode "$sub_dm"` + +iface=$(uci_get_by_name base interface) +if [ "Z$iface" == "Zinternet" -o "Z$iface" == "Z" ]; then + ip=$(intelnetip) +else + ip=$(ubus call network.interface.$iface status | grep '"address"' | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | head -1) +fi + +DATE=$(date +'%Y-%m-%d %H:%M:%S') +timestamp=$(date -u "+%Y-%m-%dT%H%%3A%M%%3A%SZ") + +clean_log +check_aliddns || do_ddns_record + +# exit if ipv6 not-enabled +uci_bool_by_name base ipv6 || exit 0 + +iface6=$(uci_get_by_name base interface6) +if [ "Z$iface6" == "Zinternet" -o "Z$iface6" == "Z" ]; then + ip6=$(intelnetip6) +else + ip6=$(ubus call network.interface.$iface6 status | grep '"address"' | grep -oE '([0-9A-Fa-f]{0,4}:){2,7}([0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){4})' | head -1) +fi +ip6_escape=`urlencode "$ip6"` + +clean_log +check_aliddns6 || do_ddns_record6 diff --git a/luci-app-aliddns/tools/po2lmo/Makefile b/luci-app-aliddns/tools/po2lmo/Makefile new file mode 100644 index 00000000..ad2c1332 --- /dev/null +++ b/luci-app-aliddns/tools/po2lmo/Makefile @@ -0,0 +1,12 @@ + +INSTALL = install +PREFIX = /usr/bin + +po2lmo: src/po2lmo.o src/template_lmo.o + $(CC) $(LDFLAGS) -o src/po2lmo src/po2lmo.o src/template_lmo.o + +install: + $(INSTALL) -m 755 src/po2lmo $(PREFIX) + +clean: + $(RM) src/po2lmo src/*.o diff --git a/luci-app-aliddns/tools/po2lmo/src/po2lmo.c b/luci-app-aliddns/tools/po2lmo/src/po2lmo.c new file mode 100644 index 00000000..0da792b6 --- /dev/null +++ b/luci-app-aliddns/tools/po2lmo/src/po2lmo.c @@ -0,0 +1,247 @@ +/* + * lmo - Lua Machine Objects - PO to LMO conversion tool + * + * Copyright (C) 2009-2012 Jo-Philipp Wich + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "template_lmo.h" + +static void die(const char *msg) +{ + fprintf(stderr, "Error: %s\n", msg); + exit(1); +} + +static void usage(const char *name) +{ + fprintf(stderr, "Usage: %s input.po output.lmo\n", name); + exit(1); +} + +static void print(const void *ptr, size_t size, size_t nmemb, FILE *stream) +{ + if( fwrite(ptr, size, nmemb, stream) == 0 ) + die("Failed to write stdout"); +} + +static int extract_string(const char *src, char *dest, int len) +{ + int pos = 0; + int esc = 0; + int off = -1; + + for( pos = 0; (pos < strlen(src)) && (pos < len); pos++ ) + { + if( (off == -1) && (src[pos] == '"') ) + { + off = pos + 1; + } + else if( off >= 0 ) + { + if( esc == 1 ) + { + switch (src[pos]) + { + case '"': + case '\\': + off++; + break; + } + dest[pos-off] = src[pos]; + esc = 0; + } + else if( src[pos] == '\\' ) + { + dest[pos-off] = src[pos]; + esc = 1; + } + else if( src[pos] != '"' ) + { + dest[pos-off] = src[pos]; + } + else + { + dest[pos-off] = '\0'; + break; + } + } + } + + return (off > -1) ? strlen(dest) : -1; +} + +static int cmp_index(const void *a, const void *b) +{ + uint32_t x = ((const lmo_entry_t *)a)->key_id; + uint32_t y = ((const lmo_entry_t *)b)->key_id; + + if (x < y) + return -1; + else if (x > y) + return 1; + + return 0; +} + +static void print_uint32(uint32_t x, FILE *out) +{ + uint32_t y = htonl(x); + print(&y, sizeof(uint32_t), 1, out); +} + +static void print_index(void *array, int n, FILE *out) +{ + lmo_entry_t *e; + + qsort(array, n, sizeof(*e), cmp_index); + + for (e = array; n > 0; n--, e++) + { + print_uint32(e->key_id, out); + print_uint32(e->val_id, out); + print_uint32(e->offset, out); + print_uint32(e->length, out); + } +} + +int main(int argc, char *argv[]) +{ + char line[4096]; + char key[4096]; + char val[4096]; + char tmp[4096]; + int state = 0; + int offset = 0; + int length = 0; + int n_entries = 0; + void *array = NULL; + lmo_entry_t *entry = NULL; + uint32_t key_id, val_id; + + FILE *in; + FILE *out; + + if( (argc != 3) || ((in = fopen(argv[1], "r")) == NULL) || ((out = fopen(argv[2], "w")) == NULL) ) + usage(argv[0]); + + memset(line, 0, sizeof(key)); + memset(key, 0, sizeof(val)); + memset(val, 0, sizeof(val)); + + while( (NULL != fgets(line, sizeof(line), in)) || (state >= 2 && feof(in)) ) + { + if( state == 0 && strstr(line, "msgid \"") == line ) + { + switch(extract_string(line, key, sizeof(key))) + { + case -1: + die("Syntax error in msgid"); + case 0: + state = 1; + break; + default: + state = 2; + } + } + else if( state == 1 || state == 2 ) + { + if( strstr(line, "msgstr \"") == line || state == 2 ) + { + switch(extract_string(line, val, sizeof(val))) + { + case -1: + state = 4; + break; + default: + state = 3; + } + } + else + { + switch(extract_string(line, tmp, sizeof(tmp))) + { + case -1: + state = 2; + break; + default: + strcat(key, tmp); + } + } + } + else if( state == 3 ) + { + switch(extract_string(line, tmp, sizeof(tmp))) + { + case -1: + state = 4; + break; + default: + strcat(val, tmp); + } + } + + if( state == 4 ) + { + if( strlen(key) > 0 && strlen(val) > 0 ) + { + key_id = sfh_hash(key, strlen(key)); + val_id = sfh_hash(val, strlen(val)); + + if( key_id != val_id ) + { + n_entries++; + array = realloc(array, n_entries * sizeof(lmo_entry_t)); + entry = (lmo_entry_t *)array + n_entries - 1; + + if (!array) + die("Out of memory"); + + entry->key_id = key_id; + entry->val_id = val_id; + entry->offset = offset; + entry->length = strlen(val); + + length = strlen(val) + ((4 - (strlen(val) % 4)) % 4); + + print(val, length, 1, out); + offset += length; + } + } + + state = 0; + memset(key, 0, sizeof(key)); + memset(val, 0, sizeof(val)); + } + + memset(line, 0, sizeof(line)); + } + + print_index(array, n_entries, out); + + if( offset > 0 ) + { + print_uint32(offset, out); + fsync(fileno(out)); + fclose(out); + } + else + { + fclose(out); + unlink(argv[2]); + } + + fclose(in); + return(0); +} diff --git a/luci-app-aliddns/tools/po2lmo/src/template_lmo.c b/luci-app-aliddns/tools/po2lmo/src/template_lmo.c new file mode 100644 index 00000000..27205a72 --- /dev/null +++ b/luci-app-aliddns/tools/po2lmo/src/template_lmo.c @@ -0,0 +1,328 @@ +/* + * lmo - Lua Machine Objects - Base functions + * + * Copyright (C) 2009-2010 Jo-Philipp Wich + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "template_lmo.h" + +/* + * Hash function from http://www.azillionmonkeys.com/qed/hash.html + * Copyright (C) 2004-2008 by Paul Hsieh + */ + +uint32_t sfh_hash(const char *data, int len) +{ + uint32_t hash = len, tmp; + int rem; + + if (len <= 0 || data == NULL) return 0; + + rem = len & 3; + len >>= 2; + + /* Main loop */ + for (;len > 0; len--) { + hash += sfh_get16(data); + tmp = (sfh_get16(data+2) << 11) ^ hash; + hash = (hash << 16) ^ tmp; + data += 2*sizeof(uint16_t); + hash += hash >> 11; + } + + /* Handle end cases */ + switch (rem) { + case 3: hash += sfh_get16(data); + hash ^= hash << 16; + hash ^= data[sizeof(uint16_t)] << 18; + hash += hash >> 11; + break; + case 2: hash += sfh_get16(data); + hash ^= hash << 11; + hash += hash >> 17; + break; + case 1: hash += *data; + hash ^= hash << 10; + hash += hash >> 1; + } + + /* Force "avalanching" of final 127 bits */ + hash ^= hash << 3; + hash += hash >> 5; + hash ^= hash << 4; + hash += hash >> 17; + hash ^= hash << 25; + hash += hash >> 6; + + return hash; +} + +uint32_t lmo_canon_hash(const char *str, int len) +{ + char res[4096]; + char *ptr, prev; + int off; + + if (!str || len >= sizeof(res)) + return 0; + + for (prev = ' ', ptr = res, off = 0; off < len; prev = *str, off++, str++) + { + if (isspace(*str)) + { + if (!isspace(prev)) + *ptr++ = ' '; + } + else + { + *ptr++ = *str; + } + } + + if ((ptr > res) && isspace(*(ptr-1))) + ptr--; + + return sfh_hash(res, ptr - res); +} + +lmo_archive_t * lmo_open(const char *file) +{ + int in = -1; + uint32_t idx_offset = 0; + struct stat s; + + lmo_archive_t *ar = NULL; + + if (stat(file, &s) == -1) + goto err; + + if ((in = open(file, O_RDONLY)) == -1) + goto err; + + if ((ar = (lmo_archive_t *)malloc(sizeof(*ar))) != NULL) + { + memset(ar, 0, sizeof(*ar)); + + ar->fd = in; + ar->size = s.st_size; + + fcntl(ar->fd, F_SETFD, fcntl(ar->fd, F_GETFD) | FD_CLOEXEC); + + if ((ar->mmap = mmap(NULL, ar->size, PROT_READ, MAP_SHARED, ar->fd, 0)) == MAP_FAILED) + goto err; + + idx_offset = ntohl(*((const uint32_t *) + (ar->mmap + ar->size - sizeof(uint32_t)))); + + if (idx_offset >= ar->size) + goto err; + + ar->index = (lmo_entry_t *)(ar->mmap + idx_offset); + ar->length = (ar->size - idx_offset - sizeof(uint32_t)) / sizeof(lmo_entry_t); + ar->end = ar->mmap + ar->size; + + return ar; + } + +err: + if (in > -1) + close(in); + + if (ar != NULL) + { + if ((ar->mmap != NULL) && (ar->mmap != MAP_FAILED)) + munmap(ar->mmap, ar->size); + + free(ar); + } + + return NULL; +} + +void lmo_close(lmo_archive_t *ar) +{ + if (ar != NULL) + { + if ((ar->mmap != NULL) && (ar->mmap != MAP_FAILED)) + munmap(ar->mmap, ar->size); + + close(ar->fd); + free(ar); + + ar = NULL; + } +} + + +lmo_catalog_t *_lmo_catalogs = NULL; +lmo_catalog_t *_lmo_active_catalog = NULL; + +int lmo_load_catalog(const char *lang, const char *dir) +{ + DIR *dh = NULL; + char pattern[16]; + char path[PATH_MAX]; + struct dirent *de = NULL; + + lmo_archive_t *ar = NULL; + lmo_catalog_t *cat = NULL; + + if (!lmo_change_catalog(lang)) + return 0; + + if (!dir || !(dh = opendir(dir))) + goto err; + + if (!(cat = malloc(sizeof(*cat)))) + goto err; + + memset(cat, 0, sizeof(*cat)); + + snprintf(cat->lang, sizeof(cat->lang), "%s", lang); + snprintf(pattern, sizeof(pattern), "*.%s.lmo", lang); + + while ((de = readdir(dh)) != NULL) + { + if (!fnmatch(pattern, de->d_name, 0)) + { + snprintf(path, sizeof(path), "%s/%s", dir, de->d_name); + ar = lmo_open(path); + + if (ar) + { + ar->next = cat->archives; + cat->archives = ar; + } + } + } + + closedir(dh); + + cat->next = _lmo_catalogs; + _lmo_catalogs = cat; + + if (!_lmo_active_catalog) + _lmo_active_catalog = cat; + + return 0; + +err: + if (dh) closedir(dh); + if (cat) free(cat); + + return -1; +} + +int lmo_change_catalog(const char *lang) +{ + lmo_catalog_t *cat; + + for (cat = _lmo_catalogs; cat; cat = cat->next) + { + if (!strncmp(cat->lang, lang, sizeof(cat->lang))) + { + _lmo_active_catalog = cat; + return 0; + } + } + + return -1; +} + +static lmo_entry_t * lmo_find_entry(lmo_archive_t *ar, uint32_t hash) +{ + unsigned int m, l, r; + uint32_t k; + + l = 0; + r = ar->length - 1; + + while (1) + { + m = l + ((r - l) / 2); + + if (r < l) + break; + + k = ntohl(ar->index[m].key_id); + + if (k == hash) + return &ar->index[m]; + + if (k > hash) + { + if (!m) + break; + + r = m - 1; + } + else + { + l = m + 1; + } + } + + return NULL; +} + +int lmo_translate(const char *key, int keylen, char **out, int *outlen) +{ + uint32_t hash; + lmo_entry_t *e; + lmo_archive_t *ar; + + if (!key || !_lmo_active_catalog) + return -2; + + hash = lmo_canon_hash(key, keylen); + + for (ar = _lmo_active_catalog->archives; ar; ar = ar->next) + { + if ((e = lmo_find_entry(ar, hash)) != NULL) + { + *out = ar->mmap + ntohl(e->offset); + *outlen = ntohl(e->length); + return 0; + } + } + + return -1; +} + +void lmo_close_catalog(const char *lang) +{ + lmo_archive_t *ar, *next; + lmo_catalog_t *cat, *prev; + + for (prev = NULL, cat = _lmo_catalogs; cat; prev = cat, cat = cat->next) + { + if (!strncmp(cat->lang, lang, sizeof(cat->lang))) + { + if (prev) + prev->next = cat->next; + else + _lmo_catalogs = cat->next; + + for (ar = cat->archives; ar; ar = next) + { + next = ar->next; + lmo_close(ar); + } + + free(cat); + break; + } + } +} diff --git a/luci-app-aliddns/tools/po2lmo/src/template_lmo.h b/luci-app-aliddns/tools/po2lmo/src/template_lmo.h new file mode 100644 index 00000000..57f59aa5 --- /dev/null +++ b/luci-app-aliddns/tools/po2lmo/src/template_lmo.h @@ -0,0 +1,92 @@ +/* + * lmo - Lua Machine Objects - General header + * + * Copyright (C) 2009-2012 Jo-Philipp Wich + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _TEMPLATE_LMO_H_ +#define _TEMPLATE_LMO_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if (defined(__GNUC__) && defined(__i386__)) +#define sfh_get16(d) (*((const uint16_t *) (d))) +#else +#define sfh_get16(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)\ + +(uint32_t)(((const uint8_t *)(d))[0]) ) +#endif + + +struct lmo_entry { + uint32_t key_id; + uint32_t val_id; + uint32_t offset; + uint32_t length; +} __attribute__((packed)); + +typedef struct lmo_entry lmo_entry_t; + + +struct lmo_archive { + int fd; + int length; + uint32_t size; + lmo_entry_t *index; + char *mmap; + char *end; + struct lmo_archive *next; +}; + +typedef struct lmo_archive lmo_archive_t; + + +struct lmo_catalog { + char lang[6]; + struct lmo_archive *archives; + struct lmo_catalog *next; +}; + +typedef struct lmo_catalog lmo_catalog_t; + + +uint32_t sfh_hash(const char *data, int len); +uint32_t lmo_canon_hash(const char *data, int len); + +lmo_archive_t * lmo_open(const char *file); +void lmo_close(lmo_archive_t *ar); + + +extern lmo_catalog_t *_lmo_catalogs; +extern lmo_catalog_t *_lmo_active_catalog; + +int lmo_load_catalog(const char *lang, const char *dir); +int lmo_change_catalog(const char *lang); +int lmo_translate(const char *key, int keylen, char **out, int *outlen); +void lmo_close_catalog(const char *lang); + +#endif diff --git a/luci-app-argon-config b/luci-app-argon-config deleted file mode 160000 index 9e2f3e5e..00000000 --- a/luci-app-argon-config +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 9e2f3e5eba0a9ab64433414d63fe7eeb221a5d2e diff --git a/luci-app-argon-config/.github/workflows/build.sh b/luci-app-argon-config/.github/workflows/build.sh new file mode 100755 index 00000000..e34e3185 --- /dev/null +++ b/luci-app-argon-config/.github/workflows/build.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +sed -i 's/git\.openwrt\.org\/project\/luci/github\.com\/openwrt\/luci/g' ./feeds.conf.default +./scripts/feeds update luci +./scripts/feeds install luci +mv ./bin/luci-app-argon-config ./package/ +make defconfig +make package/luci-app-argon-config/compile V=s -j$(nproc) BUILD_LOG=1 + +tar -cJf logs.tar.xz logs +mv logs.tar.xz bin diff --git a/luci-app-argon-config/.github/workflows/check.yml b/luci-app-argon-config/.github/workflows/check.yml new file mode 100644 index 00000000..c6c3a056 --- /dev/null +++ b/luci-app-argon-config/.github/workflows/check.yml @@ -0,0 +1,41 @@ +name: CI + +on: + push: + branches: + - master + tags-ignore: + - 'release-*' + paths: + - 'luci-app-argon-config/**' + pull_request: + branches: + - master + +jobs: + build: + name: Build the IPK + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@master + - name: Prepare + run: | + mkdir -p bin/luci-app-argon-config + cp -rf ./luasrc ./po ./root ./Makefile ./bin/luci-app-argon-config + - name: Docker Build + run: | + docker pull openwrtorg/sdk:x86-64-21.02-SNAPSHOT + docker run --rm -u root -v "$(pwd)"/bin/:/home/build/openwrt/bin -v ${{ github.workspace }}/.github/workflows:/home/build/workflows openwrtorg/sdk:x86-64-21.02-SNAPSHOT /bin/sh /home/build/workflows/build.sh + - name: Upload app + uses: actions/upload-artifact@v2 + with: + name: luci-app-argon-config + path: ./bin/packages/x86_64/base/*argon-config* + if-no-files-found: error + - name: Upload Log + if: ${{ always() }} + uses: actions/upload-artifact@v2 + with: + name: buildlog + path: bin/logs.tar.xz diff --git a/luci-app-argon-config/.github/workflows/release.yml b/luci-app-argon-config/.github/workflows/release.yml new file mode 100644 index 00000000..61e18dca --- /dev/null +++ b/luci-app-argon-config/.github/workflows/release.yml @@ -0,0 +1,39 @@ +name: Release + +on: + push: + tags: + - 'release-*' + +jobs: + build: + name: Build the IPK + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@master + - name: Prepare + run: | + mkdir -p bin/luci-app-argon-config + cp -rf ./luasrc ./po ./root ./Makefile ./bin/luci-app-argon-config + - name: Docker Build + run: | + docker pull openwrtorg/sdk:x86-64-21.02-SNAPSHOT + docker run --rm -u root -v "$(pwd)"/bin/:/home/build/openwrt/bin -v ${{ github.workspace }}/.github/workflows:/home/build/workflows openwrtorg/sdk:x86-64-21.02-SNAPSHOT /bin/sh /home/build/workflows/build.sh + - name: Release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + set -x + assets=() + for asset in ./bin/packages/x86_64/base/*argon-config*.ipk; do + assets+=("-a" "$asset") + done + tag_name=$(basename ${{github.ref}}) + hub release create -p "${assets[@]}" -m "$tag_name" "$tag_name" + - name: Upload Log + if: ${{ always() }} + uses: actions/upload-artifact@v2 + with: + name: buildlog + path: bin/logs.tar.xz diff --git a/luci-app-argon-config/Makefile b/luci-app-argon-config/Makefile new file mode 100644 index 00000000..500a33f8 --- /dev/null +++ b/luci-app-argon-config/Makefile @@ -0,0 +1,19 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=luci-app-argon-config +PKG_VERSION:=0.9 +PKG_RELEASE:=20220424 + +PKG_MAINTAINER:=jerrykuku + +LUCI_TITLE:=LuCI page for Argon Config +LUCI_PKGARCH:=all +LUCI_DEPENDS:=+luci-compat +luci-lib-ipkg +luci-theme-argon + +define Package/$(PKG_NAME)/conffiles +/etc/config/argon +endef + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/luci-app-argon-config/README.md b/luci-app-argon-config/README.md new file mode 100644 index 00000000..59212036 --- /dev/null +++ b/luci-app-argon-config/README.md @@ -0,0 +1,4 @@ +# luci-app-argon-config +Argon Theme Config Plugin + +You can set the blur and transparency of the login page of argon theme, and manage the background pictures and videos. \ No newline at end of file diff --git a/luci-app-argon-config/luasrc/controller/argon-config.lua b/luci-app-argon-config/luasrc/controller/argon-config.lua new file mode 100644 index 00000000..5d7faf45 --- /dev/null +++ b/luci-app-argon-config/luasrc/controller/argon-config.lua @@ -0,0 +1,10 @@ +module("luci.controller.argon-config", package.seeall) + +function index() + if not nixio.fs.access('/www/luci-static/argon/css/cascade.css') then + return + end + + local page = entry({"admin", "system", "argon-config"}, form("argon-config"), _("Argon Config"), 90) + page.acl_depends = { "luci-app-argon-config" } +end diff --git a/luci-app-argon-config/luasrc/model/cbi/argon-config.lua b/luci-app-argon-config/luasrc/model/cbi/argon-config.lua new file mode 100644 index 00000000..ced16c47 --- /dev/null +++ b/luci-app-argon-config/luasrc/model/cbi/argon-config.lua @@ -0,0 +1,217 @@ +local nxfs = require 'nixio.fs' +local wa = require 'luci.tools.webadmin' +local opkg = require 'luci.model.ipkg' +local sys = require 'luci.sys' +local http = require 'luci.http' +local nutil = require 'nixio.util' +local name = 'argon' +local uci = require 'luci.model.uci'.cursor() + +local fstat = nxfs.statvfs(opkg.overlay_root()) +local space_total = fstat and fstat.blocks or 0 +local space_free = fstat and fstat.bfree or 0 +local space_used = space_total - space_free + +local free_byte = space_free * fstat.frsize + +local primary, dark_primary, blur_radius, blur_radius_dark, blur_opacity, mode +if nxfs.access('/etc/config/argon') then + primary = uci:get_first('argon', 'global', 'primary') + dark_primary = uci:get_first('argon', 'global', 'dark_primary') + blur_radius = uci:get_first('argon', 'global', 'blur') + blur_radius_dark = uci:get_first('argon', 'global', 'blur_dark') + blur_opacity = uci:get_first('argon', 'global', 'transparency') + blur_opacity_dark = uci:get_first('argon', 'global', 'transparency_dark') + mode = uci:get_first('argon', 'global', 'mode') + bing_background = uci:get_first('argon', 'global', 'bing_background') +end + +function glob(...) + local iter, code, msg = nxfs.glob(...) + if iter then + return nutil.consume(iter) + else + return nil, code, msg + end +end + +local transparency_sets = { + 0, + 0.1, + 0.2, + 0.3, + 0.4, + 0.5, + 0.6, + 0.7, + 0.8, + 0.9, + 1 +} + +-- [[ 模糊设置 ]]-- +br = SimpleForm('config', translate('Argon Config'), translate('Here you can set the blur and transparency of the login page of argon theme, and manage the background pictures and videos.[Chrome is recommended]')) +br.reset = false +br.submit = false +s = br:section(SimpleSection) + +o = s:option(ListValue, 'bing_background', translate('Wallpaper Source')) +o:value('0', translate('Built-in')) +o:value('1', translate('Bing Wallpapers')) +o.default = bing_background +o.rmempty = false + +o = s:option(ListValue, 'mode', translate('Theme mode')) +o:value('normal', translate('Follow System')) +o:value('light', translate('Force Light')) +o:value('dark', translate('Force Dark')) +o.default = mode +o.rmempty = false +o.description = translate('You can choose Theme color mode here') + +o = s:option(Value, 'primary', translate('[Light mode] Primary Color'), translate('A HEX Color ; ( Default: #5e72e4 )')) +o.default = primary +o.datatype = ufloat +o.rmempty = false + + + +o = s:option(ListValue, 'transparency', translate('[Light mode] Transparency'), translate('0 transparent - 1 opaque ; ( Suggest: transparent: 0 or translucent preset: 0.5 )')) +for _, v in ipairs(transparency_sets) do + o:value(v) +end +o.default = blur_opacity +o.datatype = ufloat +o.rmempty = false + +o = s:option(Value, 'blur', translate('[Light mode] Frosted Glass Radius'), translate('Larger value will more blurred ; ( Suggest: clear: 1 or blur preset: 10 )')) +o.default = blur_radius +o.datatype = ufloat +o.rmempty = false + +o = s:option(Value, 'dark_primary', translate('[Dark mode] Primary Color'), translate('A HEX Color ; ( Default: #483d8b )')) +o.default = dark_primary +o.datatype = ufloat +o.rmempty = false + +o = s:option(ListValue, 'transparency_dark', translate('[Dark mode] Transparency'), translate('0 transparent - 1 opaque ; ( Suggest: Black translucent preset: 0.5 )')) +for _, v in ipairs(transparency_sets) do + o:value(v) +end +o.default = blur_opacity_dark +o.datatype = ufloat +o.rmempty = false + +o = s:option(Value, 'blur_dark', translate('[Dark mode] Frosted Glass Radius'), translate('Larger value will more blurred ; ( Suggest: clear: 1 or blur preset: 10 )')) +o.default = blur_radius_dark +o.datatype = ufloat +o.rmempty = false + +o = s:option(Button, 'save', translate('Save Changes')) +o.inputstyle = 'reload' + +function br.handle(self, state, data) + if (state == FORM_VALID and data.blur ~= nil and data.blur_dark ~= nil and data.transparency ~= nil and data.transparency_dark ~= nil and data.mode ~= nil) then + nxfs.writefile('/tmp/aaa', data) + for key, value in pairs(data) do + uci:set('argon','@global[0]',key,value) + end + uci:commit('argon') + end + return true +end + +ful = SimpleForm('upload', translate('Upload (Free: ') .. wa.byte_format(free_byte) .. ')', translate("You can upload files such as jpg,png,gif,webp,mp4,webm files, To change the login page background.")) +ful.reset = false +ful.submit = false + +sul = ful:section(SimpleSection, '', translate("Upload file to '/www/luci-static/argon/background/'")) +fu = sul:option(FileUpload, '') +fu.template = 'argon-config/other_upload' +um = sul:option(DummyValue, '', nil) +um.template = 'argon-config/other_dvalue' + +local dir, fd +dir = '/www/luci-static/argon/background/' +nxfs.mkdir(dir) +http.setfilehandler( + function(meta, chunk, eof) + if not fd then + if not meta then + return + end + + if meta and chunk then + fd = nixio.open(dir .. meta.file, 'w') + end + + if not fd then + um.value = translate('Create upload file error.') + return + end + end + if chunk and fd then + fd:write(chunk) + end + if eof and fd then + fd:close() + fd = nil + um.value = translate('File saved to') .. ' "/www/luci-static/argon/background/' .. meta.file .. '"' + end + end +) + +if http.formvalue('upload') then + local f = http.formvalue('ulfile') + if #f <= 0 then + um.value = translate('No specify upload file.') + end +end + +local function getSizeStr(size) + local i = 0 + local byteUnits = {' kB', ' MB', ' GB', ' TB'} + repeat + size = size / 1024 + i = i + 1 + until (size <= 1024) + return string.format('%.1f', size) .. byteUnits[i] +end + +local inits, attr = {} +for i, f in ipairs(glob(dir .. '*')) do + attr = nxfs.stat(f) + if attr then + inits[i] = {} + inits[i].name = nxfs.basename(f) + inits[i].mtime = os.date('%Y-%m-%d %H:%M:%S', attr.mtime) + inits[i].modestr = attr.modestr + inits[i].size = getSizeStr(attr.size) + inits[i].remove = 0 + inits[i].install = false + end +end + +form = SimpleForm('filelist', translate('Background file list'), nil) +form.reset = false +form.submit = false + +tb = form:section(Table, inits) +nm = tb:option(DummyValue, 'name', translate('File name')) +mt = tb:option(DummyValue, 'mtime', translate('Modify time')) +sz = tb:option(DummyValue, 'size', translate('Size')) +btnrm = tb:option(Button, 'remove', translate('Remove')) +btnrm.render = function(self, section, scope) + self.inputstyle = 'remove' + Button.render(self, section, scope) +end + +btnrm.write = function(self, section) + local v = nxfs.unlink(dir .. nxfs.basename(inits[section].name)) + if v then + table.remove(inits, section) + end + return v +end + +return br, ful, form diff --git a/luci-app-argon-config/luasrc/view/argon-config/other_button.htm b/luci-app-argon-config/luasrc/view/argon-config/other_button.htm new file mode 100644 index 00000000..1c391ad9 --- /dev/null +++ b/luci-app-argon-config/luasrc/view/argon-config/other_button.htm @@ -0,0 +1,7 @@ +<%+cbi/valueheader%> + <% if self:cfgvalue(section) ~= false then %> + " style="display: <%= display %>" type="submit"<%= attr("name", cbid) .. attr("id", cbid) .. attr("value", self.inputtitle or self.title)%> /> + <% else %> + - + <% end %> +<%+cbi/valuefooter%> diff --git a/luci-app-argon-config/luasrc/view/argon-config/other_dvalue.htm b/luci-app-argon-config/luasrc/view/argon-config/other_dvalue.htm new file mode 100644 index 00000000..296c61e4 --- /dev/null +++ b/luci-app-argon-config/luasrc/view/argon-config/other_dvalue.htm @@ -0,0 +1,8 @@ +<%+cbi/valueheader%> + +<% + local val = self:cfgvalue(section) or self.default or "" + write(pcdata(val)) +%> + +<%+cbi/valuefooter%> diff --git a/luci-app-argon-config/luasrc/view/argon-config/other_upload.htm b/luci-app-argon-config/luasrc/view/argon-config/other_upload.htm new file mode 100644 index 00000000..775629f3 --- /dev/null +++ b/luci-app-argon-config/luasrc/view/argon-config/other_upload.htm @@ -0,0 +1,5 @@ +<%+cbi/valueheader%> + + + +<%+cbi/valuefooter%> diff --git a/luci-app-argon-config/po/es/argon-config.po b/luci-app-argon-config/po/es/argon-config.po new file mode 100644 index 00000000..e6670acc --- /dev/null +++ b/luci-app-argon-config/po/es/argon-config.po @@ -0,0 +1,179 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: 2021-03-15 21:25-0300\n" +"PO-Revision-Date: 2022-04-23 15:21-0300\n" +"Last-Translator: Franco Castillo \n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 3.0.1\n" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:97 +msgid "0 transparent - 1 opaque ; ( Suggest: Black translucent preset: 0.5 )" +msgstr "" +"0 transparente - 1 opaco; (Sugerencia: negro translúcido preestablecido: 0.5)" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:79 +msgid "" +"0 transparent - 1 opaque ; ( Suggest: transparent: 0 or translucent preset: " +"0.5 )" +msgstr "" +"0 transparente - 1 opaco; (Sugerencia: transparente: 0 o translúcido " +"preestablecido: 0.5)" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:92 +msgid "A HEX Color ; ( Default: #483d8b )" +msgstr "Un color HEX; (Predeterminado: #483d8b)" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:72 +msgid "A HEX Color ; ( Default: #5e72e4 )" +msgstr "Un color HEX; (Predeterminado: #5e72e4)" + +#: applications/luci-app-argon-config/luasrc/controller/argon-config.lua:8 +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:53 +msgid "Argon Config" +msgstr "Configuración de Argon" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:195 +msgid "Background file list" +msgstr "Lista de archivos de fondo" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:60 +msgid "Bing Wallpapers" +msgstr "Fondos de Bing" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:59 +msgid "Built-in" +msgstr "Integrado" + +#: applications/luci-app-argon-config/luasrc/view/argon-config/other_upload.htm:2 +msgid "Choose local file:" +msgstr "Elija un archivo local:" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:149 +msgid "Create upload file error." +msgstr "Crear archivo de error de carga." + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:200 +msgid "File name" +msgstr "Nombre del archivo" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:159 +msgid "File saved to" +msgstr "Archivo guardado en" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:65 +msgid "Follow System" +msgstr "Seguir el sistema" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:67 +msgid "Force Dark" +msgstr "Forzar oscuro" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:66 +msgid "Force Light" +msgstr "Forzar claro" + +#: applications/luci-app-argon-config/root/usr/share/rpcd/acl.d/luci-app-argon-config.json:3 +msgid "Grant UCI access for luci-app-argon-config" +msgstr "Otorgar acceso UCI para luci-app-argon-config" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:53 +msgid "" +"Here you can set the blur and transparency of the login page of argon theme, " +"and manage the background pictures and videos.[Chrome is recommended]" +msgstr "" +"Aquí puede configurar el desenfoque y la transparencia de la página de " +"inicio de sesión del tema argon y administrar las imágenes de fondo y los " +"videos. [Se recomienda Chrome]" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:87 +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:105 +msgid "" +"Larger value will more blurred ; ( Suggest: clear: 1 or blur preset: 10 )" +msgstr "" +"El valor más grande se verá más borroso; (Sugerencia: claro: 1 o desenfoque " +"predeterminado: 10)" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:201 +msgid "Modify time" +msgstr "Modificar la hora" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:167 +msgid "No specify upload file." +msgstr "No especificar archivo de carga." + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:203 +msgid "Remove" +msgstr "Eliminar" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:110 +msgid "Save Changes" +msgstr "Guardar cambios" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:202 +msgid "Size" +msgstr "Tamaño" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:64 +msgid "Theme mode" +msgstr "Modo del tema" + +#: applications/luci-app-argon-config/luasrc/view/argon-config/other_upload.htm:4 +msgid "Upload" +msgstr "Cargar" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:124 +msgid "Upload (Free:" +msgstr "Cargar (Libre:" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:128 +msgid "Upload file to '/www/luci-static/argon/background/'" +msgstr "Subir archivo a '/www/luci-static/argon/background/'" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:58 +msgid "Wallpaper Source" +msgstr "Fuente del fondo de pantalla" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:70 +msgid "You can choose Theme color mode here" +msgstr "Puede elegir el modo de color del tema aquí" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:124 +msgid "" +"You can upload files such as jpg,png,gif,webp,mp4,webm files, To change the login page " +"background." +msgstr "" +"Puede cargar archivos como jpg, png, gif, webp, mp4, webm, para cambiar el fondo de la " +"página de inicio de sesión." + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:105 +msgid "[Dark mode] Frosted Glass Radius" +msgstr "[Modo oscuro] Radio de vidrio esmerilado" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:92 +msgid "[Dark mode] Primary Color" +msgstr "[Modo oscuro] Color primario" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:97 +msgid "[Dark mode] Transparency" +msgstr "[Modo oscuro] Transparencia" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:87 +msgid "[Light mode] Frosted Glass Radius" +msgstr "[Modo claro] Radio de vidrio esmerilado" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:72 +msgid "[Light mode] Primary Color" +msgstr "[Modo claro] Color primario" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:79 +msgid "[Light mode] Transparency" +msgstr "[Modo claro] Transparencia" + +#~ msgid "Luci Argon theme config" +#~ msgstr "Configuración del tema Luci Argon" diff --git a/luci-app-argon-config/po/templates/argon-config.pot b/luci-app-argon-config/po/templates/argon-config.pot new file mode 100644 index 00000000..4b56ec11 --- /dev/null +++ b/luci-app-argon-config/po/templates/argon-config.pot @@ -0,0 +1,155 @@ +msgid "" +msgstr "Content-Type: text/plain; charset=UTF-8" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:97 +msgid "0 transparent - 1 opaque ; ( Suggest: Black translucent preset: 0.5 )" +msgstr "" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:79 +msgid "" +"0 transparent - 1 opaque ; ( Suggest: transparent: 0 or translucent preset: " +"0.5 )" +msgstr "" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:92 +msgid "A HEX Color ; ( Default: #483d8b )" +msgstr "" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:72 +msgid "A HEX Color ; ( Default: #5e72e4 )" +msgstr "" + +#: applications/luci-app-argon-config/luasrc/controller/argon-config.lua:8 +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:53 +msgid "Argon Config" +msgstr "" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:195 +msgid "Background file list" +msgstr "" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:60 +msgid "Bing Wallpapers" +msgstr "" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:59 +msgid "Built-in" +msgstr "" + +#: applications/luci-app-argon-config/luasrc/view/argon-config/other_upload.htm:2 +msgid "Choose local file:" +msgstr "" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:149 +msgid "Create upload file error." +msgstr "" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:200 +msgid "File name" +msgstr "" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:159 +msgid "File saved to" +msgstr "" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:65 +msgid "Follow System" +msgstr "" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:67 +msgid "Force Dark" +msgstr "" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:66 +msgid "Force Light" +msgstr "" + +#: applications/luci-app-argon-config/root/usr/share/rpcd/acl.d/luci-app-argon-config.json:3 +msgid "Grant UCI access for luci-app-argon-config" +msgstr "" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:53 +msgid "" +"Here you can set the blur and transparency of the login page of argon theme, " +"and manage the background pictures and videos.[Chrome is recommended]" +msgstr "" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:87 +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:105 +msgid "" +"Larger value will more blurred ; ( Suggest: clear: 1 or blur preset: 10 )" +msgstr "" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:201 +msgid "Modify time" +msgstr "" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:167 +msgid "No specify upload file." +msgstr "" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:203 +msgid "Remove" +msgstr "" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:110 +msgid "Save Changes" +msgstr "" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:202 +msgid "Size" +msgstr "" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:64 +msgid "Theme mode" +msgstr "" + +#: applications/luci-app-argon-config/luasrc/view/argon-config/other_upload.htm:4 +msgid "Upload" +msgstr "" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:124 +msgid "Upload (Free:" +msgstr "" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:128 +msgid "Upload file to '/www/luci-static/argon/background/'" +msgstr "" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:58 +msgid "Wallpaper Source" +msgstr "" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:70 +msgid "You can choose Theme color mode here" +msgstr "" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:124 +msgid "" +"You can upload files such as jpg,png,gif,webp,mp4,webm files, To change the login page " +"background." +msgstr "" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:105 +msgid "[Dark mode] Frosted Glass Radius" +msgstr "" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:92 +msgid "[Dark mode] Primary Color" +msgstr "" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:97 +msgid "[Dark mode] Transparency" +msgstr "" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:87 +msgid "[Light mode] Frosted Glass Radius" +msgstr "" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:72 +msgid "[Light mode] Primary Color" +msgstr "" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:79 +msgid "[Light mode] Transparency" +msgstr "" diff --git a/luci-app-argon-config/po/zh-cn/argon-config.po b/luci-app-argon-config/po/zh-cn/argon-config.po new file mode 100644 index 00000000..6b173412 --- /dev/null +++ b/luci-app-argon-config/po/zh-cn/argon-config.po @@ -0,0 +1,129 @@ +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: dingpengyu \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"X-Generator: Poedit 2.3.1\n" + +msgid "Argon Config" +msgstr "Argon 主题设置" + +msgid "Here you can set the blur and transparency of the login page of argon theme, and manage the background pictures and videos.[Chrome is recommended]" +msgstr "在这里你可以设置argon 主题的登录页面的模糊和透明度,并管理背景图片与视频。[建议使用 Chrome]" + +msgid "Wallpaper Source" +msgstr "壁纸来源" + +msgid "Built-in" +msgstr "内建" + +msgid "Bing Wallpapers" +msgstr "Bing 壁纸" + +msgid "Theme mode" +msgstr "主题模式" + +msgid "Follow System" +msgstr "跟随系统" + +msgid "Force Light" +msgstr "强制亮色" + +msgid "Force Dark" +msgstr "强制暗色" + +msgid "You can choose Theme color mode here" +msgstr "你可以选择喜欢的主题模式" + +msgid "[Light mode] Primary Color" +msgstr "[亮色模式] 主色调" + +msgid "[Dark mode] Primary Color" +msgstr "[暗色模式] 主色调" + +msgid "A HEX Color ; ( Default: #5e72e4 )" +msgstr "十六进制颜色值 ( 预设为:#5e72e4 )" + +msgid "A HEX Color ; ( Default: #483d8b )" +msgstr "十六进制颜色值 ( 预设为:#483d8b )" + +msgid "[Light mode] Transparency" +msgstr "[亮色模式] 透明度" + +msgid "[Dark mode] Transparency" +msgstr "[暗色模式] 透明度" + +msgid "0 transparent - 1 opaque ; ( Suggest: transparent: 0 or translucent preset: 0.5 )" +msgstr "0最透明 - 1不透明 ; ( 建议: 透明 0 或 半透明预设 0.5 )" + +msgid "0 transparent - 1 opaque ; ( Suggest: Black translucent preset: 0.5 )" +msgstr "0最透明 - 1不透明 ; ( 建议: 黑色半透明 0.5 )" + +msgid "[Light mode] Frosted Glass Radius" +msgstr "[亮色模式] 毛玻璃模糊半径" + +msgid "[Dark mode] Frosted Glass Radius" +msgstr "[暗色模式] 毛玻璃模糊半径" + +msgid "Larger value will more blurred ; ( Suggest: clear: 1 or blur preset: 10 )" +msgstr "值越大越模糊; ( 建议: 清透 1 或 模糊预设 10 )" + +msgid "You can upload files such as jpg,png,gif,webp,mp4,webm files, To change the login page background." +msgstr "你可以上传jpg、png、gif、webp或mp4、webm文件,以创建自己喜欢的登录界面" + +msgid "Save Changes" +msgstr "保存更改" + +msgid "Choose local file:" +msgstr "选择本地文件:" + +msgid "Couldn't open file:" +msgstr "无法打开文件:" + +msgid "Create upload file error." +msgstr "创建上传文件失败。" + +msgid "File name" +msgstr "文件名" + +msgid "File saved to" +msgstr "文件保存到" + +msgid "FileTransfer" +msgstr "文件传输" + +msgid "Install" +msgstr "安装" + +msgid "Attributes" +msgstr "属性" + +msgid "Modify time" +msgstr "修改时间" + +msgid "No specify upload file." +msgstr "未指定上传文件。" + +msgid "Path on Route:" +msgstr "路由根目录:" + +msgid "Remove" +msgstr "移除" + +msgid "Size" +msgstr "大小" + +msgid "Upload (Free:" +msgstr "上传 (剩余空间:" + +msgid "Background file list" +msgstr "背景文件列表" + +msgid "Upload file to '/www/luci-static/argon/background/'" +msgstr "文件将上传到'/www/luci-static/argon/background/'" diff --git a/luci-app-argon-config/po/zh-tw/argon-config.po b/luci-app-argon-config/po/zh-tw/argon-config.po new file mode 100644 index 00000000..ea2523c1 --- /dev/null +++ b/luci-app-argon-config/po/zh-tw/argon-config.po @@ -0,0 +1,165 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: Victor Tseng \n" +"Language-Team: \n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.2.2\n" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:97 +msgid "0 transparent - 1 opaque ; ( Suggest: Black translucent preset: 0.5 )" +msgstr "0 全透明 - 1 不透明(建議:黑色半透明 0.5)" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:79 +msgid "" +"0 transparent - 1 opaque ; ( Suggest: transparent: 0 or translucent preset: 0.5 )" +msgstr "0 全透明 - 1 不透明(建議:全透明 0,或半透明 0.5)" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:92 +msgid "A HEX Color ; ( Default: #483d8b )" +msgstr "十六進制顏色(預設 #483d8b)" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:72 +msgid "A HEX Color ; ( Default: #5e72e4 )" +msgstr "十六進制顏色(預設 #5e72e4)" + +#: applications/luci-app-argon-config/luasrc/controller/argon-config.lua:8 +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:53 +msgid "Argon Config" +msgstr "Argon 設定" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:195 +msgid "Background file list" +msgstr "背景檔案清單" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:60 +msgid "Bing Wallpapers" +msgstr "必應桌布" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:59 +msgid "Built-in" +msgstr "內建" + +#: applications/luci-app-argon-config/luasrc/view/argon-config/other_upload.htm:2 +msgid "Choose local file:" +msgstr "選擇本地檔案:" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:149 +msgid "Create upload file error." +msgstr "建立上傳檔案錯誤。" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:200 +msgid "File name" +msgstr "檔案名稱" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:159 +msgid "File saved to" +msgstr "檔案已儲存至" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:65 +msgid "Follow System" +msgstr "跟隨系統配色" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:67 +msgid "Force Dark" +msgstr "強制深色" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:66 +msgid "Force Light" +msgstr "強制淺色" + +#: applications/luci-app-argon-config/root/usr/share/rpcd/acl.d/luci-app-argon-config.json:3 +msgid "Grant UCI access for luci-app-argon-config" +msgstr "為 luci-app-argon-config 授予 UCI 權限" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:53 +msgid "" +"Here you can set the blur and transparency of the login page of argon theme, and " +"manage the background pictures and videos.[Chrome is recommended]" +msgstr "" +"您可以在此設定登入畫面的模糊度、透明度、以及管理背景圖片與影片(推薦使用 " +"Chrome)。" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:87 +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:105 +msgid "Larger value will more blurred ; ( Suggest: clear: 1 or blur preset: 10 )" +msgstr "數值越大越模糊(建議:清晰 1,或模糊程度 10)" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:201 +msgid "Modify time" +msgstr "修改時間" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:167 +msgid "No specify upload file." +msgstr "沒有選擇要上傳的檔案。" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:203 +msgid "Remove" +msgstr "移除" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:110 +msgid "Save Changes" +msgstr "保存變更" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:202 +msgid "Size" +msgstr "容量" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:64 +msgid "Theme mode" +msgstr "佈景主題模式" + +#: applications/luci-app-argon-config/luasrc/view/argon-config/other_upload.htm:4 +msgid "Upload" +msgstr "上傳" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:124 +msgid "Upload (Free:" +msgstr "上傳(剩餘空間:" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:128 +msgid "Upload file to '/www/luci-static/argon/background/'" +msgstr "上傳檔案至「/www/luci-static/argon/background」" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:58 +msgid "Wallpaper Source" +msgstr "桌布來源" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:70 +msgid "You can choose Theme color mode here" +msgstr "您可以在此選擇佈景主題的顏色模式" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:124 +msgid "" +"You can upload files such as jpg,png,gif,mp4,webm files, To change the login page " +"background." +msgstr "您可以上傳諸如 jpg、png、gif、mp4、webm 等類型的檔案來更換登入畫面的背景。" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:105 +msgid "[Dark mode] Frosted Glass Radius" +msgstr "《深色模式》模糊效果半徑" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:92 +msgid "[Dark mode] Primary Color" +msgstr "《深色模式》主色彩" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:97 +msgid "[Dark mode] Transparency" +msgstr "《深色模式》透明度" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:87 +msgid "[Light mode] Frosted Glass Radius" +msgstr "《淺色模式》模糊效果半徑" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:72 +msgid "[Light mode] Primary Color" +msgstr "《淺色模式》主色彩" + +#: applications/luci-app-argon-config/luasrc/model/cbi/argon-config.lua:79 +msgid "[Light mode] Transparency" +msgstr "《淺色模式》透明度" diff --git a/luci-app-argon-config/po/zh_Hans b/luci-app-argon-config/po/zh_Hans new file mode 120000 index 00000000..41451e4a --- /dev/null +++ b/luci-app-argon-config/po/zh_Hans @@ -0,0 +1 @@ +zh-cn \ No newline at end of file diff --git a/luci-app-argon-config/po/zh_Hant b/luci-app-argon-config/po/zh_Hant new file mode 120000 index 00000000..f6e591fd --- /dev/null +++ b/luci-app-argon-config/po/zh_Hant @@ -0,0 +1 @@ +zh-tw \ No newline at end of file diff --git a/luci-app-argon-config/root/etc/config/argon b/luci-app-argon-config/root/etc/config/argon new file mode 100644 index 00000000..fb7f35d9 --- /dev/null +++ b/luci-app-argon-config/root/etc/config/argon @@ -0,0 +1,9 @@ +config global + option primary '#5e72e4' + option dark_primary '#483d8b' + option blur '10' + option blur_dark '10' + option transparency '0.5' + option transparency_dark '0.5' + option mode 'normal' + option bing_background '0' diff --git a/luci-app-argon-config/root/etc/uci-defaults/luci-argon-config b/luci-app-argon-config/root/etc/uci-defaults/luci-argon-config new file mode 100755 index 00000000..935d7c8b --- /dev/null +++ b/luci-app-argon-config/root/etc/uci-defaults/luci-argon-config @@ -0,0 +1,6 @@ +#!/bin/sh + +sed -i 's/cbi.submit\"] = true/cbi.submit\"] = \"1\"/g' /usr/lib/lua/luci/dispatcher.lua + +rm -f /tmp/luci-indexcache +exit 0 diff --git a/luci-app-argon-config/root/usr/share/rpcd/acl.d/luci-app-argon-config.json b/luci-app-argon-config/root/usr/share/rpcd/acl.d/luci-app-argon-config.json new file mode 100644 index 00000000..f0a31379 --- /dev/null +++ b/luci-app-argon-config/root/usr/share/rpcd/acl.d/luci-app-argon-config.json @@ -0,0 +1,11 @@ +{ + "luci-app-argon-config": { + "description": "Grant UCI access for luci-app-argon-config", + "read": { + "uci": [ "argon" ] + }, + "write": { + "uci": [ "argon" ] + } + } +} diff --git a/luci-app-autotimeset b/luci-app-autotimeset deleted file mode 160000 index ca78417d..00000000 --- a/luci-app-autotimeset +++ /dev/null @@ -1 +0,0 @@ -Subproject commit ca78417d1b5665fe0c3e4c4a743e24dd325911f5 diff --git a/luci-app-autotimeset/LICENSE b/luci-app-autotimeset/LICENSE new file mode 100644 index 00000000..02a5512a --- /dev/null +++ b/luci-app-autotimeset/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019-2020 johnrosen1 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/luci-app-autotimeset/Makefile b/luci-app-autotimeset/Makefile new file mode 100644 index 00000000..8fbbf234 --- /dev/null +++ b/luci-app-autotimeset/Makefile @@ -0,0 +1,22 @@ +# Copyright (C) 2019-2023 sirpdboy https://github.com/sirpdboy/luci-app-autotimeset +# +# This is free software, licensed under the Apache License, Version 2.0 . +# + +include $(TOPDIR)/rules.mk + +LUCI_TITLE:=LuCI support for Scheduled Time setting +LUCI_PKGARCH:=all + +PKG_VERSION:=2.0.2 +PKG_RELEASE:=20230718 + + +define Package/$(PKG_NAME)/conffiles +/etc/config/autotimeset +endef + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature + diff --git a/luci-app-autotimeset/README.md b/luci-app-autotimeset/README.md new file mode 100644 index 00000000..9731d6aa --- /dev/null +++ b/luci-app-autotimeset/README.md @@ -0,0 +1,113 @@ +[![若部分图片无法正常显示,请挂上机场浏览或点这里到末尾看修复教程](https://visitor-badge-deno.deno.dev/sirpdboy.sirpdboy.svg)](#解决-github-网页上图片显示失败的问题) [![](https://img.shields.io/badge/TG群-点击加入-FFFFFF.svg)](https://t.me/joinchat/AAAAAEpRF88NfOK5vBXGBQ) + +[autotimeset 定时设置插件](https://github.com/sirpdboy/luci-app-autotimeset) + +![screenshots](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/说明1.jpg) + +请 **认真阅读完毕** 本页面,本页面包含注意事项和如何使用。 + +## 功能说明: + +### 定时设置2.0版 +#### 2023.5.23 定时设置2.0版:定时执行任务设置和开机启动任务设置二合一版,并增加自定义脚本功能。 + +### 定时设置1.9版 +#### 2023.4.1 定时设置1.9版:加入定时断网重连、定时检测WAN3重启等服务。 + +### 定时设置1.6版 +#### 2023.1.15 定时设置1.6版:重新代码制作优化。在之前的版本上新增加:定时清理内存、定时清理系统垃圾、定时断网、定时重启网络共享、定时重拨 等 8大功能 + +### 定时设置1.4版 +#### 2021.2.7 新增功能定时重启网络。现包括:定时重启、定时关机、定时重启网络,各功能可一起使用。 + +### 定时设置1.3版 +#### 2020.10.6 原来重定关机正式改名为定时设置,实现定时重启和定时关机功能二合一。 + +### 定时关机1.1版 +#### 2020.7.19 定时关机功能,彻底解决需要保存二次才生效的问题。 + +### 定时关机1.0版 +#### 2019.2.24 定时关机功能借鉴前辈们的开源代码首发。 + +## 编译使用方法 [![](https://img.shields.io/badge/-编译使用方法-F5F5F5.svg)](#编译使用方法-) + +将luci-app-autotimeset添加至 LEDE/OpenWRT 源码的方法。 + +### 下载源码方法一: +编辑源码文件夹根目录feeds.conf.default并加入如下内容: + +```Brach + # feeds获取源码: + src-git autotimeset https://github.com/sirpdboy/luci-app-autotimeset + ``` + ```Brach + # 更新feeds,并安装主题: + scripts/feeds update autotimeset + scripts/feeds install luci-app-autotimeset + ``` + +### 下载源码方法二: + ```Brach + # 下载源码 + git clone https://github.com/sirpdboy/luci-app-autotimeset package/luci-app-autotimeset + make menuconfig + ``` +### 配置菜单 + ```Brach + make menuconfig + # 找到 LuCI -> Applications, 选择 luci-app-autotimeset, 保存后退出。 + ``` +### 编译 + ```Brach + # 编译固件 + make package/luci-app-autotimeset/compile V=s + ``` + +## 说明 [![](https://img.shields.io/badge/-说明-F5F5F5.svg)](#说明-) + +源码来源:https://github.com/sirpdboy/luci-app-autotimeset + + + +## 使用与授权相关说明 + +- 本人开源的所有源码,任何引用需注明本处出处,如需修改二次发布必告之本人,未经许可不得做于任何商用用途。 + + +# My other project + +- 网络速度测试 :https://github.com/sirpdboy/NetSpeedTest + +- 任务设置(定时和开机二合一)插件 : https://github.com/sirpdboy/luci-app-autotimeset + +- 关机功能插件 : https://github.com/sirpdboy/luci-app-poweroffdevice + +- opentopd主题 : https://github.com/sirpdboy/luci-theme-opentopd + +- kucat 主题: https://github.com/sirpdboy/luci-theme-kucat + +- 家长控制: https://github.com/sirpdboy/luci-theme-parentcontrol + +- 系统高级设置 : https://github.com/sirpdboy/luci-app-advanced + +- ddns-go动态域名: https://github.com/sirpdboy/luci-app-ddns-go + +- 进阶设置(系统高级设置+主题设置kucat/agron/opentopd): https://github.com/sirpdboy/luci-app-advancedplus + +- 设置向导: https://github.com/sirpdboy/luci-app-wizard + +- 分区扩容: https://github.com/sirpdboy/luci-app-partexp + +- lukcy大吉: https://github.com/sirpdboy/luci-app-lukcy + +## 捐助 + +![screenshots](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/说明3.jpg) + +| 图飞了😂 | 图飞了😂 | +| :-----------------: | :-------------: | +|![xm1](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/支付宝.png) | ![xm1](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/微信.png) | + + + 图飞了😂 + diff --git a/luci-app-autotimeset/luasrc/controller/autotimeset.lua b/luci-app-autotimeset/luasrc/controller/autotimeset.lua new file mode 100644 index 00000000..1f5138eb --- /dev/null +++ b/luci-app-autotimeset/luasrc/controller/autotimeset.lua @@ -0,0 +1,35 @@ +module("luci.controller.autotimeset",package.seeall) +local fs=require"nixio.fs" +local http=require"luci.http" +function index() + if not nixio.fs.access("/etc/config/autotimeset") then + return + end + entry({"admin", "control"}, firstchild(), "Control", 44).dependent = false + entry({"admin", "control", "autotimeset"}, alias("admin", "control", "autotimeset", "base"), _("Scheduled Setting"), 20).dependent = true + entry({"admin", "control", "autotimeset", "base"}, cbi("autotimeset/base"), _("Scheduled Setting"), 1).leaf = true + entry({"admin", "control", "autotimeset", "log"}, form("autotimeset/log"), _("Log"), 2).leaf = true + entry({"admin","control","autotimeset","dellog"},call("dellog")) + entry({"admin","control","autotimeset","getlog"},call("getlog")) +end + + +function getlog() + logfile="/etc/autotimeset/autotimeset.log" + if not fs.access(logfile) then + http.write("") + return + end + local f=io.open(logfile,"r") + local a=f:read("*a") or "" + f:close() + a=string.gsub(a,"\n$","") + http.prepare_content("text/plain; charset=utf-8") + http.write(a) +end + +function dellog() + fs.writefile("/etc/autotimeset/autotimeset.log","") + http.prepare_content("application/json") + http.write('') +end diff --git a/luci-app-autotimeset/luasrc/model/cbi/autotimeset.lua b/luci-app-autotimeset/luasrc/model/cbi/autotimeset.lua new file mode 100644 index 00000000..96e72dc9 --- /dev/null +++ b/luci-app-autotimeset/luasrc/model/cbi/autotimeset.lua @@ -0,0 +1,56 @@ +local o=require"luci.dispatcher" +local e=require("luci.model.ipkg") +local s=require"nixio.fs" +local e=luci.model.uci.cursor() +local m,s,e + +m=Map("autotimeset",translate("Scheduled Setting"),translate("Timing settings include: timing restart, timing shutdown, timing restart network, all functions can be used together.")) + +s=m:section(TypedSection,"stime","") +s.addremove=true +s.anonymous=true +s.template = "cbi/tblsection" + +e=s:option(ListValue,"stype",translate("Scheduled Type")) +e:value(1,translate("Scheduled Reboot")) +e:value(2,translate("Scheduled Poweroff")) +e:value(3,translate("Scheduled ReNetwork")) +e:value(4,translate("Scheduled RestartSamba")) +e:value(5,translate("Scheduled Restartwan")) +e:value(6,translate("Scheduled Closewan")) +e:value(7,translate("Scheduled Clearmem")) +e:value(8,translate("Scheduled Sysfree")) +e:value(9,translate("Scheduled DisReconn")) +e.default=2 + +week=s:option(ListValue,"week",translate("Week Day")) +week.rmempty = true +week:value('*',translate("Everyday")) +week:value(0,translate("Sunday")) +week:value(1,translate("Monday")) +week:value(2,translate("Tuesday")) +week:value(3,translate("Wednesday")) +week:value(4,translate("Thursday")) +week:value(5,translate("Friday")) +week:value(6,translate("Saturday")) +week.default='*' + +e=s:option(Value,"hour",translate("Hour")) +e.datatype = "range(0,23)" +e.rmempty = false +e.default = 4 + +e=s:option(Value,"minute",translate("Minute")) +e.datatype = "range(0,59)" +e.rmempty = false +e.default = 0 + +e=s:option(Flag,"enable",translate("Enable")) +e.rmempty = false +e.default=0 + +m.apply_on_parse = true +m.on_after_apply = function(self,map) + io.popen("/etc/init.d/autotimeset start") +end +return m diff --git a/luci-app-autotimeset/luasrc/model/cbi/autotimeset/base.lua b/luci-app-autotimeset/luasrc/model/cbi/autotimeset/base.lua new file mode 100644 index 00000000..dcc4a94b --- /dev/null +++ b/luci-app-autotimeset/luasrc/model/cbi/autotimeset/base.lua @@ -0,0 +1,83 @@ +local o=require"luci.dispatcher" +local e=require("luci.model.ipkg") +local s=require"nixio.fs" +local e=luci.model.uci.cursor() +local m,s,e + +m=Map("autotimeset",translate("Scheduled task/startup task settings"),translate("The original [Timing Settings] includes scheduled task execution and startup task execution. Presets include over 10 functions, including restart, shutdown, network restart, memory release, system cleaning, network sharing, network shutdown, automatic detection of network disconnects and reconnection, MWAN3 load balancing detection of reconnection, and custom scripts
") .. +translate("N1-N5 is continuous, N1, N3, N5 is discontinuous, */N represents every N hours or every N minutes.The week can only be 0~6, the hour can only be 0~23, the minute can only be 0~59, the unavailable time is 48 hours.") .. +translate("   ")) + +s = m:section(TypedSection, 'global') +s.anonymous=true + +e=s:option(TextValue, "customscript" ,translate("Edit Custom Script")) +e.description = translate("Only by editing the content of the custom script well and scheduling the custom script task can it be executed effectively.") +e.rows = 5 +e.default = '#!/bin/sh' +e.rmempty = false + +s=m:section(TypedSection,"stime","") +s.addremove=true +s.anonymous=true +s.template = "cbi/tblsection" + +e=s:option(ListValue,"stype",translate("Scheduled Type")) +e:value(1,translate("Scheduled Reboot")) +e:value(2,translate("Scheduled Poweroff")) +e:value(3,translate("Scheduled ReNetwork")) +e:value(4,translate("Scheduled RestartSamba")) +e:value(5,translate("Scheduled Restartwan")) +e:value(6,translate("Scheduled Closewan")) +e:value(7,translate("Scheduled Clearmem")) +e:value(8,translate("Scheduled Sysfree")) +e:value(9,translate("Scheduled DisReconn")) +e:value(10,translate("Scheduled DisRereboot")) +e:value(11,translate("Scheduled Restartmwan3")) +e:value(12,translate("Scheduled Customscript")) +e.default=2 + +e=s:option(ListValue,"ttype",translate("Task Type")) +e:value(0,translate("Scheduled task execution")) +e:value(1,translate("Startup task")) +e.default=0 + +e=s:option(Value,"delay",translate("Startup delay time")) +e.default=10 + +e=s:option(Value,"month",translate("Month(0~11)")) +e.rmempty = false +e.default = '*' + +week=s:option(Value,"week",translate("Week Day(0~6)")) +week.rmempty = true +week:value('*',translate("Everyday")) +week:value(0,translate("Sunday")) +week:value(1,translate("Monday")) +week:value(2,translate("Tuesday")) +week:value(3,translate("Wednesday")) +week:value(4,translate("Thursday")) +week:value(5,translate("Friday")) +week:value(6,translate("Saturday")) +week.default='*' + +e=s:option(Value,"hour",translate("Hour(0~23)")) +e.rmempty = false +e.default = 0 + +e=s:option(Value,"minute",translate("Minute(0~59)")) +e.rmempty = false +e.default = 0 + +e=s:option(Flag,"enable",translate("Enable")) +e.rmempty = false +e.default=0 + +m.apply_on_parse = true +m.on_after_apply = function(self,map) + luci.sys.exec("/etc/init.d/autotimeset start") +end + +return m diff --git a/luci-app-autotimeset/luasrc/model/cbi/autotimeset/log.lua b/luci-app-autotimeset/luasrc/model/cbi/autotimeset/log.lua new file mode 100644 index 00000000..63e3c543 --- /dev/null +++ b/luci-app-autotimeset/luasrc/model/cbi/autotimeset/log.lua @@ -0,0 +1,13 @@ +local fs = require "nixio.fs" +local uci = require"luci.model.uci".cursor() +local f, t +f = SimpleForm("logview") +f.reset = false +f.submit = false +t=f:field(TextValue,"conf") + +t.rmempty=true +t.rows=20 +t.template="autotimeset/log" +t.readonly="readonly" +return f diff --git a/luci-app-autotimeset/luasrc/view/autotimeset/log.htm b/luci-app-autotimeset/luasrc/view/autotimeset/log.htm new file mode 100644 index 00000000..0f1b8590 --- /dev/null +++ b/luci-app-autotimeset/luasrc/view/autotimeset/log.htm @@ -0,0 +1,54 @@ +<%+cbi/valueheader%> + +<%:Reverse%> + + + +<%+cbi/valuefooter%> \ No newline at end of file diff --git a/luci-app-autotimeset/po/zh-cn/autotimeset.po b/luci-app-autotimeset/po/zh-cn/autotimeset.po new file mode 100644 index 00000000..ebb4ecc8 --- /dev/null +++ b/luci-app-autotimeset/po/zh-cn/autotimeset.po @@ -0,0 +1,91 @@ + +msgid "The original [Timing Settings] includes scheduled task execution and startup task execution. Presets include over 10 functions, including restart, shutdown, network restart, memory release, system cleaning, network sharing, network shutdown, automatic detection of network disconnects and reconnection, MWAN3 load balancing detection of reconnection, and custom scripts
" +msgstr "任务设置包括定时任务执行和开机启动任务执行,预置:重启、关机、重启网络、释放内存、系统清理、网络共享、关闭网络、自动检测断网重连、自动检测断网重启、MWAN3负载均衡检测重连、自定义脚本等10多个功能.
" + +msgid "N1-N5 is continuous, N1, N3, N5 is discontinuous, */N represents every N hours or every N minutes.The week can only be 0~6, the hour can only be 0~23, the minute can only be 0~59, the unavailable time is 48 hours." +msgstr "N1-N5连续,N1,N3,N5不连续,*/N表示每N小时或每N分钟。月份范围0-11,星期范围0~6,小时范围0~23,分钟范围0~59,不可用72小时或者90分钟等连续范围。" + +msgid "Scheduled task/startup task settings" +msgstr "定时执行任务/开机启动任务设置" + +msgid "Scheduled Setting" +msgstr "任务设置" + +msgid "Test/Verify Settings" +msgstr "测试/验证设置" + +msgid "Scheduled Type" +msgstr "任务名称" + +msgid "Task Type" +msgstr "任务类型" + +msgid "Scheduled task execution" +msgstr "定时执行任务" + +msgid "Startup task" +msgstr "开机启动任务" + +msgid "Startup delay time" +msgstr "延迟时间【开机用】" + +msgid "Log" +msgstr "日志" + +msgid "Scheduled Reboot" +msgstr "重启机器" + +msgid "Scheduled Poweroff" +msgstr "关闭机器" + +msgid "Scheduled ReNetwork" +msgstr "重启网络" + +msgid "Scheduled RestartSamba" +msgstr "重启网络共享" + +msgid "Scheduled Restartwan" +msgstr "重启WAN" + +msgid "Scheduled Closewan" +msgstr "关闭网络" + +msgid "Scheduled Clearmem" +msgstr "释放内存" + +msgid "Scheduled Sysfree" +msgstr "系统清理(会重启机器)" + +msgid "Scheduled DisReconn" +msgstr "检测断网重连" + +msgid "Scheduled DisRereboot" +msgstr "检测断网重启" + +msgid "Scheduled Restartmwan3" +msgstr "检测MWAN3失联重启服务" + +msgid "Edit Custom Script" +msgstr "编辑自定义脚本" + +msgid "Scheduled Customscript" +msgstr "自定义脚本" + +msgid "Only by editing the content of the custom script well and scheduling the custom script task can it be executed effectively." +msgstr "编辑好自定义脚本内容,自定义脚本任务才能有效执行。" + +msgid "Month(0~11)" +msgstr "月份(0~11)【定时用】" + +msgid "Week Day(0~6)" +msgstr "星期(0~6)【定时用】" + +msgid "Everyday" +msgstr "每天【定时用】" + +msgid "Hour(0~23)" +msgstr "小时(0~23)【定时用】" + +msgid "Minute(0~59)" +msgstr "分钟(0~59)【定时用】" + diff --git a/luci-app-autotimeset/po/zh_Hans b/luci-app-autotimeset/po/zh_Hans new file mode 120000 index 00000000..41451e4a --- /dev/null +++ b/luci-app-autotimeset/po/zh_Hans @@ -0,0 +1 @@ +zh-cn \ No newline at end of file diff --git a/luci-app-autotimeset/root/etc/autotimeset/timesetcustomscript b/luci-app-autotimeset/root/etc/autotimeset/timesetcustomscript new file mode 100644 index 00000000..1a248525 --- /dev/null +++ b/luci-app-autotimeset/root/etc/autotimeset/timesetcustomscript @@ -0,0 +1 @@ +#!/bin/sh diff --git a/luci-app-autotimeset/root/etc/config/autotimeset b/luci-app-autotimeset/root/etc/config/autotimeset new file mode 100644 index 00000000..34280e07 --- /dev/null +++ b/luci-app-autotimeset/root/etc/config/autotimeset @@ -0,0 +1,75 @@ + +config global + option enabled '0' + option customscript '#!/bin/sh' + +config stime + option hour '*/4' + option stype '7' + option week '*' + option minute '0' + option month '*' + option enable '0' + option ttype '0' + option delay '10' + +config stime + option minute '0' + option month '*' + option hour '*/5' + option enable '0' + option week '1,3,5' + option ttype '1' + option delay '10' + option stype '1' + +config stime + option week '*' + option month '*' + option enable '0' + option ttype '0' + option delay '10' + option stype '10' + option hour '0' + option minute '*/5' + +config stime + option week '*' + option minute '0' + option stype '2' + option hour '1' + option month '*' + option enable '0' + option ttype '0' + option delay '10' + +config stime + option week '*' + option minute '0' + option hour '3' + option month '*' + option enable '0' + option ttype '0' + option delay '10' + option stype '6' + +config stime + option week '*' + option hour '0' + option minute '*/5' + option month '*' + option stype '11' + option ttype '1' + option delay '20' + option enable '0' + +config stime + option month '*' + option week '*' + option hour '0' + option enable '0' + option minute '*/5' + option stype '12' + option ttype '1' + option delay '30' + diff --git a/luci-app-autotimeset/root/etc/init.d/autotimeset b/luci-app-autotimeset/root/etc/init.d/autotimeset new file mode 100644 index 00000000..154ea277 --- /dev/null +++ b/luci-app-autotimeset/root/etc/init.d/autotimeset @@ -0,0 +1,117 @@ +#!/bin/sh /etc/rc.common +#copyright by sirpdboy + +START=95 +STOP=10 +TMP=/etc/autotimeset +LOG=$TMP/autotimeset.log +TT=/etc/init.d/autotimesetrun +CR=/etc/crontabs/root +[ ! -d $TMP ] && mkdir -p $TMP 2>/dev/null +[ -s $LOG ] && echo ' ' >> $LOG +run_autotimeset() +{ +ssum=$(grep -c stime /etc/config/autotimeset) +customscript=$(uci -q get autotimeset.@global[0].customscript ) || customscript='#!/bin/sh' +script=`echo $customscript | grep '#!/bin/sh'` >/dev/null 2>&1 +[ $script ] && echo $script > /etc/autotimeset/timesetcustomscript || { + echo '#!/bin/sh' >/etc/autotimeset/timesetcustomscript + echo $customscript >>/etc/autotimeset/timesetcustomscript +} +echo 'start(){' >>$TT +for i in $(seq 0 $((ssum-1))) +do + enable=$(uci -q get autotimeset.@stime[$i].enable ) + if [ "x$enable" = "x1" ]; then + month=$(uci -q get autotimeset.@stime[$i].month ) || month="*" + stype=$(uci -q get autotimeset.@stime[$i].stype ) + week=$(uci -q get autotimeset.@stime[$i].week ) || week="*" + minute=$(uci -q get autotimeset.@stime[$i].minute ) || minute="00" + hour=$(uci -q get autotimeset.@stime[$i].hour ) || hour="*" + ttype=$(uci -q get autotimeset.@stime[$i].ttype ) || ttype=0 + delay=$(uci -q get autotimeset.@stime[$i].delay ) || delay=10 + [ "x$hour" = "x0" ] && hour="00" + [ "x$minute" = "x0" ] && minute="00" + case "$stype" in + 1) + local cmd="$minute $hour * $month $week /usr/bin/timesethandler reboot Scheduled_task" + [ $ttype = '0' ] && echo "$cmd" >> $CR || echo "sleep $delay && /usr/bin/timesethandler reboot Startup_task" >>$TT + ;; + 2) + local cmd="$minute $hour * $month $week /usr/bin/timesethandler poweroff Scheduled_task" + [ $ttype = '0' ] && echo "$cmd" >> $CR || echo "sleep $delay && /usr/bin/timesethandler poweroff Startup_task" >>$TT + ;; + 3) + local cmd="$minute $hour * $month $week /usr/bin/timesethandler network Scheduled_task" + [ $ttype = '0' ] && echo "$cmd" >> $CR || echo "sleep $delay && /usr/bin/timesethandler network Startup_task" >>$TT + ;; + 4) + local cmd="$minute $hour * $month $week /usr/bin/timesethandler restartsamba Scheduled_task" + [ $ttype = '0' ] && echo "$cmd" >> $CR || echo "sleep $delay && /usr/bin/timesethandler restartsamba Startup_task" >>$TT + ;; + 5) + local cmd="$minute $hour * $month $week /usr/bin/timesethandler restartwan Scheduled_task" + [ $ttype = '0' ] && echo "$cmd" >> $CR || echo "sleep $delay && /usr/bin/timesethandler restartwan Startup_task" >>$TT + ;; + 6) + local cmd="$minute $hour * $month $week /usr/bin/timesethandler closewan Scheduled_task" + [ $ttype = '0' ] && echo "$cmd" >> $CR || echo "sleep $delay && /usr/bin/timesethandler closewan Startup_task" >>$TT + ;; + 7) + local cmd="$minute $hour * $month $week /usr/bin/timesethandler clearmem Scheduled_task" + [ $ttype = '0' ] && echo "$cmd" >> $CR || echo "sleep $delay && /usr/bin/timesethandler clearmem Startup_task" >>$TT + ;; + 8) + local cmd="$minute $hour * $month $week /usr/bin/timesethandler sysfree Scheduled_task" + [ $ttype = '0' ] && echo "$cmd" >> $CR || echo "sleep $delay && /usr/bin/timesethandler reboot Startup_task" >>$TT + ;; + 9) + local cmd="$minute $hour * $month $week /usr/bin/timesethandler disreconn Scheduled_task" + [ $ttype = '0' ] && echo "$cmd" >> $CR || echo "sleep $delay && /usr/bin/timesethandler disreconn Startup_task" >>$TT + ;; + 10) + local cmd="$minute $hour * $month $week /usr/bin/timesethandler disrereboot Scheduled_task" + [ $ttype = '0' ] && echo "$cmd" >> $CR || echo "sleep $delay && /usr/bin/timesethandler disrereboot Startup_task" >>$TT + ;; + + 11) + local cmd="$minute $hour * $month $week /usr/bin/timesethandler restartmwan3 Scheduled_task" + [ $ttype = '0' ] && echo "$cmd" >> $CR || echo "sleep $delay && /usr/bin/timesethandler restartmwan3 Startup_task" >>$TT + ;; + 12) + local cmd="$minute $hour * $month $week /usr/bin/timesethandler customscript Scheduled_task" + [ $ttype = '0' ] && echo "$cmd" >> $CR || echo "sleep $delay && /usr/bin/timesethandler customscript Startup_task" >>$TT + ;; + esac + + fi + + done + echo '}' >>$TT +} + +start() +{ + del_cru + [ -n "`tail -c1 $CR`" ] && echo >> $CR + run_autotimeset + /etc/init.d/cron reload +} + +stop() +{ + del_cru + /etc/init.d/cron reload +} + +restart() +{ + start +} + +del_cru() +{ + echo -e '#!/bin/sh /etc/rc.common\n\nSTART=99\n' > $TT + sed -i '/timesethandler/d' $CR >/dev/null 2>&1 +} + diff --git a/luci-app-autotimeset/root/etc/init.d/autotimesetrun b/luci-app-autotimeset/root/etc/init.d/autotimesetrun new file mode 100644 index 00000000..2e17a228 --- /dev/null +++ b/luci-app-autotimeset/root/etc/init.d/autotimesetrun @@ -0,0 +1,6 @@ +#!/bin/sh /etc/rc.common + +START=99 +start(){ + +} \ No newline at end of file diff --git a/luci-app-autotimeset/root/etc/uci-defaults/40_luci-app-autotimeset b/luci-app-autotimeset/root/etc/uci-defaults/40_luci-app-autotimeset new file mode 100644 index 00000000..94da7287 --- /dev/null +++ b/luci-app-autotimeset/root/etc/uci-defaults/40_luci-app-autotimeset @@ -0,0 +1,10 @@ +#!/bin/sh +chmod +x /etc/init.d/autotimeset /usr/bin/timesethandler +uci -q batch <<-EOF >/dev/null + delete ucitrack.@autotimeset[-1] + add ucitrack autotimeset + set ucitrack.@autotimeset[-1].init=autotimeset + commit ucitrack +EOF +rm -rf /tmp/luci-modulecache /tmp/luci-indexcache* +exit 0 diff --git a/luci-app-autotimeset/root/etc/uci-defaults/luci--autotimeset b/luci-app-autotimeset/root/etc/uci-defaults/luci--autotimeset new file mode 100644 index 00000000..37d82b3a --- /dev/null +++ b/luci-app-autotimeset/root/etc/uci-defaults/luci--autotimeset @@ -0,0 +1,14 @@ +#!/bin/sh +chmod +x /etc/init.d/autotimeset /usr/bin/timesethandler /etc/init.d/autotimesetrun +uci -q batch <<-EOF >/dev/null + delete ucitrack.@autotimeset[-1] + add ucitrack autotimeset + set ucitrack.@autotimeset[-1].init="autotimeset" + commit ucitrack + delete ucitrack.@autotimesetrun[-1] + add ucitrack autotimesetrun + set ucitrack.@autotimesetrun[-1].init=autotimesetrun + commit ucitrack +EOF +rm -rf /tmp/luci-modulecache /tmp/luci-indexcache* +exit 0 \ No newline at end of file diff --git a/luci-app-autotimeset/root/usr/bin/timesethandler b/luci-app-autotimeset/root/usr/bin/timesethandler new file mode 100644 index 00000000..fc44c451 --- /dev/null +++ b/luci-app-autotimeset/root/usr/bin/timesethandler @@ -0,0 +1,127 @@ +#!/bin/sh +# author 2021 jjm2473 +# author 2020-2023 sirpdboy +TMP_T=/var/autotimeset/autotimeset.tmp +LOG=/etc/autotimeset/autotimeset.log +log(){ + echo "$(date +'%Y-%m-%d %H:%M:%S') $*" >> $LOG +} + +limit_log() { + local logf=$1 + [ ! -f "$logf" ] && return + local sc=100 + [ -n "$2" ] && sc=$2 + local count=$(grep -c "" $logf) + if [ $count -gt $sc ];then + let count=count-$sc + sed -i "1,$count d" $logf + fi +} + +remwan3() { +while true; do + status=$(/usr/sbin/mwan3 status | grep error) + if [ -z $status ]; then + log "Mwan3 is OK" + exit 1 + else + log "mwan3 restarting ..." + /usr/sbin/mwan3 restart + fi + sleep 60 +done + +} + +disreconnwan() { +i=0 +PingA=114.114.114.114 +PingB=223.5.5.5 +while [[ $i -lt 5 ]] +do + if /bin/ping -c 1 $PingA >/dev/null + then + PingErr=0 + break + else + if /bin/ping -c 1 $PingB >/dev/null + then + PingErr=0 + break + else + i=$(($i + 1)) + PingErr=1 + sleep 10 + fi + fi +done +} + +trigger() { + case "$1" in + reboot) + reboot + ;; + poweroff) + poweroff + ;; + network) + /etc/init.d/network restart + ;; + clearmem) + sync && echo 3 > /proc/sys/vm/drop_caches + ;; + sysfree) + cd /overlay + rm -rf `ls | egrep -v '(upper|.fs_state)'` + cd upper + rm -rf `ls | egrep -v '(etc)'` + cd etc + rm -rf `ls | egrep -v '(config|ssr|bench.log|shadow)'` + rm -rf /var/luci-modulecache + rm -rf /var/luci-indexcache + rm -rf /tmp/cache/* + reboot + ;; + restartsamba) + /etc/init.d/ksmdb restart + /etc/init.d/samba restart + /etc/init.d/samba4 restart + ;; + restartwan) + ifup wan + log "Redial succeeded!" + ;; + closewan) + ifdown wan + ;; + disreconn) + disreconnwan + if [ $PingErr = 1 ]; then + ifup wan + log "Redial succeeded!" + fi + ;; + disrereboot) + disreconnwan + if [ $PingErr = 1 ]; then + log "Reboot succeeded!" + reboot + fi + ;; + restartmwan3) + [ -s /usr/sbin/mwan3 ] && remwan3 + ;; + customscript) + script=`cat /etc/autotimeset/timesetcustomscript ` >/dev/null 2>&1 + [ $script ] && source /etc/autotimeset/timesetcustomscript + log "CustomScript succeeded!" + ;; + esac +} + +limit_log $LOG 500 +PingErr=0 +log "Scheduled operation $2: $1" && trigger $1 + diff --git a/luci-app-autotimeset/root/usr/bin/timesetsecurity b/luci-app-autotimeset/root/usr/bin/timesetsecurity new file mode 100644 index 00000000..ae139978 --- /dev/null +++ b/luci-app-autotimeset/root/usr/bin/timesetsecurity @@ -0,0 +1,119 @@ +#! /bin/bash + +#ԴĴ +tryErrNum=10 +#Դڶ೤ʱ䷶Χλ룬tryErrNumһЧ +tryTimeOut=300 +#ҪĶipַŸ,Ϊ +dropIpList="" +#logreadʶַBad password attempt for ssh root¼logluci: failed login on ǵ¼weblog +errStr=("Bad password attempt for" "luci: failed login on") +#ѯlogread ־ʱ,λ +timesleep=30 + +#Ӹַ־ȡҪip׷ӵ dropIpList +getdropip() { + #Թ˵־ + lines=$(logread | grep $1 | sed -n '1!G;h;$p') + linesNum=$(echo -n "$lines" | wc -l) + #ֵ + declare -A dict + # + if [ "$linesNum" -gt "$tryErrNum" ];then + while read line; + do + ip=$(echo -n "$line" | awk '{print $NF}' | awk -F":" '{print $1}') + time=$(echo -n "$line" | awk '{print $4}' | awk -F":" '{sum += $1*3600 + $2*60 + $3};END {print sum}') + ok=${dict[$ip]} + if [ -z $ok ];then + dict[$ip]=1 + time=$(date | awk '{print $4}' | awk -F":" '{sum += $1*3600 + $2*60+ $3};END {print sum}') + dict[${ip}_endtime]=$time + else + if [ ${dict[$ip]} -lt "$tryErrNum" ];then + dict[$ip]=$(expr ${dict[$ip]} + 1) + dict[${ip}_starttime]=$time + fi + fi + done < <(echo -n "$lines") + + for key in ${!dict[@]}; + do + if ! [[ "$key" =~ "starttime" ]] && ! [[ "$key" =~ "endtime" ]];then + if [ ${dict[$key]} -eq "$tryErrNum" ];then + timeDiff=$(expr ${dict[${key}_endtime]} - ${dict[${key}_starttime]}) + if [ "$timeDiff" -gt 0 ] && [ "$timeDiff" -lt "$tryTimeOut" ];then + #׷Ҫip + dropIpList=$dropIpList,$key + fi + fi + fi + done + + fi + +} + +#errStr ֱַlogƥ䣬ȡҪip +startGetDropIp(){ + i=0 + while : + do + errstr=${errStr[$i]} + if [ -z "$errstr" ];then + break + fi + i=$(expr $i + 1) + + getdropip $errstr + + done +} + +#ʼipset iptable +intEnv(){ + ipset list BlockIpList + if ! [ "$?" == 0 ]; + then + ipset create BlockIpList hash:net timeout 300 + iptables -I INPUT -m set --match-set BlockIpList src -p tcp -m tcp --dport 22 -j DROP + iptables -I INPUT -m set --match-set BlockIpList src -p tcp -m tcp --dport 80 -j DROP + iptables -I INPUT -s 192.168.0.0/16 -j ACCEPT + fi +} +#Ҫipӵipset BlockIpList +ipsetAddIp(){ + dropIpListNew="" + for ip in $(echo -n "$dropIpList" | sed 's/,/ /g') + do + ipset add BlockIpList $ip + if [ "$?" -eq 0 ];then + dropIpListNew=$dropIpListNew,$ip + fi + done +} + +sendlogger(){ + if [ -n "$dropIpListNew" ];then + echo -e "autotimeset:MyOpenwrt IP:$dropIpListNew" + logger -p warn -t "autotimeset" ",ʱ: IP:$dropIpListNew ---- ʱ䣺`date `" + fi +} + +#鵱ǰǷ +PocessNum=$(ps | grep timesetsecurity | grep -v grep | wc -l) +if [ "$PocessNum" -gt 2 ];then + #Ѿڽֱ̣˳ǰ + kill -9 $$ +else + intEnv + + while : + do + sleep $timesleep + dropIpList="" + startGetDropIp + ipsetAddIp + sendlogger + done +fi diff --git a/luci-app-autotimeset/root/usr/share/rpcd/acl.d/luci-app-autotimeset.json b/luci-app-autotimeset/root/usr/share/rpcd/acl.d/luci-app-autotimeset.json new file mode 100644 index 00000000..0e858925 --- /dev/null +++ b/luci-app-autotimeset/root/usr/share/rpcd/acl.d/luci-app-autotimeset.json @@ -0,0 +1,11 @@ +{ + "luci-app-autotimeset": { + "description": "Grant UCI access for luci-app-autotimeset", + "read": { + "uci": [ "autotimeset" ] + }, + "write": { + "uci": [ "autotimeset" ] + } + } +} diff --git a/luci-app-autoupdate/LICENSE b/luci-app-autoupdate/LICENSE new file mode 100644 index 00000000..f288702d --- /dev/null +++ b/luci-app-autoupdate/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/luci-app-autoupdate/Makefile b/luci-app-autoupdate/Makefile new file mode 100644 index 00000000..f50f92d1 --- /dev/null +++ b/luci-app-autoupdate/Makefile @@ -0,0 +1,11 @@ +include $(TOPDIR)/rules.mk + +LUCI_TITLE:=LuCI Support for AutoBuild Firmware/AutoUpdate.sh +LUCI_DEPENDS:=+curl +wget +bash +LUCI_PKGARCH:=all +PKG_VERSION:=1 +PKG_RELEASE:=20210221 + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/luci-app-autoupdate/luasrc/controller/autoupdate.lua b/luci-app-autoupdate/luasrc/controller/autoupdate.lua new file mode 100644 index 00000000..54dc70e6 --- /dev/null +++ b/luci-app-autoupdate/luasrc/controller/autoupdate.lua @@ -0,0 +1,5 @@ +module("luci.controller.autoupdate",package.seeall) + +function index() + entry({"admin","system","autoupdate"},cbi("autoupdate"),_("AutoUpdate"),99) +end diff --git a/luci-app-autoupdate/luasrc/model/cbi/autoupdate.lua b/luci-app-autoupdate/luasrc/model/cbi/autoupdate.lua new file mode 100644 index 00000000..d34f40d7 --- /dev/null +++ b/luci-app-autoupdate/luasrc/model/cbi/autoupdate.lua @@ -0,0 +1,55 @@ +require("luci.sys") + +m=Map("autoupdate",translate("AutoUpdate"),translate("AutoUpdate LUCI supports one-click firmware upgrade and scheduled upgrade")) + +s=m:section(TypedSection,"login","") +s.addremove=false +s.anonymous=true + +o = s:option(Flag, "enable", translate("Enable AutoUpdate"),translate("Automatically update firmware during the specified time")) +o.default = 0 +o.optional = false + +week=s:option(ListValue,"week",translate("xWeek Day")) +week:value(7,translate("Everyday")) +week:value(1,translate("Monday")) +week:value(2,translate("Tuesday")) +week:value(3,translate("Wednesday")) +week:value(4,translate("Thursday")) +week:value(5,translate("Friday")) +week:value(6,translate("Saturday")) +week:value(0,translate("Sunday")) +week.default=0 + +hour=s:option(Value,"hour",translate("xHour")) +hour.datatype = "range(0,23)" +hour.rmempty = false + +pass=s:option(Value,"minute",translate("xMinute")) +pass.datatype = "range(0,59)" +pass.rmempty = false + +local github_url = luci.sys.exec("grep Github= /bin/openwrt_info | cut -c8-100") +o=s:option(Value,"github",translate("Github Url")) +o.default=github_url + +luci.sys.call ( "/usr/share/autoupdate/Check_Update.sh > /dev/null") +local cloud_version = luci.sys.exec("cat /tmp/cloud_version") +local current_version = luci.sys.exec("grep CURRENT_Version= /etc/openwrt_ver | cut -c17-100") +local current_model = luci.sys.exec("jsonfilter -e '@.model.id' < /etc/board.json | tr ',' '_'") +local firmware_type = luci.sys.exec("grep CURRENT_Model= /etc/openwrt_ver | cut -c15-100") +local luci_edition = luci.sys.exec("grep NEI_Luci= /etc/openwrt_ver | cut -c10-100") + +button_upgrade_firmware = s:option (Button, "_button_upgrade_firmware", translate("Upgrade to Latested Version"), +translatef("若有更新可点击上方 手动更新 后请耐心等待至路由器重启.") .. "

当前固件版本: " .. current_version .. "
云端固件版本: " .. cloud_version.. "

设备名称: " .. current_model .. "
内核版本: " .. luci_edition .. "
固件类型: " .. firmware_type) +button_upgrade_firmware.inputtitle = translate ("Do Upgrade") +button_upgrade_firmware.write = function() + luci.sys.call ("bash /bin/AutoUpdate.sh -u > /dev/null") +end + +local e=luci.http.formvalue("cbi.apply") +if e then + io.popen("/etc/init.d/autoupdate restart") +end + +return m diff --git a/luci-app-autoupdate/po/zh-cn/autoupdate.po b/luci-app-autoupdate/po/zh-cn/autoupdate.po new file mode 100644 index 00000000..e9b5fd63 --- /dev/null +++ b/luci-app-autoupdate/po/zh-cn/autoupdate.po @@ -0,0 +1,41 @@ +msgid "AutoUpdate" +msgstr "定时更新" + +msgid "xWeek Day" +msgstr "更新时间" + +msgid "Everyday" +msgstr "每天" + +msgid "Day" +msgstr "天" + +msgid "xHour" +msgstr "时 [0~23]" + +msgid "xMinute" +msgstr "分 [0~59]" + +msgid "Check Update" +msgstr "检查更新" + +msgid "Enable AutoUpdate" +msgstr "启用定时更新" + +msgid "AutoUpdate LUCI supports one-click firmware upgrade and scheduled upgrade" +msgstr "定时更新 LUCI 支持手动更新以及定时更新固件" + +msgid "Do Upgrade" +msgstr "手动更新" + +msgid "Upgrade to Latested Version" +msgstr "更新固件" + +msgid "Automatically update firmware during the specified time" +msgstr "在指定时间段自动检测云端版本,若有新版本自动更新固件" + +msgid "Github Url" +msgstr "Github 地址" + +msgid "Please wait patiently after clicking Do Upgrade button" +msgstr "点击手动更新按钮后请耐心等待至路由器重启" diff --git a/luci-app-autoupdate/po/zh_Hans b/luci-app-autoupdate/po/zh_Hans new file mode 120000 index 00000000..41451e4a --- /dev/null +++ b/luci-app-autoupdate/po/zh_Hans @@ -0,0 +1 @@ +zh-cn \ No newline at end of file diff --git a/luci-app-autoupdate/root/etc/config/autoupdate b/luci-app-autoupdate/root/etc/config/autoupdate new file mode 100644 index 00000000..304ff347 --- /dev/null +++ b/luci-app-autoupdate/root/etc/config/autoupdate @@ -0,0 +1,7 @@ +config login + option enable '0' + option forceupdate '0' + option week '7' + option hour '23' + option minute '0' + diff --git a/luci-app-autoupdate/root/etc/init.d/autoupdate b/luci-app-autoupdate/root/etc/init.d/autoupdate new file mode 100644 index 00000000..beb23482 --- /dev/null +++ b/luci-app-autoupdate/root/etc/init.d/autoupdate @@ -0,0 +1,48 @@ +#!/bin/bash /etc/rc.common +START=99 + +run_autoupdate() +{ + local enable + config_get_bool enable $1 enable + if [ $enable == "1" ]; then + local minute + local hour + config_get week $1 week + config_get minute $1 minute + config_get hour $1 hour + [ "$week" == 7 ] && week="*" + sed -i '/AutoUpdate/d' /etc/crontabs/root >/dev/null 2>&1 + echo "$minute $hour * * $week bash /bin/AutoUpdate.sh -u" >> /etc/crontabs/root + else + sed -i '/AutoUpdate/d' /etc/crontabs/root >/dev/null 2>&1 + fi + if [ -f /bin/AutoUpdate.sh ] && [ -f /bin/openwrt_info ];then + custom_github_url="$(uci get autoupdate.@login[0].github)" + current_github_url="$(grep Github= /bin/openwrt_info | cut -c8-100)" + [[ -n "${custom_github_url}" ]] && { + [[ "${custom_github_url}" != "${current_github_url}" ]] && { + sed -i "s?${current_github_url}?${custom_github_url}?g" /bin/openwrt_info + } + } + fi + /etc/init.d/cron restart +} + + +start() +{ + config_load autoupdate + config_foreach run_autoupdate login +} + +stop() +{ + sed -i '/AutoUpdate/d' /etc/crontabs/root >/dev/null 2>&1 +} + +restart() +{ + stop + start +} diff --git a/luci-app-autoupdate/root/etc/uci-defaults/autoupdate b/luci-app-autoupdate/root/etc/uci-defaults/autoupdate new file mode 100644 index 00000000..38e88985 --- /dev/null +++ b/luci-app-autoupdate/root/etc/uci-defaults/autoupdate @@ -0,0 +1,10 @@ +#!/bin/sh + +uci -q batch <<-EOF >/dev/null + delete ucitrack.@autoupdate[-1] + add ucitrack autoupdate + set ucitrack.@autoupdate[-1].init=autoupdate + commit ucitrack +EOF + +exit 0 diff --git a/luci-app-autoupdate/root/usr/share/autoupdate/Check_Update.sh b/luci-app-autoupdate/root/usr/share/autoupdate/Check_Update.sh new file mode 100644 index 00000000..2712d6a4 --- /dev/null +++ b/luci-app-autoupdate/root/usr/share/autoupdate/Check_Update.sh @@ -0,0 +1,30 @@ +#!/bin/bash +# https://github.com/Hyy2001X/AutoBuild-Actions +# AutoBuild Module by Hyy2001 + +rm -f /tmp/cloud_version +rm -f /tmp/Version_Tags +if [[ -f /bin/openwrt_info ]]; then + chmod +x /bin/openwrt_info + bash /bin/AutoUpdate.sh -w +else + echo "未检测到openwrt_info文件,无法运行更新程序!" > /tmp/cloud_version + exit 1 +fi +[[ ! -f /tmp/Version_Tags ]] && echo "未检测到云端版本,请检查网络,或您的仓库为私库,或您修改的Github地址有错误,或发布已被删除,或再次刷新网页试试!" > /tmp/cloud_version && exit 1 +chmod +x /tmp/Version_Tags && source /tmp/Version_Tags +if [[ -n "${CLOUD_Version}" ]];then + if [[ "${CURRENT_Version}" -eq "${CLOUD_Version}" ]];then + Checked_Type="已是最新" + echo "${CLOUD_Version} [${Checked_Type}]" > /tmp/cloud_version + elif [[ "${CURRENT_Version}" -gt "${CLOUD_Version}" ]];then + Checked_Type="发现更高版本固件可更新" + echo "${CLOUD_Version} [${Checked_Type}]" > /tmp/cloud_version + elif [[ "${CURRENT_Version}" -lt "${CLOUD_Version}" ]];then + Checked_Type="云端最高版本固件,低于您现在所安装的版本" + echo "${CLOUD_Version} [${Checked_Type}]" > /tmp/cloud_version + fi +else + echo "没检测到云端固件,您可能把云端固件删除了,或格式不对称,比如爱快虚拟机安装EIF格式都会变成Legacy引导!" > /tmp/cloud_version +fi +exit 0 diff --git a/luci-app-autoupdate/root/usr/share/rpcd/acl.d/luci-app-autoupdate.json b/luci-app-autoupdate/root/usr/share/rpcd/acl.d/luci-app-autoupdate.json new file mode 100644 index 00000000..86d43bdd --- /dev/null +++ b/luci-app-autoupdate/root/usr/share/rpcd/acl.d/luci-app-autoupdate.json @@ -0,0 +1,11 @@ +{ + "luci-app-autoupdate": { + "description": "Grant UCI access for luci-app-autoupdate", + "read": { + "uci": [ "autoupdate" ] + }, + "write": { + "uci": [ "autoupdate" ] + } + } +} diff --git a/luci-app-beardropper b/luci-app-beardropper deleted file mode 160000 index e0280b19..00000000 --- a/luci-app-beardropper +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e0280b19010f2ac8ec616b5cde429825d1466872 diff --git a/luci-app-beardropper/.gitattributes b/luci-app-beardropper/.gitattributes new file mode 100644 index 00000000..dfe07704 --- /dev/null +++ b/luci-app-beardropper/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/luci-app-beardropper/.gitignore b/luci-app-beardropper/.gitignore new file mode 100644 index 00000000..9bea4330 --- /dev/null +++ b/luci-app-beardropper/.gitignore @@ -0,0 +1,2 @@ + +.DS_Store diff --git a/luci-app-beardropper/LICENSE b/luci-app-beardropper/LICENSE new file mode 100644 index 00000000..e963df82 --- /dev/null +++ b/luci-app-beardropper/LICENSE @@ -0,0 +1,622 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + diff --git a/luci-app-beardropper/Makefile b/luci-app-beardropper/Makefile new file mode 100644 index 00000000..bbdbdcc0 --- /dev/null +++ b/luci-app-beardropper/Makefile @@ -0,0 +1,22 @@ +# +# Copyright (C) 2020 Nate Ding +# +# This is free software, licensed under the GNU General Public License v3. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +LUCI_Title:=LuCI Support for BearDropper +LUCI_PKGARCH=all + +PKG_VERSION:=1.1 +PKG_RELEASE:=20200522 + +PKG_MAINTANINER:=Nate Ding +PKG_LICENSE:=GLPv3 +PKG_LICENSE_FILES:=LICENSE + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/luci-app-beardropper/README.md b/luci-app-beardropper/README.md new file mode 100644 index 00000000..efb0e223 --- /dev/null +++ b/luci-app-beardropper/README.md @@ -0,0 +1,59 @@ +luci-app-beardropper +=== + +[Preview][preview] +--- +luci-app-beardropper, a log examination script w/ iptables firewall rule generation response. + + This is the LuCI app built for the elegant firewall rule generation on-the-fly script [bearDropper][bearDropper], only a few modifications were made to work with Luci. + + + +Targets/Devices +--- +Written in shell scripts, so it shall work all good on all devices. + + +Config +--- +The config file path is: `/etc/config/beardropper` and this is the uci configuration format. + + + +Compile +--- +RECOMMENDED!!!! (推荐使用右边的feeds---->)You can use [natelol feeds][feeds] + + +OR + + +0. Go under `openwrt/` + +1. Make your own local feeds, say a folder `mkdir yourfeeds` + +2. Clone master under feeds to have `git clone https://github.com/natelol/luci-app-beardropper yourefeeds/luci-app-beardropper` + +3. Append `src-link yourfeeds /path/to/openwrt/yourfeeds` in the file `openwrt/feeds.conf(.default)` + +4. Run following scripts under `openwrt`: + +```bash +# Update feeds +./scripts/feeds update -a +./scripts/feeds install -a + +# M select luci-app-beardropper in LuCI -> 3. Applications also 2. Modules->Translations if you want translations together +make menuconfig +# compile +make package/feeds/luci-app-beardropper/compile V=99 +``` + +Logs +--- +`2020-05-21` Added a new tab listing the blocked IPs. + + + [preview]: https://github.com/natelol/luci-app-beardropper/tree/master/preview + [bearDropper]: https://github.com/robzr/bearDropper + [feeds]: https://github.com/natelol/natelol \ No newline at end of file diff --git a/luci-app-beardropper/luasrc/controller/beardropper.lua b/luci-app-beardropper/luasrc/controller/beardropper.lua new file mode 100755 index 00000000..c28f0b34 --- /dev/null +++ b/luci-app-beardropper/luasrc/controller/beardropper.lua @@ -0,0 +1,19 @@ +module("luci.controller.beardropper", package.seeall) + +function index() + if not nixio.fs.access("/etc/config/beardropper") then + return + end + entry({"admin", "services", "beardropper"}, alias("admin", "services", "beardropper", "setting"),_("BearDropper"), 20).dependent = true + entry({"admin", "services", "beardropper", "status"}, call("act_status")) + entry({"admin", "services", "beardropper", "setting"}, cbi("beardropper/setting"), _("Setting"), 30).leaf= true + entry({"admin", "services", "beardropper", "log"}, form("beardropper/log"),_("Log"),40).leaf= true + --entry: +end + +function act_status() + local e={} + e.running = luci.sys.call("pgrep -f /usr/sbin/beardropper >/dev/null")==0 + luci.http.prepare_content("application/json") + luci.http.write_json(e) +end \ No newline at end of file diff --git a/luci-app-beardropper/luasrc/model/cbi/beardropper/log.lua b/luci-app-beardropper/luasrc/model/cbi/beardropper/log.lua new file mode 100644 index 00000000..c725bcdf --- /dev/null +++ b/luci-app-beardropper/luasrc/model/cbi/beardropper/log.lua @@ -0,0 +1,17 @@ +f = SimpleForm("logview") +f.reset = false +f.submit = false +t = f:field(TextValue, "conf") +t.rmempty = true +t.rows = 20 +function t.cfgvalue() +local logs = luci.util.execi("logread | grep authpriv | grep beardropper") +local s = "" +for line in logs do +s = line .. "\n" .. s +end +return s +end +t.readonly="readonly" + +return f diff --git a/luci-app-beardropper/luasrc/model/cbi/beardropper/setting.lua b/luci-app-beardropper/luasrc/model/cbi/beardropper/setting.lua new file mode 100755 index 00000000..2735200b --- /dev/null +++ b/luci-app-beardropper/luasrc/model/cbi/beardropper/setting.lua @@ -0,0 +1,54 @@ + +m = Map("beardropper", translate("BearDropper"), +translate("luci-app-beardropper, the LuCI app built with the elegant firewall rule generation on-the-fly script bearDropper.

Should you have any questions, please refer to the repo: ")..[[luci-app-beardropper]] +) +m:chain("luci") + +m:section(SimpleSection).template="beardropper/status" + +s = m:section(TypedSection, "beardropper", translate("")) +s.anonymous = true +s.addremove = false + +-- TABS +s:tab("options", translate("Options")) +s:tab("blocked", translate("Blocked IP")) + +o = s:taboption("options", Flag, "enabled",translate("Enabled")) +o.default = 0 + +-- OPTIONS +o = s:taboption("options", ListValue, "defaultMode", translate("Running Mode")) +o.default = "follow" +o:value("follow", translate("Follow")) +o:value("entire", translate("Entire")) +o:value("today", translate("Today")) +o:value("wipe", translate("Wipe")) + + +o = s:taboption("options", Value, "attemptCount", translate("Attempt Tolerance"), translate("failure attempts from a given IP required to trigger a ban")) + +o = s:taboption("options", Value, "attemptPeriod", translate("Attempt Cycle"), translate("time period during which attemptCount must be exceeded in order to trigger a ban
Format: 1w2d3h4m5s represents 1week 2days 3hours 4minutes 5 seconds")) + +o = s:taboption("options", Value, "banLength", translate("Ban Period"), translate("how long a ban exist once the attempt threshold is exceeded")) + +o = s:taboption("options", ListValue, "logLevel", translate("Log Level")) +o.default = "1" +o:value("0", translate("Silent")) +o:value("1", translate("Default")) +o:value("2", translate("Verbose")) +o:value("3", translate("Debug")) + + +o = s:taboption("blocked", Value, "blocked", translate("Blocked IP List")) +o.template="cbi/tvalue" +o.rows=40 +o.wrap="off" +o.readonly="true" +function o.cfgvalue(e, e) + return luci.sys.exec("cat /tmp/beardropper.bddb | awk /'=1/'| awk -F '=' '{print $1}' | awk '{print substr($0,6)}' | awk 'gsub(/_/,\":\",$0)'") +end + + + +return m diff --git a/luci-app-beardropper/luasrc/view/beardropper/status.htm b/luci-app-beardropper/luasrc/view/beardropper/status.htm new file mode 100755 index 00000000..808b3a00 --- /dev/null +++ b/luci-app-beardropper/luasrc/view/beardropper/status.htm @@ -0,0 +1,22 @@ + + +
+

+ <%:Collecting data...%> +

+
\ No newline at end of file diff --git a/luci-app-beardropper/po/zh-cn b/luci-app-beardropper/po/zh-cn new file mode 120000 index 00000000..8d69574d --- /dev/null +++ b/luci-app-beardropper/po/zh-cn @@ -0,0 +1 @@ +zh_Hans \ No newline at end of file diff --git a/luci-app-beardropper/po/zh_Hans/beardropper.po b/luci-app-beardropper/po/zh_Hans/beardropper.po new file mode 100755 index 00000000..bcffc107 --- /dev/null +++ b/luci-app-beardropper/po/zh_Hans/beardropper.po @@ -0,0 +1,115 @@ +bearDropper#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:36 +msgid "Attempt Cycle" +msgstr "尝试登录时间段" + + +msgid "Setting" +msgstr "设置" + +msgid "Log" +msgstr "日志" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:34 +msgid "Attempt Tolerance" +msgstr "最大尝试登录次数" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:38 +msgid "Ban Period" +msgstr "封禁IP时长" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/controller/bearDropper.lua:7 +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:7 +msgid "BearDropper" +msgstr "" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:20 +msgid "Blocked IP" +msgstr "屏蔽列表" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:52 +msgid "Blocked IP List" +msgstr "已屏蔽IP列表" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/view/bearDropper/status.htm:20 +msgid "Collecting data..." +msgstr "" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:45 +msgid "Debug" +msgstr "调试" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:43 +msgid "Default" +msgstr "默认" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:22 +msgid "Enabled" +msgstr "启用" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:29 +msgid "Entire" +msgstr "已有记录" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:28 +msgid "Follow" +msgstr "后台监控" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:40 +msgid "Log Level" +msgstr "日志等级" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/view/bearDropper/status.htm:10 +msgid "NOT RUNNING" +msgstr "" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:19 +msgid "Options" +msgstr "选项" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/view/bearDropper/status.htm:7 +msgid "RUNNING" +msgstr "" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:26 +msgid "Running Mode" +msgstr "运行模式" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:42 +msgid "Silent" +msgstr "安静" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:30 +msgid "Today" +msgstr "仅今日" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:44 +msgid "Verbose" +msgstr "详细" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:31 +msgid "Wipe" +msgstr "清除所有" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:34 +msgid "failure attempts from a given IP required to trigger a ban" +msgstr "尝试登录超过设定值次数的IP将被封禁" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:38 +msgid "how long a ban exist once the attempt threshold is exceeded" +msgstr "IP将被封禁设定的时间" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:8 +msgid "" +"luci-app-beardropper, the LuCI app built with the elegant firewall rule " +"generation on-the-fly script bearDropper.

Should you have any " +"questions, please refer to the repo:" +msgstr "" +"luci-app-beardropper, 是一款能够在开启公网访问之后对潜在的ssh attack进行防御" +"的脚本.

如果你在使用中有任何问题,请到项目中提问: " + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:36 +msgid "" +"time period during which attemptCount must be exceeded in order to trigger a " +"ban
Format: 1w2d3h4m5s represents 1week 2days 3hours 4minutes 5 seconds" +msgstr "" +"在设定的时间段内连续尝试失败
格式:1w2d3h4m5s代表1周2天3小时4分5秒" diff --git a/luci-app-beardropper/po/zh_Hant/beardropper.po b/luci-app-beardropper/po/zh_Hant/beardropper.po new file mode 100644 index 00000000..00c1da72 --- /dev/null +++ b/luci-app-beardropper/po/zh_Hant/beardropper.po @@ -0,0 +1,115 @@ +bearDropper#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:36 +msgid "Attempt Cycle" +msgstr "嘗試登錄時間段" + + +msgid "Setting" +msgstr "設置" + +msgid "Log" +msgstr "日誌" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:34 +msgid "Attempt Tolerance" +msgstr "最大嘗試登錄次數" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:38 +msgid "Ban Period" +msgstr "封禁IP時長" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/controller/bearDropper.lua:7 +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:7 +msgid "BearDropper" +msgstr "" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:20 +msgid "Blocked IP" +msgstr "屏蔽列表" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:52 +msgid "Blocked IP List" +msgstr "已屏蔽IP列表" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/view/bearDropper/status.htm:20 +msgid "Collecting data..." +msgstr "" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:45 +msgid "Debug" +msgstr "調試" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:43 +msgid "Default" +msgstr "默認" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:22 +msgid "Enabled" +msgstr "啟用" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:29 +msgid "Entire" +msgstr "已有記錄" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:28 +msgid "Follow" +msgstr "後臺監控" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:40 +msgid "Log Level" +msgstr "日誌等級" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/view/bearDropper/status.htm:10 +msgid "NOT RUNNING" +msgstr "" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:19 +msgid "Options" +msgstr "選項" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/view/bearDropper/status.htm:7 +msgid "RUNNING" +msgstr "" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:26 +msgid "Running Mode" +msgstr "運行模式" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:42 +msgid "Silent" +msgstr "安靜" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:30 +msgid "Today" +msgstr "僅今日" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:44 +msgid "Verbose" +msgstr "詳細" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:31 +msgid "Wipe" +msgstr "清除所有" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:34 +msgid "failure attempts from a given IP required to trigger a ban" +msgstr "嘗試登錄超過設定值次數的IP將被封禁" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:38 +msgid "how long a ban exist once the attempt threshold is exceeded" +msgstr "IP將被封禁設定的時間" + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:8 +msgid "" +"luci-app-beardropper, the LuCI app built with the elegant firewall rule " +"generation on-the-fly script bearDropper.

Should you have any " +"questions, please refer to the repo:" +msgstr "" +"luci-app-beardropper, 是壹款能夠在開啟公網訪問之後對潛在的ssh attack進行防禦" +"的腳本.

如果妳在使用中有任何問題,請到項目中提問: " + +#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:36 +msgid "" +"time period during which attemptCount must be exceeded in order to trigger a " +"ban
Format: 1w2d3h4m5s represents 1week 2days 3hours 4minutes 5 seconds" +msgstr "" +"在設定的時間段內連續嘗試失敗
格式:1w2d3h4m5s代表1周2天3小時4分5秒" diff --git a/luci-app-beardropper/preview/1_setting.png b/luci-app-beardropper/preview/1_setting.png new file mode 100644 index 00000000..6cd9b92c Binary files /dev/null and b/luci-app-beardropper/preview/1_setting.png differ diff --git a/luci-app-beardropper/preview/2_blockedlist.png b/luci-app-beardropper/preview/2_blockedlist.png new file mode 100644 index 00000000..cfee88d3 Binary files /dev/null and b/luci-app-beardropper/preview/2_blockedlist.png differ diff --git a/luci-app-beardropper/root/etc/config/beardropper b/luci-app-beardropper/root/etc/config/beardropper new file mode 100644 index 00000000..ec5d0d4e --- /dev/null +++ b/luci-app-beardropper/root/etc/config/beardropper @@ -0,0 +1,18 @@ +config beardropper + option attemptCount '5' + option attemptPeriod '12h' + option banLength '1w' + option logFacility 'authpriv.notice' + option fileStateType 'bddb' + option fileStateTempPrefix '/tmp/beardropper' + option fileStatePersistPrefix '/etc/beardropper' + list firewallHookChain 'input_wan_rule:1' + list firewallHookChain 'forwarding_wan_rule:1' + option firewallTarget 'DROP' + list logRegex 's/[`$"\'\'']//g' + list logRegex '/has invalid shell, rejected$/d' + list logRegex '/^[A-Za-z ]+[0-9: ]+authpriv.warn dropbear\[.+([0-9]+\.){3}[0-9]+/p' + list logRegex '/^[A-Za-z ]+[0-9: ]+authpriv.info dropbear\[.+:\ Exit before auth:.*/p' + option defaultMode 'follow' + option enabled '1' + option logLevel '2' diff --git a/luci-app-beardropper/root/etc/init.d/beardropper b/luci-app-beardropper/root/etc/init.d/beardropper new file mode 100755 index 00000000..a7c1c98d --- /dev/null +++ b/luci-app-beardropper/root/etc/init.d/beardropper @@ -0,0 +1,46 @@ +#!/bin/sh /etc/rc.common +START=98 + +PROG=/usr/sbin/beardropper +SERVICE_DAEMONIZE=1 +SERVICE_WRITE_PID=1 + +getKids() { + egrep "^PPid: *$1$" /proc/[0-9]*/s*s 2>/dev/null | cut -f3 -d/ | xargs echo +} + +start() { + service_start ${PROG} -m follow + echo "beardropper started!" +} + +stop() { + #PID=`cat /var/run/bearDropper.pid` + #kill `getKids $PID` + kill -9 `pgrep -f /usr/sbin/beardropper` + sleep 1 + service_stop ${PROG} + echo "beardropper exit...." +} + +restart() { + enabled=$(uci get beardropper.@beardropper[0].enabled) + pgrep -f ${PROG} >/dev/null + if [ $? -eq 0 ];then #running + if [ $enabled -eq 1 ]; then + stop + sleep 1 + echo "beardropper is restarting..." + start + else + stop + fi + else + if [ $enabled -eq 1 ]; then + start + else + exit 0 + fi + fi + +} diff --git a/luci-app-beardropper/root/etc/uci-defaults/luci-beardropper b/luci-app-beardropper/root/etc/uci-defaults/luci-beardropper new file mode 100644 index 00000000..0565aa65 --- /dev/null +++ b/luci-app-beardropper/root/etc/uci-defaults/luci-beardropper @@ -0,0 +1,11 @@ +#!/bin/sh + +uci -q batch <<-EOF >/dev/null + delete ucitrack.@beardropper[-1] + add ucitrack beardropper + set ucitrack.@beardropper[-1].init=beardropper + commit ucitrack +EOF + +rm -rf /tmp/luci-* +exit 0 diff --git a/luci-app-beardropper/root/usr/sbin/beardropper b/luci-app-beardropper/root/usr/sbin/beardropper new file mode 100755 index 00000000..d3015491 --- /dev/null +++ b/luci-app-beardropper/root/usr/sbin/beardropper @@ -0,0 +1,517 @@ +#!/bin/ash +# +# beardropper - dropbear log parsing ban agent for OpenWRT (Chaos Calmer rewrite of dropBrute.sh) +# http://github.com/robzr/bearDropper -- Rob Zwissler 11/2015 +# +# - lightweight, no dependencies, busybox ash + native OpenWRT commands +# - uses uci for configuration, overrideable via command line arguments +# - runs continuously in background (via init script) or periodically (via cron) +# - uses BIND time shorthand, ex: 1w5d3h1m8s is 1 week, 5 days, 3 hours, 1 minute, 8 seconds +# - Whitelist IP or CIDR entries (TBD) in uci config file +# - Records state file to tmpfs and intelligently syncs to persistent storage (can disable) +# - Persistent sync routines are optimized to avoid excessive writes (persistentStateWritePeriod) +# - Every run occurs in one of the following modes. If not specified, interval mode (24 hours) is +# the default when not specified (the init script specifies follow mode via command line) +# +# "follow" mode follows syslog to process entries as they happen; generally launched via init +# script. Responds the fastest, runs the most efficiently, but is always in memory. +# "interval" mode only processes entries going back the specified interval; requires +# more processing than today mode, but responds more accurately. Use with cron. +# "today" mode looks at log entries from the day it is being run, simple and lightweight, +# generally run from cron periodically (same simplistic behavior as dropBrute.sh) +# "entire" mode runs through entire contents of the syslog ring buffer +# "wipe" mode tears down the firewall rules and removes the state files + +# Load UCI config variable, or use default if not set +# Args: $1 = variable name (also uci option name), $2 = default_value +uciSection='beardropper.@[0]' +uciLoadVar () { + local getUci + getUci=`uci -q get ${uciSection}."$1"` || getUci="$2" + eval $1=\'$getUci\'; +} +uciLoad() { + local tFile=`mktemp` delim=" +" + [ "$1" = -d ] && { delim="$2"; shift 2; } + uci -q -d"$delim" get "$uciSection.$1" 2>/dev/null >$tFile + if [ $? = 0 ] ; then + sed -e s/^\'// -e s/\'$// <$tFile + else + while [ -n "$2" ]; do echo $2; shift; done + fi + rm -f $tFile +} + +# Common config variables - edit these in /etc/config/beardropper +# or they can be overridden at runtime with command line options +# +uciLoadVar defaultMode entire +uciLoadVar enabled 0 +uciLoadVar attemptCount 10 +uciLoadVar attemptPeriod 12h +uciLoadVar banLength 1w +uciLoadVar logLevel 1 +uciLoadVar logFacility authpriv.notice +uciLoadVar persistentStateWritePeriod -1 +uciLoadVar fileStateType bddb +uciLoadVar fileStateTempPrefix /tmp/beardropper +uciLoadVar fileStatePersistPrefix /etc/beardropper +firewallHookChains="`uciLoad -d \ firewallHookChain input_wan_rule:1 forwarding_wan_rule:1`" +uciLoadVar firewallTarget DROP + +# Not commonly changed, but changeable via uci or cmdline (primarily +# to enable multiple parallel runs with different parameters) +uciLoadVar firewallChain beardropper + +# Advanced variables, changeable via uci only (no cmdline), it is +# unlikely that these will need to be changed, but just in case... +# +uciLoadVar syslogTag "beardropper[$$]" +# how often to attempt to expire bans when in follow mode +uciLoadVar followModeCheckInterval 30m +uciLoadVar cmdLogread 'logread' # for tuning, ex: "logread -l250" +uciLoadVar cmdLogreadEba 'logread' # for "Exit before auth:" backscanning +uciLoadVar formatLogDate '%b %e %H:%M:%S %Y' # used to convert syslog dates +uciLoadVar formatTodayLogDateRegex '^%a %b %e ..:..:.. %Y' # filter for today mode + +# Begin functions +# +# Clear bddb entries from environment +bddbClear () { + local bddbVar + for bddbVar in `set | egrep '^bddb_[0-9_]*=' | cut -f1 -d= | xargs echo -n` ; do eval unset $bddbVar ; done + bddbStateChange=1 +} + +# Returns count of unique IP entries in environment +bddbCount () { set | egrep '^bddb_[0-9_]*=' | wc -l ; } + +# Loads existing bddb file into environment +# Arg: $1 = file, $2 = type (bddb/bddbz), $3 = +bddbLoad () { + local loadFile="$1.$2" fileType="$2" + if [ "$fileType" = bddb -a -f "$loadFile" ] ; then + . "$loadFile" + elif [ "$fileType" = bddbz -a -f "$loadFile" ] ; then + local tmpFile="`mktemp`" + zcat $loadFile > "$tmpFile" + . "$tmpFile" + rm -f "$tmpFile" + fi + bddbStateChange=0 +} + +# Saves environment bddb entries to file, Arg: $1 = file to save in +bddbSave () { + local saveFile="$1.$2" fileType="$2" + if [ "$fileType" = bddb ] ; then + set | egrep '^bddb_[0-9_]*=' | sed s/\'//g > "$saveFile" + elif [ "$fileType" = bddbz ] ; then + set | egrep '^bddb_[0-9_]*=' | sed s/\'//g | gzip -c > "$saveFile" + fi + bddbStateChange=0 +} + +# Set bddb record status=1, update ban time flag with newest +# Args: $1=IP Address $2=timeFlag +bddbEnableStatus () { + local record=`echo $1 | sed -e 's/\./_/g' -e 's/^/bddb_/'` + local newestTime=`bddbGetTimes $1 | sed 's/.* //' | xargs echo $2 | tr \ '\n' | sort -n | tail -1 ` + eval $record="1,$newestTime" + bddbStateChange=1 +} + +# Args: $1=IP Address +bddbGetStatus () { + bddbGetRecord $1 | cut -d, -f1 +} + +# Args: $1=IP Address +bddbGetTimes () { + bddbGetRecord $1 | cut -d, -f2- +} + +# Args: $1 = IP address, $2 [$3 ...] = timestamp (seconds since epoch) +bddbAddRecord () { + local ip="`echo "$1" | tr . _`" ; shift + local newEpochList="$@" status="`eval echo \\\$bddb_$ip | cut -f1 -d,`" + local oldEpochList="`eval echo \\\$bddb_$ip | cut -f2- -d, | tr , \ `" + local epochList=`echo $oldEpochList $newEpochList | xargs -n 1 echo | sort -un | xargs echo -n | tr \ ,` + [ -z "$status" ] && status=0 + eval "bddb_$ip"\=\"$status,$epochList\" + bddbStateChange=1 +} + +# Args: $1 = IP address +bddbRemoveRecord () { + local ip="`echo "$1" | tr . _`" + eval unset bddb_$ip + bddbStateChange=1 +} + +# Returns all IPs (not CIDR) present in records +bddbGetAllIPs () { + local ipRaw record + set | egrep '^bddb_[0-9_]*=' | tr \' \ | while read record ; do + ipRaw=`echo $record | cut -f1 -d= | sed 's/^bddb_//'` + if [ `echo $ipRaw | tr _ \ | wc -w` -eq 4 ] ; then + echo $ipRaw | tr _ . + fi + done +} + +# retrieve single IP record, Args: $1=IP +bddbGetRecord () { + local record + record=`echo $1 | sed -e 's/\./_/g' -e 's/^/bddb_/'` + eval echo \$$record +} + +isValidBindTime () { echo "$1" | egrep -q '^[0-9]+$|^([0-9]+[wdhms]?)+$' ; } + +# expands Bind time syntax into seconds (ex: 3w6d23h59m59s), Arg: $1=time string +expandBindTime () { + isValidBindTime "$1" || { logLine 0 "Error: Invalid time specified ($1)" >&2 ; exit 254 ; } + echo $((`echo "$1" | sed -e 's/w+*/*7d+/g' -e 's/d+*/*24h+/g' -e 's/h+*/*60m+/g' -e 's/m+*/*60+/g' \ + -e s/s//g -e s/+\$//`)) +} + +# Args: $1 = loglevel, $2 = info to log +logLine () { + [ $1 -gt $logLevel ] && return + shift + if [ "$logFacility" = "stdout" ] ; then echo "$@" + elif [ "$logFacility" = "stderr" ] ; then echo "$@" >&2 + else logger -t "$syslogTag" -p "$logFacility" "$@" + fi +} + +# extra validation, fails safe. Args: $1=log line +getLogTime () { + local logDateString=`echo "$1" | sed -n \ + 's/^[A-Z][a-z]* \([A-Z][a-z]* *[0-9][0-9]* *[0-9][0-9]*:[0-9][0-9]:[0-9][0-9] [0-9][0-9]*\) .*$/\1/p'` + date -d"$logDateString" -D"$formatLogDate" +%s || logLine 1 \ + "Error: logDateString($logDateString) malformed line ($1)" +} + +# extra validation, fails safe. Args: $1=log line +getLogIP () { + local logLine="$1" + local ebaPID=`echo "$logLine" | sed -n 's/^.*authpriv.info \(dropbear\[[0-9]*\]:\) Exit before auth:.*/\1/p'` + [ -n "$ebaPID" ] && logLine=`$cmdLogreadEba | fgrep "${ebaPID} Child connection from "` + echo "$logLine" | sed -n 's/^.*[^0-9]\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*$/\1/p' +} + +# Args: $1=IP +unBanIP () { + if iptables -C $firewallChain -s $ip -j "$firewallTarget" 2>/dev/null ; then + logLine 1 "Removing ban rule for IP $ip from iptables" + iptables -D $firewallChain -s $ip -j "$firewallTarget" + else + logLine 3 "unBanIP() Ban rule for $ip not present in iptables" + fi +} + +# Args: $1=IP +banIP () { + local ip="$1" x chain position + if ! iptables -nL $firewallChain >/dev/null 2>/dev/null ; then + logLine 1 "Creating iptables chain $firewallChain" + iptables -N $firewallChain + fi + for x in $firewallHookChains ; do + chain="${x%:*}" ; position="${x#*:}" + if [ $position -ge 0 ] && ! iptables -C $chain -j $firewallChain 2>/dev/null ; then + logLine 1 "Inserting hook into iptables chain $chain" + if [ $position = 0 ] ; then + iptables -A $chain -j $firewallChain + else + iptables -I $chain $position -j $firewallChain + fi ; fi + done + if ! iptables -C $firewallChain -s $ip -j "$firewallTarget" 2>/dev/null ; then + logLine 1 "Inserting ban rule for IP $ip into iptables chain $firewallChain" + iptables -A $firewallChain -s $ip -j "$firewallTarget" + else + logLine 3 "banIP() rule for $ip already present in iptables chain" + fi +} + +wipeFirewall () { + local x chain position + for x in $firewallHookChains ; do + chain="${x%:*}" ; position="${x#*:}" + if [ $position -ge 0 ] ; then + if iptables -C $chain -j $firewallChain 2>/dev/null ; then + logLine 1 "Removing hook from iptables chain $chain" + iptables -D $chain -j $firewallChain + fi ; fi + done + if iptables -nL $firewallChain >/dev/null 2>/dev/null ; then + logLine 1 "Flushing and removing iptables chain $firewallChain" + iptables -F $firewallChain 2>/dev/null + iptables -X $firewallChain 2>/dev/null + fi +} + +# review state file for expired records - we could add the bantime to +# the rule via --comment but I can't think of a reason why that would +# be necessary unless there is a bug in the expiration logic. The +# state db should be more resiliant than the firewall in practice. +# +bddbCheckStatusAll () { + local now=`date +%s` + bddbGetAllIPs | while read ip ; do + if [ `bddbGetStatus $ip` -eq 1 ] ; then + logLine 3 "bddbCheckStatusAll($ip) testing banLength:$banLength + bddbGetTimes:`bddbGetTimes $ip` vs. now:$now" + if [ $((banLength + `bddbGetTimes $ip`)) -lt $now ] ; then + logLine 1 "Ban expired for $ip, removing from iptables" + unBanIP $ip + bddbRemoveRecord $ip + else + logLine 3 "bddbCheckStatusAll($ip) not expired yet" + banIP $ip + fi + elif [ `bddbGetStatus $ip` -eq 0 ] ; then + local times=`bddbGetTimes $ip | tr , \ ` + local timeCount=`echo $times | wc -w` + local lastTime=`echo $times | cut -d\ -f$timeCount` + if [ $((lastTime + attemptPeriod)) -lt $now ] ; then + bddbRemoveRecord $ip + fi ; fi + saveState + done + loadState +} + +# Only used when status is already 0 and possibly going to 1, Args: $1=IP +bddbEvaluateRecord () { + local ip=$1 firstTime lastTime + local times=`bddbGetRecord $1 | cut -d, -f2- | tr , \ ` + local timeCount=`echo $times | wc -w` + local didBan=0 + + # 1: not enough attempts => do nothing and exit + # 2: attempts exceed threshold in time period => ban + # 3: attempts exceed threshold but time period is too long => trim oldest time, recalculate + while [ $timeCount -ge $attemptCount ] ; do + firstTime=`echo $times | cut -d\ -f1` + lastTime=`echo $times | cut -d\ -f$timeCount` + timeDiff=$((lastTime - firstTime)) + logLine 3 "bddbEvaluateRecord($ip) count=$timeCount timeDiff=$timeDiff/$attemptPeriod" + if [ $timeDiff -le $attemptPeriod ] ; then + bddbEnableStatus $ip $lastTime + logLine 2 "bddbEvaluateRecord($ip) exceeded ban threshold, adding to iptables" + banIP $ip + didBan=1 + fi + times=`echo $times | cut -d\ -f2-` + timeCount=`echo $times | wc -w` + done + [ $didBan = 0 ] && logLine 2 "bddbEvaluateRecord($ip) does not exceed threshhold, skipping" +} + +# Reads filtered log line and evaluates for action Args: $1=log line +processLogLine () { + local time=`getLogTime "$1"` + local ip=`getLogIP "$1"` + local status="`bddbGetStatus $ip`" + + if [ "$status" = -1 ] ; then + logLine 2 "processLogLine($ip,$time) IP is whitelisted" + elif [ "$status" = 1 ] ; then + if [ "`bddbGetTimes $ip`" -ge $time ] ; then + logLine 2 "processLogLine($ip,$time) already banned, ban timestamp already equal or newer" + else + logLine 2 "processLogLine($ip,$time) already banned, updating ban timestamp" + bddbEnableStatus $ip $time + fi + banIP $ip + elif [ -n "$ip" -a -n "$time" ] ; then + bddbAddRecord $ip $time + logLine 2 "processLogLine($ip,$time) Added record, comparing" + bddbEvaluateRecord $ip + else + logLine 1 "processLogLine($ip,$time) malformed line ($1)" + fi +} + +# Args, $1=-f to force a persistent write (unless lastPersistentStateWrite=-1) +saveState () { + local forcePersistent=0 + [ "$1" = "-f" ] && forcePersistent=1 + + if [ $bddbStateChange -gt 0 ] ; then + logLine 3 "saveState() saving to temp state file" + bddbSave "$fileStateTempPrefix" "$fileStateType" + logLine 3 "saveState() now=`date +%s` lPSW=$lastPersistentStateWrite pSWP=$persistentStateWritePeriod fP=$forcePersistent" + fi + if [ $persistentStateWritePeriod -gt 1 ] || [ $persistentStateWritePeriod -eq 0 -a $forcePersistent -eq 1 ] ; then + if [ $((`date +%s` - lastPersistentStateWrite)) -ge $persistentStateWritePeriod ] || [ $forcePersistent -eq 1 ] ; then + if [ ! -f "$fileStatePersist" ] || ! cmp -s "$fileStateTemp" "$fileStatePersist" ; then + logLine 2 "saveState() writing to persistent state file" + bddbSave "$fileStatePersistPrefix" "$fileStateType" + lastPersistentStateWrite="`date +%s`" + fi ; fi ; fi +} + +loadState () { + bddbClear + bddbLoad "$fileStatePersistPrefix" "$fileStateType" + bddbLoad "$fileStateTempPrefix" "$fileStateType" + logLine 2 "loadState() loaded `bddbCount` entries" +} + +printUsage () { + cat <<-_EOF_ + Usage: beardropper [-m mode] [-a #] [-b #] [-c ...] [-C ...] [-f ...] [-l #] [-j ...] [-p #] [-P #] [-s ...] + + Running Modes (-m) (def: $defaultMode) + follow constantly monitors log + entire processes entire log contents + today processes log entries from same day only + # interval mode, specify time string or seconds + wipe wipe state files, unhook and remove firewall chain + + Options + -a # attempt count before banning (def: $attemptCount) + -b # ban length once attempts hit threshold (def: $banLength) + -c ... firewall chain to record bans (def: $firewallChain) + -C ... firewall chains/positions to hook into (def: $firewallHookChains) + -f ... log facility (syslog facility or stdout/stderr) (def: $logFacility) + -j ... firewall target (def: $firewallTarget) + -l # log level - 0=off, 1=standard, 2=verbose (def: $logLevel) + -p # attempt period which attempt counts must happen in (def: $attemptPeriod) + -P # persistent state file write period (def: $persistentStateWritePeriod) + -s ... persistent state file prefix (def: $fileStatePersistPrefix) + -t ... temporary state file prefix (def: $fileStateTempPrefix) + + All time strings can be specified in seconds, or using BIND style + time strings, ex: 1w2d3h5m30s is 1 week, 2 days, 3 hours, etc... + + _EOF_ +} + +# Begin main logic +# +unset logMode +while getopts a:b:c:C:f:hj:l:m:p:P:s:t: arg ; do + case "$arg" in + a) attemptCount="$OPTARG" ;; + b) banLength="$OPTARG" ;; + c) firewallChain="$OPTARG" ;; + C) firewallHookChains="$OPTARG" ;; + f) logFacility="$OPTARG" ;; + j) firewallTarget="$OPTARG" ;; + l) logLevel="$OPTARG" ;; + m) logMode="$OPTARG" ;; + p) attemptPeriod="$OPTARG" ;; + P) persistentStateWritePeriod="$OPTARG" ;; + s) fileStatePersistPrefix="$OPTARG" ;; + s) fileStatePersistPrefix="$OPTARG" ;; + *) printUsage + exit 254 + esac + shift `expr $OPTIND - 1` +done +[ -z $logMode ] && logMode="$defaultMode" + +fileStateTemp="$fileStateTempPrefix.$fileStateType" +fileStatePersist="$fileStatePersistPrefix.$fileStateType" + +attemptPeriod=`expandBindTime $attemptPeriod` +banLength=`expandBindTime $banLength` +[ $persistentStateWritePeriod != -1 ] && persistentStateWritePeriod=`expandBindTime $persistentStateWritePeriod` +followModeCheckInterval=`expandBindTime $followModeCheckInterval` +exitStatus=0 + +# Here we convert the logRegex list into a sed -f file +fileRegex="/tmp/beardropper.$$.regex" +uciLoad logRegex 's/[`$"'\\\'']//g' '/has invalid shell, rejected$/d' \ + '/^[A-Za-z ]+[0-9: ]+authpriv.warn dropbear\[.+([0-9]+\.){3}[0-9]+/p' \ + '/^[A-Za-z ]+[0-9: ]+authpriv.info dropbear\[.+:\ Exit before auth:.*/p' > "$fileRegex" +lastPersistentStateWrite="`date +%s`" +loadState +bddbCheckStatusAll + +# main event loops + +if [ "$logMode" = follow ] ; then + logLine 1 "Running in follow mode" + readsSinceSave=0 lastCheckAll=0 worstCaseReads=1 tmpFile="/tmp/beardropper.$$.1" +# Verify if these do any good - try saving to a temp. Scope may make saveState useless. + trap "rm -f "$tmpFile" "$fileRegex" ; exit " SIGINT + [ $persistentStateWritePeriod -gt 1 ] && worstCaseReads=$((persistentStateWritePeriod / followModeCheckInterval)) + firstRun=1 + $cmdLogread -f | while read -t $followModeCheckInterval line || true ; do + if [ $firstRun -eq 1 ] ; then + trap "saveState -f" SIGHUP + trap "saveState -f; exit" SIGINT + firstRun=0 + fi + sed -nEf "$fileRegex" > "$tmpFile" <<-_EOF_ + $line + _EOF_ + line="`cat $tmpFile`" + [ -n "$line" ] && processLogLine "$line" + logLine 3 "ReadComp:$readsSinceSave/$worstCaseReads" + if [ $((++readsSinceSave)) -ge $worstCaseReads ] ; then + now="`date +%s`" + if [ $((now - lastCheckAll)) -ge $followModeCheckInterval ] ; then + bddbCheckStatusAll + lastCheckAll="$now" + saveState + readsSinceSave=0 + fi + fi + done +elif [ "$logMode" = entire ] ; then + logLine 1 "Running in entire mode" + $cmdLogread | sed -nEf "$fileRegex" | while read line ; do + processLogLine "$line" + saveState + done + loadState + bddbCheckStatusAll + saveState -f +elif [ "$logMode" = today ] ; then + logLine 1 "Running in today mode" + # merge the egrep into sed with -e /^$formatTodayLogDateRegex/!d + $cmdLogread | egrep "`date +\'$formatTodayLogDateRegex\'`" | sed -nEf "$fileRegex" | while read line ; do + processLogLine "$line" + saveState + done + loadState + bddbCheckStatusAll + saveState -f +elif isValidBindTime "$logMode" ; then + logInterval=`expandBindTime $logMode` + logLine 1 "Running in interval mode (reviewing $logInterval seconds of log entries)..." + timeStart=$((`date +%s` - logInterval)) + $cmdLogread | sed -nEf "$fileRegex" | while read line ; do + timeWhen=`getLogTime "$line"` + [ $timeWhen -ge $timeStart ] && processLogLine "$line" + saveState + done + loadState + bddbCheckStatusAll + saveState -f +elif [ "$logMode" = wipe ] ; then + logLine 2 "Wiping state files, unhooking and removing iptables chains" + wipeFirewall + if [ -f "$fileStateTemp" ] ; then + logLine 1 "Removing non-persistent statefile ($fileStateTemp)" + rm -f "$fileStateTemp" + fi + if [ -f "$fileStatePersist" ] ; then + logLine 1 "Removing persistent statefile ($fileStatePersist)" + rm -f "$fileStatePersist" + fi +else + logLine 0 "Error: invalid log mode ($logMode)" + exitStatus=254 +fi + +rm -f "$fileRegex" +exit $exitStatus diff --git a/luci-app-beardropper/root/usr/share/rpcd/acl.d/luci-app-beardropper.json b/luci-app-beardropper/root/usr/share/rpcd/acl.d/luci-app-beardropper.json new file mode 100644 index 00000000..65451ae8 --- /dev/null +++ b/luci-app-beardropper/root/usr/share/rpcd/acl.d/luci-app-beardropper.json @@ -0,0 +1,11 @@ +{ + "luci-app-beardropper": { + "description": "Grant UCI access for luci-app-beardropper", + "read": { + "uci": [ "beardropper" ] + }, + "write": { + "uci": [ "beardropper" ] + } + } +} \ No newline at end of file diff --git a/luci-app-cloudflarespeedtest/Makefile b/luci-app-cloudflarespeedtest/Makefile new file mode 100644 index 00000000..ea1d672f --- /dev/null +++ b/luci-app-cloudflarespeedtest/Makefile @@ -0,0 +1,21 @@ +# Author: mingxiaoyu (fengying0347@163.com) +# +# Licensed to the public under the GNU General Public License v3. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=luci-app-cloudflarespeedtest + +LUCI_TITLE:=LuCI support for Cloudflares Speed Test +LUCI_DEPENDS:=+cdnspeedtest +openssl-util +curl +LUCI_PKGARCH:=all +PKG_VERSION:=1.5.2 +PKG_RELEASE:=0 +PKG_LICENSE:=AGPL-3.0 +PKG_MAINTAINER:=mingxiaoyu + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature + diff --git a/luci-app-cloudflarespeedtest/luasrc/controller/cloudflarespeedtest.lua b/luci-app-cloudflarespeedtest/luasrc/controller/cloudflarespeedtest.lua new file mode 100644 index 00000000..90a94ced --- /dev/null +++ b/luci-app-cloudflarespeedtest/luasrc/controller/cloudflarespeedtest.lua @@ -0,0 +1,50 @@ +-- Copyright (C) 2020 mingxiaoyu +-- Licensed to the public under the GNU General Public License v3. +module("luci.controller.cloudflarespeedtest",package.seeall) + +function index() + + if not nixio.fs.access('/etc/config/cloudflarespeedtest') then + return + end + + local page + page = entry({"admin", "services", "cloudflarespeedtest"}, firstchild(), _("Cloudflare Speed Test"), 99) + page.dependent = false + page.acl_depends = { "luci-app-cloudflarespeedtest" } + + entry({"admin", "services", "cloudflarespeedtest", "general"}, cbi("cloudflarespeedtest/cloudflarespeedtest"), _("Base Setting"), 1) + entry({"admin", "services", "cloudflarespeedtest", "logread"}, form("cloudflarespeedtest/logread"), _("Logs"), 2) + + entry({"admin", "services", "cloudflarespeedtest", "status"}, call("act_status")).leaf = true + entry({"admin", "services", "cloudflarespeedtest", "stop"}, call("act_stop")) + entry({"admin", "services", "cloudflarespeedtest", "start"}, call("act_start")) + entry({"admin", "services", "cloudflarespeedtest", "getlog"}, call("get_log")) +end + +function act_status() + local e = {} + e.running = luci.sys.call("busybox ps -w | grep cdnspeedtest | grep -v grep >/dev/null") == 0 + luci.http.prepare_content("application/json") + luci.http.write_json(e) +end + +function act_stop() + luci.sys.call("busybox ps -w | grep cdnspeedtest | grep -v grep | xargs kill -9 >/dev/null") + luci.http.write('') +end + +function act_start() + act_stop() + luci.sys.call("/usr/bin/cloudflarespeedtest/cloudflarespeedtest.sh start") + luci.http.write('') +end + +function get_log() + local fs = require "nixio.fs" + local e = {} + e.running = luci.sys.call("busybox ps -w | grep cdnspeedtest | grep -v grep >/dev/null") == 0 + e.log= fs.readfile("/var/log/cloudflarespeedtest.log") or "" + luci.http.prepare_content("application/json") + luci.http.write_json(e) +end diff --git a/luci-app-cloudflarespeedtest/luasrc/model/cbi/cloudflarespeedtest/cloudflarespeedtest.lua b/luci-app-cloudflarespeedtest/luasrc/model/cbi/cloudflarespeedtest/cloudflarespeedtest.lua new file mode 100644 index 00000000..552c30ec --- /dev/null +++ b/luci-app-cloudflarespeedtest/luasrc/model/cbi/cloudflarespeedtest/cloudflarespeedtest.lua @@ -0,0 +1,335 @@ +require("luci.sys") + +local uci = luci.model.uci.cursor() + +m = Map('cloudflarespeedtest') +m.title = translate('Cloudflare Speed Test') +m.description = 'GitHub' + +-- [[ 基本设置 ]]-- + +s = m:section(NamedSection, 'global') +s.addremove = false +s.anonymous = true + +o=s:option(Flag,"enabled",translate("Enabled")) +o.description = translate("Enabled scheduled task test Cloudflare IP") +o.rmempty=false +o.default = 0 + +o=s:option(Flag,"ipv6_enabled",translate("IPv6 Enabled")) +o.description = translate("Provides only one method, if IPv6 is enabled, IPv4 will not be tested") +o.default = 0 +o.rmempty=false + +o=s:option(Value,"speed",translate("Broadband speed")) +o.description =translate("100M broadband download speed is about 12M/s. It is not recommended to fill in an excessively large value, and it may run all the time."); +o.datatype ="uinteger" +o.rmempty=false + +o=s:option(Value,"custome_url",translate("Custome Url")) +o.description = translate("How to create") +o.rmempty=false + +o=s:option(Flag,"custome_cors_enabled",translate("Custome Cron Enabled")) +o.default = 0 +o.rmempty=false + +o = s:option(Value, "custome_cron", translate("Custome Cron")) +o:depends("custome_cors_enabled", 1) + +hour = s:option(Value, "hour", translate("Hour")) +hour.datatype = "range(0,23)" +hour:depends("custome_cors_enabled", 0) + +minute = s:option(Value, "minute", translate("Minute")) +minute.datatype = "range(0,59)" +minute:depends("custome_cors_enabled", 0) + +o = s:option(ListValue, "proxy_mode", translate("Proxy Mode")) +o:value("nil", translate("HOLD")) +o.description = translate("during the speed testing, swith to which mode") +o:value("gfw", translate("GFW List")) +o:value("close", translate("CLOSE")) +o.default = "gfw" + +o=s:option(Flag,"advanced",translate("Advanced")) +o.description = translate("Not recommended") +o.default = 0 +o.rmempty=false + +o = s:option(Value, "threads", translate("Thread")) +o.datatype ="uinteger" +o.default = 200 +o.rmempty=true +o:depends("advanced", 1) + +o = s:option(Value, "tl", translate("Average Latency Cap")) +o.datatype ="uinteger" +o.default = 200 +o.rmempty=true +o:depends("advanced", 1) + +o = s:option(Value, "tll", translate("Average Latency Lower Bound")) +o.datatype ="uinteger" +o.default = 40 +o.rmempty=true +o:depends("advanced", 1) + +o = s:option(Value, "t", translate("Delayed speed measurement time")) +o.datatype ="uinteger" +o.default = 4 +o.rmempty=true +o:depends("advanced", 1) + +o = s:option(Value, "dt", translate("Download speed test time")) +o.datatype ="uinteger" +o.default = 10 +o.rmempty=true +o:depends("advanced", 1) + +o = s:option(Value, "dn", translate("Number of download speed tests")) +o.datatype ="uinteger" +o.default = 1 +o.rmempty=true +o:depends("advanced", 1) + +o = s:option(Flag, "dd", translate("Disable download speed test")) +o.default = 0 +o.rmempty=true +o:depends("advanced", 1) + +o = s:option(Value, "tp", translate("Port")) +o.rmempty=true +o.default = 443 +o.datatype ="port" +o:depends("advanced", 1) + +o = s:option(DummyValue, '', '') +o.rawhtml = true +o.template = "cloudflarespeedtest/actions" + +s = m:section(NamedSection, "servers", "section", translate("Third party applications settings")) + +if nixio.fs.access("/etc/config/shadowsocksr") then + s:tab("ssr", translate("Shadowsocksr Plus+")) + + o=s:taboption("ssr", Flag, "ssr_enabled",translate("Shadowsocksr Plus+ Enabled")) + o.rmempty=true + + local ssr_server_table = {} + uci:foreach("shadowsocksr", "servers", function(s) + if s.alias then + ssr_server_table[s[".name"]] = "[%s]:%s" % {string.upper(s.v2ray_protocol or s.type), s.alias} + elseif s.server and s.server_port then + ssr_server_table[s[".name"]] = "[%s]:%s:%s" % {string.upper(s.v2ray_protocol or s.type), s.server, s.server_port} + end + end) + + local ssr_key_table = {} + for key, _ in pairs(ssr_server_table) do + table.insert(ssr_key_table, key) + end + + table.sort(ssr_key_table) + + o = s:taboption("ssr", DynamicList, "ssr_services", + translate("Shadowsocksr Servers"), + translate("Please select a service")) + + for _, key in pairs(ssr_key_table) do + o:value(key, ssr_server_table[key]) + end + o:depends("ssr_enabled", 1) + o.forcewrite = true + +end + + +if nixio.fs.access("/etc/config/passwall") then + s:tab("passwalltab", translate("passwall")) + + o=s:taboption("passwalltab", Flag, "passwall_enabled",translate("Passwall Enabled")) + o.rmempty=true + + local passwall_server_table = {} + uci:foreach("passwall", "nodes", function(s) + if s.remarks then + passwall_server_table[s[".name"]] = "[%s]:%s" % {string.upper(s.protocol or s.type), s.remarks} + end + end) + + local passwall_key_table = {} + for key, _ in pairs(passwall_server_table) do + table.insert(passwall_key_table, key) + end + + table.sort(passwall_key_table) + + o = s:taboption("passwalltab", DynamicList, "passwall_services", + translate("Passwall Servers"), + translate("Please select a service")) + + for _, key in pairs(passwall_key_table) do + o:value(key, passwall_server_table[key]) + end + o:depends("passwall_enabled", 1) + o.forcewrite = true + +end + +if nixio.fs.access("/etc/config/passwall2") then + s:tab("passwall2tab", translate("passwall2")) + + o=s:taboption("passwall2tab", Flag, "passwall2_enabled",translate("PassWall2 Enabled")) + o.rmempty=true + + local passwall2_server_table = {} + uci:foreach("passwall2", "nodes", function(s) + if s.remarks then + passwall2_server_table[s[".name"]] = "[%s]:%s" % {string.upper(s.protocol or s.type), s.remarks} + end + end) + + local passwall2_key_table = {} + for key, _ in pairs(passwall2_server_table) do + table.insert(passwall2_key_table, key) + end + + table.sort(passwall2_key_table) + + o = s:taboption("passwall2tab", DynamicList, "passwall2_services", + translate("Passwall2 Servers"), + translate("Please select a service")) + + for _, key in pairs(passwall2_key_table) do + o:value(key, passwall2_server_table[key]) + end + o:depends("passwall2_enabled", 1) + o.forcewrite = true + +end + +s:tab("bypasstab", translate("Bypass")) +if nixio.fs.access("/etc/config/bypass") then + + o=s:taboption("bypasstab", Flag, "bypass_enabled",translate("Bypass Enabled")) + o.rmempty=true + + local bypass_server_table = {} + uci:foreach("bypass", "servers", function(s) + if s.alias then + bypass_server_table[s[".name"]] = "[%s]:%s" % {string.upper(s.protocol or s.type), s.alias} + elseif s.server and s.server_port then + bypass_server_table[s[".name"]] = "[%s]:%s:%s" % {string.upper(s.protocol or s.type), s.server, s.server_port} + end + end) + + local bypass_key_table = {} + for key, _ in pairs(bypass_server_table) do + table.insert(bypass_key_table, key) + end + + table.sort(bypass_key_table) + + o = s:taboption("bypasstab", DynamicList, "bypass_services", + translate("Bypass Servers"), + translate("Please select a service")) + + for _, key in pairs(bypass_key_table) do + o:value(key, bypass_server_table[key]) + end + o:depends("bypass_enabled", 1) + o.forcewrite = true + +end + +s:tab("vssrtab", translate("Vssr")) +if nixio.fs.access("/etc/config/vssr") then + + o=s:taboption("vssrtab", Flag, "vssr_enabled",translate("Vssr Enabled")) + o.rmempty=true + + local vssr_server_table = {} + uci:foreach("vssr", "servers", function(s) + if s.alias then + vssr_server_table[s[".name"]] = "[%s]:%s" % {string.upper(s.protocol or s.type), s.alias} + elseif s.server and s.server_port then + vssr_server_table[s[".name"]] = "[%s]:%s:%s" % {string.upper(s.protocol or s.type), s.server, s.server_port} + end + end) + + local vssr_key_table = {} + for key, _ in pairs(vssr_server_table) do + table.insert(vssr_key_table, key) + end + + table.sort(vssr_key_table) + + o = s:taboption("vssrtab", DynamicList, "vssr_services", + translate("Vssr Servers"), + translate("Please select a service")) + + for _, key in pairs(vssr_key_table) do + o:value(key, vssr_server_table[key]) + end + o:depends("vssr_enabled", 1) + o.forcewrite = true + +end + +s:tab("dnstab", translate("DNS")) + +o=s:taboption("dnstab", Flag, "DNS_enabled",translate("DNS Enabled")) + +o=s:taboption("dnstab", ListValue, "DNS_type", translate("DNS Type")) +o:value("aliyu", translate("AliyuDNS")) +o:depends("DNS_enabled", 1) + +o=s:taboption("dnstab", Value,"app_key",translate("Access Key ID")) +o.rmempty=true +o:depends("DNS_enabled", 1) +o=s:taboption("dnstab", Value,"app_secret",translate("Access Key Secret")) +o.rmempty=true +o:depends("DNS_enabled", 1) + +o=s:taboption("dnstab", Value,"main_domain",translate("Main Domain"),translate("For example: test.github.com -> github.com")) +o.rmempty=true +o:depends("DNS_enabled", 1) +o=s:taboption("dnstab", DynamicList,"sub_domain",translate("Sub Domain"),translate("For example: test.github.com -> test")) +o.rmempty=true +o:depends("DNS_enabled", 1) + +o=s:taboption("dnstab", ListValue, "line", translate("Lines")) +o:value("default", translate("default")) +o:value("telecom", translate("telecom")) +o:value("unicom", translate("unicom")) +o:value("mobile", translate("mobile")) +o:depends("DNS_enabled", 1) +o.default ="telecom" + +s:tab("dnshost", translate("HOST")) +o=s:taboption("dnshost", Flag, "HOST_enabled",translate("HOST Enabled")) +o=s:taboption("dnshost", Value,"host_domain",translate("Domain")) +o.rmempty=true +o:depends("HOST_enabled", 1) + +e=m:section(TypedSection,"global",translate("Best IP")) +e.anonymous=true +local a="/usr/share/cloudflarespeedtestresult.txt" +tvIPs=e:option(TextValue,"syipstext") +tvIPs.rows=8 +tvIPs.readonly="readonly" +tvIPs.wrap="off" + +function tvIPs.cfgvalue(e,e) + sylogtext="" + if a and nixio.fs.access(a) then + sylogtext=luci.sys.exec("tail -n 100 %s"%a) + end + return sylogtext +end +tvIPs.write=function(e,e,e) +end + +return m diff --git a/luci-app-cloudflarespeedtest/luasrc/model/cbi/cloudflarespeedtest/logread.lua b/luci-app-cloudflarespeedtest/luasrc/model/cbi/cloudflarespeedtest/logread.lua new file mode 100644 index 00000000..1af7b661 --- /dev/null +++ b/luci-app-cloudflarespeedtest/luasrc/model/cbi/cloudflarespeedtest/logread.lua @@ -0,0 +1,9 @@ +log = SimpleForm("logview") +log.submit = false +log.reset = false + +t = log:field(DummyValue, '', '') +t.rawhtml = true +t.template = 'cloudflarespeedtest/logread' + +return log diff --git a/luci-app-cloudflarespeedtest/luasrc/view/cloudflarespeedtest/actions.htm b/luci-app-cloudflarespeedtest/luasrc/view/cloudflarespeedtest/actions.htm new file mode 100644 index 00000000..cd117f88 --- /dev/null +++ b/luci-app-cloudflarespeedtest/luasrc/view/cloudflarespeedtest/actions.htm @@ -0,0 +1,56 @@ +<%+cbi/valueheader%> + + +
+

<%:Collecting data...%>

+
+ + +
+ + +
+ +<%+cbi/valuefooter%> \ No newline at end of file diff --git a/luci-app-cloudflarespeedtest/luasrc/view/cloudflarespeedtest/logread.htm b/luci-app-cloudflarespeedtest/luasrc/view/cloudflarespeedtest/logread.htm new file mode 100644 index 00000000..c118d57d --- /dev/null +++ b/luci-app-cloudflarespeedtest/luasrc/view/cloudflarespeedtest/logread.htm @@ -0,0 +1,23 @@ +<%+cbi/valueheader%> +<%:Auto refresh%> + + + +<%+cbi/valuefooter%> \ No newline at end of file diff --git a/luci-app-cloudflarespeedtest/po/zh-cn b/luci-app-cloudflarespeedtest/po/zh-cn new file mode 120000 index 00000000..8d69574d --- /dev/null +++ b/luci-app-cloudflarespeedtest/po/zh-cn @@ -0,0 +1 @@ +zh_Hans \ No newline at end of file diff --git a/luci-app-cloudflarespeedtest/po/zh_Hans/cloudflarespeedtest.po b/luci-app-cloudflarespeedtest/po/zh_Hans/cloudflarespeedtest.po new file mode 100644 index 00000000..bbc26bfb --- /dev/null +++ b/luci-app-cloudflarespeedtest/po/zh_Hans/cloudflarespeedtest.po @@ -0,0 +1,221 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: 2022-02-10 20:44+0000\n" +"Last-Translator: mingxiaoyu \n" +"Language: zh_Hans\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 4.8-dev\n" + +msgid "GitHub" +msgstr "GitHub项目地址" + +msgid "Cloudflare Speed Test" +msgstr "Cloudflare速度测试" + +msgid "Base Setting" +msgstr "基本设置" + +msgid "Logs" +msgstr "日志" + +msgid "Enabled" +msgstr "启用" + +msgid "Enabled scheduled task test Cloudflare IP" +msgstr "启用计划任务测试 Cloudflare IP" + +msgid "Broadband speed" +msgstr "宽带速度" + +msgid "Custome Url Enabled" +msgstr "启用自定义地址" + +msgid "Custome Url" +msgstr "自定义地址" + +msgid "Custome Cron Enabled" +msgstr "启用自定义Cron" + +msgid "Custome Cron" +msgstr "自定义Cron" + +msgid "Hour" +msgstr "小时" + +msgid "Minute" +msgstr "分钟" + +msgid "100M broadband download speed is about 12M/s. It is not recommended to fill in an excessively large value, and it may run all the time." +msgstr "100M的宽带下载大概为速度12M/s。不推荐填过大的值,可能出现一直运行。" + +msgid "Shadowsocksr Plus+ Enabled" +msgstr "启用ShadowSocksR Plus+" + +msgid "Passwall Enabled" +msgstr "启用Passwall" + +msgid "PassWall2 Enabled" +msgstr "启用PassWall2" + +msgid "Bypass Enabled" +msgstr "启用Bypass" + +msgid "Vssr Enabled" +msgstr "启用Vssr" +msgid "Shadowsocksr Servers" +msgstr "ShadowSocksR Plus+服务" + +msgid "Passwall Servers" +msgstr "Passwall服务" + +msgid "Passwall2 Servers" +msgstr "Passwall2服务" + +msgid "Bypass Servers" +msgstr "Bypass服务" + +msgid "Vssr Servers" +msgstr "Vssr服务" + +msgid "Please select a service" +msgstr "请选择一项服务" + +msgid "Speed Test" +msgstr "速度测试" + +msgid "Best IP" +msgstr "最佳IP" + +msgid "TEST AND APPLY" +msgstr "测试并应用" + +msgid "STOP" +msgstr "停止" + +msgid "Advanced" +msgstr "高级模式" + +msgid "Thread" +msgid "线程数" + +msgid "Average Latency Cap" +msgstr "平均延迟上限" + +msgid "Average Latency Lower Bound" +msgstr "平均延迟下限" + +msgid "IPv6 Enabled" +msgstr "启用IPv6" + +msgid "Delayed speed measurement time" +msgstr "延迟测速次数" + +msgid "Download speed test time" +msgstr "下载测速时间" + +msgid "Number of download speed tests" +msgstr "下载测速数量" + +msgid "Disable download speed test" +msgstr "禁用下载测速" + +msgid "Port" +msgstr "端口" + +msgid "Not recommended" +msgstr "不推荐" + +msgid "Provides only one method, if IPv6 is enabled, IPv4 will not be tested" +msgstr "IPv4和IPv6只能选一个!!!!!!" + +msgid "How to create" +msgstr "如何创建" + +msgid "RUNNING" +msgstr "运行中" + +msgid "NOT RUNNING" +msgstr "未运行" + +msgid "Collecting data..." +msgstr "收集数据中..." + +msgid "Third party applications settings" +msgstr "第三方应用设置" + +msgid "Auto refresh" +msgstr "自动刷新" + +msgid "Status" +msgstr "状态" + +msgid "Proxy Mode" +msgstr "代理模式" + +msgid "HOLD" +msgstr "保持" + +msgid "GFW List" +msgid "GFW列表" + +msgid "CLOSE" +msgstr "关闭" + +msgid "during the speed testing, swith to which mode" +msgstr "在速度测试期间,切换到哪种模式" + +msgid "DNS" +msgstr "DNS" + +msgid "DNS Enabled" +msgstr "启用DNS" + +msgid "DNS Type" +msgstr "DNS类型" + +msgid "AliyuDNS" +msgstr "阿里云DNS" + +msgid "Access Key ID" +msgstr "Access Key ID" + +msgid "Access Key Secret" +msgstr "Access Key Secret" + +msgid "Main Domain" +msgstr "主域名" + +msgid "Sub Domain" +msgstr "子域名" + +msgid "For example: test.github.com -> github.com" +msgstr "例如: test.github.com 则填: github.com" + +msgid "For example: test.github.com -> test" +msgstr "例如: test.github.com, 则填: test" + +msgid "Lines" +msgstr "解析线路" + +msgid "default" +msgstr "默认" + +msgid "telecom" +msgstr "电信" + +msgid "unicom" +msgstr "联通" + +msgid "mobile" +msgstr "移动" + +msgid "HOST Enabled" +msgstr "启用HOST" + +msgid "Domain" +msgstr "域名" diff --git a/luci-app-cloudflarespeedtest/root/etc/config/cloudflarespeedtest b/luci-app-cloudflarespeedtest/root/etc/config/cloudflarespeedtest new file mode 100644 index 00000000..c318ca8f --- /dev/null +++ b/luci-app-cloudflarespeedtest/root/etc/config/cloudflarespeedtest @@ -0,0 +1,21 @@ + +config global 'global' + option hour '5' + option minute '0' + option enabled '0' + option ipv6_enabled '0' + option advanced '0' + option tl '200' + option tll '40' + option custome_url 'https://speed.cloudflare.com/__down?bytes=300000000' + option threads '200' + option speed '100' + +config servers 'servers' + option ssr_enabled '0' + option passwall_enabled '0' + option passwall2_enabled '0' + option bypass_enabled '0' + option vssr_enabled '0' + option DNS_enabled '0' + diff --git a/luci-app-cloudflarespeedtest/root/etc/init.d/cloudflarespeedtest b/luci-app-cloudflarespeedtest/root/etc/init.d/cloudflarespeedtest new file mode 100755 index 00000000..c0b6320a --- /dev/null +++ b/luci-app-cloudflarespeedtest/root/etc/init.d/cloudflarespeedtest @@ -0,0 +1,59 @@ +#!/bin/sh /etc/rc.common + +START=99 + +USE_PROCD=1 + +CRON_FILE=/etc/crontabs/root + +service_triggers() { + procd_add_reload_trigger "cloudflarespeedtest" +} + +add_cron(){ + local enabled + config_get_bool enabled $1 enabled + + del_cron + + if [ $enabled = 1 ] ; then + local minute + local hour + local custome_cors_enabled + local custome_cron + + config_get minute $1 minute + config_get hour $1 hour + config_get_bool custome_cors_enabled $1 custome_cors_enabled + config_get custome_cron $1 custome_cron + + if [ $custome_cors_enabled = 1 ] ; then + echo "$custome_cron /usr/bin/cloudflarespeedtest/cloudflarespeedtest.sh start" >> $CRON_FILE + else + echo "$minute $hour * * * /usr/bin/cloudflarespeedtest/cloudflarespeedtest.sh start" >> $CRON_FILE + fi + crontab $CRON_FILE + fi +} + +del_cron(){ + sed -i '/cloudflarespeedtest/d' $CRON_FILE + /etc/init.d/cron restart +} + +stop_instance(){ + del_cron +} + +stop_service() { + config_load cloudflarespeedtest + config_foreach stop_instance global +} +start_service() { + config_load cloudflarespeedtest + config_foreach add_cron global +} +reload_service() { + stop + start +} \ No newline at end of file diff --git a/luci-app-cloudflarespeedtest/root/usr/bin/cloudflarespeedtest/aliddns.sh b/luci-app-cloudflarespeedtest/root/usr/bin/cloudflarespeedtest/aliddns.sh new file mode 100755 index 00000000..250f4796 --- /dev/null +++ b/luci-app-cloudflarespeedtest/root/usr/bin/cloudflarespeedtest/aliddns.sh @@ -0,0 +1,81 @@ +#!/bin/sh +LOG_FILE='/var/log/cloudflarespeedtest.log' + +echolog() { + local d="$(date "+%Y-%m-%d %H:%M:%S")" + echo -e "$d: $*" >>$LOG_FILE +} + +urlencode() { + # urlencode url + out='' + for c in $(echo -n $1 | sed 's/[^\n]/&\n/g'); do + case $c in + [a-zA-Z0-9._-]) out="$out$c" ;; + *) out="$out$(printf '%%%02X' "'$c")" ;; + esac + done + echo -n $out +} + +send_request() { + # send_request action args + local args="AccessKeyId=$ak_id&Action=$1&Format=json&$2&Version=2015-01-09" + local hash=$(urlencode $(echo -n "GET&%2F&$(urlencode $args)" | openssl dgst -sha1 -hmac "$ak_sec&" -binary | openssl base64)) + curl -sSL --connect-timeout 5 "http://alidns.aliyuncs.com/?$args&Signature=$hash" +} + +get_recordid() { + sed 's/RR/\n/g' | sed -n 's/.*RecordId[^0-9]*\([0-9]*\).*/\1\n/p' | sort -ru | sed /^$/d +} + +query_recordid() { + send_request "DescribeSubDomainRecords" "SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&SubDomain=$sub_dm.$main_dm&Timestamp=$timestamp&Type=A" +} + +update_record() { + send_request "UpdateDomainRecord" "Line=$line&RR=$sub_dm&RecordId=$1&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&Timestamp=$timestamp&Type=$type&Value=$ip" +} + +add_record() { + send_request "AddDomainRecord&DomainName=$main_dm" "Line=$line&RR=$sub_dm&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&Timestamp=$timestamp&Type=$type&Value=$ip" +} + +del_record() { + send_request "DeleteDomainRecord" "RecordId=$1&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&Timestamp=$timestamp" +} + +aliddns() { + ak_id=$1 + ak_sec=$2 + main_dm=$3 + sub_dm=$4 + line=$5 + isIpv6=$6 + ip=$7 + type=A + + if [ $isIpv6 -eq "1" ] ;then + type=AAAA + fi +echo $ip +echo $type + rrid=`query_recordid | get_recordid` + + if [ -z "$rrid" ]; then + rrid=`add_record | get_recordid` + echolog "ADD record $rrid" + else + update_record $rrid + echolog "UPDATE record $rrid" + fi + if [ -z "$rrid" ]; then + # failed + echolog "# ERROR, Please Check Config/Time" + fi +} + + +timestamp=$(date -u "+%Y-%m-%dT%H%%3A%M%%3A%SZ") + +aliddns "$@" diff --git a/luci-app-cloudflarespeedtest/root/usr/bin/cloudflarespeedtest/cloudflarespeedtest.sh b/luci-app-cloudflarespeedtest/root/usr/bin/cloudflarespeedtest/cloudflarespeedtest.sh new file mode 100644 index 00000000..1147a2a2 --- /dev/null +++ b/luci-app-cloudflarespeedtest/root/usr/bin/cloudflarespeedtest/cloudflarespeedtest.sh @@ -0,0 +1,318 @@ +#!/bin/sh + +LOG_FILE='/var/log/cloudflarespeedtest.log' +IP_FILE='/usr/share/cloudflarespeedtestresult.txt' +IPV4_TXT='/usr/share/CloudflareSpeedTest/ip.txt' +IPV6_TXT='/usr/share/CloudflareSpeedTest/ipv6.txt' + +function get_global_config(){ + while [[ "$*" != "" ]]; do + eval ${1}='`uci get cloudflarespeedtest.global.$1`' 2>/dev/null + shift + done +} + +function get_servers_config(){ + while [[ "$*" != "" ]]; do + eval ${1}='`uci get cloudflarespeedtest.servers.$1`' 2>/dev/null + shift + done +} + +echolog() { + local d="$(date "+%Y-%m-%d %H:%M:%S")" + echo -e "$d: $*" + echo -e "$d: $*" >>$LOG_FILE +} + +function read_config(){ + get_global_config "enabled" "speed" "custome_url" "threads" "custome_cors_enabled" "custome_cron" "t" "tp" "dt" "dn" "dd" "tl" "tll" "ipv6_enabled" "advanced" "proxy_mode" + get_servers_config "ssr_services" "ssr_enabled" "passwall_enabled" "passwall_services" "passwall2_enabled" "passwall2_services" "bypass_enabled" "bypass_services" "vssr_enabled" "vssr_services" "DNS_enabled" "HOST_enabled" +} + +function appinit(){ + ssr_started=''; + passwall_started=''; + passwall2_started=''; + bypass_started=''; + vssr_started=''; +} + +function speed_test(){ + + rm -rf $LOG_FILE + + command="/usr/bin/cdnspeedtest -sl $((speed*125/1000)) -url ${custome_url} -o ${IP_FILE}" + + if [ $ipv6_enabled -eq "1" ] ;then + command="${command} -f ${IPV6_TXT}" + else + command="${command} -f ${IPV4_TXT}" + fi + + if [ $advanced -eq "1" ] ; then + command="${command} -tl ${tl} -tll ${tll} -n ${threads} -t ${t} -dt ${dt} -dn ${dn}" + if [ $dd -eq "1" ] ; then + command="${command} -dd" + fi + if [ $tp -ne "443" ] ; then + command="${command} -tp ${tp}" + fi + else + command="${command} -tl 200 -tll 40 -n 200 -t 4 -dt 10 -dn 1" + fi + + appinit + + ssr_original_server=$(uci get shadowsocksr.@global[0].global_server 2>/dev/null) + ssr_original_run_mode=$(uci get shadowsocksr.@global[0].run_mode 2>/dev/null) + if [ "x${ssr_original_server}" != "xnil" ] && [ "x${ssr_original_server}" != "x" ] ;then + if [ $proxy_mode == "close" ] ;then + uci set shadowsocksr.@global[0].global_server="nil" + elif [ $proxy_mode == "gfw" ] ;then + uci set shadowsocksr.@global[0].run_mode="gfw" + fi + ssr_started='1'; + uci commit shadowsocksr + /etc/init.d/shadowsocksr restart + fi + + passwall_server_enabled=$(uci get passwall.@global[0].enabled 2>/dev/null) + passwall_original_run_mode=$(uci get passwall.@global[0].tcp_proxy_mode 2>/dev/null) + if [ "x${passwall_server_enabled}" == "x1" ] ;then + if [ $proxy_mode == "close" ] ;then + uci set passwall.@global[0].enabled="0" + elif [ $proxy_mode == "gfw" ] ;then + uci set passwall.@global[0].tcp_proxy_mode="gfwlist" + fi + passwall_started='1'; + uci commit passwall + /etc/init.d/passwall restart 2>/dev/null + fi + + passwall2_server_enabled=$(uci get passwall2.@global[0].enabled 2>/dev/null) + passwall2_original_run_mode=$(uci get passwall2.@global[0].tcp_proxy_mode 2>/dev/null) + if [ "x${passwall2_server_enabled}" == "x1" ] ;then + if [ $proxy_mode == "close" ] ;then + uci set passwall2.@global[0].enabled="0" + elif [ $proxy_mode == "gfw" ] ;then + uci set passwall2.@global[0].tcp_proxy_mode="gfwlist" + fi + passwall2_started='1'; + uci commit passwall2 + /etc/init.d/passwall2 restart 2>/dev/null + fi + + vssr_original_server=$(uci get vssr.@global[0].global_server 2>/dev/null) + vssr_original_run_mode=$(uci get vssr.@global[0].run_mode 2>/dev/null) + if [ "x${vssr_original_server}" != "xnil" ] && [ "x${vssr_original_server}" != "x" ] ;then + + if [ $proxy_mode == "close" ] ;then + uci set vssr.@global[0].global_server="nil" + elif [ $proxy_mode == "gfw" ] ;then + uci set vssr.@global[0].run_mode="gfw" + fi + vssr_started='1'; + uci commit vssr + /etc/init.d/vssr restart + fi + + bypass_original_server=$(uci get bypass.@global[0].global_server 2>/dev/null) + bypass_original_run_mode=$(uci get bypass.@global[0].run_mode 2>/dev/null) + if [ "x${bypass_original_server}" != "x" ] ;then + if [ $proxy_mode == "close" ] ;then + uci set bypass.@global[0].global_server="" + elif [ $proxy_mode == "gfw" ] ;then + uci set bypass.@global[0].run_mode="gfw" + fi + bypass_started='1'; + uci commit bypass + /etc/init.d/bypass restart + fi + + echo $command >> $LOG_FILE 2>&1 + echolog "-----------start----------" + $command >> $LOG_FILE 2>&1 + echolog "-----------end------------" +} + +function ip_replace(){ + + # 获取最快 IP(从 result.csv 结果文件中获取第一个 IP) + bestip=$(sed -n "2,1p" $IP_FILE | awk -F, '{print $1}') + if [[ -z "${bestip}" ]]; then + echolog "CloudflareST 测速结果 IP 数量为 0,跳过下面步骤..." + else + host_ip + alidns_ip + ssr_best_ip + vssr_best_ip + bypass_best_ip + passwall_best_ip + passwall2_best_ip + restart_app + + fi +} + +function host_ip() { + if [ "x${HOST_enabled}" == "x1" ] ;then + get_servers_config "host_domain" + HOSTS_LINE=$(echo "$host_domain" | sed 's/,/ /g' | sed "s/^/$bestip /g") + host_domain_first=$(echo "$host_domain" | awk -F, '{print $1}') + + if [ -n "$(grep $host_domain_first /etc/hosts)" ] + then + echo $host_domain_first + sed -i".bak" "/$host_domain_first/d" /etc/hosts + echo $HOSTS_LINE >> /etc/hosts; + else + echo $HOSTS_LINE >> /etc/hosts; + fi + /etc/init.d/dnsmasq reload &>/dev/null + echolog "HOST 完成" + fi +} + +function passwall_best_ip(){ + if [ "x${passwall_enabled}" == "x1" ] ;then + echolog "设置passwall IP" + for ssrname in $passwall_services + do + echo $ssrname + uci set passwall.$ssrname.address="${bestip}" + done + uci commit passwall + fi +} + +function passwall2_best_ip(){ + if [ "x${passwall2_enabled}" == "x1" ] ;then + echolog "设置passwall2 IP" + for ssrname in $passwall2_services + do + echo $ssrname + uci set passwall2.$ssrname.address="${bestip}" + done + uci commit passwall2 + fi +} + +function ssr_best_ip(){ + if [ "x${ssr_enabled}" == "x1" ] ;then + echolog "设置ssr IP" + for ssrname in $ssr_services + do + echo $ssrname + uci set shadowsocksr.$ssrname.server="${bestip}" + uci set shadowsocksr.$ssrname.ip="${bestip}" + done + uci commit shadowsocksr + fi +} + +function vssr_best_ip(){ + if [ "x${vssr_enabled}" == "x1" ] ;then + echolog "设置Vssr IP" + for ssrname in $vssr_services + do + echo $ssrname + uci set vssr.$ssrname.server="${bestip}" + done + uci commit vssr + fi +} + +function bypass_best_ip(){ + if [ "x${bypass_enabled}" == "x1" ] ;then + echolog "设置Bypass IP" + for ssrname in $bypass_services + do + echo $ssrname + uci set bypass.$ssrname.server="${bestip}" + done + uci commit bypass + fi +} + +function restart_app(){ + if [ "x${ssr_started}" == "x1" ] ;then + if [ $proxy_mode == "close" ] ;then + uci set shadowsocksr.@global[0].global_server="${ssr_original_server}" + elif [ $proxy_mode == "gfw" ] ;then + uci set shadowsocksr.@global[0].run_mode="${ssr_original_run_mode}" + fi + uci commit shadowsocksr + /etc/init.d/shadowsocksr restart &>/dev/null + echolog "ssr重启完成" + fi + + if [ "x${passwall_started}" == "x1" ] ;then + if [ $proxy_mode == "close" ] ;then + uci set passwall.@global[0].enabled="${passwall_server_enabled}" + elif [ $proxy_mode == "gfw" ] ;then + uci set passwall.@global[0].tcp_proxy_mode="${passwall_original_run_mode}" + fi + uci commit passwall + /etc/init.d/passwall restart 2>/dev/null + echolog "passwall重启完成" + fi + + if [ "x${passwall2_started}" == "x1" ] ;then + if [ $proxy_mode == "close" ] ;then + uci set passwall2.@global[0].enabled="${passwall2_server_enabled}" + elif [ $proxy_mode == "gfw" ] ;then + uci set passwall2.@global[0].tcp_proxy_mode="${passwall2_original_run_mode}" + fi + uci commit passwall2 + /etc/init.d/passwall2 restart 2>/dev/null + echolog "passwall2重启完成" + fi + + if [ "x${vssr_started}" == "x1" ] ;then + if [ $proxy_mode == "close" ] ;then + uci set vssr.@global[0].global_server="${vssr_original_server}" + elif [ $proxy_mode == "gfw" ] ;then + uci set vssr.@global[0].run_mode="${vssr_original_run_mode}" + fi + uci commit vssr + /etc/init.d/vssr restart &>/dev/null + echolog "Vssr重启完成" + fi + + if [ "x${bypass_started}" == "x1" ] ;then + if [ $proxy_mode == "close" ] ;then + uci set bypass.@global[0].global_server="${bypass_original_server}" + elif [ $proxy_mode == "gfw" ] ;then + uci set bypass.@global[0].run_mode="${bypass_original_run_mode}" + fi + uci commit bypass + /etc/init.d/bypass restart &>/dev/null + echolog "Bypass重启完成" + fi +} + +function alidns_ip(){ + if [ "x${DNS_enabled}" == "x1" ] ;then + get_servers_config "DNS_type" "app_key" "app_secret" "main_domain" "sub_domain" "line" + if [ $DNS_type == "aliyu" ] ;then + for sub in $sub_domain + do + /usr/bin/cloudflarespeedtest/aliddns.sh $app_key $app_secret $main_domain $sub $line $ipv6_enabled $bestip + echolog "更新域名${sub}阿里云DNS完成" + sleep 1s + done + fi + echo "aliyun done" + fi +} + +read_config + +# 启动参数 +if [ "$1" ] ;then + [ $1 == "start" ] && speed_test && ip_replace + [ $1 == "test" ] && speed_test + [ $1 == "replace" ] && ip_replace + exit +fi diff --git a/luci-app-cloudflarespeedtest/root/usr/share/rpcd/acl.d/luci-app-cloudflarespeedtest.json b/luci-app-cloudflarespeedtest/root/usr/share/rpcd/acl.d/luci-app-cloudflarespeedtest.json new file mode 100644 index 00000000..b4940aba --- /dev/null +++ b/luci-app-cloudflarespeedtest/root/usr/share/rpcd/acl.d/luci-app-cloudflarespeedtest.json @@ -0,0 +1,11 @@ +{ + "luci-app-cloudflarespeedtest": { + "description": "Grant UCI access for luci-app-cloudflarespeedtest", + "read": { + "uci": [ "cloudflarespeedtest" ] + }, + "write": { + "uci": [ "cloudflarespeedtest" ] + } + } +} diff --git a/luci-app-ddns-go b/luci-app-ddns-go deleted file mode 160000 index f213eb96..00000000 --- a/luci-app-ddns-go +++ /dev/null @@ -1 +0,0 @@ -Subproject commit f213eb962024d2df6e3779fe8b431a71bef54a2a diff --git a/luci-app-ddns-go/README.md b/luci-app-ddns-go/README.md new file mode 100644 index 00000000..3e451db4 --- /dev/null +++ b/luci-app-ddns-go/README.md @@ -0,0 +1,137 @@ +## 访问数:![hello](https://views.whatilearened.today/views/github/sirpdboy/deplives.svg)[![](https://img.shields.io/badge/TG群-点击加入-FFFFFF.svg)](https://t.me/joinchat/AAAAAEpRF88NfOK5vBXGBQ) +### 访问数:[![](https://visitor-badge.glitch.me/badge?page_id=sirpdboy-visitor-badge)] [![](https://img.shields.io/badge/TG群-点击加入-FFFFFF.svg)](https://t.me/joinchat/AAAAAEpRF88NfOK5vBXGBQ) + +![screenshots](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/说明1.jpg) + +# luci-app-ddns-go + +luci-app-ddns-go 自动获得你的公网 IPv4 或 IPv6 地址,并解析到对应的域名服务。支持的域名服务商 Alidns(阿里云) Dnspod(腾讯云) Cloudflare 华为云 Callback 百度云 porkbun GoDaddy + +[![若部分图片无法正常显示,请挂上机场浏览或点这里到末尾看修复教程](https://visitor-badge.glitch.me/badge?page_id=sirpdboy-visitor-badge)](#解决-github-网页上图片显示失败的问题) [![](https://img.shields.io/badge/TG群-点击加入-FFFFFF.svg)](https://t.me/joinchat/AAAAAEpRF88NfOK5vBXGBQ) + +[luci-app-ddns-go ddns-go动态域名插件](https://github.com/sirpdboy/luci-app-ddns-go) +====================== + + +请 **认真阅读完毕** 本页面,本页面包含注意事项和如何使用。 + +## 功能说明: + +### ddns-go动态域名插件 +#### 自动获得你的公网 IPv4 或 IPv6 地址,并解析到对应的域名服务。 + + + +- [ddns-go](#ddns-go) + - [特性](#特性) + - [使用方法](#使用方法) + - [说明](#说明) + - [界面](#界面) + - [捐助](#捐助) + + + +## 特性 + +- 支持Mac、Windows、Linux系统,支持ARM、x86架构 +- 支持的域名服务商 `Alidns(阿里云)` `Dnspod(腾讯云)` `Cloudflare` `华为云` `Callback` `百度云` `porkbun` `GoDaddy` +- 支持接口/网卡获取IP +- 支持以服务的方式运行 +- 默认间隔5分钟同步一次 +- 支持多个域名同时解析,公司必备 +- 支持多级域名 +- 网页中配置,简单又方便,可设置 `登录用户名和密码` / `禁止从公网访问` +- 网页中方便快速查看最近50条日志,不需要跑docker中查看 +- 支持webhook通知 +- 支持TTL +- 支持部分dns服务商传递自定义参数,实现地域解析等功能 + +## 使用方法 + +- 将luci-app-ddns-go添加至 LEDE/OpenWRT 源码的方法。 + +### 下载源码方法: + + ```Brach + + # 下载源码 + + git clone https://github.com/sirpdboy/luci-app-ddns-go.git package/ddns-go + make menuconfig + + ``` +### 配置菜单 + + ```Brach + make menuconfig + # 找到 LuCI -> Applications, 选择 luci-app-ddns-go, 保存后退出。 + ``` + +### 编译 + + ```Brach + # 编译固件 + make package/ddns-go/luci-app-ddns-go/compile V=s + ``` + +## 说明 + +-源码来源:https://github.com/sirpdboy/luci-app-ddns-go +-源码来源:https://github.com/jeessy2/ddns-go.git +-你可以随意使用其中的源码,但请注明出处。 + +![screenshots](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/说明2.jpg) + +## 界面 + +![screenshots](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/ddnsgo1.jpg) + +![screenshots](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/ddnsgo2.jpg) + +![screenshots](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/ddnsgo3.jpg) + + + + +## 使用与授权相关说明 + +- 本人开源的所有源码,任何引用需注明本处出处,如需修改二次发布必告之本人,未经许可不得做于任何商用用途。 + + +# My other project + +- 网络速度测试 :https://github.com/sirpdboy/NetSpeedTest + +- 定时设置插件 : https://github.com/sirpdboy/luci-app-autotimeset + +- 关机功能插件 : https://github.com/sirpdboy/luci-app-poweroffdevice + +- opentopd主题 : https://github.com/sirpdboy/luci-theme-opentopd + +- kucat 主题: https://github.com/sirpdboy/luci-theme-kucat + +- 家长控制: https://github.com/sirpdboy/luci-theme-parentcontrol + +- 系统高级设置 : https://github.com/sirpdboy/luci-app-advanced + +- ddns-go动态域名: https://github.com/sirpdboy/luci-app-ddns-go + +- 进阶设置(系统高级设置+主题设置kucat/agron/opentopd): https://github.com/sirpdboy/luci-app-advancedplus + +- 设置向导: https://github.com/sirpdboy/luci-app-wizard + +- 分区扩容: https://github.com/sirpdboy/luci-app-partexp + +- lukcy大吉: https://github.com/sirpdboy/luci-app-lukcy + +## 捐助 + +![screenshots](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/说明3.jpg) + +| 图飞了😂 | 图飞了😂 | +| :-----------------: | :-------------: | +|![xm1](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/支付宝.png) | ![xm1](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/微信.png) | + + + 图飞了😂 + diff --git a/luci-app-ddns-go/ddns-go/Makefile b/luci-app-ddns-go/ddns-go/Makefile new file mode 100644 index 00000000..98783e41 --- /dev/null +++ b/luci-app-ddns-go/ddns-go/Makefile @@ -0,0 +1,62 @@ +# SPDX-License-Identifier: GPL-3.0-only +# +# Copyright (C) 2021-2023 sirpdboy +# +# This is free software, licensed under the Apache License, Version 2.0 . +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=ddns-go +PKG_VERSION:=5.6.4 +PKG_RELEASE:=1 + +PKG_SOURCE_PROTO:=git +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://github.com/jeessy2/ddns-go.git +PKG_MIRROR_HASH:=00892c90cdbbd8dd1f8f9add76857924c8e0fa5f87e727249f304d18543a8b45 +PKG_SOURCE_VERSION:=5b77583b498dc2e893cd77533b5a15c0e1620aef + +PKG_LICENSE:=AGPL-3.0-only +PKG_LICENSE_FILES:=LICENSE +PKG_MAINTAINER:=herboy2008 + +PKG_BUILD_DEPENDS:=golang/host +PKG_BUILD_PARALLEL:=1 +PKG_USE_MIPS16:=0 +PKG_BUILD_FLAGS:=no-mips16 + +GO_PKG:=github.com/jeessy2/ddns-go/v5 +GO_PKG_LDFLAGS_X:=main.version=$(PKG_VERSION) + +include $(INCLUDE_DIR)/package.mk +include $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk + +define Package/ddns-go + TITLE:=A Linux web GUI client of ddns-go + SECTION:=net + CATEGORY:=Network + SUBMENU:=Web Servers/Proxies + DEPENDS:=$(GO_ARCH_DEPENDS) +ca-bundle + URL:=https://github.com/jeessy2/ddns-go + USERID:=ddns-go:ddns-go +endef + +define Package/ddns-go/description + ddns-go is a automatically obtain your public IPv4 or IPv6 address and resolve it to the corresponding domain name service, + support Alidns Dnspod Cloudflare Hicloud Callback Baiducloud porkbun GoDaddy Google Domains. +endef + + +define Package/ddns-go/install + $(call GoPackage/Package/Install/Bin,$(1)) + + $(INSTALL_DIR) $(1)/etc/init.d + $(INSTALL_BIN) ./file/ddns-go.init $(1)/etc/init.d/ddns-go + + $(INSTALL_DIR) $(1)/etc/uci-defaults + $(INSTALL_BIN) ./file/luci-ddns-go.uci-default $(1)/etc/uci-defaults/luci-ddns-go +endef + +$(eval $(call GoBinPackage,ddns-go)) +$(eval $(call BuildPackage,ddns-go)) diff --git a/luci-app-ddns-go/ddns-go/file/ddns-go.init b/luci-app-ddns-go/ddns-go/file/ddns-go.init new file mode 100644 index 00000000..d845dc55 --- /dev/null +++ b/luci-app-ddns-go/ddns-go/file/ddns-go.init @@ -0,0 +1,46 @@ +#!/bin/sh /etc/rc.common +# +# Copyright (C) 2021-2023 sirpdboy https://github.com/sirpdboy/luci-app-ddns-go +# +# This file is part of ddns-go . +# +# This is free software, licensed under the Apache License, Version 2.0 . +# + + +START=99 +USE_PROCD=1 + +PROG=/usr/bin/ddns-go +CONFDIR=/etc/ddns-go +CONF=$CONFDIR/ddns-go-config.yaml + +get_config() { + config_get_bool enabled $1 enabled 1 + config_get_bool logger $1 logger 1 + config_get port $1 port 9876 + config_get time $1 time 300 +} + +init_yaml(){ + [ -d $CONFDIR ] || mkdir -p $CONFDIR 2>/dev/null + cat /usr/share/ddns-go/ddns-go-default.yaml > $CONF +} + +start_service() { + config_load ddns-go + config_foreach get_config basic + [ x$enabled == x1 ] || return 1 + [ -s ${CONF} ] || init_yaml + logger -t ddns-go -p warn "ddns-go is start." + echo "ddns-go is start." + procd_open_instance + procd_set_param command $PROG -l :$port -f $time -c "$CONF" + [ "x$logger" == x1 ] && procd_set_param stderr 1 + procd_set_param respawn + procd_close_instance +} + +service_triggers() { + procd_add_reload_trigger "ddns-go" +} diff --git a/luci-app-ddns-go/ddns-go/file/luci-ddns-go.uci-default b/luci-app-ddns-go/ddns-go/file/luci-ddns-go.uci-default new file mode 100644 index 00000000..0c01cacc --- /dev/null +++ b/luci-app-ddns-go/ddns-go/file/luci-ddns-go.uci-default @@ -0,0 +1,7 @@ +#!/bin/sh + +[ -s "/etc/ddns-go/localtime" ] && mv -f /etc/ddns-go/localtime /etc/localtime +/etc/init.d/ddns-go enable +/etc/init.d/ddns-go start +rm -f /tmp/luci* +exit 0 diff --git a/luci-app-ddns-go/luci-app-ddns-go/Makefile b/luci-app-ddns-go/luci-app-ddns-go/Makefile new file mode 100644 index 00000000..daca91ad --- /dev/null +++ b/luci-app-ddns-go/luci-app-ddns-go/Makefile @@ -0,0 +1,23 @@ +# SPDX-License-Identifier: GPL-3.0-only +# +# Copyright (C) 2021-2022 sirpdboy https://github.com/sirpdboy/luci-app-ddns-go +# +# This is free software, licensed under the Apache License, Version 2.0 . +# +include $(TOPDIR)/rules.mk + +PKG_NAME:=luci-app-ddns-go +PKG_VERSION:=1.3.2 +PKG_RELEASE:=10 + +LUCI_TITLE:=LuCI Support for Dynamic ddns-go Client +LUCI_DEPENDS:=+ddns-go +LUCI_PKGARCH:=all + +define Package/$(PKG_NAME)/conffiles +/etc/config/ddns-go +/etc/ddns-go/ddns-go-config.yaml +endef + +include $(TOPDIR)/feeds/luci/luci.mk +# call BuildPackage - OpenWrt buildroot signature diff --git a/luci-app-ddns-go/luci-app-ddns-go/README.md b/luci-app-ddns-go/luci-app-ddns-go/README.md new file mode 100644 index 00000000..8665ed6e --- /dev/null +++ b/luci-app-ddns-go/luci-app-ddns-go/README.md @@ -0,0 +1,118 @@ +## 访问数:![hello](https://views.whatilearened.today/views/github/sirpdboy/deplives.svg)[![](https://img.shields.io/badge/TG群-点击加入-FFFFFF.svg)](https://t.me/joinchat/AAAAAEpRF88NfOK5vBXGBQ) +### 访问数:[![](https://visitor-badge.glitch.me/badge?page_id=sirpdboy-visitor-badge)] [![](https://img.shields.io/badge/TG群-点击加入-FFFFFF.svg)](https://t.me/joinchat/AAAAAEpRF88NfOK5vBXGBQ) + +欢迎来到sirpdboy的源码仓库! += +# luci-app-ddns-go + +luci-app-ddns-go 自动获得你的公网 IPv4 或 IPv6 地址,并解析到对应的域名服务。支持的域名服务商 Alidns(阿里云) Dnspod(腾讯云) Cloudflare 华为云 Callback 百度云 porkbun GoDaddy + +[![若部分图片无法正常显示,请挂上机场浏览或点这里到末尾看修复教程](https://visitor-badge.glitch.me/badge?page_id=sirpdboy-visitor-badge)](#解决-github-网页上图片显示失败的问题) [![](https://img.shields.io/badge/TG群-点击加入-FFFFFF.svg)](https://t.me/joinchat/AAAAAEpRF88NfOK5vBXGBQ) + +[luci-app-ddns-go ddns-go动态域名插件](https://github.com/sirpdboy/luci-app-ddns-go) + +====================== + + +请 **认真阅读完毕** 本页面,本页面包含注意事项和如何使用。 + +## 功能说明: + +### ddns-go动态域名插件 +#### 自动获得你的公网 IPv4 或 IPv6 地址,并解析到对应的域名服务。 + + + +- [ddns-go](#ddns-go) + - [特性](#特性) + - [使用方法](#使用方法) + - [说明](#说明) + - [界面](#界面) + - [捐助](#捐助) + + + +## 特性 + +- 支持Mac、Windows、Linux系统,支持ARM、x86架构 +- 支持的域名服务商 `Alidns(阿里云)` `Dnspod(腾讯云)` `Cloudflare` `华为云` `Callback` `百度云` `porkbun` `GoDaddy` +- 支持接口/网卡获取IP +- 支持以服务的方式运行 +- 默认间隔5分钟同步一次 +- 支持多个域名同时解析,公司必备 +- 支持多级域名 +- 网页中配置,简单又方便,可设置 `登录用户名和密码` / `禁止从公网访问` +- 网页中方便快速查看最近50条日志,不需要跑docker中查看 +- 支持webhook通知 +- 支持TTL +- 支持部分dns服务商传递自定义参数,实现地域解析等功能 + +## 使用方法 + +- 将luci-app-ddns-go添加至 LEDE/OpenWRT 源码的方法。 + +### 下载源码方法: + + ```Brach + + # 下载源码 + + git clone https://github.com/sirpdboy/luci-app-ddns-go.git package/ddns-go + make menuconfig + + ``` +### 配置菜单 + + ```Brach + make menuconfig + # 找到 LuCI -> Applications, 选择 luci-app-ddns-go, 保存后退出。 + ``` + +### 编译 + + ```Brach + # 编译固件 + make package/ddns-go/luci-app-ddns-go/compile V=s + ``` + +## 说明 + +-源码来源:https://github.com/sirpdboy/luci-app-ddns-go +-你可以随意使用其中的源码,但请注明出处。 + +============================ + +## 界面 + +![screenshots](https://raw.githubusercontent.com/jeessy2/ddns-go/master/ddns-web.png) + + +# My other project + +网络速度测试 :https://github.com/sirpdboy/NetSpeedTest + +定时设置插件 : https://github.com/sirpdboy/luci-app-autotimeset + +关机功能插件 : https://github.com/sirpdboy/luci-app-poweroffdevice + +opentopd主题 : https://github.com/sirpdboy/luci-theme-opentopd + +opentoks 主题: https://github.com/sirpdboy/luci-theme-opentoks [仿KOOLSAHRE主题] + +btmob 主题: https://github.com/sirpdboy/luci-theme-btmob + +系统高级设置 : https://github.com/sirpdboy/luci-app-advanced + +## 捐助 + +-如果你觉得此项目对你有帮助,请捐助我们,以使项目能持续发展,更加完善。··请作者喝杯咖啡~~~** +-你们的支持就是我的动力!** + +| 图飞了😂 | 图飞了😂 | +| :-----------------: | :-------------: | +|![xm1](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/支付宝.png) | ![xm1](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/微信.png) | + + + 图飞了😂 + + diff --git a/luci-app-ddns-go/luci-app-ddns-go/luasrc/controller/ddns-go.lua b/luci-app-ddns-go/luci-app-ddns-go/luasrc/controller/ddns-go.lua new file mode 100644 index 00000000..abafbceb --- /dev/null +++ b/luci-app-ddns-go/luci-app-ddns-go/luasrc/controller/ddns-go.lua @@ -0,0 +1,23 @@ +-- Copyright (C) 2021-2022 sirpdboy https://github.com/sirpdboy/luci-app-ddns-go +-- Licensed to the public under the Apache License 2.0. + +module("luci.controller.ddns-go", package.seeall) + +function index() + if not nixio.fs.access("/etc/config/ddns-go") then + return + end + + entry({"admin", "services", "ddns-go"}, alias("admin", "services", "ddns-go", "setting"),_("DDNS-GO"), 58).dependent = true + entry({"admin", "services", "ddns-go", "setting"}, cbi("ddns-go"), _("Base Setting"), 20).leaf=true + entry({"admin", "services", "ddns-go", "ddns-go"}, template("ddns-go"), _("DDNS-GO"), 30).leaf = true + entry({"admin", "services", "ddnsgo_status"}, call("act_status")) +end + +function act_status() + local sys = require "luci.sys" + local e = { } + e.running = sys.call("pidof ddns-go >/dev/null") == 0 + luci.http.prepare_content("application/json") + luci.http.write_json(e) +end diff --git a/luci-app-ddns-go/luci-app-ddns-go/luasrc/model/cbi/ddns-go.lua b/luci-app-ddns-go/luci-app-ddns-go/luasrc/model/cbi/ddns-go.lua new file mode 100644 index 00000000..d0cf7e4f --- /dev/null +++ b/luci-app-ddns-go/luci-app-ddns-go/luasrc/model/cbi/ddns-go.lua @@ -0,0 +1,30 @@ +-- Copyright (C) 2021-2022 sirpdboy https://github.com/sirpdboy/luci-app-ddns-go + +local m, s ,o + +m = Map("ddns-go") +m.title = translate("DDNS-GO") +m.description = translate("DDNS-GO automatically obtains your public IPv4 or IPv6 address and resolves it to the corresponding domain name service.")..translate("
For specific usage, see:")..translate("GitHub @sirpdboy/luci-app-ddns-go ") + +m:section(SimpleSection).template = "ddns-go_status" + +s = m:section(TypedSection, "basic", translate("Global Settings")) +s.addremove = false +s.anonymous = true + +o = s:option(Flag,"enabled",translate("Enable")) +o.default = 0 + +o = s:option(Value, "port",translate("Set the DDNS-TO access port")) +o.datatype = "uinteger" +o.default=9876 + +o = s:option(Value, "time",translate("update interval")) +o.default=300 + +m.apply_on_parse = true +m.on_after_apply = function(self,map) + luci.sys.exec("/etc/init.d/ddns-go restart") +end + +return m diff --git a/luci-app-ddns-go/luci-app-ddns-go/luasrc/view/ddns-go.htm b/luci-app-ddns-go/luci-app-ddns-go/luasrc/view/ddns-go.htm new file mode 100644 index 00000000..2dd5c707 --- /dev/null +++ b/luci-app-ddns-go/luci-app-ddns-go/luasrc/view/ddns-go.htm @@ -0,0 +1,22 @@ +<%# + Copyright 2021-2022 sirpdboy Wich + https://github.com/sirpdboy/luci-app-ddns-go + Licensed to the public under the Apache License 2.0. +-%> + +<%+header%> +
+ + + +
+ +<%+footer%> diff --git a/luci-app-ddns-go/luci-app-ddns-go/luasrc/view/ddns-go_status.htm b/luci-app-ddns-go/luci-app-ddns-go/luasrc/view/ddns-go_status.htm new file mode 100644 index 00000000..35a0135a --- /dev/null +++ b/luci-app-ddns-go/luci-app-ddns-go/luasrc/view/ddns-go_status.htm @@ -0,0 +1,27 @@ + + +
+ <%:DDNS-GO Status%> +

+ <%:Collecting data...%> +

+
diff --git a/luci-app-ddns-go/luci-app-ddns-go/po/zh-cn/ddns-go.po b/luci-app-ddns-go/luci-app-ddns-go/po/zh-cn/ddns-go.po new file mode 100644 index 00000000..047e6e02 --- /dev/null +++ b/luci-app-ddns-go/luci-app-ddns-go/po/zh-cn/ddns-go.po @@ -0,0 +1,40 @@ +msgid "" +msgstr "Content-Type: text/plain; charset=UTF-8" + +msgid "DDNS-GO" +msgstr "DDNS-GO" + +msgid "DDNS-GO automatically obtains your public IPv4 or IPv6 address and resolves it to the corresponding domain name service." +msgstr "DDNS-GO自动获得你的公网 IPv4 或 IPv6 地址,并解析到对应的域名服务." + +msgid "Base Setting" +msgstr "基本设置" + +msgid "Running state" +msgstr "运行状态" + +msgid "The DDNS-GO service is running." +msgstr "DDNS-GO服务已启动" + +msgid "The DDNS-GO service is not running." +msgstr "DDNS-GO服务未启动" + +msgid "DDNS-GO Status" +msgstr "DDNS-GO服务状态" + +msgid "Click the new page to open ddns-go" +msgstr "点击打开ddns-go后台" + +msgid "Set the DDNS-TO access port" +msgstr "设置访问端口" + +msgid "
For specific usage, see:" +msgstr "
具体使用方法参见:" + +msgid "Collecting data..." +msgstr "收集数据..." + +msgid "update interval" +msgstr "更新间隔" + + diff --git a/luci-app-ddns-go/luci-app-ddns-go/po/zh_Hans b/luci-app-ddns-go/luci-app-ddns-go/po/zh_Hans new file mode 100644 index 00000000..41451e4a --- /dev/null +++ b/luci-app-ddns-go/luci-app-ddns-go/po/zh_Hans @@ -0,0 +1 @@ +zh-cn \ No newline at end of file diff --git a/luci-app-ddns-go/luci-app-ddns-go/root/etc/config/ddns-go b/luci-app-ddns-go/luci-app-ddns-go/root/etc/config/ddns-go new file mode 100644 index 00000000..12377726 --- /dev/null +++ b/luci-app-ddns-go/luci-app-ddns-go/root/etc/config/ddns-go @@ -0,0 +1,5 @@ +config basic + option enabled '0' + option logger '1' + option port 9876 + option time 300 \ No newline at end of file diff --git a/luci-app-ddns-go/luci-app-ddns-go/root/etc/ddns-go/ddns-go-config.yaml b/luci-app-ddns-go/luci-app-ddns-go/root/etc/ddns-go/ddns-go-config.yaml new file mode 100644 index 00000000..74b2fd12 --- /dev/null +++ b/luci-app-ddns-go/luci-app-ddns-go/root/etc/ddns-go/ddns-go-config.yaml @@ -0,0 +1,27 @@ +ipv4: + enable: true + gettype: url + url: https://myip4.ipip.net, https://ddns.oray.com/checkip, https://ip.3322.net + netinterface: br-lan + domains: + - "" +ipv6: + enable: false + gettype: url + url: https://myip6.ipip.net, https://speed.neu6.edu.cn/getIP.php, https://v6.ident.me + netinterface: "" + ipv6reg: "" + domains: + - "" +dns: + name: alidns + id: "" + secret: "" +user: + username: "" + password: "" +webhook: + webhookurl: "" + webhookrequestbody: "" +notallowwanaccess: true +ttl: "" diff --git a/luci-app-ddns-go/luci-app-ddns-go/root/etc/ddns-go/localtime b/luci-app-ddns-go/luci-app-ddns-go/root/etc/ddns-go/localtime new file mode 100644 index 00000000..91f6f8bc Binary files /dev/null and b/luci-app-ddns-go/luci-app-ddns-go/root/etc/ddns-go/localtime differ diff --git a/luci-app-ddns-go/luci-app-ddns-go/root/usr/share/ddns-go/ddns-go-default.yaml b/luci-app-ddns-go/luci-app-ddns-go/root/usr/share/ddns-go/ddns-go-default.yaml new file mode 100644 index 00000000..b0777562 --- /dev/null +++ b/luci-app-ddns-go/luci-app-ddns-go/root/usr/share/ddns-go/ddns-go-default.yaml @@ -0,0 +1,27 @@ +ipv4: + enable: true + gettype: url + url: https://4.ipw.cn,https://myip4.ipip.net,https://ddns.oray.com/checkip,https://ip.3322.net + netinterface: br-lan + domains: + - "" +ipv6: + enable: false + gettype: url + url: https://6.ipw.cn, https://speed.neu6.edu.cn/getIP.php, https://v6.ident.me + netinterface: "" + ipv6reg: "" + domains: + - "" +dns: + name: alidns + id: "" + secret: "" +user: + username: "" + password: "" +webhook: + webhookurl: "" + webhookrequestbody: "" +notallowwanaccess: true +ttl: "" diff --git a/luci-app-ddns-go/luci-app-ddns-go/root/usr/share/rpcd/acl.d/luci-app-ddns-go.json b/luci-app-ddns-go/luci-app-ddns-go/root/usr/share/rpcd/acl.d/luci-app-ddns-go.json new file mode 100644 index 00000000..7f919d25 --- /dev/null +++ b/luci-app-ddns-go/luci-app-ddns-go/root/usr/share/rpcd/acl.d/luci-app-ddns-go.json @@ -0,0 +1,11 @@ +{ + "luci-app-ddns-go": { + "description": "Grant UCI access for luci-app-ddns-go", + "read": { + "uci": [ "ddns-go" ] + }, + "write": { + "uci": [ "ddns-go" ] + } + } +} diff --git a/luci-app-mosdns/Makefile b/luci-app-mosdns/Makefile new file mode 100644 index 00000000..ea5d677d --- /dev/null +++ b/luci-app-mosdns/Makefile @@ -0,0 +1,20 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=luci-app-mosdns +PKG_VERSION:=1.5.15 +PKG_RELEASE:=1 + +LUCI_TITLE:=LuCI Support for mosdns +LUCI_PKGARCH:=all +LUCI_DEPENDS:=+mosdns +jsonfilter +luci-compat +curl +v2ray-geoip +v2ray-geosite +v2dat + +define Package/$(PKG_NAME)/conffiles +/etc/config/mosdns +/etc/mosdns/cache.dump +/etc/mosdns/config_custom.yaml +/etc/mosdns/rule +endef + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/luci-app-mosdns/luasrc/controller/mosdns.lua b/luci-app-mosdns/luasrc/controller/mosdns.lua new file mode 100644 index 00000000..60840fbb --- /dev/null +++ b/luci-app-mosdns/luasrc/controller/mosdns.lua @@ -0,0 +1,53 @@ +local sys = require "luci.sys" +local http = require "luci.http" + +module("luci.controller.mosdns", package.seeall) + +function index() + if not nixio.fs.access("/etc/config/mosdns") then + return + end + + local page = entry({"admin", "services", "mosdns"}, alias("admin", "services", "mosdns", "basic"), _("MosDNS"), 30) + page.dependent = true + page.acl_depends = { "luci-app-mosdns" } + + entry({"admin", "services", "mosdns", "basic"}, cbi("mosdns/basic"), _("Basic Setting"), 1).leaf = true + entry({"admin", "services", "mosdns", "rule_list"}, cbi("mosdns/rule_list"), _("Rule List"), 2).leaf = true + entry({"admin", "services", "mosdns", "update"}, cbi("mosdns/update"), _("Geodata Update"), 3).leaf = true + entry({"admin", "services", "mosdns", "log"}, cbi("mosdns/log"), _("Logs"), 4).leaf = true + entry({"admin", "services", "mosdns", "status"}, call("act_status")).leaf = true + entry({"admin", "services", "mosdns", "get_log"}, call("get_log")).leaf = true + entry({"admin", "services", "mosdns", "clear_log"}, call("clear_log")).leaf = true + entry({"admin", "services", "mosdns", "geo_update"}, call("geo_update")).leaf = true + entry({"admin", "services", "mosdns", "flush_cache"}, call("flush_cache")).leaf = true +end + +function act_status() + local e = {} + e.running = sys.call("pgrep -f mosdns >/dev/null") == 0 + http.prepare_content("application/json") + http.write_json(e) +end + +function get_log() + http.write(sys.exec("cat $(/usr/share/mosdns/mosdns.sh logfile)")) +end + +function clear_log() + sys.call("cat /dev/null > $(/usr/share/mosdns/mosdns.sh logfile)") +end + +function geo_update() + local e = {} + e.updating = sys.call("/usr/share/mosdns/mosdns.sh geodata >/dev/null") == 0 + http.prepare_content("application/json") + http.write_json(e) +end + +function flush_cache() + local e = {} + e.flushing = sys.call("/usr/share/mosdns/mosdns.sh flush >/dev/null") == 0 + http.prepare_content("application/json") + http.write_json(e) +end diff --git a/luci-app-mosdns/luasrc/model/cbi/mosdns/basic.lua b/luci-app-mosdns/luasrc/model/cbi/mosdns/basic.lua new file mode 100644 index 00000000..7793889f --- /dev/null +++ b/luci-app-mosdns/luasrc/model/cbi/mosdns/basic.lua @@ -0,0 +1,240 @@ +local fs = require "nixio.fs" +local sys = require "luci.sys" + +if fs.access("/usr/bin/mosdns") then + mosdns_version = sys.exec("/usr/share/mosdns/mosdns.sh version") +else + mosdns_version = "Unknown Version" +end +m = Map("mosdns") +m.title = translate("MosDNS") .. " " .. mosdns_version +m.description = translate("MosDNS is a plugin-based DNS forwarder/traffic splitter.") + +m:section(SimpleSection).template = "mosdns/mosdns_status" + +s = m:section(TypedSection, "mosdns") +s.addremove = false +s.anonymous = true + +s:tab("basic", translate("Basic Options")) + +o = s:taboption("basic", Flag, "enabled", translate("Enabled")) +o.rmempty = false + +o = s:taboption("basic", ListValue, "configfile", translate("Config File")) +o:value("/etc/mosdns/config.yaml", translate("Default Config")) +o:value("/etc/mosdns/config_custom.yaml", translate("Custom Config")) +o.default = "/etc/mosdns/config.yaml" + +o = s:taboption("basic", Value, "listen_port", translate("Listen port")) +o.datatype = "and(port,min(1))" +o.default = 5335 +o:depends("configfile", "/etc/mosdns/config.yaml") + +o = s:taboption("basic", ListValue, "log_level", translate("Log Level")) +o:value("debug", translate("Debug")) +o:value("info", translate("Info")) +o:value("warn", translate("Warning")) +o:value("error", translate("Error")) +o.default = "info" +o:depends("configfile", "/etc/mosdns/config.yaml") + +o = s:taboption("basic", Value, "logfile", translate("Log File")) +o.placeholder = "/var/log/mosdns.log" +o.default = "/var/log/mosdns.log" +o:depends("configfile", "/etc/mosdns/config.yaml") + +o = s:taboption("basic", Flag, "redirect", translate("DNS Forward"), translate("Forward Dnsmasq Domain Name resolution requests to MosDNS")) +o.default = true + +o = s:taboption("basic", Flag, "custom_local_dns", translate("Custom China DNS"), translate("Follow WAN interface DNS if not enabled")) +o:depends( "configfile", "/etc/mosdns/config.yaml") +o.default = false + +o = s:taboption("basic", Flag, "apple_optimization", translate("Apple domains optimization"), translate("For Apple domains equipped with Chinese mainland CDN, always responsive to Chinese CDN IP addresses")) +o:depends("custom_local_dns", "1") +o.default = false + +o = s:taboption("basic", DynamicList, "local_dns", translate("China DNS server")) +o:value("119.29.29.29", translate("Tencent Public DNS (119.29.29.29)")) +o:value("119.28.28.28", translate("Tencent Public DNS (119.28.28.28)")) +o:value("223.5.5.5", translate("Aliyun Public DNS (223.5.5.5)")) +o:value("223.6.6.6", translate("Aliyun Public DNS (223.6.6.6)")) +o:value("114.114.114.114", translate("Xinfeng Public DNS (114.114.114.114)")) +o:value("114.114.115.115", translate("Xinfeng Public DNS (114.114.115.115)")) +o:value("180.76.76.76", translate("Baidu Public DNS (180.76.76.76)")) +o:value("https://doh.pub/dns-query", translate("Tencent Public DNS (DNS over HTTPS)")) +o:value("quic://dns.alidns.com", translate("Aliyun Public DNS (DNS over QUIC)")) +o:value("https://dns.alidns.com/dns-query", translate("Aliyun Public DNS (DNS over HTTPS)")) +o:value("h3://dns.alidns.com/dns-query", translate("Aliyun Public DNS (DNS over HTTPS/3)")) +o:value("https://doh.360.cn/dns-query", translate("360 Public DNS (DNS over HTTPS)")) +o:depends("custom_local_dns", "1") + +o = s:taboption("basic", DynamicList, "remote_dns", translate("Remote DNS server")) +o:value("tls://1.1.1.1", translate("CloudFlare Public DNS (1.1.1.1)")) +o:value("tls://1.0.0.1", translate("CloudFlare Public DNS (1.0.0.1)")) +o:value("tls://8.8.8.8", translate("Google Public DNS (8.8.8.8)")) +o:value("tls://8.8.4.4", translate("Google Public DNS (8.8.4.4)")) +o:value("tls://9.9.9.9", translate("Quad9 Public DNS (9.9.9.9)")) +o:value("tls://149.112.112.112", translate("Quad9 Public DNS (149.112.112.112)")) +o:value("tls://208.67.222.222", translate("Cisco Public DNS (208.67.222.222)")) +o:value("tls://208.67.220.220", translate("Cisco Public DNS (208.67.220.220)")) +o:depends("configfile", "/etc/mosdns/config.yaml") + +o = s:taboption("basic", ListValue, "bootstrap_dns", translate("Bootstrap DNS servers"), translate("Bootstrap DNS servers are used to resolve IP addresses of the DoH/DoT resolvers you specify as upstreams")) +o:value("119.29.29.29", translate("Tencent Public DNS (119.29.29.29)")) +o:value("119.28.28.28", translate("Tencent Public DNS (119.28.28.28)")) +o:value("223.5.5.5", translate("Aliyun Public DNS (223.5.5.5)")) +o:value("223.6.6.6", translate("Aliyun Public DNS (223.6.6.6)")) +o:value("114.114.114.114", translate("Xinfeng Public DNS (114.114.114.114)")) +o:value("114.114.115.115", translate("Xinfeng Public DNS (114.114.115.115)")) +o:value("180.76.76.76", translate("Baidu Public DNS (180.76.76.76)")) +o:value("8.8.8.8", translate("Google Public DNS (8.8.8.8)")) +o:value("1.1.1.1", translate("CloudFlare Public DNS (1.1.1.1)")) +o.default = "119.29.29.29" +o:depends("configfile", "/etc/mosdns/config.yaml") + +s:tab("advanced", translate("Advanced Options")) + +o = s:taboption("advanced", Value, "concurrent", translate("Concurrent"), translate("DNS query request concurrency, The number of upstream DNS servers that are allowed to initiate requests at the same time")) +o.datatype = "and(uinteger,min(1),max(3))" +o.default = "2" +o:depends("configfile", "/etc/mosdns/config.yaml") + +o = s:taboption("advanced", Value, "idle_timeout", translate("Idle Timeout"), translate("DoH/TCP/DoT Connection Multiplexing idle timeout (default 30 seconds)")) +o.datatype = "and(uinteger,min(1))" +o.default = "30" +o:depends("configfile", "/etc/mosdns/config.yaml") + +o = s:taboption("advanced", Flag, "enable_pipeline", translate("TCP/DoT Connection Multiplexing"), translate("Enable TCP/DoT RFC 7766 new Query Pipelining connection multiplexing mode")) +o.rmempty = false +o.default = false +o:depends("configfile", "/etc/mosdns/config.yaml") + +o = s:taboption("advanced", Flag, "insecure_skip_verify", translate("Disable TLS Certificate"), translate("Disable TLS Servers certificate validation, Can be useful if system CA certificate expires or the system time is out of order")) +o.rmempty = false +o.default = false +o:depends("configfile", "/etc/mosdns/config.yaml") + +o = s:taboption("advanced", Flag, "enable_ecs_remote", translate("Enable EDNS client subnet")) +o.rmempty = false +o.default = false +o:depends("configfile", "/etc/mosdns/config.yaml") + +o = s:taboption("advanced", Value, "remote_ecs_ip", translate("IP Address"), translate("Please provide the IP address you use when accessing foreign websites. This IP subnet (0/24) will be used as the ECS address for Remote DNS requests") .. '
' .. translate("This feature is typically used when using a self-built DNS server as an Remote DNS upstream (requires support from the upstream server)")) +o.datatype = "ipaddr" +o:depends("enable_ecs_remote", "1") + +o = s:taboption("advanced", Flag, "dns_leak", translate("Prevent DNS Leaks"), translate("Enable this option fallback policy forces forwarding to remote DNS")) +o.rmempty = false +o.default = false +o:depends("configfile", "/etc/mosdns/config.yaml") + +o = s:taboption("advanced", Value, "cache_size", translate("DNS Cache Size"), translate("DNS cache size (in piece). To disable caching, please set to 0.")) +o.datatype = "and(uinteger,min(0))" +o.default = "8000" +o:depends("configfile", "/etc/mosdns/config.yaml") + +o = s:taboption("advanced", Value, "cache_survival_time", translate("Lazy Cache TTL"), translate("Lazy cache survival time (in second). To disable Lazy Cache, please set to 0.")) +o.datatype = "and(uinteger,min(0))" +o.default = "86400" +o:depends("configfile", "/etc/mosdns/config.yaml") + +o = s:taboption("advanced", Flag, "dump_file", translate("Cache Dump"), translate("Save the cache locally and reload the cache dump on the next startup")) +o.rmempty = false +o.default = false +o:depends("configfile", "/etc/mosdns/config.yaml") + +o = s:taboption("advanced", Value, "dump_interval", translate("Auto Save Cache Interval")) +o.datatype = "and(uinteger,min(0))" +o.default = "3600" +o:depends("dump_file", "1") + +o = s:taboption("advanced", Value, "minimal_ttl", translate("Minimum TTL"), translate("Modify the Minimum TTL value (seconds) for DNS answer results, 0 indicating no modification")) +o.datatype = "and(uinteger,min(0),max(604800))" +o.default = "0" +o:depends("configfile", "/etc/mosdns/config.yaml") + +o = s:taboption("advanced", Value, "maximum_ttl", translate("Maximum TTL"), translate("Modify the Maximum TTL value (seconds) for DNS answer results, 0 indicating no modification")) +o.datatype = "and(uinteger,min(0),max(604800))" +o.default = "0" +o:depends("configfile", "/etc/mosdns/config.yaml") + +o = s:taboption("advanced", Flag, "adblock", translate("Enable DNS ADblock")) +o:depends("configfile", "/etc/mosdns/config.yaml") +o.default = false + +o = s:taboption("advanced", DynamicList, "ad_source", translate("ADblock Source"), translate("When using custom rule sources, please use rule types supported by MosDNS (domain lists).") .. '
' .. translate("Support for local files, such as: file:///var/mosdns/example.txt")) +o:depends("adblock", "1") +o.default = "geosite.dat" +o:value("geosite.dat", "v2ray-geosite") +o:value("https://raw.githubusercontent.com/privacy-protection-tools/anti-AD/master/anti-ad-domains.txt", "anti-AD") +o:value("https://raw.githubusercontent.com/Cats-Team/AdRules/main/mosdns_adrules.txt", "Cats-Team/AdRules") +o:value("https://raw.githubusercontent.com/ookangzheng/dbl-oisd-nl/master/dbl_light.txt", "oisd (small)") +o:value("https://raw.githubusercontent.com/ookangzheng/dbl-oisd-nl/master/dbl.txt", "oisd (big)") + +o = s:taboption("basic", Button, "_reload", translate("Restart-Service"), translate("Restart the MosDNS process to take effect of new configuration")) +o.write = function() + sys.exec("/etc/init.d/mosdns reload") +end +o:depends("configfile", "/etc/mosdns/config_custom.yaml") + +o = s:taboption("basic", TextValue, "config_custom", translate("Configuration Editor")) +o.template = "cbi/tvalue" +o.rows = 25 +o:depends("configfile", "/etc/mosdns/config_custom.yaml") +function o.cfgvalue(self, section) + return fs.readfile("/etc/mosdns/config_custom.yaml") +end +function o.write(self, section, value) + value = value:gsub("\r\n?", "\n") + fs.writefile("/etc/mosdns/config_custom.yaml", value) +end +-- codemirror +o = s:taboption("basic", DummyValue, "") +o.template = "mosdns/mosdns_editor" + +s:tab("cloudflare", translate("Cloudflare Options")) +o = s:taboption("cloudflare", Flag, "cloudflare", translate("Enabled"), translate("Match the parsing result with the Cloudflare IP ranges, and when there is a successful match, use the 'Custom IP' as the parsing result (experimental feature)")) +o.rmempty = false +o.default = false +o:depends("configfile", "/etc/mosdns/config.yaml") + +o = s:taboption("cloudflare", DynamicList, "cloudflare_ip", translate("Custom IP")) +o.datatype = "ipaddr" +o:depends("configfile", "/etc/mosdns/config.yaml") + +o = s:taboption("cloudflare", TextValue, "cloudflare_cidr", translate("Cloudflare IP Ranges")) +o.description = translate("IPv4 CIDR:") .. [[https://www.cloudflare.com/ips-v4]] .. '
' .. translate("IPv6 CIDR:") .. [[https://www.cloudflare.com/ips-v6]] +o.template = "cbi/tvalue" +o.rows = 15 +o:depends("configfile", "/etc/mosdns/config.yaml") +function o.cfgvalue(self, section) + return fs.readfile("/etc/mosdns/rule/cloudflare-cidr.txt") +end +function o.write(self, section, value) + value = value:gsub("\r\n?", "\n") + fs.writefile("/etc/mosdns/rule/cloudflare-cidr.txt", value) +end + +s:tab("api", translate("API Options")) + +o = s:taboption("api", Value, "listen_port_api", translate("API Listen port")) +o.datatype = "and(port,min(1))" +o.default = 9091 +o:depends("configfile", "/etc/mosdns/config.yaml") + +o = s:taboption("api", Button, "flush_cache", translate("Flush Cache"), translate("Flushing Cache will clear any IP addresses or DNS records from MosDNS cache")) +o.rawhtml = true +o.template = "mosdns/mosdns_flush_cache" +o:depends("configfile", "/etc/mosdns/config.yaml") + +s:tab("geodata", translate("GeoData Export")) + +o = s:taboption("geodata", DynamicList, "geosite_tags", translate("GeoSite Tags"), translate("Enter the GeoSite.dat category to be exported, Allow add multiple tags") .. '
' .. translate("Export directory: /var/mosdns")) +o:depends("configfile", "/etc/mosdns/config_custom.yaml") + +o = s:taboption("geodata", DynamicList, "geoip_tags", translate("GeoIP Tags"), translate("Enter the GeoIP.dat category to be exported, Allow add multiple tags") .. '
' .. translate("Export directory: /var/mosdns")) +o:depends("configfile", "/etc/mosdns/config_custom.yaml") + +return m diff --git a/luci-app-mosdns/luasrc/model/cbi/mosdns/log.lua b/luci-app-mosdns/luasrc/model/cbi/mosdns/log.lua new file mode 100644 index 00000000..79fc1a95 --- /dev/null +++ b/luci-app-mosdns/luasrc/model/cbi/mosdns/log.lua @@ -0,0 +1,5 @@ +m = Map("mosdns") + +m:append(Template("mosdns/mosdns_log")) + +return m diff --git a/luci-app-mosdns/luasrc/model/cbi/mosdns/rule_list.lua b/luci-app-mosdns/luasrc/model/cbi/mosdns/rule_list.lua new file mode 100644 index 00000000..1d6554e2 --- /dev/null +++ b/luci-app-mosdns/luasrc/model/cbi/mosdns/rule_list.lua @@ -0,0 +1,99 @@ +local datatypes = require "luci.cbi.datatypes" + +local white_list_file = "/etc/mosdns/rule/whitelist.txt" +local block_list_file = "/etc/mosdns/rule/blocklist.txt" +local grey_list_file = "/etc/mosdns/rule/greylist.txt" +local hosts_list_file = "/etc/mosdns/rule/hosts.txt" +local redirect_list_file = "/etc/mosdns/rule/redirect.txt" +local local_ptr_file = "/etc/mosdns/rule/local-ptr.txt" +local ddns_list_file = "/etc/mosdns/rule/ddnslist.txt" + +m = Map("mosdns") + +s = m:section(TypedSection, "mosdns", translate("Rule Settings")) +s.anonymous = true + +s:tab("white_list", translate("White Lists")) +s:tab("block_list", translate("Block Lists")) +s:tab("grey_list", translate("Grey Lists")) +s:tab("ddns_list", translate("DDNS Lists")) +s:tab("hosts_list", translate("Hosts")) +s:tab("redirect_list", translate("Redirect")) +s:tab("local_ptr_list", translate("Block PTR")) + +o = s:taboption("white_list", TextValue, "whitelist", "", "" .. translate("These domain names allow DNS resolution with the highest priority. Please input the domain names of websites, every line can input only one website domain. For example: hm.baidu.com.") .. "" .. "" .. translate("
The list of rules only apply to 'Default Config' profiles.") .. "
") +o.rows = 15 +o.wrap = "off" +o.cfgvalue = function(self, section) return nixio.fs.readfile(white_list_file) or "" end +o.write = function(self, section, value) nixio.fs.writefile(white_list_file , value:gsub("\r\n", "\n")) end +o.remove = function(self, section, value) nixio.fs.writefile(white_list_file , "") end +o.validate = function(self, value) + return value +end + +o = s:taboption("block_list", TextValue, "blocklist", "", "" .. translate("These domains are blocked from DNS resolution. Please input the domain names of websites, every line can input only one website domain. For example: baidu.com.") .. "" .. "" .. translate("
The list of rules only apply to 'Default Config' profiles.") .. "
") +o.rows = 15 +o.wrap = "off" +o.cfgvalue = function(self, section) return nixio.fs.readfile(block_list_file) or "" end +o.write = function(self, section, value) nixio.fs.writefile(block_list_file, value:gsub("\r\n", "\n")) end +o.remove = function(self, section, value) nixio.fs.writefile(block_list_file, "") end +o.validate = function(self, value) + return value +end + +o = s:taboption("grey_list", TextValue, "greylist", "", "" .. translate("These domains are always resolved using remote DNS. Please input the domain names of websites, every line can input only one website domain. For example: google.com.") .. "" .. "" .. translate("
The list of rules only apply to 'Default Config' profiles.") .. "
") +o.rows = 15 +o.wrap = "off" +o.cfgvalue = function(self, section) return nixio.fs.readfile(grey_list_file) or "" end +o.write = function(self, section, value) nixio.fs.writefile(grey_list_file, value:gsub("\r\n", "\n")) end +o.remove = function(self, section, value) nixio.fs.writefile(grey_list_file, "") end +o.validate = function(self, value) + return value +end + +o = s:taboption("ddns_list", TextValue, "ddns", "", "" .. translate("These domains are always resolved using local DNS. And force TTL 5 seconds, DNS resolution results will not enter the cache. For example: myddns.example.com.") .. "" .. "" .. translate("
The list of rules only apply to 'Default Config' profiles.") .. "
") +o.rows = 15 +o.wrap = "off" +o.cfgvalue = function(self, section) return nixio.fs.readfile(ddns_list_file) or "" end +o.write = function(self, section, value) nixio.fs.writefile(ddns_list_file, value:gsub("\r\n", "\n")) end +o.remove = function(self, section, value) nixio.fs.writefile(ddns_list_file, "") end +o.validate = function(self, value) + return value +end + +o = s:taboption("hosts_list", TextValue, "hosts", "", "" .. translate("Hosts For example: baidu.com 10.0.0.1") .. "" .. "" .. translate("
The list of rules only apply to 'Default Config' profiles.") .. "
") +o.rows = 15 +o.wrap = "off" +o.cfgvalue = function(self, section) return nixio.fs.readfile(hosts_list_file) or "" end +o.write = function(self, section, value) nixio.fs.writefile(hosts_list_file, value:gsub("\r\n", "\n")) end +o.remove = function(self, section, value) nixio.fs.writefile(hosts_list_file, "") end +o.validate = function(self, value) + return value +end + +o = s:taboption("redirect_list", TextValue, "redirect", "", "" .. translate("The domain name to redirect the request to. Requests domain A, but returns records for domain B. example: a.com b.com") .. "" .. "" .. translate("
The list of rules only apply to 'Default Config' profiles.") .. "
") +o.rows = 15 +o.wrap = "off" +o.cfgvalue = function(self, section) return nixio.fs.readfile(redirect_list_file) or "" end +o.write = function(self, section, value) nixio.fs.writefile(redirect_list_file, value:gsub("\r\n", "\n")) end +o.remove = function(self, section, value) nixio.fs.writefile(redirect_list_file, "") end +o.validate = function(self, value) + return value +end + +o = s:taboption("local_ptr_list", TextValue, "local_ptr", "", "" .. translate("These domains are blocked from PTR requests") .. "" .. "" .. translate("
The list of rules only apply to 'Default Config' profiles.") .. "
") +o.rows = 15 +o.wrap = "off" +o.cfgvalue = function(self, section) return nixio.fs.readfile(local_ptr_file) or "" end +o.write = function(self, section, value) nixio.fs.writefile(local_ptr_file, value:gsub("\r\n", "\n")) end +o.remove = function(self, section, value) nixio.fs.writefile(local_ptr_file, "") end +o.validate = function(self, value) + return value +end + +local apply = luci.http.formvalue("cbi.apply") +if apply then + luci.sys.exec("/etc/init.d/mosdns reload") +end + +return m diff --git a/luci-app-mosdns/luasrc/model/cbi/mosdns/update.lua b/luci-app-mosdns/luasrc/model/cbi/mosdns/update.lua new file mode 100644 index 00000000..c8e26c5a --- /dev/null +++ b/luci-app-mosdns/luasrc/model/cbi/mosdns/update.lua @@ -0,0 +1,31 @@ +m = Map("mosdns") + +s = m:section(TypedSection, "mosdns", translate("Update GeoIP & GeoSite dat")) +s.addremove = false +s.anonymous = true + +enable = s:option(Flag, "geo_auto_update", translate("Enable Auto Database Update")) +enable.rmempty = false + +o = s:option(ListValue, "geo_update_week_time", translate("Update Cycle")) +o:value("*", translate("Every Day")) +o:value("1", translate("Every Monday")) +o:value("2", translate("Every Tuesday")) +o:value("3", translate("Every Wednesday")) +o:value("4", translate("Every Thursday")) +o:value("5", translate("Every Friday")) +o:value("6", translate("Every Saturday")) +o:value("7", translate("Every Sunday")) +o.default = "*" + +update_time = s:option(ListValue, "geo_update_day_time", translate("Update Time")) +for t = 0, 23 do + update_time:value(t, t..":00") +end +update_time.default = 0 + +data_update = s:option(Button, "geo_update_database", translate("Database Update")) +data_update.rawhtml = true +data_update.template = "mosdns/mosdns_geo_update" + +return m diff --git a/luci-app-mosdns/luasrc/view/mosdns/mosdns_editor.htm b/luci-app-mosdns/luasrc/view/mosdns/mosdns_editor.htm new file mode 100644 index 00000000..2ac907c7 --- /dev/null +++ b/luci-app-mosdns/luasrc/view/mosdns/mosdns_editor.htm @@ -0,0 +1,21 @@ +<%+cbi/valueheader%> + + + + + + + + + +<%+cbi/valuefooter%> diff --git a/luci-app-mosdns/luasrc/view/mosdns/mosdns_flush_cache.htm b/luci-app-mosdns/luasrc/view/mosdns/mosdns_flush_cache.htm new file mode 100644 index 00000000..6734fbf0 --- /dev/null +++ b/luci-app-mosdns/luasrc/view/mosdns/mosdns_flush_cache.htm @@ -0,0 +1,34 @@ +<%+cbi/valueheader%> + + +<%=self.value%> +<%+cbi/valuefooter%> diff --git a/luci-app-mosdns/luasrc/view/mosdns/mosdns_geo_update.htm b/luci-app-mosdns/luasrc/view/mosdns/mosdns_geo_update.htm new file mode 100644 index 00000000..813b3b53 --- /dev/null +++ b/luci-app-mosdns/luasrc/view/mosdns/mosdns_geo_update.htm @@ -0,0 +1,34 @@ +<%+cbi/valueheader%> + + +<%=self.value%> +<%+cbi/valuefooter%> diff --git a/luci-app-mosdns/luasrc/view/mosdns/mosdns_log.htm b/luci-app-mosdns/luasrc/view/mosdns/mosdns_log.htm new file mode 100644 index 00000000..9698f691 --- /dev/null +++ b/luci-app-mosdns/luasrc/view/mosdns/mosdns_log.htm @@ -0,0 +1,33 @@ + +
+ + +
diff --git a/luci-app-mosdns/luasrc/view/mosdns/mosdns_status.htm b/luci-app-mosdns/luasrc/view/mosdns/mosdns_status.htm new file mode 100644 index 00000000..26832795 --- /dev/null +++ b/luci-app-mosdns/luasrc/view/mosdns/mosdns_status.htm @@ -0,0 +1,28 @@ + + +
+

+ <%:Collecting data...%> +

+
diff --git a/luci-app-mosdns/po/zh-cn/mosdns.po b/luci-app-mosdns/po/zh-cn/mosdns.po new file mode 100644 index 00000000..ca064012 --- /dev/null +++ b/luci-app-mosdns/po/zh-cn/mosdns.po @@ -0,0 +1,386 @@ +msgid "Basic Setting" +msgstr "基本设置" + +msgid "Basic Options" +msgstr "基本选项" + +msgid "Advanced Options" +msgstr "高级选项" + +msgid "Cloudflare Options" +msgstr "Cloudflare 选项" + +msgid "API Options" +msgstr "API 选项" + +msgid "MosDNS is a plugin-based DNS forwarder/traffic splitter." +msgstr "MosDNS 是一个插件化的 DNS 转发/分流器。" + +msgid "RUNNING" +msgstr "运行中" + +msgid "NOT RUNNING" +msgstr "未运行" + +msgid "Collecting data..." +msgstr "获取数据中..." + +msgid "Enabled" +msgstr "启用" + +msgid "Listen port" +msgstr "监听端口" + +msgid "API Listen port" +msgstr "API 监听端口" + +msgid "Flush Cache" +msgstr "刷新缓存" + +msgid "Flushing Cache will clear any IP addresses or DNS records from MosDNS cache" +msgstr "刷新缓存会清空 MosDNS 所有 IP 地址和 DNS 解析缓存" + +msgid "Flushing..." +msgstr "正在刷新..." + +msgid "Flushing Success" +msgstr "刷新成功" + +msgid "Flushing Failed, Please check if MosDNS is enabled" +msgstr "刷新失败,请检查 MosDNS 是否已启用" + +msgid "Match the parsing result with the Cloudflare IP ranges, and when there is a successful match, use the 'Custom IP' as the parsing result (experimental feature)" +msgstr "将解析结果与 Cloudflare IP 范围进行匹配,当匹配成功时,使用 “自选 IP” 作为解析结果(实验性功能)" + +msgid "Custom IP" +msgstr "自选 IP" + +msgid "Cloudflare IP Ranges" +msgstr "Cloudflare IP 范围" + +msgid "Log Level" +msgstr "日志等级" + +msgid "DNS Forward" +msgstr "DNS 转发" + +msgid "Forward Dnsmasq Domain Name resolution requests to MosDNS" +msgstr "将 Dnsmasq 域名解析请求转发到 MosDNS 服务器" + +msgid "Enable DNS ADblock" +msgstr "启用 DNS 广告过滤" + +msgid "ADblock Source" +msgstr "广告过滤规则来源" + +msgid "When using custom rule sources, please use rule types supported by MosDNS (domain lists)." +msgstr "使用自定义规则来源时,请使用 MosDNS 支持的规则类型(域名列表)" + +msgid "Support for local files, such as: file:///var/mosdns/example.txt" +msgstr "支持本地文件,例如:file:///var/mosdns/example.txt" + +msgid "Restart-Service" +msgstr "重启服务" + +msgid "Restart the MosDNS process to take effect of new configuration" +msgstr "重启 MosDNS 进程使新配置文件生效" + +msgid "Configuration Editor" +msgstr "配置编辑器" + +msgid "Geodata Update" +msgstr "更新数据库" + +msgid "Update GeoIP & GeoSite dat" +msgstr "更新广告规则、GeoIP & GeoSite 数据库" + +msgid "Update Time" +msgstr "更新时间" + +msgid "Update Cycle" +msgstr "更新周期" + +msgid "Every Day" +msgstr "每天" + +msgid "Every Monday" +msgstr "每周一" + +msgid "Every Tuesday" +msgstr "每周二" + +msgid "Every Wednesday" +msgstr "每周三" + +msgid "Every Thursday" +msgstr "每周四" + +msgid "Every Friday" +msgstr "每周五" + +msgid "Every Saturday" +msgstr "每周六" + +msgid "Every Sunday" +msgstr "每周日" + +msgid "Database Update" +msgstr "数据库更新" + +msgid "Check And Update" +msgstr "检查并更新" + +msgid "Enable Auto Database Update" +msgstr "启用自动更新" + +msgid "Updating..." +msgstr "正在更新..." + +msgid "Update success" +msgstr "更新成功" + +msgid "Update failed, Please check the network status" +msgstr "更新失败,请检查网络状态" + +msgid "Config File" +msgstr "配置文件" + +msgid "Default Config" +msgstr "内置预设" + +msgid "Custom Config" +msgstr "自定义" + +msgid "Log File" +msgstr "日志文件" + +msgid "Custom China DNS" +msgstr "自定义国内 DNS" + +msgid "Follow WAN interface DNS if not enabled" +msgstr "不启用则使用 WAN 接口 DNS" + +msgid "Apple domains optimization" +msgstr "Apple 域名解析优化" + +msgid "For Apple domains equipped with Chinese mainland CDN, always responsive to Chinese CDN IP addresses" +msgstr "配备中国大陆 CDN 的 Apple 域名,始终应答中国大陆 CDN 地址" + +msgid "China DNS server" +msgstr "国内 DNS 服务器" + +msgid "Remote DNS server" +msgstr "远程 DNS 服务器" + +msgid "Bootstrap DNS servers" +msgstr "Bootstrap DNS 服务器" + +msgid "Bootstrap DNS servers are used to resolve IP addresses of the DoH/DoT resolvers you specify as upstreams" +msgstr "Bootstrap DNS 服务器用于解析您指定为上游的 DoH / DoT 解析器的 IP 地址" + +msgid "Tencent Public DNS (119.29.29.29)" +msgstr "腾讯公共 DNS(119.29.29.29)" + +msgid "Tencent Public DNS (119.28.28.28)" +msgstr "腾讯公共 DNS(119.28.28.28)" + +msgid "Aliyun Public DNS (223.5.5.5)" +msgstr "阿里云公共 DNS(223.5.5.5)" + +msgid "Aliyun Public DNS (223.6.6.6)" +msgstr "阿里云公共 DNS(223.6.6.6)" + +msgid "Xinfeng Public DNS (114.114.114.114)" +msgstr "信风公共 DNS(114.114.114.114)" + +msgid "Xinfeng Public DNS (114.114.115.115)" +msgstr "信风公共 DNS(114.114.115.115)" + +msgid "Baidu Public DNS (180.76.76.76)" +msgstr "百度公共 DNS(180.76.76.76)" + +msgid "Tencent Public DNS (DNS over HTTPS)" +msgstr "腾讯公共 DNS(DNS over HTTPS)" + +msgid "Aliyun Public DNS (DNS over QUIC)" +msgstr "阿里云公共 DNS(DNS over QUIC)" + +msgid "Aliyun Public DNS (DNS over HTTPS)" +msgstr "阿里云公共 DNS(DNS over HTTPS)" + +msgid "Aliyun Public DNS (DNS over HTTPS/3)" +msgstr "阿里云公共 DNS(DNS over HTTPS/3)" + +msgid "360 Public DNS (DNS over HTTPS)" +msgstr "360 安全 DNS(DNS over HTTPS)" + +msgid "CloudFlare Public DNS (1.1.1.1)" +msgstr "CloudFlare 公共 DNS(1.1.1.1)" + +msgid "CloudFlare Public DNS (1.0.0.1)" +msgstr "CloudFlare 公共 DNS(1.0.0.1)" + +msgid "Google Public DNS (8.8.8.8)" +msgstr "谷歌公共 DNS(8.8.8.8)" + +msgid "Google Public DNS (8.8.4.4)" +msgstr "谷歌公共 DNS(8.8.4.4)" + +msgid "Quad9 Public DNS (9.9.9.9)" +msgstr "Quad9 公共 DNS(9.9.9.9)" + +msgid "Quad9 Public DNS (149.112.112.112)" +msgstr "Quad9 公共 DNS(149.112.112.112)" + +msgid "Cisco Public DNS (208.67.222.222)" +msgstr "思科公共 DNS(208.67.222.222)" + +msgid "Cisco Public DNS (208.67.220.220)" +msgstr "思科公共 DNS(208.67.220.220)" + +msgid "Concurrent" +msgstr "DNS 服务器并发数(默认 2)" + +msgid "DNS query request concurrency, The number of upstream DNS servers that are allowed to initiate requests at the same time" +msgstr "DNS 查询请求并发数,允许同时发起请求的上游 DNS 服务器数量" + +msgid "Idle Timeout" +msgstr "空闲超时" + +msgid "DoH/TCP/DoT Connection Multiplexing idle timeout (default 30 seconds)" +msgstr "DoH/TCP/DoT 连接复用空闲保持时间(默认 30 秒)" + +msgid "TCP/DoT Connection Multiplexing" +msgstr "TCP/DoT 连接复用" + +msgid "Enable TCP/DoT RFC 7766 new Query Pipelining connection multiplexing mode" +msgstr "启用 TCP/DoT RFC 7766 新型 Query Pipelining 连接复用模式" + +msgid "Disable TLS Certificate" +msgstr "禁用 TLS 证书" + +msgid "Disable TLS Servers certificate validation, Can be useful if system CA certificate expires or the system time is out of order" +msgstr "禁用 TLS 服务器证书验证,当系统 CA 证书过期或系统时间错乱时,本选项可能会有用" + +msgid "Enable EDNS client subnet" +msgstr "启用 EDNS 客户端子网" + +msgid "IP Address" +msgstr "IP 地址" + +msgid "Please provide the IP address you use when accessing foreign websites. This IP subnet (0/24) will be used as the ECS address for Remote DNS requests" +msgstr "请提供您在访问国外网站时使用的 IP 地址,这个 IP 子网(0/24)将用作远程 DNS 请求的 ECS 地址" + +msgid "This feature is typically used when using a self-built DNS server as an Remote DNS upstream (requires support from the upstream server)" +msgstr "此功能通常在使用自建 DNS 服务器作为 远程 DNS 上游时使用(需要上游服务器的支持)" + +msgid "Prevent DNS Leaks" +msgstr "防止 DNS 泄漏" + +msgid "Enable this option fallback policy forces forwarding to remote DNS" +msgstr "启用此选项 fallback 策略会强制转发到远程 DNS" + +msgid "DNS Cache Size" +msgstr "DNS 缓存大小" + +msgid "DNS cache size (in piece). To disable caching, please set to 0." +msgstr "DNS 缓存大小(单位:条),要禁用缓存,请设置为 0" + +msgid "Lazy Cache TTL" +msgstr "乐观缓存 TTL" + +msgid "Lazy cache survival time (in second). To disable Lazy Cache, please set to 0." +msgstr "乐观缓存生存时间(单位:秒),要禁用乐观缓存,请设置为 0" + +msgid "Cache Dump" +msgstr "自动保存缓存" + +msgid "Save the cache locally and reload the cache dump on the next startup" +msgstr "保存缓存到本地文件,以供下次启动时重新载入使用" + +msgid "Auto Save Cache Interval" +msgstr "自动保存缓存间隔(秒)" + +msgid "Minimum TTL" +msgstr "覆盖最小 TTL 值(默认 0)" + +msgid "Modify the Minimum TTL value (seconds) for DNS answer results, 0 indicating no modification" +msgstr "修改 DNS 应答结果的最小 TTL 值 (秒),0 表示不修改" + +msgid "Maximum TTL" +msgstr "覆盖最大 TTL 值(默认 0)" + +msgid "Modify the Maximum TTL value (seconds) for DNS answer results, 0 indicating no modification" +msgstr "修改 DNS 应答结果的最大 TTL 值(秒),0 表示不修改" + +msgid "Logs" +msgstr "日志" + +msgid "Clear logs" +msgstr "清空日志" + +msgid "Rule List" +msgstr "规则列表" + +msgid "Rule Settings" +msgstr "自定义规则列表" + +msgid "
The list of rules only apply to 'Default Config' profiles." +msgstr "
规则列表仅适用于 “内置预设” 配置文件" + +msgid "White Lists" +msgstr "白名单" + +msgid "These domain names allow DNS resolution with the highest priority. Please input the domain names of websites, every line can input only one website domain. For example: hm.baidu.com." +msgstr "加入的域名始终允许使用 “本地 DNS” 进行解析,且优先级最高(每个域名一行,支持域名匹配规则)" + +msgid "Block Lists" +msgstr "黑名单" + +msgid "These domains are blocked from DNS resolution. Please input the domain names of websites, every line can input only one website domain. For example: baidu.com." +msgstr "加入的域名将屏蔽 DNS 解析(每个域名一行,支持域名匹配规则)" + +msgid "Grey Lists" +msgstr "灰名单" + +msgid "These domains are always resolved using remote DNS. Please input the domain names of websites, every line can input only one website domain. For example: google.com." +msgstr "加入的域名始终使用 “远程 DNS” 进行解析(每个域名一行,支持域名匹配规则)" + +msgid "DDNS Lists" +msgstr "DDNS 域名" + +msgid "These domains are always resolved using local DNS. And force TTL 5 seconds, DNS resolution results will not enter the cache. For example: myddns.example.com." +msgstr "加入的域名始终使用 “本地 DNS” 进行解析,并且强制 TTL 5 秒,解析结果不会进入缓存(每个域名一行,支持域名匹配规则)" + +msgid "Hosts For example: baidu.com 10.0.0.1" +msgstr "自定义 Hosts 重写,如:baidu.com 10.0.0.1(每个规则一行,支持域名匹配规则)" + +msgid "Redirect" +msgstr "重定向" + +msgid "The domain name to redirect the request to. Requests domain A, but returns records for domain B. example: a.com b.com" +msgstr "重定向请求的域名。请求域名 A,但返回域名 B 的记录,如:baidu.com qq.com(每个规则一行)" + +msgid "Block PTR" +msgstr "PTR 黑名单" + +msgid "These domains are blocked from PTR requests" +msgstr "加入的域名将阻止 PTR 请求(每个域名一行,支持域名匹配规则)" + +msgid "GeoData Export" +msgstr "GeoData 导出" + +msgid "GeoSite Tags" +msgstr "GeoSite 标签" + +msgid "Enter the GeoSite.dat category to be exported, Allow add multiple tags" +msgstr "填写需要导出的 GeoSite.dat 类别条目,允许添加多个标签" + +msgid "GeoIP Tags" +msgstr "GeoIP 标签" + +msgid "Enter the GeoIP.dat category to be exported, Allow add multiple tags" +msgstr "输入需要导出的 GeoIP.dat 类别条目,允许添加多个标签" + +msgid "Export directory: /var/mosdns" +msgstr "导出目录:/var/mosdns" diff --git a/luci-app-mosdns/po/zh_Hans b/luci-app-mosdns/po/zh_Hans new file mode 120000 index 00000000..41451e4a --- /dev/null +++ b/luci-app-mosdns/po/zh_Hans @@ -0,0 +1 @@ +zh-cn \ No newline at end of file diff --git a/luci-app-mosdns/root/etc/config/mosdns b/luci-app-mosdns/root/etc/config/mosdns new file mode 100644 index 00000000..d6b3f468 --- /dev/null +++ b/luci-app-mosdns/root/etc/config/mosdns @@ -0,0 +1,29 @@ + +config mosdns 'config' + option enabled '0' + option listen_port '5335' + option geo_auto_update '0' + option geo_update_week_time '*' + option geo_update_day_time '2' + option redirect '1' + option adblock '0' + option configfile '/etc/mosdns/config.yaml' + option log_level 'info' + option logfile '/var/log/mosdns.log' + option cache_size '8000' + option cache_survival_time '86400' + option dump_file '0' + option concurrent '1' + option idle_timeout '30' + option minimal_ttl '0' + option maximum_ttl '0' + option custom_local_dns '0' + option enable_pipeline '0' + option insecure_skip_verify '0' + option dns_leak '0' + option cloudflare '0' + option listen_port_api '9091' + option bootstrap_dns '119.29.29.29' + list remote_dns 'tls://8.8.8.8' + list remote_dns 'tls://1.1.1.1' + diff --git a/luci-app-mosdns/root/etc/hotplug.d/iface/99-mosdns b/luci-app-mosdns/root/etc/hotplug.d/iface/99-mosdns new file mode 100755 index 00000000..1fb646fb --- /dev/null +++ b/luci-app-mosdns/root/etc/hotplug.d/iface/99-mosdns @@ -0,0 +1,2 @@ +#!/bin/sh +[ "$ACTION" = ifup ] && /etc/init.d/mosdns restart diff --git a/luci-app-mosdns/root/etc/init.d/mosdns b/luci-app-mosdns/root/etc/init.d/mosdns new file mode 100755 index 00000000..f8dafd01 --- /dev/null +++ b/luci-app-mosdns/root/etc/init.d/mosdns @@ -0,0 +1,247 @@ +#!/bin/sh /etc/rc.common +# +# Copyright (C) 2020-2022, IrineSistiana +# +# Copyright (C) 2023, sbwml +# +# This file is part of mosdns. +# +# mosdns is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# mosdns is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +START=99 +USE_PROCD=1 + +PROG=/usr/bin/mosdns +CONF=$(uci -q get mosdns.config.configfile) +CRON_FILE=/etc/crontabs/root +DUMP_FILE=/etc/mosdns/cache.dump +DUMP_FILE_DEFAULT=/usr/share/mosdns/cache.dump +DEFAULT_CONF=/usr/share/mosdns/default.yaml +MOSDNS_SCRIPT=/usr/share/mosdns/mosdns.sh + +get_config() { + config_get enabled $1 enabled 0 + config_get adblock $1 adblock 0 + config_get ad_source $1 ad_source "" + config_get cache_size $1 cache_size 8000 + config_get cache_survival_time $1 cache_survival_time 86400 + config_get dump_file $1 dump_file 0 + config_get dump_interval $1 dump_interval 3600 + config_get enable_pipeline $1 enable_pipeline 0 + config_get geo_auto_update $1 geo_auto_update 0 + config_get geo_update_day_time $1 geo_update_day_time 2 + config_get geo_update_week_time $1 geo_update_week_time "*" + config_get listen_port $1 listen_port 5335 + config_get log_file $1 logfile "/var/log/mosdns.log" + config_get log_level $1 log_level "info" + config_get maximum_ttl_custom $1 maximum_ttl 0 + config_get minimal_ttl_custom $1 minimal_ttl 0 + config_get redirect $1 redirect 0 + config_get remote_dns $1 remote_dns "tls://8.8.8.8 tls://1.1.1.1" + config_get custom_local_dns $1 custom_local_dns 0 + config_get apple_optimization $1 apple_optimization 0 + config_get bootstrap_dns $1 bootstrap_dns "119.29.29.29" + config_get listen_port_api $1 listen_port_api 9091 + config_get concurrent $1 concurrent 1 + config_get insecure_skip_verify $1 insecure_skip_verify 0 + config_get idle_timeout $1 idle_timeout 30 + config_get enable_ecs_remote $1 enable_ecs_remote 0 + config_get remote_ecs_ip $1 remote_ecs_ip "110.34.181.1" + config_get dns_leak $1 dns_leak 0 + config_get cloudflare $1 cloudflare 0 +} + +init_yaml() { + TMPDIR=$(mktemp -d) || exit 1 + [ $enable_pipeline -eq 1 ] && enable_pipeline=true || enable_pipeline=false + [ $insecure_skip_verify -eq 1 ] && insecure_skip_verify=true || insecure_skip_verify=false + # China DNS + if [ "$custom_local_dns" -eq 1 ]; then + local_dns=$($MOSDNS_SCRIPT dns | awk -v s=' ' '{ + for(i=1; i<=NF; i++) { + if ($i ~ /^h3:\/\//) { + printf "%s- addr: \"%s\"\n%s bootstrap: '${bootstrap_dns}'\n%s enable_pipeline: '${enable_pipeline}'\n%s insecure_skip_verify: '${insecure_skip_verify}'\n%s idle_timeout: '${idle_timeout}'\n%s enable_http3: true\n",s,$i,s,s,s,s,s + } else { + printf "%s- addr: \"%s\"\n%s bootstrap: '${bootstrap_dns}'\n%s enable_pipeline: '${enable_pipeline}'\n%s insecure_skip_verify: '${insecure_skip_verify}'\n%s idle_timeout: '${idle_timeout}'\n",s,$i,s,s,s,s + } + } + }') + else + local_dns=$($MOSDNS_SCRIPT dns | awk '{for(i=1;i<=NF;i++)printf "%s- addr: \"%s\"\n",s,$i,s}' s=' ') + fi + # Remote DNS + remote_dns=$(echo $remote_dns | awk -v s=' ' '{ + for(i=1; i<=NF; i++) { + if ($i ~ /^h3:\/\//) { + printf "%s- addr: \"%s\"\n%s bootstrap: '${bootstrap_dns}'\n%s enable_pipeline: '${enable_pipeline}'\n%s insecure_skip_verify: '${insecure_skip_verify}'\n%s idle_timeout: '${idle_timeout}'\n%s enable_http3: true\n",s,$i,s,s,s,s,s + } else { + printf "%s- addr: \"%s\"\n%s bootstrap: '${bootstrap_dns}'\n%s enable_pipeline: '${enable_pipeline}'\n%s insecure_skip_verify: '${insecure_skip_verify}'\n%s idle_timeout: '${idle_timeout}'\n",s,$i,s,s,s,s + } + } + }') + # Write parameters + sed "s,log_level,$log_level,g;s,log_file,$log_file,g; \ + s,listen_port,$listen_port,g;s,cache_size,$cache_size,g; \ + s,cache_survival_time,$cache_survival_time,g; \ + s,minimal_ttl_custom,$minimal_ttl_custom,g; \ + s,maximum_ttl_custom,$maximum_ttl_custom,g; \ + s,concurrent_num,$concurrent,g;s,api_port,$listen_port_api,g; \ + s,remote_dns_pipeline,$enable_pipeline,g" $DEFAULT_CONF > $CONF + # Apple optimization + [ "$apple_optimization" != 1 ] && sed -i '/- exec: \$query_is_apple_domain/,+1d' $CONF + # Adlist + adlist=$($MOSDNS_SCRIPT adlist) + echo "${adlist}" > $TMPDIR/adlist_files.txt + sed -i -e '/ADBLOCK_LIST/{r '$TMPDIR/adlist_files.txt -e';d}' $CONF + # DNS + echo "${local_dns}" > $TMPDIR/local_dns.txt + echo "${remote_dns}" > $TMPDIR/remote_dns.txt + sed -i -e '/- addr: local_dns/{r '$TMPDIR/local_dns.txt -e';d};/- addr: remote_dns/{r '$TMPDIR/remote_dns.txt -e';d}' $CONF + # Convert HTTP/3 prefix format + sed -i 's/h3:\/\//https:\/\//g' $CONF + # Cache dump + [ "$dump_file" -eq 1 ] && sed -i "/lazy_cache_ttl/a\ dump_file: $DUMP_FILE\n dump_interval: $dump_interval" $CONF + [ "$dump_file" -eq 1 ] && [ ! -f $DUMP_FILE ] && cp -a $DUMP_FILE_DEFAULT $DUMP_FILE + [ "$dump_file" -eq 0 ] && \cp -a $DUMP_FILE_DEFAULT $DUMP_FILE + # ECS + if [ "$enable_ecs_remote" -eq 1 ]; then + ecs_remote=$(echo "ecs ${remote_ecs_ip%.*}.0/24") + sed -i "s,ecs_remote,$ecs_remote,g" $CONF + else + sed -i "/ecs_remote/d;" $CONF + fi + # DNS Leak + if [ $dns_leak -eq 1 ]; then + sed -i "s/primary: UNDEFINED/primary: forward_remote_upstream/g" $CONF + else + sed -i "s/primary: UNDEFINED/primary: query_is_non_local_ip/g" $CONF + fi + # Cloudflare IP + if [ $cloudflare -eq 1 ]; then + cloudflare_ip=$(sh $MOSDNS_SCRIPT cloudflare) + sed -i "s/CLOUDFLARE_IP/$cloudflare_ip/g" $CONF + else + sed -i '/\$cloudflare_cidr\|CLOUDFLARE_IP/d' $CONF + fi + # disable lazy_cache plugin when cache_size is 0 + [ $cache_size -eq 0 ] && sed -i -E ':l;N;/exec: \$lazy_cache/s/(\n[^\n]*){6}$//;bl' $CONF + rm -rf $TMPDIR +} + +service_triggers() { + procd_add_reload_trigger "mosdns" +} + +restore_setting() { + rm -f /etc/mosdns/redirect.lock + sed -i "/list server/d" /etc/config/dhcp + uci set dhcp.@dnsmasq[0].noresolv='0' + uci del dhcp.@dnsmasq[0].cachesize + uci commit dhcp +} + +redirect_setting() { + if [ "${CONF}" = "/etc/mosdns/config.yaml" ]; then + sed -i "/list server/d" /etc/config/dhcp + uci add_list dhcp.@dnsmasq[0].server="127.0.0.1#$listen_port" + uci set dhcp.@dnsmasq[0].rebind_protection='0' + uci set dhcp.@dnsmasq[0].noresolv="1" + uci set dhcp.@dnsmasq[0].cachesize='0' + uci commit dhcp + else + sed -i "/list server/d" /etc/config/dhcp + uci add_list dhcp.@dnsmasq[0].server="127.0.0.1#$(awk -F'[:" ]+' '/^\s+listen:/{for(i=1;i<=NF;i++){if($i~/^[0-9]+$/){print $i;exit}}}' $CONF)" + uci set dhcp.@dnsmasq[0].rebind_protection='0' + uci set dhcp.@dnsmasq[0].noresolv="1" + uci set dhcp.@dnsmasq[0].cachesize='0' + uci commit dhcp + fi + touch /etc/mosdns/redirect.lock +} + +reload_dnsmasq() { + /etc/init.d/dnsmasq reload +} + +reload_service() { + stop + sleep 1 + start +} + +setcron() { + sed -i '/mosdns.sh/d' $CRON_FILE 2>/dev/null + [ "$geo_auto_update" -eq 1 ] && echo "0 $geo_update_day_time * * $geo_update_week_time $MOSDNS_SCRIPT geodata" >> $CRON_FILE + crontab $CRON_FILE +} + +delcron() { + sed -i '/mosdns.sh/d' $CRON_FILE 2>/dev/null + crontab $CRON_FILE +} + +v2dat_dump() { + $MOSDNS_SCRIPT v2dat_dump +} + +start_service() { + config_load "mosdns" + config_foreach get_config "mosdns" + [ $enabled -ne 1 ] && return 1 + delcron ; setcron + [ "${CONF}" = "/etc/mosdns/config.yaml" ] && init_yaml + :> $($MOSDNS_SCRIPT logfile) + if [ "${log_level}" = "error" ] || [ "${log_level}" = "warn" ]; then + v2dat_dump > /dev/null 2>&1 + else + v2dat_dump >> $($MOSDNS_SCRIPT logfile) 2>&1 + fi + procd_open_instance mosdns + procd_set_param env QUIC_GO_DISABLE_RECEIVE_BUFFER_WARNING=true + procd_set_param command $PROG start -c "$CONF" + procd_set_param user root + procd_set_param stdout 1 + procd_set_param stderr 1 + procd_set_param respawn "${respawn_threshold:-3600}" "${respawn_timeout:-5}" "${respawn_retry:-5}" + procd_close_instance mosdns + [ "$redirect" -ne 1 ] && [ -f "/etc/mosdns/redirect.lock" ] && restore_setting + [ "$redirect" -eq 1 ] && redirect_setting + reload_dnsmasq + # Update Adlist + update_list=0 + if [ "$adblock" -eq 1 ]; then + if [ -f "/etc/mosdns/rule/.ad_source" ]; then + for url in $ad_source; + do + [ "$url" = "geosite.dat" ] && continue + if [ $(grep -c "$url" "/etc/mosdns/rule/.ad_source") -eq 0 ]; then + update_list=1 + break + fi + done + else + update_list=1 + fi + fi + [ "$update_list" -eq 1 ] && $MOSDNS_SCRIPT adlist_update &> /dev/null & +} + +stop_service() { + config_load "mosdns" + config_foreach get_config "mosdns" + [ "$enabled" -eq "0" ] && [ -f "/etc/mosdns/redirect.lock" ] && restore_setting + reload_dnsmasq + delcron +} diff --git a/luci-app-mosdns/root/etc/mosdns/config_custom.yaml b/luci-app-mosdns/root/etc/mosdns/config_custom.yaml new file mode 100644 index 00000000..15347bce --- /dev/null +++ b/luci-app-mosdns/root/etc/mosdns/config_custom.yaml @@ -0,0 +1,142 @@ +log: + level: info + file: "/var/log/mosdns.log" + +# API 入口设置 +api: + http: "0.0.0.0:9091" + +include: [] + +plugins: + # 国内域名 + - tag: geosite_cn + type: domain_set + args: + files: + - "/var/mosdns/geosite_cn.txt" + + # 国内 IP + - tag: geoip_cn + type: ip_set + args: + files: + - "/var/mosdns/geoip_cn.txt" + + # 国外域名 + - tag: geosite_no_cn + type: domain_set + args: + files: + - "/var/mosdns/geosite_geolocation-!cn.txt" + + # 缓存 + - tag: lazy_cache + type: cache + args: + size: 20000 + lazy_cache_ttl: 86400 + dump_file: "/etc/mosdns/cache.dump" + dump_interval: 600 + + # 转发至本地服务器 + - tag: forward_local + type: forward + args: + upstreams: + - addr: "https://doh.pub/dns-query" + bootstrap: 180.76.76.76 + - addr: 119.29.29.29 + + # 转发至远程服务器 + - tag: forward_remote + type: forward + args: + upstreams: + - addr: tls://8.8.8.8 + enable_pipeline: false + + # 国内解析 + - tag: local_sequence + type: sequence + args: + - exec: $forward_local + + # 国外解析 + - tag: remote_sequence + type: sequence + args: + - exec: prefer_ipv4 + - exec: $forward_remote + + # 有响应终止返回 + - tag: has_resp_sequence + type: sequence + args: + - matches: has_resp + exec: accept + + # fallback 用本地服务器 sequence + # 返回非国内 ip 则 drop_resp + - tag: query_is_local_ip + type: sequence + args: + - exec: $local_sequence + - matches: "!resp_ip $geoip_cn" + exec: drop_resp + + # fallback 用远程服务器 sequence + - tag: query_is_remote + type: sequence + args: + - exec: $remote_sequence + + # fallback 用远程服务器 sequence + - tag: fallback + type: fallback + args: + primary: query_is_local_ip + secondary: query_is_remote + threshold: 500 + always_standby: true + + # 查询国内域名 + - tag: query_is_local_domain + type: sequence + args: + - matches: qname $geosite_cn + exec: $local_sequence + + # 查询国外域名 + - tag: query_is_no_local_domain + type: sequence + args: + - matches: qname $geosite_no_cn + exec: $remote_sequence + + # 主要的运行逻辑插件 + # sequence 插件中调用的插件 tag 必须在 sequence 前定义, + # 否则 sequence 找不到对应插件。 + - tag: main_sequence + type: sequence + args: + - exec: $lazy_cache + - exec: $query_is_local_domain + - exec: jump has_resp_sequence + - exec: $query_is_no_local_domain + - exec: jump has_resp_sequence + - exec: $fallback + + # 启动 udp 服务器。 + - tag: udp_server + type: udp_server + args: + entry: main_sequence + listen: ":5335" + + # 启动 tcp 服务器。 + - tag: tcp_server + type: tcp_server + args: + entry: main_sequence + listen: ":5335" diff --git a/luci-app-mosdns/root/etc/mosdns/rule/blocklist.txt b/luci-app-mosdns/root/etc/mosdns/rule/blocklist.txt new file mode 100644 index 00000000..e69de29b diff --git a/luci-app-mosdns/root/etc/mosdns/rule/cloudflare-cidr.txt b/luci-app-mosdns/root/etc/mosdns/rule/cloudflare-cidr.txt new file mode 100644 index 00000000..ca50c345 --- /dev/null +++ b/luci-app-mosdns/root/etc/mosdns/rule/cloudflare-cidr.txt @@ -0,0 +1,22 @@ +173.245.48.0/20 +103.21.244.0/22 +103.22.200.0/22 +103.31.4.0/22 +141.101.64.0/18 +108.162.192.0/18 +190.93.240.0/20 +188.114.96.0/20 +197.234.240.0/22 +198.41.128.0/17 +162.158.0.0/15 +104.16.0.0/13 +104.24.0.0/14 +172.64.0.0/13 +131.0.72.0/22 +2400:cb00::/32 +2606:4700::/32 +2803:f800::/32 +2405:b500::/32 +2405:8100::/32 +2a06:98c0::/29 +2c0f:f248::/32 diff --git a/luci-app-mosdns/root/etc/mosdns/rule/ddnslist.txt b/luci-app-mosdns/root/etc/mosdns/rule/ddnslist.txt new file mode 100644 index 00000000..e69de29b diff --git a/luci-app-mosdns/root/etc/mosdns/rule/greylist.txt b/luci-app-mosdns/root/etc/mosdns/rule/greylist.txt new file mode 100644 index 00000000..e69de29b diff --git a/luci-app-mosdns/root/etc/mosdns/rule/hosts.txt b/luci-app-mosdns/root/etc/mosdns/rule/hosts.txt new file mode 100644 index 00000000..e69de29b diff --git a/luci-app-mosdns/root/etc/mosdns/rule/local-ptr.txt b/luci-app-mosdns/root/etc/mosdns/rule/local-ptr.txt new file mode 100644 index 00000000..0a66cae4 --- /dev/null +++ b/luci-app-mosdns/root/etc/mosdns/rule/local-ptr.txt @@ -0,0 +1,87 @@ +0.in-addr.arpa +10.in-addr.arpa +127.in-addr.arpa +16.172.in-addr.arpa +17.172.in-addr.arpa +18.172.in-addr.arpa +19.172.in-addr.arpa +20.172.in-addr.arpa +21.172.in-addr.arpa +22.172.in-addr.arpa +23.172.in-addr.arpa +24.172.in-addr.arpa +25.172.in-addr.arpa +26.172.in-addr.arpa +27.172.in-addr.arpa +28.172.in-addr.arpa +29.172.in-addr.arpa +30.172.in-addr.arpa +31.172.in-addr.arpa +64.100.in-addr.arpa +65.100.in-addr.arpa +66.100.in-addr.arpa +67.100.in-addr.arpa +68.100.in-addr.arpa +69.100.in-addr.arpa +70.100.in-addr.arpa +71.100.in-addr.arpa +72.100.in-addr.arpa +73.100.in-addr.arpa +74.100.in-addr.arpa +75.100.in-addr.arpa +76.100.in-addr.arpa +77.100.in-addr.arpa +78.100.in-addr.arpa +79.100.in-addr.arpa +80.100.in-addr.arpa +81.100.in-addr.arpa +82.100.in-addr.arpa +83.100.in-addr.arpa +84.100.in-addr.arpa +85.100.in-addr.arpa +86.100.in-addr.arpa +87.100.in-addr.arpa +88.100.in-addr.arpa +89.100.in-addr.arpa +90.100.in-addr.arpa +91.100.in-addr.arpa +92.100.in-addr.arpa +93.100.in-addr.arpa +94.100.in-addr.arpa +95.100.in-addr.arpa +96.100.in-addr.arpa +97.100.in-addr.arpa +98.100.in-addr.arpa +99.100.in-addr.arpa +100.100.in-addr.arpa +101.100.in-addr.arpa +102.100.in-addr.arpa +103.100.in-addr.arpa +104.100.in-addr.arpa +105.100.in-addr.arpa +106.100.in-addr.arpa +107.100.in-addr.arpa +108.100.in-addr.arpa +109.100.in-addr.arpa +110.100.in-addr.arpa +111.100.in-addr.arpa +112.100.in-addr.arpa +113.100.in-addr.arpa +114.100.in-addr.arpa +115.100.in-addr.arpa +116.100.in-addr.arpa +117.100.in-addr.arpa +118.100.in-addr.arpa +119.100.in-addr.arpa +120.100.in-addr.arpa +121.100.in-addr.arpa +122.100.in-addr.arpa +123.100.in-addr.arpa +124.100.in-addr.arpa +125.100.in-addr.arpa +126.100.in-addr.arpa +127.100.in-addr.arpa +2.0.192.in-addr.arpa +168.192.in-addr.arpa +255.255.255.255.in-addr.arpa +domain:ip6.arpa diff --git a/luci-app-mosdns/root/etc/mosdns/rule/redirect.txt b/luci-app-mosdns/root/etc/mosdns/rule/redirect.txt new file mode 100644 index 00000000..e69de29b diff --git a/luci-app-mosdns/root/etc/mosdns/rule/whitelist.txt b/luci-app-mosdns/root/etc/mosdns/rule/whitelist.txt new file mode 100644 index 00000000..98470876 --- /dev/null +++ b/luci-app-mosdns/root/etc/mosdns/rule/whitelist.txt @@ -0,0 +1,11 @@ +domain:bing.com +domain:live.com +domain:msn.com +domain:ntp.org +domain:office.com +domain:qlogo.cn +domain:qq.com +domain:redhat.com +keyword:douyin +keyword:microsoft +keyword:windows diff --git a/luci-app-mosdns/root/etc/uci-defaults/luci-mosdns b/luci-app-mosdns/root/etc/uci-defaults/luci-mosdns new file mode 100755 index 00000000..09c39fa0 --- /dev/null +++ b/luci-app-mosdns/root/etc/uci-defaults/luci-mosdns @@ -0,0 +1,11 @@ +#!/bin/sh + +uci -q batch <<-EOF >/dev/null + delete ucitrack.@mosdns[-1] + add ucitrack mosdns + set ucitrack.@mosdns[-1].init=mosdns + commit ucitrack +EOF + +rm -rf /tmp/luci-* +exit 0 diff --git a/luci-app-mosdns/root/usr/share/mosdns/cache.dump b/luci-app-mosdns/root/usr/share/mosdns/cache.dump new file mode 100644 index 00000000..7d574188 Binary files /dev/null and b/luci-app-mosdns/root/usr/share/mosdns/cache.dump differ diff --git a/luci-app-mosdns/root/usr/share/mosdns/default.yaml b/luci-app-mosdns/root/usr/share/mosdns/default.yaml new file mode 100644 index 00000000..a684438d --- /dev/null +++ b/luci-app-mosdns/root/usr/share/mosdns/default.yaml @@ -0,0 +1,259 @@ +log: + level: log_level + file: "log_file" + +api: + http: "0.0.0.0:api_port" + +include: [] + +plugins: + - tag: geosite_cn + type: domain_set + args: + files: + - "/var/mosdns/geosite_cn.txt" + + - tag: geoip_cn + type: ip_set + args: + files: + - "/var/mosdns/geoip_cn.txt" + + - tag: geosite_apple + type: domain_set + args: + files: + - "/var/mosdns/geosite_apple.txt" + + - tag: geosite_no_cn + type: domain_set + args: + files: + - "/var/mosdns/geosite_geolocation-!cn.txt" + + - tag: whitelist + type: domain_set + args: + files: + - "/etc/mosdns/rule/whitelist.txt" + + - tag: blocklist + type: domain_set + args: + files: + - "/etc/mosdns/rule/blocklist.txt" + + - tag: greylist + type: domain_set + args: + files: + - "/etc/mosdns/rule/greylist.txt" + + - tag: ddnslist + type: domain_set + args: + files: + - "/etc/mosdns/rule/ddnslist.txt" + + - tag: hosts + type: hosts + args: + files: + - "/etc/mosdns/rule/hosts.txt" + + - tag: redirect + type: redirect + args: + files: + - "/etc/mosdns/rule/redirect.txt" + + - tag: adlist + type: domain_set + args: + files: + ADBLOCK_LIST + + - tag: local_ptr + type: domain_set + args: + files: + - "/etc/mosdns/rule/local-ptr.txt" + + - tag: cloudflare_cidr + type: ip_set + args: + files: + - "/etc/mosdns/rule/cloudflare-cidr.txt" + + - tag: lazy_cache + type: cache + args: + size: cache_size + lazy_cache_ttl: cache_survival_time + + - tag: forward_xinfeng_udp + type: forward + args: + concurrent: 2 + upstreams: + - addr: "114.114.114.114" + - addr: "114.114.115.115" + + - tag: forward_local + type: forward + args: + concurrent: concurrent_num + upstreams: + - addr: local_dns + + - tag: forward_remote + type: forward + args: + concurrent: concurrent_num + upstreams: + - addr: remote_dns + + - tag: forward_remote_upstream + type: sequence + args: + - exec: prefer_ipv4 + - exec: ecs_remote + - exec: $forward_remote + + - tag: modify_ttl + type: sequence + args: + - exec: ttl minimal_ttl_custom-maximum_ttl_custom + + - tag: modify_ddns_ttl + type: sequence + args: + - exec: ttl 5-5 + + - tag: has_resp_sequence + type: sequence + args: + - matches: qname $ddnslist + exec: $modify_ddns_ttl + - matches: "!qname $ddnslist" + exec: $modify_ttl + - matches: "resp_ip $cloudflare_cidr" + exec: black_hole CLOUDFLARE_IP + - matches: has_resp + exec: accept + + - tag: query_is_non_local_ip + type: sequence + args: + - exec: $forward_local + - matches: "!resp_ip $geoip_cn" + exec: drop_resp + + - tag: fallback + type: fallback + args: + primary: UNDEFINED + secondary: forward_remote_upstream + threshold: 500 + always_standby: true + + - tag: apple_domain_fallback + type: fallback + args: + primary: query_is_non_local_ip + secondary: forward_xinfeng_udp + threshold: 100 + always_standby: true + + - tag: query_is_apple_domain + type: sequence + args: + - matches: "!qname $geosite_apple" + exec: return + - exec: $apple_domain_fallback + + - tag: query_is_ddns_domain + type: sequence + args: + - matches: qname $ddnslist + exec: $forward_local + + - tag: query_is_local_domain + type: sequence + args: + - matches: qname $geosite_cn + exec: $forward_local + + - tag: query_is_no_local_domain + type: sequence + args: + - matches: qname $geosite_no_cn + exec: $forward_remote_upstream + + - tag: query_is_whitelist_domain + type: sequence + args: + - matches: qname $whitelist + exec: $forward_local + + - tag: query_is_greylist_domain + type: sequence + args: + - matches: qname $greylist + exec: $forward_remote_upstream + + - tag: query_is_reject_domain + type: sequence + args: + - matches: qname $blocklist + exec: reject 3 + - matches: qname $adlist + exec: reject 3 + - matches: + - qtype 12 + - qname $local_ptr + exec: reject 3 + - matches: qtype 65 + exec: reject 3 + + - tag: main_sequence + type: sequence + args: + - exec: $hosts + - exec: jump has_resp_sequence + - matches: + - "!qname $ddnslist" + - "!qname $blocklist" + - "!qname $adlist" + - "!qname $local_ptr" + exec: $lazy_cache + - exec: $redirect + - exec: jump has_resp_sequence + - exec: $query_is_apple_domain + - exec: jump has_resp_sequence + - exec: $query_is_ddns_domain + - exec: jump has_resp_sequence + - exec: $query_is_whitelist_domain + - exec: jump has_resp_sequence + - exec: $query_is_reject_domain + - exec: jump has_resp_sequence + - exec: $query_is_greylist_domain + - exec: jump has_resp_sequence + - exec: $query_is_local_domain + - exec: jump has_resp_sequence + - exec: $query_is_no_local_domain + - exec: jump has_resp_sequence + - exec: $fallback + + - tag: udp_server + type: udp_server + args: + entry: main_sequence + listen: ":listen_port" + + - tag: tcp_server + type: tcp_server + args: + entry: main_sequence + listen: ":listen_port" diff --git a/luci-app-mosdns/root/usr/share/mosdns/mosdns.sh b/luci-app-mosdns/root/usr/share/mosdns/mosdns.sh new file mode 100755 index 00000000..0cf430fb --- /dev/null +++ b/luci-app-mosdns/root/usr/share/mosdns/mosdns.sh @@ -0,0 +1,193 @@ +#!/bin/sh + +script_action=${1} + +logfile_path() ( + configfile=$(uci -q get mosdns.config.configfile) + if [ "$configfile" = "/etc/mosdns/config.yaml" ]; then + uci -q get mosdns.config.logfile + else + [ ! -f /etc/mosdns/config_custom.yaml ] && exit 1 + awk '/^log:/{f=1;next}f==1{if($0~/file:/){print;exit}if($0~/^[^ ]/)exit}' /etc/mosdns/config_custom.yaml | grep -Eo "/[^'\"]+" + fi +) + +interface_dns() ( + if [ "$(uci -q get mosdns.config.custom_local_dns)" = 1 ]; then + uci -q get mosdns.config.local_dns + else + peerdns=$(uci -q get network.wan.peerdns) + proto=$(uci -q get network.wan.proto) + if [ "$peerdns" = 0 ] || [ "$proto" = "static" ]; then + uci -q get network.wan.dns + else + interface_status=$(ubus call network.interface.wan status) + echo $interface_status | jsonfilter -e "@['dns-server'][0]" + echo $interface_status | jsonfilter -e "@['dns-server'][1]" + fi + [ $? -ne 0 ] && echo "119.29.29.29 223.5.5.5" + fi +) + +get_adlist() ( + adblock=$(uci -q get mosdns.config.adblock) + if [ "$adblock" = 1 ]; then + mkdir -p /etc/mosdns/rule/adlist + ad_source=$(uci -q get mosdns.config.ad_source) + for url in $ad_source; + do + if [ $(echo $url) = 'geosite.dat' ]; then + echo " - \"/var/mosdns/geosite_category-ads-all.txt\"" + elif echo "$url" | grep -Eq "^file://" ; then + echo " - \"$(echo "$url" | sed 's/file:\/\///')\"" + else + echo " - \"/etc/mosdns/rule/adlist/$(basename $url)\"" + [ ! -f "/etc/mosdns/rule/adlist/$(basename $url)" ] && touch /etc/mosdns/rule/adlist/$(basename $url) + fi + done + else + rm -rf /etc/mosdns/rule/adlist /etc/mosdns/rule/.ad_source + touch /var/disable-ads.txt + echo " - \"/var/disable-ads.txt\"" + fi +) + +adlist_update() { + [ "$(uci -q get mosdns.config.adblock)" != 1 ] && exit 0 + ad_source=$(uci -q get mosdns.config.ad_source) + AD_TMPDIR=$(mktemp -d) || exit 1 + google_status=$(curl -I -4 -m 3 -o /dev/null -s -w %{http_code} http://www.google.com/generate_204) + mirror="" + : > /etc/mosdns/rule/.ad_source + has_update=0 + for url in $ad_source; + do + if [ "$url" != "geosite.dat" ] && [ $(echo "$url" | grep -c -E "^file://") -eq 0 ]; then + echo "$url" >> /etc/mosdns/rule/.ad_source + filename=$(basename $url) + if echo "$url" | grep -Eq "^https://raw.githubusercontent.com" ; then + [ "$google_status" -ne "204" ] && mirror="https://ghproxy.com/" + fi + echo -e "\e[1;32mDownloading $mirror$url\e[0m" + curl --connect-timeout 5 -m 90 --ipv4 -kfSLo "$AD_TMPDIR/$filename" "$mirror$url" + has_update=1 + fi + done + if [ $? -ne 0 ]; then + echo -e "\e[1;31mRules download failed.\e[0m" + rm -rf "$AD_TMPDIR" + exit 1 + else + [ $has_update -eq 1 ] && { + mkdir -p /etc/mosdns/rule/adlist + rm -rf /etc/mosdns/rule/adlist/* + \cp $AD_TMPDIR/* /etc/mosdns/rule/adlist + rm -rf "$AD_TMPDIR" + } + fi +} + +geodat_update() ( + TMPDIR=$(mktemp -d) || exit 1 + google_status=$(curl -I -4 -m 3 -o /dev/null -s -w %{http_code} http://www.google.com/generate_204) + [ "$google_status" -ne "204" ] && mirror="https://ghproxy.com/" + # geoip.dat - cn-private + echo -e "\e[1;32mDownloading "$mirror"https://github.com/Loyalsoldier/geoip/releases/latest/download/geoip-only-cn-private.dat\e[0m" + curl --connect-timeout 5 -m 60 --ipv4 -kfSLo "$TMPDIR/geoip.dat" ""$mirror"https://github.com/Loyalsoldier/geoip/releases/latest/download/geoip-only-cn-private.dat" + [ $? -ne 0 ] && rm -rf "$TMPDIR" && exit 1 + # checksum - geoip.dat + echo -e "\e[1;32mDownloading "$mirror"https://github.com/Loyalsoldier/geoip/releases/latest/download/geoip-only-cn-private.dat.sha256sum\e[0m" + curl --connect-timeout 5 -m 10 --ipv4 -kfSLo "$TMPDIR/geoip.dat.sha256sum" ""$mirror"https://github.com/Loyalsoldier/geoip/releases/latest/download/geoip-only-cn-private.dat.sha256sum" + [ $? -ne 0 ] && rm -rf "$TMPDIR" && exit 1 + if [ "$(sha256sum "$TMPDIR/geoip.dat" | awk '{print $1}')" != "$(cat "$TMPDIR/geoip.dat.sha256sum" | awk '{print $1}')" ]; then + echo -e "\e[1;31mgeoip.dat checksum error\e[0m" + rm -rf "$TMPDIR" + exit 1 + fi + + # geosite.dat + echo -e "\e[1;32mDownloading "$mirror"https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat\e[0m" + curl --connect-timeout 5 -m 120 --ipv4 -kfSLo "$TMPDIR/geosite.dat" ""$mirror"https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat" + [ $? -ne 0 ] && rm -rf "$TMPDIR" && exit 1 + # checksum - geosite.dat + echo -e "\e[1;32mDownloading "$mirror"https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat.sha256sum\e[0m" + curl --connect-timeout 5 -m 10 --ipv4 -kfSLo "$TMPDIR/geosite.dat.sha256sum" ""$mirror"https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat.sha256sum" + [ $? -ne 0 ] && rm -rf "$TMPDIR" && exit 1 + if [ "$(sha256sum "$TMPDIR/geosite.dat" | awk '{print $1}')" != "$(cat "$TMPDIR/geosite.dat.sha256sum" | awk '{print $1}')" ]; then + echo -e "\e[1;31mgeosite.dat checksum error\e[0m" + rm -rf "$TMPDIR" + exit 1 + fi + rm -rf "$TMPDIR"/*.sha256sum + \cp -a "$TMPDIR"/* /usr/share/v2ray + rm -rf "$TMPDIR" +) + +restart_service() { + /etc/init.d/mosdns restart +} + +flush_cache() { + curl -s 127.0.0.1:$(uci -q get mosdns.config.listen_port_api)/plugins/lazy_cache/flush || exit 1 +} + +v2dat_dump() { + # env + v2dat_dir=/usr/share/v2ray + adblock=$(uci -q get mosdns.config.adblock) + ad_source=$(uci -q get mosdns.config.ad_source) + configfile=$(uci -q get mosdns.config.configfile) + mkdir -p /var/mosdns + rm -f /var/mosdns/geo*.txt + if [ "$configfile" = "/etc/mosdns/config.yaml" ]; then + # default config + v2dat unpack geoip -o /var/mosdns -f cn $v2dat_dir/geoip.dat + v2dat unpack geosite -o /var/mosdns -f cn -f apple -f 'geolocation-!cn' $v2dat_dir/geosite.dat + [ "$adblock" -eq 1 ] && [ $(echo $ad_source | grep -c geosite.dat) -ge '1' ] && v2dat unpack geosite -o /var/mosdns -f category-ads-all $v2dat_dir/geosite.dat + else + # custom config + v2dat unpack geoip -o /var/mosdns -f cn $v2dat_dir/geoip.dat + v2dat unpack geosite -o /var/mosdns -f cn -f 'geolocation-!cn' $v2dat_dir/geosite.dat + geoip_tags=$(uci -q get mosdns.config.geoip_tags) + geosite_tags=$(uci -q get mosdns.config.geosite_tags) + [ -n "$geoip_tags" ] && v2dat unpack geoip -o /var/mosdns $(echo $geoip_tags | sed -r 's/\S+/-f &/g') $v2dat_dir/geoip.dat + [ -n "$geosite_tags" ] && v2dat unpack geosite -o /var/mosdns $(echo $geosite_tags | sed -r 's/\S+/-f &/g') $v2dat_dir/geosite.dat + fi +} + +cloudflare_ip() { + uci -q get mosdns.config.cloudflare_ip +} + +case $script_action in + "dns") + interface_dns + ;; + "adlist") + get_adlist + ;; + "geodata") + geodat_update && adlist_update && restart_service + ;; + "logfile") + logfile_path + ;; + "adlist_update") + adlist_update && [ "$has_update" -eq 1 ] && restart_service + ;; + "flush") + flush_cache + ;; + "v2dat_dump") + v2dat_dump + ;; + "cloudflare") + cloudflare_ip + ;; + "version") + mosdns version + ;; + *) + exit 0 + ;; +esac diff --git a/luci-app-mosdns/root/usr/share/rpcd/acl.d/luci-app-mosdns.json b/luci-app-mosdns/root/usr/share/rpcd/acl.d/luci-app-mosdns.json new file mode 100644 index 00000000..6c79e330 --- /dev/null +++ b/luci-app-mosdns/root/usr/share/rpcd/acl.d/luci-app-mosdns.json @@ -0,0 +1,11 @@ +{ + "luci-app-mosdns": { + "description": "Grant UCI access for luci-app-mosdns", + "read": { + "uci": [ "mosdns" ] + }, + "write": { + "uci": [ "mosdns" ] + } + } +} diff --git a/luci-app-mosdns/root/www/luci-static/resources/mosdns/addon/fold/foldcode.js b/luci-app-mosdns/root/www/luci-static/resources/mosdns/addon/fold/foldcode.js new file mode 100644 index 00000000..f93d42b7 --- /dev/null +++ b/luci-app-mosdns/root/www/luci-static/resources/mosdns/addon/fold/foldcode.js @@ -0,0 +1 @@ +!function(n){"object"==typeof exports&&"object"==typeof module?n(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],n):n(CodeMirror)}(function(n){"use strict";function e(e,o,i,t){if(i&&i.call){var l=i;i=null}else l=r(e,i,"rangeFinder");"number"==typeof o&&(o=n.Pos(o,0));var f=r(e,i,"minFoldSize");function d(n){var r=l(e,o);if(!r||r.to.line-r.from.linee.firstLine();)o=n.Pos(o.line-1,0),u=d(!1);if(u&&!u.cleared&&"unfold"!==t){var a=function(n,e){var o=r(n,e,"widget");if("string"==typeof o){var i=document.createTextNode(o);(o=document.createElement("span")).appendChild(i),o.className="CodeMirror-foldmarker"}else o&&(o=o.cloneNode(!0));return o}(e,i);n.on(a,"mousedown",function(e){c.clear(),n.e_preventDefault(e)});var c=e.markText(u.from,u.to,{replacedWith:a,clearOnEnter:r(e,i,"clearOnEnter"),__isFold:!0});c.on("clear",function(o,r){n.signal(e,"unfold",e,o,r)}),n.signal(e,"fold",e,u.from,u.to)}}n.newFoldFunction=function(n,o){return function(r,i){e(r,i,{rangeFinder:n,widget:o})}},n.defineExtension("foldCode",function(n,o,r){e(this,n,o,r)}),n.defineExtension("isFolded",function(n){for(var e=this.findMarksAt(n),o=0;o=u){if(s&&f&&s.test(f.className))return;i=r(a.indicatorOpen)}}(i||f)&&t.setGutterMarker(n,a.gutter,i)})}function i(t){return new RegExp("(^|\\s)"+t+"(?:$|\\s)\\s*")}function f(t){var o=t.getViewport(),e=t.state.foldGutter;e&&(t.operation(function(){n(t,o.from,o.to)}),e.from=o.from,e.to=o.to)}function a(t,r,n){var i=t.state.foldGutter;if(i){var f=i.options;if(n==f.gutter){var a=e(t,r);a?a.clear():t.foldCode(o(r,0),f)}}}function d(t){var o=t.state.foldGutter;if(o){var e=o.options;o.from=o.to=0,clearTimeout(o.changeUpdate),o.changeUpdate=setTimeout(function(){f(t)},e.foldOnChangeTimeSpan||600)}}function u(t){var o=t.state.foldGutter;if(o){var e=o.options;clearTimeout(o.changeUpdate),o.changeUpdate=setTimeout(function(){var e=t.getViewport();o.from==o.to||e.from-o.to>20||o.from-e.to>20?f(t):t.operation(function(){e.fromo.to&&(n(t,o.to,e.to),o.to=e.to)})},e.updateViewportTimeSpan||400)}}function l(t,o){var e=t.state.foldGutter;if(e){var r=o.line;r>=e.from&&ro))break;r=l}}return r?{from:e.Pos(i.line,t.getLine(i.line).length),to:e.Pos(r,t.getLine(r).length)}:void 0}})}); \ No newline at end of file diff --git a/luci-app-mosdns/root/www/luci-static/resources/mosdns/lib/codemirror.css b/luci-app-mosdns/root/www/luci-static/resources/mosdns/lib/codemirror.css new file mode 100644 index 00000000..504079b4 --- /dev/null +++ b/luci-app-mosdns/root/www/luci-static/resources/mosdns/lib/codemirror.css @@ -0,0 +1 @@ +.CodeMirror{/* Set height, width, borders, and global font properties here */ font-family: monospace; height: 500px; color: black; direction: ltr;}@media screen and (max-width: 768px){.CodeMirror{/* Set height, width, borders, and global font properties here */ font-size: small; font-family: monospace; height: 560px; width: 100%; color: black; direction: ltr;}}@media (min-width: 769px){.CodeMirror{/* Set height, width, borders, and global font properties here */ font-size: small; font-family: monospace; height: 560px; width: 750px; color: black; direction: ltr;}}.CodeMirror-lines{padding: 4px 0}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{padding: 0 4px}.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{background-color: white}.CodeMirror-gutters{border-right: 1px solid #ddd; background-color: #f7f7f7; white-space: nowrap}.CodeMirror-linenumber{padding: 0 3px 0 5px; min-width: 20px; text-align: right; color: #999; white-space: nowrap}.CodeMirror-guttermarker{color: black}.CodeMirror-guttermarker-subtle{color: #999}.CodeMirror-cursor{border-left: 1px solid black; border-right: 0; width: 0}.CodeMirror div.CodeMirror-secondarycursor{border-left: 1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width: auto; border: 0 !important; background: #7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index: 1}.cm-fat-cursor-mark{background-color: rgba(20, 255, 20, 0.5); -webkit-animation: blink 1.06s steps(1) infinite; -moz-animation: blink 1.06s steps(1) infinite; animation: blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width: auto; border: 0; -webkit-animation: blink 1.06s steps(1) infinite; -moz-animation: blink 1.06s steps(1) infinite; animation: blink 1.06s steps(1) infinite; background-color: #7e7}@-moz-keyframes blink{50%{background-color: transparent}}@-webkit-keyframes blink{50%{background-color: transparent}}@keyframes blink{50%{background-color: transparent}}.cm-tab{display: inline-block; text-decoration: inherit}.CodeMirror-rulers{position: absolute; left: 0; right: 0; top: -50px; bottom: 0; overflow: hidden}.CodeMirror-ruler{border-left: 1px solid #ccc; top: 0; bottom: 0; position: absolute}.cm-s-default .cm-header{color: blue}.cm-s-default .cm-quote{color: #090}.cm-negative{color: #d44}.cm-positive{color: #292}.cm-header,.cm-strong{font-weight: bold}.cm-em{font-style: italic}.cm-link{text-decoration: underline}.cm-strikethrough{text-decoration: line-through}.cm-s-default .cm-keyword{color: #708}.cm-s-default .cm-atom{color: #219}.cm-s-default .cm-number{color: #164}.cm-s-default .cm-def{color: #00f}.cm-s-default .cm-variable-2{color: #05a}.cm-s-default .cm-variable-3,.cm-s-default .cm-type{color: #085}.cm-s-default .cm-comment{color: #a50}.cm-s-default .cm-string{color: #a11}.cm-s-default .cm-string-2{color: #f50}.cm-s-default .cm-meta{color: #555}.cm-s-default .cm-qualifier{color: #555}.cm-s-default .cm-builtin{color: #30a}.cm-s-default .cm-bracket{color: #997}.cm-s-default .cm-tag{color: #170}.cm-s-default .cm-attribute{color: #00c}.cm-s-default .cm-hr{color: #999}.cm-s-default .cm-link{color: #00c}.cm-s-default .cm-error{color: red}.cm-invalidchar{color: red}.CodeMirror-composing{border-bottom: 2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color: #0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color: #a22}.CodeMirror-matchingtag{background: rgba(255, 150, 0, .3)}.CodeMirror-activeline-background{background: #e8f2ff}.CodeMirror{position: relative; overflow: hidden; background: white}.CodeMirror-scroll{overflow: scroll !important; margin-bottom: -30px; margin-right: -30px; padding-bottom: 30px; height: 100%; outline: 0; position: relative}.CodeMirror-sizer{position: relative; border-right: 30px solid transparent}.CodeMirror-vscrollbar,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{position: absolute; z-index: 6; display: none}.CodeMirror-vscrollbar{right: 0; top: 0; overflow-x: hidden; overflow-y: scroll}.CodeMirror-hscrollbar{bottom: 0; left: 0; overflow-y: hidden; overflow-x: scroll}.CodeMirror-scrollbar-filler{right: 0; bottom: 0}.CodeMirror-gutter-filler{left: 0; bottom: 0}.CodeMirror-gutters{position: absolute; left: 0; top: 0; min-height: 100%; z-index: 3}.CodeMirror-gutter{white-space: normal; height: 100%; display: inline-block; vertical-align: top; margin-bottom: -30px}.CodeMirror-gutter-wrapper{position: absolute; z-index: 4; background: none !important; border: none !important}.CodeMirror-gutter-background{position: absolute; top: 0; bottom: 0; z-index: 4}.CodeMirror-gutter-elt{position: absolute; cursor: default; z-index: 4}.CodeMirror-gutter-wrapper ::selection{background-color: transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color: transparent}.CodeMirror-lines{cursor: text; min-height: 1px}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{-moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0; border-width: 0; background: transparent; font-family: inherit; font-size: inherit; margin: 0; white-space: pre; word-wrap: normal; line-height: inherit; color: inherit; z-index: 2; position: relative; overflow: visible; -webkit-tap-highlight-color: transparent; -webkit-font-variant-ligatures: contextual; font-variant-ligatures: contextual}.CodeMirror-wrap pre.CodeMirror-line,.CodeMirror-wrap pre.CodeMirror-line-like{word-wrap: break-word; white-space: pre-wrap; word-break: normal}.CodeMirror-linebackground{position: absolute; left: 0; right: 0; top: 0; bottom: 0; z-index: 0}.CodeMirror-linewidget{position: relative; z-index: 2; padding: .1px}.CodeMirror-rtl pre{direction: rtl}.CodeMirror-code{outline: 0}.CodeMirror-scroll,.CodeMirror-sizer,.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber{-moz-box-sizing: content-box; box-sizing: content-box}.CodeMirror-measure{position: absolute; width: 100%; height: 0; overflow: hidden; visibility: hidden}.CodeMirror-cursor{position: absolute; pointer-events: none}.CodeMirror-measure pre{position: static}div.CodeMirror-cursors{visibility: hidden; position: relative; z-index: 3}div.CodeMirror-dragcursors{visibility: visible}.CodeMirror-focused div.CodeMirror-cursors{visibility: visible}.CodeMirror-selected{background: #d9d9d9}.CodeMirror-focused .CodeMirror-selected{background: #d7d4f0}.CodeMirror-crosshair{cursor: crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background: #d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background: #d7d4f0}.cm-searching{background-color: #ffa; background-color: rgba(255, 255, 0, .4)}.cm-force-border{padding-right: .1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility: hidden}}.cm-tab-wrap-hack:after{content: ''}span.CodeMirror-selectedtext{background: 0} \ No newline at end of file diff --git a/luci-app-mosdns/root/www/luci-static/resources/mosdns/lib/codemirror.js b/luci-app-mosdns/root/www/luci-static/resources/mosdns/lib/codemirror.js new file mode 100644 index 00000000..d01f072e --- /dev/null +++ b/luci-app-mosdns/root/www/luci-static/resources/mosdns/lib/codemirror.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.CodeMirror=t()}(this,function(){"use strict";var e=navigator.userAgent,t=navigator.platform,r=/gecko\/\d/i.test(e),n=/MSIE \d/.test(e),i=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(e),o=/Edge\/(\d+)/.exec(e),l=n||i||o,s=l&&(n?document.documentMode||6:+(o||i)[1]),a=!o&&/WebKit\//.test(e),u=a&&/Qt\/\d+\.\d+/.test(e),c=!o&&/Chrome\//.test(e),h=/Opera\//.test(e),f=/Apple Computer/.test(navigator.vendor),d=/Mac OS X 1\d\D([8-9]|\d\d)\D/.test(e),p=/PhantomJS/.test(e),g=!o&&/AppleWebKit/.test(e)&&/Mobile\/\w+/.test(e),v=/Android/.test(e),m=g||v||/webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(e),y=g||/Mac/.test(t),b=/\bCrOS\b/.test(e),w=/win/i.test(t),x=h&&e.match(/Version\/(\d*\.\d*)/);x&&(x=Number(x[1])),x&&x>=15&&(h=!1,a=!0);var C=y&&(u||h&&(null==x||x<12.11)),S=r||l&&s>=9;function L(e){return new RegExp("(^|\\s)"+e+"(?:$|\\s)\\s*")}var k,T=function(e,t){var r=e.className,n=L(t).exec(r);if(n){var i=r.slice(n.index+n[0].length);e.className=r.slice(0,n.index)+(i?n[1]+i:"")}};function M(e){for(var t=e.childNodes.length;t>0;--t)e.removeChild(e.firstChild);return e}function N(e,t){return M(e).appendChild(t)}function O(e,t,r,n){var i=document.createElement(e);if(r&&(i.className=r),n&&(i.style.cssText=n),"string"==typeof t)i.appendChild(document.createTextNode(t));else if(t)for(var o=0;o=t)return l+(t-o);l+=s-o,l+=r-l%r,o=s+1}}g?P=function(e){e.selectionStart=0,e.selectionEnd=e.value.length}:l&&(P=function(e){try{e.select()}catch(e){}});var R=function(){this.id=null,this.f=null,this.time=0,this.handler=E(this.onTimeout,this)};function B(e,t){for(var r=0;r=t)return n+Math.min(l,t-i);if(i+=o-n,n=o+1,(i+=r-i%r)>=t)return n}}var Y=[""];function _(e){for(;Y.length<=e;)Y.push($(Y)+" ");return Y[e]}function $(e){return e[e.length-1]}function q(e,t){for(var r=[],n=0;n"€"&&(e.toUpperCase()!=e.toLowerCase()||J.test(e))}function te(e,t){return t?!!(t.source.indexOf("\\w")>-1&&ee(e))||t.test(e):ee(e)}function re(e){for(var t in e)if(e.hasOwnProperty(t)&&e[t])return!1;return!0}var ne=/[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;function ie(e){return e.charCodeAt(0)>=768&&ne.test(e)}function oe(e,t,r){for(;(r<0?t>0:tr?-1:1;;){if(t==r)return t;var i=(t+r)/2,o=n<0?Math.ceil(i):Math.floor(i);if(o==t)return e(o)?t:r;e(o)?r=o:t=o+n}}var se=null;function ae(e,t,r){var n;se=null;for(var i=0;it)return i;o.to==t&&(o.from!=o.to&&"before"==r?n=i:se=i),o.from==t&&(o.from!=o.to&&"before"!=r?n=i:se=i)}return null!=n?n:se}var ue=function(){var e="bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN",t="nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111";var r=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/,n=/[stwN]/,i=/[LRr]/,o=/[Lb1n]/,l=/[1n]/;function s(e,t,r){this.level=e,this.from=t,this.to=r}return function(a,u){var c="ltr"==u?"L":"R";if(0==a.length||"ltr"==u&&!r.test(a))return!1;for(var h,f=a.length,d=[],p=0;p-1&&(n[t]=i.slice(0,o).concat(i.slice(o+1)))}}}function ge(e,t){var r=de(e,t);if(r.length)for(var n=Array.prototype.slice.call(arguments,2),i=0;i0}function be(e){e.prototype.on=function(e,t){fe(this,e,t)},e.prototype.off=function(e,t){pe(this,e,t)}}function we(e){e.preventDefault?e.preventDefault():e.returnValue=!1}function xe(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0}function Ce(e){return null!=e.defaultPrevented?e.defaultPrevented:0==e.returnValue}function Se(e){we(e),xe(e)}function Le(e){return e.target||e.srcElement}function ke(e){var t=e.which;return null==t&&(1&e.button?t=1:2&e.button?t=3:4&e.button&&(t=2)),y&&e.ctrlKey&&1==t&&(t=3),t}var Te,Me,Ne=function(){if(l&&s<9)return!1;var e=O("div");return"draggable"in e||"dragDrop"in e}();function Oe(e){if(null==Te){var t=O("span","​");N(e,O("span",[t,document.createTextNode("x")])),0!=e.firstChild.offsetHeight&&(Te=t.offsetWidth<=1&&t.offsetHeight>2&&!(l&&s<8))}var r=Te?O("span","​"):O("span"," ",null,"display: inline-block; width: 1px; margin-right: -1px");return r.setAttribute("cm-text",""),r}function Ae(e){if(null!=Me)return Me;var t=N(e,document.createTextNode("AخA")),r=k(t,0,1).getBoundingClientRect(),n=k(t,1,2).getBoundingClientRect();return M(e),!(!r||r.left==r.right)&&(Me=n.right-r.right<3)}var De,We=3!="\n\nb".split(/\n/).length?function(e){for(var t=0,r=[],n=e.length;t<=n;){var i=e.indexOf("\n",t);-1==i&&(i=e.length);var o=e.slice(t,"\r"==e.charAt(i-1)?i-1:i),l=o.indexOf("\r");-1!=l?(r.push(o.slice(0,l)),t+=l+1):(r.push(o),t=i+1)}return r}:function(e){return e.split(/\r\n?|\n/)},He=window.getSelection?function(e){try{return e.selectionStart!=e.selectionEnd}catch(e){return!1}}:function(e){var t;try{t=e.ownerDocument.selection.createRange()}catch(e){}return!(!t||t.parentElement()!=e)&&0!=t.compareEndPoints("StartToEnd",t)},Fe="oncopy"in(De=O("div"))||(De.setAttribute("oncopy","return;"),"function"==typeof De.oncopy),Pe=null;var Ee={},Ie={};function ze(e){if("string"==typeof e&&Ie.hasOwnProperty(e))e=Ie[e];else if(e&&"string"==typeof e.name&&Ie.hasOwnProperty(e.name)){var t=Ie[e.name];"string"==typeof t&&(t={name:t}),(e=Q(t,e)).name=t.name}else{if("string"==typeof e&&/^[\w\-]+\/[\w\-]+\+xml$/.test(e))return ze("application/xml");if("string"==typeof e&&/^[\w\-]+\/[\w\-]+\+json$/.test(e))return ze("application/json")}return"string"==typeof e?{name:e}:e||{name:"null"}}function Re(e,t){t=ze(t);var r=Ee[t.name];if(!r)return Re(e,"text/plain");var n=r(e,t);if(Be.hasOwnProperty(t.name)){var i=Be[t.name];for(var o in i)i.hasOwnProperty(o)&&(n.hasOwnProperty(o)&&(n["_"+o]=n[o]),n[o]=i[o])}if(n.name=t.name,t.helperType&&(n.helperType=t.helperType),t.modeProps)for(var l in t.modeProps)n[l]=t.modeProps[l];return n}var Be={};function Ge(e,t){I(t,Be.hasOwnProperty(e)?Be[e]:Be[e]={})}function Ue(e,t){if(!0===t)return t;if(e.copyState)return e.copyState(t);var r={};for(var n in t){var i=t[n];i instanceof Array&&(i=i.concat([])),r[n]=i}return r}function Ve(e,t){for(var r;e.innerMode&&(r=e.innerMode(t))&&r.mode!=e;)t=r.state,e=r.mode;return r||{mode:e,state:t}}function Ke(e,t,r){return!e.startState||e.startState(t,r)}var je=function(e,t,r){this.pos=this.start=0,this.string=e,this.tabSize=t||8,this.lastColumnPos=this.lastColumnValue=0,this.lineStart=0,this.lineOracle=r};function Xe(e,t){if((t-=e.first)<0||t>=e.size)throw new Error("There is no line "+(t+e.first)+" in the document.");for(var r=e;!r.lines;)for(var n=0;;++n){var i=r.children[n],o=i.chunkSize();if(t=e.first&&tr?et(r,Xe(e,r).text.length):function(e,t){var r=e.ch;return null==r||r>t?et(e.line,t):r<0?et(e.line,0):e}(t,Xe(e,t.line).text.length)}function at(e,t){for(var r=[],n=0;n=this.string.length},je.prototype.sol=function(){return this.pos==this.lineStart},je.prototype.peek=function(){return this.string.charAt(this.pos)||void 0},je.prototype.next=function(){if(this.post},je.prototype.eatSpace=function(){for(var e=this.pos;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>e},je.prototype.skipToEnd=function(){this.pos=this.string.length},je.prototype.skipTo=function(e){var t=this.string.indexOf(e,this.pos);if(t>-1)return this.pos=t,!0},je.prototype.backUp=function(e){this.pos-=e},je.prototype.column=function(){return this.lastColumnPos0?null:(n&&!1!==t&&(this.pos+=n[0].length),n)}var i=function(e){return r?e.toLowerCase():e};if(i(this.string.substr(this.pos,e.length))==i(e))return!1!==t&&(this.pos+=e.length),!0},je.prototype.current=function(){return this.string.slice(this.start,this.pos)},je.prototype.hideFirstChars=function(e,t){this.lineStart+=e;try{return t()}finally{this.lineStart-=e}},je.prototype.lookAhead=function(e){var t=this.lineOracle;return t&&t.lookAhead(e)},je.prototype.baseToken=function(){var e=this.lineOracle;return e&&e.baseToken(this.pos)};var ut=function(e,t){this.state=e,this.lookAhead=t},ct=function(e,t,r,n){this.state=t,this.doc=e,this.line=r,this.maxLookAhead=n||0,this.baseTokens=null,this.baseTokenPos=1};function ht(e,t,r,n){var i=[e.state.modeGen],o={};wt(e,t.text,e.doc.mode,r,function(e,t){return i.push(e,t)},o,n);for(var l=r.state,s=function(n){r.baseTokens=i;var s=e.state.overlays[n],a=1,u=0;r.state=!0,wt(e,t.text,s.mode,r,function(e,t){for(var r=a;ue&&i.splice(a,1,e,i[a+1],n),a+=2,u=Math.min(e,n)}if(t)if(s.opaque)i.splice(r,a-r,e,"overlay "+t),a=r+2;else for(;re.options.maxHighlightLength&&Ue(e.doc.mode,n.state),o=ht(e,t,n);i&&(n.state=i),t.stateAfter=n.save(!i),t.styles=o.styles,o.classes?t.styleClasses=o.classes:t.styleClasses&&(t.styleClasses=null),r===e.doc.highlightFrontier&&(e.doc.modeFrontier=Math.max(e.doc.modeFrontier,++e.doc.highlightFrontier))}return t.styles}function dt(e,t,r){var n=e.doc,i=e.display;if(!n.mode.startState)return new ct(n,!0,t);var o=function(e,t,r){for(var n,i,o=e.doc,l=r?-1:t-(e.doc.mode.innerMode?1e3:100),s=t;s>l;--s){if(s<=o.first)return o.first;var a=Xe(o,s-1),u=a.stateAfter;if(u&&(!r||s+(u instanceof ut?u.lookAhead:0)<=o.modeFrontier))return s;var c=z(a.text,null,e.options.tabSize);(null==i||n>c)&&(i=s-1,n=c)}return i}(e,t,r),l=o>n.first&&Xe(n,o-1).stateAfter,s=l?ct.fromSaved(n,l,o):new ct(n,Ke(n.mode),o);return n.iter(o,t,function(r){pt(e,r.text,s);var n=s.line;r.stateAfter=n==t-1||n%5==0||n>=i.viewFrom&&nt.start)return o}throw new Error("Mode "+e.name+" failed to advance stream.")}ct.prototype.lookAhead=function(e){var t=this.doc.getLine(this.line+e);return null!=t&&e>this.maxLookAhead&&(this.maxLookAhead=e),t},ct.prototype.baseToken=function(e){if(!this.baseTokens)return null;for(;this.baseTokens[this.baseTokenPos]<=e;)this.baseTokenPos+=2;var t=this.baseTokens[this.baseTokenPos+1];return{type:t&&t.replace(/( |^)overlay .*/,""),size:this.baseTokens[this.baseTokenPos]-e}},ct.prototype.nextLine=function(){this.line++,this.maxLookAhead>0&&this.maxLookAhead--},ct.fromSaved=function(e,t,r){return t instanceof ut?new ct(e,Ue(e.mode,t.state),r,t.lookAhead):new ct(e,Ue(e.mode,t),r)},ct.prototype.save=function(e){var t=!1!==e?Ue(this.doc.mode,this.state):this.state;return this.maxLookAhead>0?new ut(t,this.maxLookAhead):t};var mt=function(e,t,r){this.start=e.start,this.end=e.pos,this.string=e.current(),this.type=t||null,this.state=r};function yt(e,t,r,n){var i,o,l=e.doc,s=l.mode,a=Xe(l,(t=st(l,t)).line),u=dt(e,t.line,r),c=new je(a.text,e.options.tabSize,u);for(n&&(o=[]);(n||c.pose.options.maxHighlightLength?(s=!1,l&&pt(e,t,n,h.pos),h.pos=t.length,a=null):a=bt(vt(r,h,n.state,f),o),f){var d=f[0].name;d&&(a="m-"+(a?d+" "+a:d))}if(!s||c!=a){for(;u=t:o.to>t);(n||(n=[])).push(new St(l,o.from,s?null:o.to))}}return n}(r,i,l),a=function(e,t,r){var n;if(e)for(var i=0;i=t:o.to>t)||o.from==t&&"bookmark"==l.type&&(!r||o.marker.insertLeft)){var s=null==o.from||(l.inclusiveLeft?o.from<=t:o.from0&&s)for(var b=0;bt)&&(!r||Wt(r,o.marker)<0)&&(r=o.marker)}return r}function It(e,t,r,n,i){var o=Xe(e,t),l=Ct&&o.markedSpans;if(l)for(var s=0;s=0&&h<=0||c<=0&&h>=0)&&(c<=0&&(a.marker.inclusiveRight&&i.inclusiveLeft?tt(u.to,r)>=0:tt(u.to,r)>0)||c>=0&&(a.marker.inclusiveRight&&i.inclusiveLeft?tt(u.from,n)<=0:tt(u.from,n)<0)))return!0}}}function zt(e){for(var t;t=Ft(e);)e=t.find(-1,!0).line;return e}function Rt(e,t){var r=Xe(e,t),n=zt(r);return r==n?t:qe(n)}function Bt(e,t){if(t>e.lastLine())return t;var r,n=Xe(e,t);if(!Gt(e,n))return t;for(;r=Pt(n);)n=r.find(1,!0).line;return qe(n)+1}function Gt(e,t){var r=Ct&&t.markedSpans;if(r)for(var n=void 0,i=0;it.maxLineLength&&(t.maxLineLength=r,t.maxLine=e)})}var Xt=function(e,t,r){this.text=e,Ot(this,t),this.height=r?r(this):1};function Yt(e){e.parent=null,Nt(e)}Xt.prototype.lineNo=function(){return qe(this)},be(Xt);var _t={},$t={};function qt(e,t){if(!e||/^\s*$/.test(e))return null;var r=t.addModeClass?$t:_t;return r[e]||(r[e]=e.replace(/\S+/g,"cm-$&"))}function Zt(e,t){var r=A("span",null,null,a?"padding-right: .1px":null),n={pre:A("pre",[r],"CodeMirror-line"),content:r,col:0,pos:0,cm:e,trailingSpace:!1,splitSpaces:e.getOption("lineWrapping")};t.measure={};for(var i=0;i<=(t.rest?t.rest.length:0);i++){var o=i?t.rest[i-1]:t.line,l=void 0;n.pos=0,n.addToken=Jt,Ae(e.display.measure)&&(l=ce(o,e.doc.direction))&&(n.addToken=er(n.addToken,l)),n.map=[],rr(o,n,ft(e,o,t!=e.display.externalMeasured&&qe(o))),o.styleClasses&&(o.styleClasses.bgClass&&(n.bgClass=F(o.styleClasses.bgClass,n.bgClass||"")),o.styleClasses.textClass&&(n.textClass=F(o.styleClasses.textClass,n.textClass||""))),0==n.map.length&&n.map.push(0,0,n.content.appendChild(Oe(e.display.measure))),0==i?(t.measure.map=n.map,t.measure.cache={}):((t.measure.maps||(t.measure.maps=[])).push(n.map),(t.measure.caches||(t.measure.caches=[])).push({}))}if(a){var s=n.content.lastChild;(/\bcm-tab\b/.test(s.className)||s.querySelector&&s.querySelector(".cm-tab"))&&(n.content.className="cm-tab-wrap-hack")}return ge(e,"renderLine",e,t.line,n.pre),n.pre.className&&(n.textClass=F(n.pre.className,n.textClass||"")),n}function Qt(e){var t=O("span","•","cm-invalidchar");return t.title="\\u"+e.charCodeAt(0).toString(16),t.setAttribute("aria-label",t.title),t}function Jt(e,t,r,n,i,o,a){if(t){var u,c=e.splitSpaces?function(e,t){if(e.length>1&&!/ /.test(e))return e;for(var r=t,n="",i=0;iu&&h.from<=u);f++);if(h.to>=c)return e(r,n,i,o,l,s,a);e(r,n.slice(0,h.to-u),i,o,null,s,a),o=null,n=n.slice(h.to-u),u=h.to}}}function tr(e,t,r,n){var i=!n&&r.widgetNode;i&&e.map.push(e.pos,e.pos+t,i),!n&&e.cm.display.input.needsContentAttribute&&(i||(i=e.content.appendChild(document.createElement("span"))),i.setAttribute("cm-marker",r.id)),i&&(e.cm.display.input.setUneditable(i),e.content.appendChild(i)),e.pos+=t,e.trailingSpace=!1}function rr(e,t,r){var n=e.markedSpans,i=e.text,o=0;if(n)for(var l,s,a,u,c,h,f,d=i.length,p=0,g=1,v="",m=0;;){if(m==p){a=u=c=s="",f=null,h=null,m=1/0;for(var y=[],b=void 0,w=0;wp||C.collapsed&&x.to==p&&x.from==p)){if(null!=x.to&&x.to!=p&&m>x.to&&(m=x.to,u=""),C.className&&(a+=" "+C.className),C.css&&(s=(s?s+";":"")+C.css),C.startStyle&&x.from==p&&(c+=" "+C.startStyle),C.endStyle&&x.to==m&&(b||(b=[])).push(C.endStyle,x.to),C.title&&((f||(f={})).title=C.title),C.attributes)for(var S in C.attributes)(f||(f={}))[S]=C.attributes[S];C.collapsed&&(!h||Wt(h.marker,C)<0)&&(h=x)}else x.from>p&&m>x.from&&(m=x.from)}if(b)for(var L=0;L=d)break;for(var T=Math.min(d,m);;){if(v){var M=p+v.length;if(!h){var N=M>T?v.slice(0,T-p):v;t.addToken(t,N,l?l+a:a,c,p+N.length==m?u:"",s,f)}if(M>=T){v=v.slice(T-p),p=T;break}p=M,c=""}v=i.slice(o,o=r[g++]),l=qt(r[g++],t.cm.options)}}else for(var O=1;Or)return{map:e.measure.maps[i],cache:e.measure.caches[i],before:!0}}function Or(e,t,r,n){return Wr(e,Dr(e,t),r,n)}function Ar(e,t){if(t>=e.display.viewFrom&&t=r.lineN&&t2&&o.push((a.bottom+u.top)/2-r.top)}}o.push(r.bottom-r.top)}}(e,t.view,t.rect),t.hasHeights=!0),(o=function(e,t,r,n){var i,o=Pr(t.map,r,n),a=o.node,u=o.start,c=o.end,h=o.collapse;if(3==a.nodeType){for(var f=0;f<4;f++){for(;u&&ie(t.line.text.charAt(o.coverStart+u));)--u;for(;o.coverStart+c1}(e))return t;var r=screen.logicalXDPI/screen.deviceXDPI,n=screen.logicalYDPI/screen.deviceYDPI;return{left:t.left*r,right:t.right*r,top:t.top*n,bottom:t.bottom*n}}(e.display.measure,i))}else{var d;u>0&&(h=n="right"),i=e.options.lineWrapping&&(d=a.getClientRects()).length>1?d["right"==n?d.length-1:0]:a.getBoundingClientRect()}if(l&&s<9&&!u&&(!i||!i.left&&!i.right)){var p=a.parentNode.getClientRects()[0];i=p?{left:p.left,right:p.left+tn(e.display),top:p.top,bottom:p.bottom}:Fr}for(var g=i.top-t.rect.top,v=i.bottom-t.rect.top,m=(g+v)/2,y=t.view.measure.heights,b=0;bt)&&(i=(o=a-s)-1,t>=a&&(l="right")),null!=i){if(n=e[u+2],s==a&&r==(n.insertLeft?"left":"right")&&(l=r),"left"==r&&0==i)for(;u&&e[u-2]==e[u-3]&&e[u-1].insertLeft;)n=e[2+(u-=3)],l="left";if("right"==r&&i==a-s)for(;u=0&&(r=e[i]).left==r.right;i--);return r}function Ir(e){if(e.measure&&(e.measure.cache={},e.measure.heights=null,e.rest))for(var t=0;t=n.text.length?(a=n.text.length,u="before"):a<=0&&(a=0,u="after"),!s)return l("before"==u?a-1:a,"before"==u);function c(e,t,r){return l(r?e-1:e,1==s[t].level!=r)}var h=ae(s,a,u),f=se,d=c(a,h,"before"==u);return null!=f&&(d.other=c(a,f,"before"!=u)),d}function Yr(e,t){var r=0;t=st(e.doc,t),e.options.lineWrapping||(r=tn(e.display)*t.ch);var n=Xe(e.doc,t.line),i=Vt(n)+Cr(e.display);return{left:r,right:r,top:i,bottom:i+n.height}}function _r(e,t,r,n,i){var o=et(e,t,r);return o.xRel=i,n&&(o.outside=n),o}function $r(e,t,r){var n=e.doc;if((r+=e.display.viewOffset)<0)return _r(n.first,0,null,-1,-1);var i=Ze(n,r),o=n.first+n.size-1;if(i>o)return _r(n.first+n.size-1,Xe(n,o).text.length,null,1,1);t<0&&(t=0);for(var l=Xe(n,i);;){var s=Jr(e,l,i,t,r),a=Et(l,s.ch+(s.xRel>0||s.outside>0?1:0));if(!a)return s;var u=a.find(1);if(u.line==i)return u;l=Xe(n,i=u.line)}}function qr(e,t,r,n){n-=Ur(t);var i=t.text.length,o=le(function(t){return Wr(e,r,t-1).bottom<=n},i,0);return{begin:o,end:i=le(function(t){return Wr(e,r,t).top>n},o,i)}}function Zr(e,t,r,n){return r||(r=Dr(e,t)),qr(e,t,r,Vr(e,t,Wr(e,r,n),"line").top)}function Qr(e,t,r,n){return!(e.bottom<=r)&&(e.top>r||(n?e.left:e.right)>t)}function Jr(e,t,r,n,i){i-=Vt(t);var o=Dr(e,t),l=Ur(t),s=0,a=t.text.length,u=!0,c=ce(t,e.doc.direction);if(c){var h=(e.options.lineWrapping?function(e,t,r,n,i,o,l){var s=qr(e,t,n,l),a=s.begin,u=s.end;/\s/.test(t.text.charAt(u-1))&&u--;for(var c=null,h=null,f=0;f=u||d.to<=a)){var p=1!=d.level,g=Wr(e,n,p?Math.min(u,d.to)-1:Math.max(a,d.from)).right,v=gv)&&(c=d,h=v)}}c||(c=i[i.length-1]);c.fromu&&(c={from:c.from,to:u,level:c.level});return c}:function(e,t,r,n,i,o,l){var s=le(function(s){var a=i[s],u=1!=a.level;return Qr(Xr(e,et(r,u?a.to:a.from,u?"before":"after"),"line",t,n),o,l,!0)},0,i.length-1),a=i[s];if(s>0){var u=1!=a.level,c=Xr(e,et(r,u?a.from:a.to,u?"after":"before"),"line",t,n);Qr(c,o,l,!0)&&c.top>l&&(a=i[s-1])}return a})(e,t,r,o,c,n,i);s=(u=1!=h.level)?h.from:h.to-1,a=u?h.to:h.from-1}var f,d,p=null,g=null,v=le(function(t){var r=Wr(e,o,t);return r.top+=l,r.bottom+=l,!!Qr(r,n,i,!1)&&(r.top<=i&&r.left<=n&&(p=t,g=r),!0)},s,a),m=!1;if(g){var y=n-g.left=w.bottom?1:0}return _r(r,v=oe(t.text,v,1),d,m,n-f)}function en(e){if(null!=e.cachedTextHeight)return e.cachedTextHeight;if(null==Hr){Hr=O("pre",null,"CodeMirror-line-like");for(var t=0;t<49;++t)Hr.appendChild(document.createTextNode("x")),Hr.appendChild(O("br"));Hr.appendChild(document.createTextNode("x"))}N(e.measure,Hr);var r=Hr.offsetHeight/50;return r>3&&(e.cachedTextHeight=r),M(e.measure),r||1}function tn(e){if(null!=e.cachedCharWidth)return e.cachedCharWidth;var t=O("span","xxxxxxxxxx"),r=O("pre",[t],"CodeMirror-line-like");N(e.measure,r);var n=t.getBoundingClientRect(),i=(n.right-n.left)/10;return i>2&&(e.cachedCharWidth=i),i||10}function rn(e){for(var t=e.display,r={},n={},i=t.gutters.clientLeft,o=t.gutters.firstChild,l=0;o;o=o.nextSibling,++l){var s=e.display.gutterSpecs[l].className;r[s]=o.offsetLeft+o.clientLeft+i,n[s]=o.clientWidth}return{fixedPos:nn(t),gutterTotalWidth:t.gutters.offsetWidth,gutterLeft:r,gutterWidth:n,wrapperWidth:t.wrapper.clientWidth}}function nn(e){return e.scroller.getBoundingClientRect().left-e.sizer.getBoundingClientRect().left}function on(e){var t=en(e.display),r=e.options.lineWrapping,n=r&&Math.max(5,e.display.scroller.clientWidth/tn(e.display)-3);return function(i){if(Gt(e.doc,i))return 0;var o=0;if(i.widgets)for(var l=0;l=e.display.viewTo)return null;if((t-=e.display.viewFrom)<0)return null;for(var r=e.display.view,n=0;nt)&&(i.updateLineNumbers=t),e.curOp.viewChanged=!0,t>=i.viewTo)Ct&&Rt(e.doc,t)i.viewFrom?hn(e):(i.viewFrom+=n,i.viewTo+=n);else if(t<=i.viewFrom&&r>=i.viewTo)hn(e);else if(t<=i.viewFrom){var o=fn(e,r,r+n,1);o?(i.view=i.view.slice(o.index),i.viewFrom=o.lineN,i.viewTo+=n):hn(e)}else if(r>=i.viewTo){var l=fn(e,t,t,-1);l?(i.view=i.view.slice(0,l.index),i.viewTo=l.lineN):hn(e)}else{var s=fn(e,t,t,-1),a=fn(e,r,r+n,1);s&&a?(i.view=i.view.slice(0,s.index).concat(ir(e,s.lineN,a.lineN)).concat(i.view.slice(a.index)),i.viewTo+=n):hn(e)}var u=i.externalMeasured;u&&(r=i.lineN&&t=n.viewTo)){var o=n.view[an(e,t)];if(null!=o.node){var l=o.changes||(o.changes=[]);-1==B(l,r)&&l.push(r)}}}function hn(e){e.display.viewFrom=e.display.viewTo=e.doc.first,e.display.view=[],e.display.viewOffset=0}function fn(e,t,r,n){var i,o=an(e,t),l=e.display.view;if(!Ct||r==e.doc.first+e.doc.size)return{index:o,lineN:r};for(var s=e.display.viewFrom,a=0;a0){if(o==l.length-1)return null;i=s+l[o].size-t,o++}else i=s-t;t+=i,r+=i}for(;Rt(e.doc,r)!=r;){if(o==(n<0?0:l.length-1))return null;r+=n*l[o-(n<0?1:0)].size,o+=n}return{index:o,lineN:r}}function dn(e){for(var t=e.display.view,r=0,n=0;n=e.display.viewTo||s.to().linet||t==r&&l.to==t)&&(n(Math.max(l.from,t),Math.min(l.to,r),1==l.level?"rtl":"ltr",o),i=!0)}i||n(t,r,"ltr")}(g,r||0,null==n?f:n,function(e,t,i,h){var v="ltr"==i,m=d(e,v?"left":"right"),y=d(t-1,v?"right":"left"),b=null==r&&0==e,w=null==n&&t==f,x=0==h,C=!g||h==g.length-1;if(y.top-m.top<=3){var S=(u?w:b)&&C,L=(u?b:w)&&x?s:(v?m:y).left,k=S?a:(v?y:m).right;c(L,m.top,k-L,m.bottom)}else{var T,M,N,O;v?(T=u&&b&&x?s:m.left,M=u?a:p(e,i,"before"),N=u?s:p(t,i,"after"),O=u&&w&&C?a:y.right):(T=u?p(e,i,"before"):s,M=!u&&b&&x?a:m.right,N=!u&&w&&C?s:y.left,O=u?p(t,i,"after"):a),c(T,m.top,M-T,m.bottom),m.bottom0?t.blinker=setInterval(function(){return t.cursorDiv.style.visibility=(r=!r)?"":"hidden"},e.options.cursorBlinkRate):e.options.cursorBlinkRate<0&&(t.cursorDiv.style.visibility="hidden")}}function wn(e){e.state.focused||(e.display.input.focus(),Cn(e))}function xn(e){e.state.delayingBlurEvent=!0,setTimeout(function(){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1,Sn(e))},100)}function Cn(e,t){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1),"nocursor"!=e.options.readOnly&&(e.state.focused||(ge(e,"focus",e,t),e.state.focused=!0,H(e.display.wrapper,"CodeMirror-focused"),e.curOp||e.display.selForContextMenu==e.doc.sel||(e.display.input.reset(),a&&setTimeout(function(){return e.display.input.reset(!0)},20)),e.display.input.receivedFocus()),bn(e))}function Sn(e,t){e.state.delayingBlurEvent||(e.state.focused&&(ge(e,"blur",e,t),e.state.focused=!1,T(e.display.wrapper,"CodeMirror-focused")),clearInterval(e.display.blinker),setTimeout(function(){e.state.focused||(e.display.shift=!1)},150))}function Ln(e){for(var t=e.display,r=t.lineDiv.offsetTop,n=0;n.005||f<-.005)&&($e(i.line,a),kn(i.line),i.rest))for(var d=0;de.display.sizerWidth){var p=Math.ceil(u/tn(e.display));p>e.display.maxLineLength&&(e.display.maxLineLength=p,e.display.maxLine=i.line,e.display.maxLineChanged=!0)}}}}function kn(e){if(e.widgets)for(var t=0;t=l&&(o=Ze(t,Vt(Xe(t,a))-e.wrapper.clientHeight),l=a)}return{from:o,to:Math.max(l,o+1)}}function Mn(e,t){var r=e.display,n=en(e.display);t.top<0&&(t.top=0);var i=e.curOp&&null!=e.curOp.scrollTop?e.curOp.scrollTop:r.scroller.scrollTop,o=Mr(e),l={};t.bottom-t.top>o&&(t.bottom=t.top+o);var s=e.doc.height+Sr(r),a=t.tops-n;if(t.topi+o){var c=Math.min(t.top,(u?s:t.bottom)-o);c!=i&&(l.scrollTop=c)}var h=e.curOp&&null!=e.curOp.scrollLeft?e.curOp.scrollLeft:r.scroller.scrollLeft,f=Tr(e)-(e.options.fixedGutter?r.gutters.offsetWidth:0),d=t.right-t.left>f;return d&&(t.right=t.left+f),t.left<10?l.scrollLeft=0:t.leftf+h-3&&(l.scrollLeft=t.right+(d?0:10)-f),l}function Nn(e,t){null!=t&&(Dn(e),e.curOp.scrollTop=(null==e.curOp.scrollTop?e.doc.scrollTop:e.curOp.scrollTop)+t)}function On(e){Dn(e);var t=e.getCursor();e.curOp.scrollToPos={from:t,to:t,margin:e.options.cursorScrollMargin}}function An(e,t,r){null==t&&null==r||Dn(e),null!=t&&(e.curOp.scrollLeft=t),null!=r&&(e.curOp.scrollTop=r)}function Dn(e){var t=e.curOp.scrollToPos;t&&(e.curOp.scrollToPos=null,Wn(e,Yr(e,t.from),Yr(e,t.to),t.margin))}function Wn(e,t,r,n){var i=Mn(e,{left:Math.min(t.left,r.left),top:Math.min(t.top,r.top)-n,right:Math.max(t.right,r.right),bottom:Math.max(t.bottom,r.bottom)+n});An(e,i.scrollLeft,i.scrollTop)}function Hn(e,t){Math.abs(e.doc.scrollTop-t)<2||(r||oi(e,{top:t}),Fn(e,t,!0),r&&oi(e),ei(e,100))}function Fn(e,t,r){t=Math.min(e.display.scroller.scrollHeight-e.display.scroller.clientHeight,t),(e.display.scroller.scrollTop!=t||r)&&(e.doc.scrollTop=t,e.display.scrollbars.setScrollTop(t),e.display.scroller.scrollTop!=t&&(e.display.scroller.scrollTop=t))}function Pn(e,t,r,n){t=Math.min(t,e.display.scroller.scrollWidth-e.display.scroller.clientWidth),(r?t==e.doc.scrollLeft:Math.abs(e.doc.scrollLeft-t)<2)&&!n||(e.doc.scrollLeft=t,ai(e),e.display.scroller.scrollLeft!=t&&(e.display.scroller.scrollLeft=t),e.display.scrollbars.setScrollLeft(t))}function En(e){var t=e.display,r=t.gutters.offsetWidth,n=Math.round(e.doc.height+Sr(e.display));return{clientHeight:t.scroller.clientHeight,viewHeight:t.wrapper.clientHeight,scrollWidth:t.scroller.scrollWidth,clientWidth:t.scroller.clientWidth,viewWidth:t.wrapper.clientWidth,barLeft:e.options.fixedGutter?r:0,docHeight:n,scrollHeight:n+kr(e)+t.barHeight,nativeBarWidth:t.nativeBarWidth,gutterWidth:r}}var In=function(e,t,r){this.cm=r;var n=this.vert=O("div",[O("div",null,null,"min-width: 1px")],"CodeMirror-vscrollbar"),i=this.horiz=O("div",[O("div",null,null,"height: 100%; min-height: 1px")],"CodeMirror-hscrollbar");n.tabIndex=i.tabIndex=-1,e(n),e(i),fe(n,"scroll",function(){n.clientHeight&&t(n.scrollTop,"vertical")}),fe(i,"scroll",function(){i.clientWidth&&t(i.scrollLeft,"horizontal")}),this.checkedZeroWidth=!1,l&&s<8&&(this.horiz.style.minHeight=this.vert.style.minWidth="18px")};In.prototype.update=function(e){var t=e.scrollWidth>e.clientWidth+1,r=e.scrollHeight>e.clientHeight+1,n=e.nativeBarWidth;if(r){this.vert.style.display="block",this.vert.style.bottom=t?n+"px":"0";var i=e.viewHeight-(t?n:0);this.vert.firstChild.style.height=Math.max(0,e.scrollHeight-e.clientHeight+i)+"px"}else this.vert.style.display="",this.vert.firstChild.style.height="0";if(t){this.horiz.style.display="block",this.horiz.style.right=r?n+"px":"0",this.horiz.style.left=e.barLeft+"px";var o=e.viewWidth-e.barLeft-(r?n:0);this.horiz.firstChild.style.width=Math.max(0,e.scrollWidth-e.clientWidth+o)+"px"}else this.horiz.style.display="",this.horiz.firstChild.style.width="0";return!this.checkedZeroWidth&&e.clientHeight>0&&(0==n&&this.zeroWidthHack(),this.checkedZeroWidth=!0),{right:r?n:0,bottom:t?n:0}},In.prototype.setScrollLeft=function(e){this.horiz.scrollLeft!=e&&(this.horiz.scrollLeft=e),this.disableHoriz&&this.enableZeroWidthBar(this.horiz,this.disableHoriz,"horiz")},In.prototype.setScrollTop=function(e){this.vert.scrollTop!=e&&(this.vert.scrollTop=e),this.disableVert&&this.enableZeroWidthBar(this.vert,this.disableVert,"vert")},In.prototype.zeroWidthHack=function(){var e=y&&!d?"12px":"18px";this.horiz.style.height=this.vert.style.width=e,this.horiz.style.pointerEvents=this.vert.style.pointerEvents="none",this.disableHoriz=new R,this.disableVert=new R},In.prototype.enableZeroWidthBar=function(e,t,r){e.style.pointerEvents="auto",t.set(1e3,function n(){var i=e.getBoundingClientRect();("vert"==r?document.elementFromPoint(i.right-1,(i.top+i.bottom)/2):document.elementFromPoint((i.right+i.left)/2,i.bottom-1))!=e?e.style.pointerEvents="none":t.set(1e3,n)})},In.prototype.clear=function(){var e=this.horiz.parentNode;e.removeChild(this.horiz),e.removeChild(this.vert)};var zn=function(){};function Rn(e,t){t||(t=En(e));var r=e.display.barWidth,n=e.display.barHeight;Bn(e,t);for(var i=0;i<4&&r!=e.display.barWidth||n!=e.display.barHeight;i++)r!=e.display.barWidth&&e.options.lineWrapping&&Ln(e),Bn(e,En(e)),r=e.display.barWidth,n=e.display.barHeight}function Bn(e,t){var r=e.display,n=r.scrollbars.update(t);r.sizer.style.paddingRight=(r.barWidth=n.right)+"px",r.sizer.style.paddingBottom=(r.barHeight=n.bottom)+"px",r.heightForcer.style.borderBottom=n.bottom+"px solid transparent",n.right&&n.bottom?(r.scrollbarFiller.style.display="block",r.scrollbarFiller.style.height=n.bottom+"px",r.scrollbarFiller.style.width=n.right+"px"):r.scrollbarFiller.style.display="",n.bottom&&e.options.coverGutterNextToScrollbar&&e.options.fixedGutter?(r.gutterFiller.style.display="block",r.gutterFiller.style.height=n.bottom+"px",r.gutterFiller.style.width=t.gutterWidth+"px"):r.gutterFiller.style.display=""}zn.prototype.update=function(){return{bottom:0,right:0}},zn.prototype.setScrollLeft=function(){},zn.prototype.setScrollTop=function(){},zn.prototype.clear=function(){};var Gn={native:In,null:zn};function Un(e){e.display.scrollbars&&(e.display.scrollbars.clear(),e.display.scrollbars.addClass&&T(e.display.wrapper,e.display.scrollbars.addClass)),e.display.scrollbars=new Gn[e.options.scrollbarStyle](function(t){e.display.wrapper.insertBefore(t,e.display.scrollbarFiller),fe(t,"mousedown",function(){e.state.focused&&setTimeout(function(){return e.display.input.focus()},0)}),t.setAttribute("cm-not-content","true")},function(t,r){"horizontal"==r?Pn(e,t):Hn(e,t)},e),e.display.scrollbars.addClass&&H(e.display.wrapper,e.display.scrollbars.addClass)}var Vn=0;function Kn(e){var t;e.curOp={cm:e,viewChanged:!1,startHeight:e.doc.height,forceUpdate:!1,updateInput:0,typing:!1,changeObjs:null,cursorActivityHandlers:null,cursorActivityCalled:0,selectionChanged:!1,updateMaxLine:!1,scrollLeft:null,scrollTop:null,scrollToPos:null,focus:!1,id:++Vn},t=e.curOp,or?or.ops.push(t):t.ownsGroup=or={ops:[t],delayedCallbacks:[]}}function jn(e){var t=e.curOp;t&&function(e,t){var r=e.ownsGroup;if(r)try{!function(e){var t=e.delayedCallbacks,r=0;do{for(;r=r.viewTo)||r.maxLineChanged&&t.options.lineWrapping,e.update=e.mustUpdate&&new ri(t,e.mustUpdate&&{top:e.scrollTop,ensure:e.scrollToPos},e.forceUpdate)}function Yn(e){var t=e.cm,r=t.display;e.updatedDisplay&&Ln(t),e.barMeasure=En(t),r.maxLineChanged&&!t.options.lineWrapping&&(e.adjustWidthTo=Or(t,r.maxLine,r.maxLine.text.length).left+3,t.display.sizerWidth=e.adjustWidthTo,e.barMeasure.scrollWidth=Math.max(r.scroller.clientWidth,r.sizer.offsetLeft+e.adjustWidthTo+kr(t)+t.display.barWidth),e.maxScrollLeft=Math.max(0,r.sizer.offsetLeft+e.adjustWidthTo-Tr(t))),(e.updatedDisplay||e.selectionChanged)&&(e.preparedSelection=r.input.prepareSelection())}function _n(e){var t=e.cm;null!=e.adjustWidthTo&&(t.display.sizer.style.minWidth=e.adjustWidthTo+"px",e.maxScrollLeft(window.innerHeight||document.documentElement.clientHeight)&&(i=!1),null!=i&&!p){var o=O("div","​",null,"position: absolute;\n top: "+(t.top-r.viewOffset-Cr(e.display))+"px;\n height: "+(t.bottom-t.top+kr(e)+r.barHeight)+"px;\n left: "+t.left+"px; width: "+Math.max(2,t.right-t.left)+"px;");e.display.lineSpace.appendChild(o),o.scrollIntoView(i),e.display.lineSpace.removeChild(o)}}}(t,function(e,t,r,n){var i;null==n&&(n=0),e.options.lineWrapping||t!=r||(r="before"==(t=t.ch?et(t.line,"before"==t.sticky?t.ch-1:t.ch,"after"):t).sticky?et(t.line,t.ch+1,"before"):t);for(var o=0;o<5;o++){var l=!1,s=Xr(e,t),a=r&&r!=t?Xr(e,r):s,u=Mn(e,i={left:Math.min(s.left,a.left),top:Math.min(s.top,a.top)-n,right:Math.max(s.left,a.left),bottom:Math.max(s.bottom,a.bottom)+n}),c=e.doc.scrollTop,h=e.doc.scrollLeft;if(null!=u.scrollTop&&(Hn(e,u.scrollTop),Math.abs(e.doc.scrollTop-c)>1&&(l=!0)),null!=u.scrollLeft&&(Pn(e,u.scrollLeft),Math.abs(e.doc.scrollLeft-h)>1&&(l=!0)),!l)break}return i}(t,st(n,e.scrollToPos.from),st(n,e.scrollToPos.to),e.scrollToPos.margin));var i=e.maybeHiddenMarkers,o=e.maybeUnhiddenMarkers;if(i)for(var l=0;l=e.display.viewTo)){var r=+new Date+e.options.workTime,n=dt(e,t.highlightFrontier),i=[];t.iter(n.line,Math.min(t.first+t.size,e.display.viewTo+500),function(o){if(n.line>=e.display.viewFrom){var l=o.styles,s=o.text.length>e.options.maxHighlightLength?Ue(t.mode,n.state):null,a=ht(e,o,n,!0);s&&(n.state=s),o.styles=a.styles;var u=o.styleClasses,c=a.classes;c?o.styleClasses=c:u&&(o.styleClasses=null);for(var h=!l||l.length!=o.styles.length||u!=c&&(!u||!c||u.bgClass!=c.bgClass||u.textClass!=c.textClass),f=0;!h&&fr)return ei(e,e.options.workDelay),!0}),t.highlightFrontier=n.line,t.modeFrontier=Math.max(t.modeFrontier,n.line),i.length&&qn(e,function(){for(var t=0;t=r.viewFrom&&t.visible.to<=r.viewTo&&(null==r.updateLineNumbers||r.updateLineNumbers>=r.viewTo)&&r.renderedView==r.view&&0==dn(e))return!1;ui(e)&&(hn(e),t.dims=rn(e));var i=n.first+n.size,o=Math.max(t.visible.from-e.options.viewportMargin,n.first),l=Math.min(i,t.visible.to+e.options.viewportMargin);r.viewFroml&&r.viewTo-l<20&&(l=Math.min(i,r.viewTo)),Ct&&(o=Rt(e.doc,o),l=Bt(e.doc,l));var s=o!=r.viewFrom||l!=r.viewTo||r.lastWrapHeight!=t.wrapperHeight||r.lastWrapWidth!=t.wrapperWidth;!function(e,t,r){var n=e.display;0==n.view.length||t>=n.viewTo||r<=n.viewFrom?(n.view=ir(e,t,r),n.viewFrom=t):(n.viewFrom>t?n.view=ir(e,t,n.viewFrom).concat(n.view):n.viewFromr&&(n.view=n.view.slice(0,an(e,r)))),n.viewTo=r}(e,o,l),r.viewOffset=Vt(Xe(e.doc,r.viewFrom)),e.display.mover.style.top=r.viewOffset+"px";var u=dn(e);if(!s&&0==u&&!t.force&&r.renderedView==r.view&&(null==r.updateLineNumbers||r.updateLineNumbers>=r.viewTo))return!1;var c=function(e){if(e.hasFocus())return null;var t=W();if(!t||!D(e.display.lineDiv,t))return null;var r={activeElt:t};if(window.getSelection){var n=window.getSelection();n.anchorNode&&n.extend&&D(e.display.lineDiv,n.anchorNode)&&(r.anchorNode=n.anchorNode,r.anchorOffset=n.anchorOffset,r.focusNode=n.focusNode,r.focusOffset=n.focusOffset)}return r}(e);return u>4&&(r.lineDiv.style.display="none"),function(e,t,r){var n=e.display,i=e.options.lineNumbers,o=n.lineDiv,l=o.firstChild;function s(t){var r=t.nextSibling;return a&&y&&e.display.currentWheelTarget==t?t.style.display="none":t.parentNode.removeChild(t),r}for(var u=n.view,c=n.viewFrom,h=0;h-1&&(d=!1),ur(e,f,c,r)),d&&(M(f.lineNumber),f.lineNumber.appendChild(document.createTextNode(Je(e.options,c)))),l=f.node.nextSibling}else{var p=vr(e,f,c,r);o.insertBefore(p,l)}c+=f.size}for(;l;)l=s(l)}(e,r.updateLineNumbers,t.dims),u>4&&(r.lineDiv.style.display=""),r.renderedView=r.view,function(e){if(e&&e.activeElt&&e.activeElt!=W()&&(e.activeElt.focus(),e.anchorNode&&D(document.body,e.anchorNode)&&D(document.body,e.focusNode))){var t=window.getSelection(),r=document.createRange();r.setEnd(e.anchorNode,e.anchorOffset),r.collapse(!1),t.removeAllRanges(),t.addRange(r),t.extend(e.focusNode,e.focusOffset)}}(c),M(r.cursorDiv),M(r.selectionDiv),r.gutters.style.height=r.sizer.style.minHeight=0,s&&(r.lastWrapHeight=t.wrapperHeight,r.lastWrapWidth=t.wrapperWidth,ei(e,400)),r.updateLineNumbers=null,!0}function ii(e,t){for(var r=t.viewport,n=!0;(n&&e.options.lineWrapping&&t.oldDisplayWidth!=Tr(e)||(r&&null!=r.top&&(r={top:Math.min(e.doc.height+Sr(e.display)-Mr(e),r.top)}),t.visible=Tn(e.display,e.doc,r),!(t.visible.from>=e.display.viewFrom&&t.visible.to<=e.display.viewTo)))&&ni(e,t);n=!1){Ln(e);var i=En(e);pn(e),Rn(e,i),si(e,i),t.force=!1}t.signal(e,"update",e),e.display.viewFrom==e.display.reportedViewFrom&&e.display.viewTo==e.display.reportedViewTo||(t.signal(e,"viewportChange",e,e.display.viewFrom,e.display.viewTo),e.display.reportedViewFrom=e.display.viewFrom,e.display.reportedViewTo=e.display.viewTo)}function oi(e,t){var r=new ri(e,t);if(ni(e,r)){Ln(e),ii(e,r);var n=En(e);pn(e),Rn(e,n),si(e,n),r.finish()}}function li(e){var t=e.gutters.offsetWidth;e.sizer.style.marginLeft=t+"px"}function si(e,t){e.display.sizer.style.minHeight=t.docHeight+"px",e.display.heightForcer.style.top=t.docHeight+"px",e.display.gutters.style.height=t.docHeight+e.display.barHeight+kr(e)+"px"}function ai(e){var t=e.display,r=t.view;if(t.alignWidgets||t.gutters.firstChild&&e.options.fixedGutter){for(var n=nn(t)-t.scroller.scrollLeft+e.doc.scrollLeft,i=t.gutters.offsetWidth,o=n+"px",l=0;ls.clientWidth,c=s.scrollHeight>s.clientHeight;if(i&&u||o&&c){if(o&&y&&a)e:for(var f=t.target,d=l.view;f!=s;f=f.parentNode)for(var p=0;p=0&&tt(e,n.to())<=0)return r}return-1};var bi=function(e,t){this.anchor=e,this.head=t};function wi(e,t,r){var n=e&&e.options.selectionsMayTouch,i=t[r];t.sort(function(e,t){return tt(e.from(),t.from())}),r=B(t,i);for(var o=1;o0:a>=0){var u=ot(s.from(),l.from()),c=it(s.to(),l.to()),h=s.empty()?l.from()==l.head:s.from()==s.head;o<=r&&--r,t.splice(--o,2,new bi(h?c:u,h?u:c))}}return new yi(t,r)}function xi(e,t){return new yi([new bi(e,t||e)],0)}function Ci(e){return e.text?et(e.from.line+e.text.length-1,$(e.text).length+(1==e.text.length?e.from.ch:0)):e.to}function Si(e,t){if(tt(e,t.from)<0)return e;if(tt(e,t.to)<=0)return Ci(t);var r=e.line+t.text.length-(t.to.line-t.from.line)-1,n=e.ch;return e.line==t.to.line&&(n+=Ci(t).ch-t.to.ch),et(r,n)}function Li(e,t){for(var r=[],n=0;n1&&e.remove(s.line+1,p-1),e.insert(s.line+1,m)}sr(e,"change",e,t)}function Ai(e,t,r){!function e(n,i,o){if(n.linked)for(var l=0;ls-(e.cm?e.cm.options.historyEventDelay:500)||"*"==t.origin.charAt(0)))&&(o=function(e,t){return t?(Pi(e.done),$(e.done)):e.done.length&&!$(e.done).ranges?$(e.done):e.done.length>1&&!e.done[e.done.length-2].ranges?(e.done.pop(),$(e.done)):void 0}(i,i.lastOp==n)))l=$(o.changes),0==tt(t.from,t.to)&&0==tt(t.from,l.to)?l.to=Ci(t):o.changes.push(Fi(e,t));else{var a=$(i.done);for(a&&a.ranges||zi(e.sel,i.done),o={changes:[Fi(e,t)],generation:i.generation},i.done.push(o);i.done.length>i.undoDepth;)i.done.shift(),i.done[0].ranges||i.done.shift()}i.done.push(r),i.generation=++i.maxGeneration,i.lastModTime=i.lastSelTime=s,i.lastOp=i.lastSelOp=n,i.lastOrigin=i.lastSelOrigin=t.origin,l||ge(e,"historyAdded")}function Ii(e,t,r,n){var i=e.history,o=n&&n.origin;r==i.lastSelOp||o&&i.lastSelOrigin==o&&(i.lastModTime==i.lastSelTime&&i.lastOrigin==o||function(e,t,r,n){var i=t.charAt(0);return"*"==i||"+"==i&&r.ranges.length==n.ranges.length&&r.somethingSelected()==n.somethingSelected()&&new Date-e.history.lastSelTime<=(e.cm?e.cm.options.historyEventDelay:500)}(e,o,$(i.done),t))?i.done[i.done.length-1]=t:zi(t,i.done),i.lastSelTime=+new Date,i.lastSelOrigin=o,i.lastSelOp=r,n&&!1!==n.clearRedo&&Pi(i.undone)}function zi(e,t){var r=$(t);r&&r.ranges&&r.equals(e)||t.push(e)}function Ri(e,t,r,n){var i=t["spans_"+e.id],o=0;e.iter(Math.max(e.first,r),Math.min(e.first+e.size,n),function(r){r.markedSpans&&((i||(i=t["spans_"+e.id]={}))[o]=r.markedSpans),++o})}function Bi(e){if(!e)return null;for(var t,r=0;r-1&&($(s)[h]=u[h],delete u[h])}}}return n}function Vi(e,t,r,n){if(n){var i=e.anchor;if(r){var o=tt(t,i)<0;o!=tt(r,i)<0?(i=t,t=r):o!=tt(t,r)<0&&(t=r)}return new bi(i,t)}return new bi(r||t,t)}function Ki(e,t,r,n,i){null==i&&(i=e.cm&&(e.cm.display.shift||e.extend)),$i(e,new yi([Vi(e.sel.primary(),t,r,i)],0),n)}function ji(e,t,r){for(var n=[],i=e.cm&&(e.cm.display.shift||e.extend),o=0;o=t.ch:s.to>t.ch))){if(i&&(ge(a,"beforeCursorEnter"),a.explicitlyCleared)){if(o.markedSpans){--l;continue}break}if(!a.atomic)continue;if(r){var h=a.find(n<0?1:-1),f=void 0;if((n<0?c:u)&&(h=ro(e,h,-n,h&&h.line==t.line?o:null)),h&&h.line==t.line&&(f=tt(h,r))&&(n<0?f<0:f>0))return eo(e,h,t,n,i)}var d=a.find(n<0?-1:1);return(n<0?u:c)&&(d=ro(e,d,n,d.line==t.line?o:null)),d?eo(e,d,t,n,i):null}}return t}function to(e,t,r,n,i){var o=n||1,l=eo(e,t,r,o,i)||!i&&eo(e,t,r,o,!0)||eo(e,t,r,-o,i)||!i&&eo(e,t,r,-o,!0);return l||(e.cantEdit=!0,et(e.first,0))}function ro(e,t,r,n){return r<0&&0==t.ch?t.line>e.first?st(e,et(t.line-1)):null:r>0&&t.ch==(n||Xe(e,t.line)).text.length?t.line0)){var c=[a,1],h=tt(u.from,s.from),f=tt(u.to,s.to);(h<0||!l.inclusiveLeft&&!h)&&c.push({from:u.from,to:s.from}),(f>0||!l.inclusiveRight&&!f)&&c.push({from:s.to,to:u.to}),i.splice.apply(i,c),a+=c.length-3}}return i}(e,t.from,t.to);if(n)for(var i=n.length-1;i>=0;--i)lo(e,{from:n[i].from,to:n[i].to,text:i?[""]:t.text,origin:t.origin});else lo(e,t)}}function lo(e,t){if(1!=t.text.length||""!=t.text[0]||0!=tt(t.from,t.to)){var r=Li(e,t);Ei(e,t,r,e.cm?e.cm.curOp.id:NaN),uo(e,t,r,Tt(e,t));var n=[];Ai(e,function(e,r){r||-1!=B(n,e.history)||(po(e.history,t),n.push(e.history)),uo(e,t,null,Tt(e,t))})}}function so(e,t,r){var n=e.cm&&e.cm.state.suppressEdits;if(!n||r){for(var i,o=e.history,l=e.sel,s="undo"==t?o.done:o.undone,a="undo"==t?o.undone:o.done,u=0;u=0;--d){var p=f(d);if(p)return p.v}}}}function ao(e,t){if(0!=t&&(e.first+=t,e.sel=new yi(q(e.sel.ranges,function(e){return new bi(et(e.anchor.line+t,e.anchor.ch),et(e.head.line+t,e.head.ch))}),e.sel.primIndex),e.cm)){un(e.cm,e.first,e.first-t,t);for(var r=e.cm.display,n=r.viewFrom;ne.lastLine())){if(t.from.lineo&&(t={from:t.from,to:et(o,Xe(e,o).text.length),text:[t.text[0]],origin:t.origin}),t.removed=Ye(e,t.from,t.to),r||(r=Li(e,t)),e.cm?function(e,t,r){var n=e.doc,i=e.display,o=t.from,l=t.to,s=!1,a=o.line;e.options.lineWrapping||(a=qe(zt(Xe(n,o.line))),n.iter(a,l.line+1,function(e){if(e==i.maxLine)return s=!0,!0}));n.sel.contains(t.from,t.to)>-1&&me(e);Oi(n,t,r,on(e)),e.options.lineWrapping||(n.iter(a,o.line+t.text.length,function(e){var t=Kt(e);t>i.maxLineLength&&(i.maxLine=e,i.maxLineLength=t,i.maxLineChanged=!0,s=!1)}),s&&(e.curOp.updateMaxLine=!0));(function(e,t){if(e.modeFrontier=Math.min(e.modeFrontier,t),!(e.highlightFrontierr;n--){var i=Xe(e,n).stateAfter;if(i&&(!(i instanceof ut)||n+i.lookAhead1||!(this.children[0]instanceof vo))){var s=[];this.collapse(s),this.children=[new vo(s)],this.children[0].parent=this}},collapse:function(e){for(var t=0;t50){for(var l=i.lines.length%25+25,s=l;s10);e.parent.maybeSpill()}},iterN:function(e,t,r){for(var n=0;n0||0==l&&!1!==o.clearWhenEmpty)return o;if(o.replacedWith&&(o.collapsed=!0,o.widgetNode=A("span",[o.replacedWith],"CodeMirror-widget"),n.handleMouseEvents||o.widgetNode.setAttribute("cm-ignore-events","true"),n.insertLeft&&(o.widgetNode.insertLeft=!0)),o.collapsed){if(It(e,t.line,t,r,o)||t.line!=r.line&&It(e,r.line,t,r,o))throw new Error("Inserting collapsed marker partially overlapping an existing one");Ct=!0}o.addToHistory&&Ei(e,{from:t,to:r,origin:"markText"},e.sel,NaN);var s,a=t.line,u=e.cm;if(e.iter(a,r.line+1,function(e){u&&o.collapsed&&!u.options.lineWrapping&&zt(e)==u.display.maxLine&&(s=!0),o.collapsed&&a!=t.line&&$e(e,0),function(e,t){e.markedSpans=e.markedSpans?e.markedSpans.concat([t]):[t],t.marker.attachLine(e)}(e,new St(o,a==t.line?t.ch:null,a==r.line?r.ch:null)),++a}),o.collapsed&&e.iter(t.line,r.line+1,function(t){Gt(e,t)&&$e(t,0)}),o.clearOnEnter&&fe(o,"beforeCursorEnter",function(){return o.clear()}),o.readOnly&&(xt=!0,(e.history.done.length||e.history.undone.length)&&e.clearHistory()),o.collapsed&&(o.id=++wo,o.atomic=!0),u){if(s&&(u.curOp.updateMaxLine=!0),o.collapsed)un(u,t.line,r.line+1);else if(o.className||o.startStyle||o.endStyle||o.css||o.attributes||o.title)for(var c=t.line;c<=r.line;c++)cn(u,c,"text");o.atomic&&Qi(u.doc),sr(u,"markerAdded",u,o)}return o}xo.prototype.clear=function(){if(!this.explicitlyCleared){var e=this.doc.cm,t=e&&!e.curOp;if(t&&Kn(e),ye(this,"clear")){var r=this.find();r&&sr(this,"clear",r.from,r.to)}for(var n=null,i=null,o=0;oe.display.maxLineLength&&(e.display.maxLine=u,e.display.maxLineLength=c,e.display.maxLineChanged=!0)}null!=n&&e&&this.collapsed&&un(e,n,i+1),this.lines.length=0,this.explicitlyCleared=!0,this.atomic&&this.doc.cantEdit&&(this.doc.cantEdit=!1,e&&Qi(e.doc)),e&&sr(e,"markerCleared",e,this,n,i),t&&jn(e),this.parent&&this.parent.clear()}},xo.prototype.find=function(e,t){var r,n;null==e&&"bookmark"==this.type&&(e=1);for(var i=0;i=0;a--)oo(this,n[a]);s?_i(this,s):this.cm&&On(this.cm)}),undo:Jn(function(){so(this,"undo")}),redo:Jn(function(){so(this,"redo")}),undoSelection:Jn(function(){so(this,"undo",!0)}),redoSelection:Jn(function(){so(this,"redo",!0)}),setExtending:function(e){this.extend=e},getExtending:function(){return this.extend},historySize:function(){for(var e=this.history,t=0,r=0,n=0;n=e.ch)&&t.push(i.marker.parent||i.marker)}return t},findMarks:function(e,t,r){e=st(this,e),t=st(this,t);var n=[],i=e.line;return this.iter(e.line,t.line+1,function(o){var l=o.markedSpans;if(l)for(var s=0;s=a.to||null==a.from&&i!=e.line||null!=a.from&&i==t.line&&a.from>=t.ch||r&&!r(a.marker)||n.push(a.marker.parent||a.marker)}++i}),n},getAllMarks:function(){var e=[];return this.iter(function(t){var r=t.markedSpans;if(r)for(var n=0;ne)return t=e,!0;e-=o,++r}),st(this,et(r,t))},indexFromPos:function(e){var t=(e=st(this,e)).ch;if(e.linet&&(t=e.from),null!=e.to&&e.to-1)return t.state.draggingText(e),void setTimeout(function(){return t.display.input.focus()},20);try{var c=e.dataTransfer.getData("Text");if(c){var h;if(t.state.draggingText&&!t.state.draggingText.copy&&(h=t.listSelections()),qi(t.doc,xi(r,r)),h)for(var f=0;f=0;t--)co(e.doc,"",n[t].from,n[t].to,"+delete");On(e)})}function _o(e,t,r){var n=oe(e.text,t+r,r);return n<0||n>e.text.length?null:n}function $o(e,t,r){var n=_o(e,t.ch,r);return null==n?null:new et(t.line,n,r<0?"after":"before")}function qo(e,t,r,n,i){if(e){var o=ce(r,t.doc.direction);if(o){var l,s=i<0?$(o):o[0],a=i<0==(1==s.level)?"after":"before";if(s.level>0||"rtl"==t.doc.direction){var u=Dr(t,r);l=i<0?r.text.length-1:0;var c=Wr(t,u,l).top;l=le(function(e){return Wr(t,u,e).top==c},i<0==(1==s.level)?s.from:s.to-1,l),"before"==a&&(l=_o(r,l,1))}else l=i<0?s.to:s.from;return new et(n,l,a)}}return new et(n,i<0?r.text.length:0,i<0?"before":"after")}Ro.basic={Left:"goCharLeft",Right:"goCharRight",Up:"goLineUp",Down:"goLineDown",End:"goLineEnd",Home:"goLineStartSmart",PageUp:"goPageUp",PageDown:"goPageDown",Delete:"delCharAfter",Backspace:"delCharBefore","Shift-Backspace":"delCharBefore",Tab:"defaultTab","Shift-Tab":"indentAuto",Enter:"newlineAndIndent",Insert:"toggleOverwrite",Esc:"singleSelection"},Ro.pcDefault={"Ctrl-A":"selectAll","Ctrl-D":"deleteLine","Ctrl-Z":"undo","Shift-Ctrl-Z":"redo","Ctrl-Y":"redo","Ctrl-Home":"goDocStart","Ctrl-End":"goDocEnd","Ctrl-Up":"goLineUp","Ctrl-Down":"goLineDown","Ctrl-Left":"goGroupLeft","Ctrl-Right":"goGroupRight","Alt-Left":"goLineStart","Alt-Right":"goLineEnd","Ctrl-Backspace":"delGroupBefore","Ctrl-Delete":"delGroupAfter","Ctrl-S":"save","Ctrl-F":"find","Ctrl-G":"findNext","Shift-Ctrl-G":"findPrev","Shift-Ctrl-F":"replace","Shift-Ctrl-R":"replaceAll","Ctrl-[":"indentLess","Ctrl-]":"indentMore","Ctrl-U":"undoSelection","Shift-Ctrl-U":"redoSelection","Alt-U":"redoSelection",fallthrough:"basic"},Ro.emacsy={"Ctrl-F":"goCharRight","Ctrl-B":"goCharLeft","Ctrl-P":"goLineUp","Ctrl-N":"goLineDown","Alt-F":"goWordRight","Alt-B":"goWordLeft","Ctrl-A":"goLineStart","Ctrl-E":"goLineEnd","Ctrl-V":"goPageDown","Shift-Ctrl-V":"goPageUp","Ctrl-D":"delCharAfter","Ctrl-H":"delCharBefore","Alt-D":"delWordAfter","Alt-Backspace":"delWordBefore","Ctrl-K":"killLine","Ctrl-T":"transposeChars","Ctrl-O":"openLine"},Ro.macDefault={"Cmd-A":"selectAll","Cmd-D":"deleteLine","Cmd-Z":"undo","Shift-Cmd-Z":"redo","Cmd-Y":"redo","Cmd-Home":"goDocStart","Cmd-Up":"goDocStart","Cmd-End":"goDocEnd","Cmd-Down":"goDocEnd","Alt-Left":"goGroupLeft","Alt-Right":"goGroupRight","Cmd-Left":"goLineLeft","Cmd-Right":"goLineRight","Alt-Backspace":"delGroupBefore","Ctrl-Alt-Backspace":"delGroupAfter","Alt-Delete":"delGroupAfter","Cmd-S":"save","Cmd-F":"find","Cmd-G":"findNext","Shift-Cmd-G":"findPrev","Cmd-Alt-F":"replace","Shift-Cmd-Alt-F":"replaceAll","Cmd-[":"indentLess","Cmd-]":"indentMore","Cmd-Backspace":"delWrappedLineLeft","Cmd-Delete":"delWrappedLineRight","Cmd-U":"undoSelection","Shift-Cmd-U":"redoSelection","Ctrl-Up":"goDocStart","Ctrl-Down":"goDocEnd",fallthrough:["basic","emacsy"]},Ro.default=y?Ro.macDefault:Ro.pcDefault;var Zo={selectAll:no,singleSelection:function(e){return e.setSelection(e.getCursor("anchor"),e.getCursor("head"),V)},killLine:function(e){return Yo(e,function(t){if(t.empty()){var r=Xe(e.doc,t.head.line).text.length;return t.head.ch==r&&t.head.line0)i=new et(i.line,i.ch+1),e.replaceRange(o.charAt(i.ch-1)+o.charAt(i.ch-2),et(i.line,i.ch-2),i,"+transpose");else if(i.line>e.doc.first){var l=Xe(e.doc,i.line-1).text;l&&(i=new et(i.line,1),e.replaceRange(o.charAt(0)+e.doc.lineSeparator()+l.charAt(l.length-1),et(i.line-1,l.length-1),i,"+transpose"))}r.push(new bi(i,i))}e.setSelections(r)})},newlineAndIndent:function(e){return qn(e,function(){for(var t=e.listSelections(),r=t.length-1;r>=0;r--)e.replaceRange(e.doc.lineSeparator(),t[r].anchor,t[r].head,"+input");t=e.listSelections();for(var n=0;n-1&&(tt((i=u.ranges[i]).from(),t)<0||t.xRel>0)&&(tt(i.to(),t)>0||t.xRel<0)?function(e,t,r,n){var i=e.display,o=!1,u=Zn(e,function(t){a&&(i.scroller.draggable=!1),e.state.draggingText=!1,pe(i.wrapper.ownerDocument,"mouseup",u),pe(i.wrapper.ownerDocument,"mousemove",c),pe(i.scroller,"dragstart",h),pe(i.scroller,"drop",u),o||(we(t),n.addNew||Ki(e.doc,r,null,null,n.extend),a||l&&9==s?setTimeout(function(){i.wrapper.ownerDocument.body.focus(),i.input.focus()},20):i.input.focus())}),c=function(e){o=o||Math.abs(t.clientX-e.clientX)+Math.abs(t.clientY-e.clientY)>=10},h=function(){return o=!0};a&&(i.scroller.draggable=!0);e.state.draggingText=u,u.copy=!n.moveOnDrag,i.scroller.dragDrop&&i.scroller.dragDrop();fe(i.wrapper.ownerDocument,"mouseup",u),fe(i.wrapper.ownerDocument,"mousemove",c),fe(i.scroller,"dragstart",h),fe(i.scroller,"drop",u),xn(e),setTimeout(function(){return i.input.focus()},20)}(e,n,t,o):function(e,t,r,n){var i=e.display,o=e.doc;we(t);var l,s,a=o.sel,u=a.ranges;n.addNew&&!n.extend?(s=o.sel.contains(r),l=s>-1?u[s]:new bi(r,r)):(l=o.sel.primary(),s=o.sel.primIndex);if("rectangle"==n.unit)n.addNew||(l=new bi(r,r)),r=sn(e,t,!0,!0),s=-1;else{var c=dl(e,r,n.unit);l=n.extend?Vi(l,c.anchor,c.head,n.extend):c}n.addNew?-1==s?(s=u.length,$i(o,wi(e,u.concat([l]),s),{scroll:!1,origin:"*mouse"})):u.length>1&&u[s].empty()&&"char"==n.unit&&!n.extend?($i(o,wi(e,u.slice(0,s).concat(u.slice(s+1)),0),{scroll:!1,origin:"*mouse"}),a=o.sel):Xi(o,s,l,K):(s=0,$i(o,new yi([l],0),K),a=o.sel);var h=r;function f(t){if(0!=tt(h,t))if(h=t,"rectangle"==n.unit){for(var i=[],u=e.options.tabSize,c=z(Xe(o,r.line).text,r.ch,u),f=z(Xe(o,t.line).text,t.ch,u),d=Math.min(c,f),p=Math.max(c,f),g=Math.min(r.line,t.line),v=Math.min(e.lastLine(),Math.max(r.line,t.line));g<=v;g++){var m=Xe(o,g).text,y=X(m,d,u);d==p?i.push(new bi(et(g,y),et(g,y))):m.length>y&&i.push(new bi(et(g,y),et(g,X(m,p,u))))}i.length||i.push(new bi(r,r)),$i(o,wi(e,a.ranges.slice(0,s).concat(i),s),{origin:"*mouse",scroll:!1}),e.scrollIntoView(t)}else{var b,w=l,x=dl(e,t,n.unit),C=w.anchor;tt(x.anchor,C)>0?(b=x.head,C=ot(w.from(),x.anchor)):(b=x.anchor,C=it(w.to(),x.head));var S=a.ranges.slice(0);S[s]=function(e,t){var r=t.anchor,n=t.head,i=Xe(e.doc,r.line);if(0==tt(r,n)&&r.sticky==n.sticky)return t;var o=ce(i);if(!o)return t;var l=ae(o,r.ch,r.sticky),s=o[l];if(s.from!=r.ch&&s.to!=r.ch)return t;var a,u=l+(s.from==r.ch==(1!=s.level)?0:1);if(0==u||u==o.length)return t;if(n.line!=r.line)a=(n.line-r.line)*("ltr"==e.doc.direction?1:-1)>0;else{var c=ae(o,n.ch,n.sticky),h=c-l||(n.ch-r.ch)*(1==s.level?-1:1);a=c==u-1||c==u?h<0:h>0}var f=o[u+(a?-1:0)],d=a==(1==f.level),p=d?f.from:f.to,g=d?"after":"before";return r.ch==p&&r.sticky==g?t:new bi(new et(r.line,p,g),n)}(e,new bi(st(o,C),b)),$i(o,wi(e,S,s),K)}}var d=i.wrapper.getBoundingClientRect(),p=0;function g(t){e.state.selectingText=!1,p=1/0,t&&(we(t),i.input.focus()),pe(i.wrapper.ownerDocument,"mousemove",v),pe(i.wrapper.ownerDocument,"mouseup",m),o.history.lastSelOrigin=null}var v=Zn(e,function(t){0!==t.buttons&&ke(t)?function t(r){var l=++p;var s=sn(e,r,!0,"rectangle"==n.unit);if(!s)return;if(0!=tt(s,h)){e.curOp.focus=W(),f(s);var a=Tn(i,o);(s.line>=a.to||s.lined.bottom?20:0;u&&setTimeout(Zn(e,function(){p==l&&(i.scroller.scrollTop+=u,t(r))}),50)}}(t):g(t)}),m=Zn(e,g);e.state.selectingText=m,fe(i.wrapper.ownerDocument,"mousemove",v),fe(i.wrapper.ownerDocument,"mouseup",m)}(e,n,t,o)}(t,n,o,e):Le(e)==r.scroller&&we(e):2==i?(n&&Ki(t.doc,n),setTimeout(function(){return r.input.focus()},20)):3==i&&(S?t.display.input.onContextMenu(e):xn(t)))}}function dl(e,t,r){if("char"==r)return new bi(t,t);if("word"==r)return e.findWordAt(t);if("line"==r)return new bi(et(t.line,0),st(e.doc,et(t.line+1,0)));var n=r(e,t);return new bi(n.from,n.to)}function pl(e,t,r,n){var i,o;if(t.touches)i=t.touches[0].clientX,o=t.touches[0].clientY;else try{i=t.clientX,o=t.clientY}catch(t){return!1}if(i>=Math.floor(e.display.gutters.getBoundingClientRect().right))return!1;n&&we(t);var l=e.display,s=l.lineDiv.getBoundingClientRect();if(o>s.bottom||!ye(e,r))return Ce(t);o-=s.top-l.viewOffset;for(var a=0;a=i)return ge(e,r,e,Ze(e.doc,o),e.display.gutterSpecs[a].className,t),Ce(t)}}function gl(e,t){return pl(e,t,"gutterClick",!0)}function vl(e,t){xr(e.display,t)||function(e,t){if(!ye(e,"gutterContextMenu"))return!1;return pl(e,t,"gutterContextMenu",!1)}(e,t)||ve(e,t,"contextmenu")||S||e.display.input.onContextMenu(t)}function ml(e){e.display.wrapper.className=e.display.wrapper.className.replace(/\s*cm-s-\S+/g,"")+e.options.theme.replace(/(^|\s)\s*/g," cm-s-"),Rr(e)}hl.prototype.compare=function(e,t,r){return this.time+400>e&&0==tt(t,this.pos)&&r==this.button};var yl={toString:function(){return"CodeMirror.Init"}},bl={},wl={};function xl(e,t,r){if(!t!=!(r&&r!=yl)){var n=e.display.dragFunctions,i=t?fe:pe;i(e.display.scroller,"dragstart",n.start),i(e.display.scroller,"dragenter",n.enter),i(e.display.scroller,"dragover",n.over),i(e.display.scroller,"dragleave",n.leave),i(e.display.scroller,"drop",n.drop)}}function Cl(e){e.options.lineWrapping?(H(e.display.wrapper,"CodeMirror-wrap"),e.display.sizer.style.minWidth="",e.display.sizerWidth=null):(T(e.display.wrapper,"CodeMirror-wrap"),jt(e)),ln(e),un(e),Rr(e),setTimeout(function(){return Rn(e)},100)}function Sl(e,t){var n=this;if(!(this instanceof Sl))return new Sl(e,t);this.options=t=t?I(t):{},I(bl,t,!1);var i=t.value;"string"==typeof i?i=new Mo(i,t.mode,null,t.lineSeparator,t.direction):t.mode&&(i.modeOption=t.mode),this.doc=i;var o=new Sl.inputStyles[t.inputStyle](this),u=this.display=new function(e,t,n,i){var o=this;this.input=n,o.scrollbarFiller=O("div",null,"CodeMirror-scrollbar-filler"),o.scrollbarFiller.setAttribute("cm-not-content","true"),o.gutterFiller=O("div",null,"CodeMirror-gutter-filler"),o.gutterFiller.setAttribute("cm-not-content","true"),o.lineDiv=A("div",null,"CodeMirror-code"),o.selectionDiv=O("div",null,null,"position: relative; z-index: 1"),o.cursorDiv=O("div",null,"CodeMirror-cursors"),o.measure=O("div",null,"CodeMirror-measure"),o.lineMeasure=O("div",null,"CodeMirror-measure"),o.lineSpace=A("div",[o.measure,o.lineMeasure,o.selectionDiv,o.cursorDiv,o.lineDiv],null,"position: relative; outline: none");var u=A("div",[o.lineSpace],"CodeMirror-lines");o.mover=O("div",[u],null,"position: relative"),o.sizer=O("div",[o.mover],"CodeMirror-sizer"),o.sizerWidth=null,o.heightForcer=O("div",null,null,"position: absolute; height: "+G+"px; width: 1px;"),o.gutters=O("div",null,"CodeMirror-gutters"),o.lineGutter=null,o.scroller=O("div",[o.sizer,o.heightForcer,o.gutters],"CodeMirror-scroll"),o.scroller.setAttribute("tabIndex","-1"),o.wrapper=O("div",[o.scrollbarFiller,o.gutterFiller,o.scroller],"CodeMirror"),l&&s<8&&(o.gutters.style.zIndex=-1,o.scroller.style.paddingRight=0),a||r&&m||(o.scroller.draggable=!0),e&&(e.appendChild?e.appendChild(o.wrapper):e(o.wrapper)),o.viewFrom=o.viewTo=t.first,o.reportedViewFrom=o.reportedViewTo=t.first,o.view=[],o.renderedView=null,o.externalMeasured=null,o.viewOffset=0,o.lastWrapHeight=o.lastWrapWidth=0,o.updateLineNumbers=null,o.nativeBarWidth=o.barHeight=o.barWidth=0,o.scrollbarsClipped=!1,o.lineNumWidth=o.lineNumInnerWidth=o.lineNumChars=null,o.alignWidgets=!1,o.cachedCharWidth=o.cachedTextHeight=o.cachedPaddingH=null,o.maxLine=null,o.maxLineLength=0,o.maxLineChanged=!1,o.wheelDX=o.wheelDY=o.wheelStartX=o.wheelStartY=null,o.shift=!1,o.selForContextMenu=null,o.activeTouch=null,o.gutterSpecs=ci(i.gutters,i.lineNumbers),hi(o),n.init(o)}(e,i,o,t);for(var c in u.wrapper.CodeMirror=this,ml(this),t.lineWrapping&&(this.display.wrapper.className+=" CodeMirror-wrap"),Un(this),this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:!1,delayingBlurEvent:!1,focused:!1,suppressEdits:!1,pasteIncoming:-1,cutIncoming:-1,selectingText:!1,draggingText:!1,highlight:new R,keySeq:null,specialChars:null},t.autofocus&&!m&&u.input.focus(),l&&s<11&&setTimeout(function(){return n.display.input.reset(!0)},20),function(e){var t=e.display;fe(t.scroller,"mousedown",Zn(e,fl)),fe(t.scroller,"dblclick",l&&s<11?Zn(e,function(t){if(!ve(e,t)){var r=sn(e,t);if(r&&!gl(e,t)&&!xr(e.display,t)){we(t);var n=e.findWordAt(r);Ki(e.doc,n.anchor,n.head)}}}):function(t){return ve(e,t)||we(t)});fe(t.scroller,"contextmenu",function(t){return vl(e,t)});var r,n={end:0};function i(){t.activeTouch&&(r=setTimeout(function(){return t.activeTouch=null},1e3),(n=t.activeTouch).end=+new Date)}function o(e,t){if(null==t.left)return!0;var r=t.left-e.left,n=t.top-e.top;return r*r+n*n>400}fe(t.scroller,"touchstart",function(i){if(!ve(e,i)&&!function(e){if(1!=e.touches.length)return!1;var t=e.touches[0];return t.radiusX<=1&&t.radiusY<=1}(i)&&!gl(e,i)){t.input.ensurePolled(),clearTimeout(r);var o=+new Date;t.activeTouch={start:o,moved:!1,prev:o-n.end<=300?n:null},1==i.touches.length&&(t.activeTouch.left=i.touches[0].pageX,t.activeTouch.top=i.touches[0].pageY)}}),fe(t.scroller,"touchmove",function(){t.activeTouch&&(t.activeTouch.moved=!0)}),fe(t.scroller,"touchend",function(r){var n=t.activeTouch;if(n&&!xr(t,r)&&null!=n.left&&!n.moved&&new Date-n.start<300){var l,s=e.coordsChar(t.activeTouch,"page");l=!n.prev||o(n,n.prev)?new bi(s,s):!n.prev.prev||o(n,n.prev.prev)?e.findWordAt(s):new bi(et(s.line,0),st(e.doc,et(s.line+1,0))),e.setSelection(l.anchor,l.head),e.focus(),we(r)}i()}),fe(t.scroller,"touchcancel",i),fe(t.scroller,"scroll",function(){t.scroller.clientHeight&&(Hn(e,t.scroller.scrollTop),Pn(e,t.scroller.scrollLeft,!0),ge(e,"scroll",e))}),fe(t.scroller,"mousewheel",function(t){return mi(e,t)}),fe(t.scroller,"DOMMouseScroll",function(t){return mi(e,t)}),fe(t.wrapper,"scroll",function(){return t.wrapper.scrollTop=t.wrapper.scrollLeft=0}),t.dragFunctions={enter:function(t){ve(e,t)||Se(t)},over:function(t){ve(e,t)||(!function(e,t){var r=sn(e,t);if(r){var n=document.createDocumentFragment();vn(e,r,n),e.display.dragCursor||(e.display.dragCursor=O("div",null,"CodeMirror-cursors CodeMirror-dragcursors"),e.display.lineSpace.insertBefore(e.display.dragCursor,e.display.cursorDiv)),N(e.display.dragCursor,n)}}(e,t),Se(t))},start:function(t){return function(e,t){if(l&&(!e.state.draggingText||+new Date-No<100))Se(t);else if(!ve(e,t)&&!xr(e.display,t)&&(t.dataTransfer.setData("Text",e.getSelection()),t.dataTransfer.effectAllowed="copyMove",t.dataTransfer.setDragImage&&!f)){var r=O("img",null,null,"position: fixed; left: 0; top: 0;");r.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",h&&(r.width=r.height=1,e.display.wrapper.appendChild(r),r._top=r.offsetTop),t.dataTransfer.setDragImage(r,0,0),h&&r.parentNode.removeChild(r)}}(e,t)},drop:Zn(e,Oo),leave:function(t){ve(e,t)||Ao(e)}};var a=t.input.getField();fe(a,"keyup",function(t){return sl.call(e,t)}),fe(a,"keydown",Zn(e,ll)),fe(a,"keypress",Zn(e,al)),fe(a,"focus",function(t){return Cn(e,t)}),fe(a,"blur",function(t){return Sn(e,t)})}(this),Ho(),Kn(this),this.curOp.forceUpdate=!0,Di(this,i),t.autofocus&&!m||this.hasFocus()?setTimeout(E(Cn,this),20):Sn(this),wl)wl.hasOwnProperty(c)&&wl[c](n,t[c],yl);ui(this),t.finishInit&&t.finishInit(this);for(var d=0;d150)){if(!n)return;r="prev"}}else u=0,r="not";"prev"==r?u=t>o.first?z(Xe(o,t-1).text,null,l):0:"add"==r?u=a+e.options.indentUnit:"subtract"==r?u=a-e.options.indentUnit:"number"==typeof r&&(u=a+r),u=Math.max(0,u);var h="",f=0;if(e.options.indentWithTabs)for(var d=Math.floor(u/l);d;--d)f+=l,h+="\t";if(fl,a=We(t),u=null;if(s&&n.ranges.length>1)if(Tl&&Tl.text.join("\n")==t){if(n.ranges.length%Tl.text.length==0){u=[];for(var c=0;c=0;f--){var d=n.ranges[f],p=d.from(),g=d.to();d.empty()&&(r&&r>0?p=et(p.line,p.ch-r):e.state.overwrite&&!s?g=et(g.line,Math.min(Xe(o,g.line).text.length,g.ch+$(a).length)):s&&Tl&&Tl.lineWise&&Tl.text.join("\n")==t&&(p=g=et(p.line,0)));var v={from:p,to:g,text:u?u[f%u.length]:a,origin:i||(s?"paste":e.state.cutIncoming>l?"cut":"+input")};oo(e.doc,v),sr(e,"inputRead",e,v)}t&&!s&&Al(e,t),On(e),e.curOp.updateInput<2&&(e.curOp.updateInput=h),e.curOp.typing=!0,e.state.pasteIncoming=e.state.cutIncoming=-1}function Ol(e,t){var r=e.clipboardData&&e.clipboardData.getData("Text");if(r)return e.preventDefault(),t.isReadOnly()||t.options.disableInput||qn(t,function(){return Nl(t,r,0,null,"paste")}),!0}function Al(e,t){if(e.options.electricChars&&e.options.smartIndent)for(var r=e.doc.sel,n=r.ranges.length-1;n>=0;n--){var i=r.ranges[n];if(!(i.head.ch>100||n&&r.ranges[n-1].head.line==i.head.line)){var o=e.getModeAt(i.head),l=!1;if(o.electricChars){for(var s=0;s-1){l=kl(e,i.head.line,"smart");break}}else o.electricInput&&o.electricInput.test(Xe(e.doc,i.head.line).text.slice(0,i.head.ch))&&(l=kl(e,i.head.line,"smart"));l&&sr(e,"electricInput",e,i.head.line)}}}function Dl(e){for(var t=[],r=[],n=0;n=t.text.length?(r.ch=t.text.length,r.sticky="before"):r.ch<=0&&(r.ch=0,r.sticky="after");var o=ae(i,r.ch,r.sticky),l=i[o];if("ltr"==e.doc.direction&&l.level%2==0&&(n>0?l.to>r.ch:l.from=l.from&&f>=c.begin)){var d=h?"before":"after";return new et(r.line,f,d)}}var p=function(e,t,n){for(var o=function(e,t){return t?new et(r.line,a(e,1),"before"):new et(r.line,e,"after")};e>=0&&e0==(1!=l.level),u=s?n.begin:a(n.end,-1);if(l.from<=u&&u0?c.end:a(c.begin,-1);return null==v||n>0&&v==t.text.length||!(g=p(n>0?0:i.length-1,n,u(v)))?null:g}(e.cm,s,t,r):$o(s,t,r))){if(n||(l=t.line+r)=e.first+e.size||(t=new et(l,t.ch,t.sticky),!(s=Xe(e,l))))return!1;t=qo(i,e.cm,s,t.line,r)}else t=o;return!0}if("char"==n)a();else if("column"==n)a(!0);else if("word"==n||"group"==n)for(var u=null,c="group"==n,h=e.cm&&e.cm.getHelper(t,"wordChars"),f=!0;!(r<0)||a(!f);f=!1){var d=s.text.charAt(t.ch)||"\n",p=te(d,h)?"w":c&&"\n"==d?"n":!c||/\s/.test(d)?null:"p";if(!c||f||p||(p="s"),u&&u!=p){r<0&&(r=1,a(),t.sticky="after");break}if(p&&(u=p),r>0&&!a(!f))break}var g=to(e,t,o,l,!0);return rt(o,g)&&(g.hitSide=!0),g}function Pl(e,t,r,n){var i,o,l=e.doc,s=t.left;if("page"==n){var a=Math.min(e.display.wrapper.clientHeight,window.innerHeight||document.documentElement.clientHeight),u=Math.max(a-.5*en(e.display),3);i=(r>0?t.bottom:t.top)+r*u}else"line"==n&&(i=r>0?t.bottom+3:t.top-3);for(;(o=$r(e,s,i)).outside;){if(r<0?i<=0:i>=l.height){o.hitSide=!0;break}i+=5*r}return o}var El=function(e){this.cm=e,this.lastAnchorNode=this.lastAnchorOffset=this.lastFocusNode=this.lastFocusOffset=null,this.polling=new R,this.composing=null,this.gracePeriod=!1,this.readDOMTimeout=null};function Il(e,t){var r=Ar(e,t.line);if(!r||r.hidden)return null;var n=Xe(e.doc,t.line),i=Nr(r,n,t.line),o=ce(n,e.doc.direction),l="left";o&&(l=ae(o,t.ch)%2?"right":"left");var s=Pr(i.map,t.ch,l);return s.offset="right"==s.collapse?s.end:s.start,s}function zl(e,t){return t&&(e.bad=!0),e}function Rl(e,t,r){var n;if(t==e.display.lineDiv){if(!(n=e.display.lineDiv.childNodes[r]))return zl(e.clipPos(et(e.display.viewTo-1)),!0);t=null,r=0}else for(n=t;;n=n.parentNode){if(!n||n==e.display.lineDiv)return null;if(n.parentNode&&n.parentNode==e.display.lineDiv)break}for(var i=0;i=t.display.viewTo||o.line=t.display.viewFrom&&Il(t,i)||{node:a[0].measure.map[2],offset:0},c=o.linen.firstLine()&&(l=et(l.line-1,Xe(n.doc,l.line-1).length)),s.ch==Xe(n.doc,s.line).text.length&&s.linei.viewTo-1)return!1;l.line==i.viewFrom||0==(e=an(n,l.line))?(t=qe(i.view[0].line),r=i.view[0].node):(t=qe(i.view[e].line),r=i.view[e-1].node.nextSibling);var a,u,c=an(n,s.line);if(c==i.view.length-1?(a=i.viewTo-1,u=i.lineDiv.lastChild):(a=qe(i.view[c+1].line)-1,u=i.view[c+1].node.previousSibling),!r)return!1;for(var h=n.doc.splitLines(function(e,t,r,n,i){var o="",l=!1,s=e.doc.lineSeparator(),a=!1;function u(){l&&(o+=s,a&&(o+=s),l=a=!1)}function c(e){e&&(u(),o+=e)}function h(t){if(1==t.nodeType){var r=t.getAttribute("cm-text");if(r)return void c(r);var o,f=t.getAttribute("cm-marker");if(f){var d=e.findMarks(et(n,0),et(i+1,0),(v=+f,function(e){return e.id==v}));return void(d.length&&(o=d[0].find(0))&&c(Ye(e.doc,o.from,o.to).join(s)))}if("false"==t.getAttribute("contenteditable"))return;var p=/^(pre|div|p|li|table|br)$/i.test(t.nodeName);if(!/^br$/i.test(t.nodeName)&&0==t.textContent.length)return;p&&u();for(var g=0;g1&&f.length>1;)if($(h)==$(f))h.pop(),f.pop(),a--;else{if(h[0]!=f[0])break;h.shift(),f.shift(),t++}for(var d=0,p=0,g=h[0],v=f[0],m=Math.min(g.length,v.length);dl.ch&&y.charCodeAt(y.length-p-1)==b.charCodeAt(b.length-p-1);)d--,p++;h[h.length-1]=y.slice(0,y.length-p).replace(/^\u200b+/,""),h[0]=h[0].slice(d).replace(/\u200b+$/,"");var x=et(t,d),C=et(a,f.length?$(f).length-p:0);return h.length>1||h[0]||tt(x,C)?(co(n.doc,h,x,C,"+input"),!0):void 0},El.prototype.ensurePolled=function(){this.forceCompositionEnd()},El.prototype.reset=function(){this.forceCompositionEnd()},El.prototype.forceCompositionEnd=function(){this.composing&&(clearTimeout(this.readDOMTimeout),this.composing=null,this.updateFromDOM(),this.div.blur(),this.div.focus())},El.prototype.readFromDOMSoon=function(){var e=this;null==this.readDOMTimeout&&(this.readDOMTimeout=setTimeout(function(){if(e.readDOMTimeout=null,e.composing){if(!e.composing.done)return;e.composing=null}e.updateFromDOM()},80))},El.prototype.updateFromDOM=function(){var e=this;!this.cm.isReadOnly()&&this.pollContent()||qn(this.cm,function(){return un(e.cm)})},El.prototype.setUneditable=function(e){e.contentEditable="false"},El.prototype.onKeyPress=function(e){0==e.charCode||this.composing||(e.preventDefault(),this.cm.isReadOnly()||Zn(this.cm,Nl)(this.cm,String.fromCharCode(null==e.charCode?e.keyCode:e.charCode),0))},El.prototype.readOnlyChanged=function(e){this.div.contentEditable=String("nocursor"!=e)},El.prototype.onContextMenu=function(){},El.prototype.resetPosition=function(){},El.prototype.needsContentAttribute=!0;var Gl=function(e){this.cm=e,this.prevInput="",this.pollingFast=!1,this.polling=new R,this.hasSelection=!1,this.composing=null};Gl.prototype.init=function(e){var t=this,r=this,n=this.cm;this.createField(e);var i=this.textarea;function o(e){if(!ve(n,e)){if(n.somethingSelected())Ml({lineWise:!1,text:n.getSelections()});else{if(!n.options.lineWiseCopyCut)return;var t=Dl(n);Ml({lineWise:!0,text:t.text}),"cut"==e.type?n.setSelections(t.ranges,null,V):(r.prevInput="",i.value=t.text.join("\n"),P(i))}"cut"==e.type&&(n.state.cutIncoming=+new Date)}}e.wrapper.insertBefore(this.wrapper,e.wrapper.firstChild),g&&(i.style.width="0px"),fe(i,"input",function(){l&&s>=9&&t.hasSelection&&(t.hasSelection=null),r.poll()}),fe(i,"paste",function(e){ve(n,e)||Ol(e,n)||(n.state.pasteIncoming=+new Date,r.fastPoll())}),fe(i,"cut",o),fe(i,"copy",o),fe(e.scroller,"paste",function(t){if(!xr(e,t)&&!ve(n,t)){if(!i.dispatchEvent)return n.state.pasteIncoming=+new Date,void r.focus();var o=new Event("paste");o.clipboardData=t.clipboardData,i.dispatchEvent(o)}}),fe(e.lineSpace,"selectstart",function(t){xr(e,t)||we(t)}),fe(i,"compositionstart",function(){var e=n.getCursor("from");r.composing&&r.composing.range.clear(),r.composing={start:e,range:n.markText(e,n.getCursor("to"),{className:"CodeMirror-composing"})}}),fe(i,"compositionend",function(){r.composing&&(r.poll(),r.composing.range.clear(),r.composing=null)})},Gl.prototype.createField=function(e){this.wrapper=Hl(),this.textarea=this.wrapper.firstChild},Gl.prototype.prepareSelection=function(){var e=this.cm,t=e.display,r=e.doc,n=gn(e);if(e.options.moveInputWithCursor){var i=Xr(e,r.sel.primary().head,"div"),o=t.wrapper.getBoundingClientRect(),l=t.lineDiv.getBoundingClientRect();n.teTop=Math.max(0,Math.min(t.wrapper.clientHeight-10,i.top+l.top-o.top)),n.teLeft=Math.max(0,Math.min(t.wrapper.clientWidth-10,i.left+l.left-o.left))}return n},Gl.prototype.showSelection=function(e){var t=this.cm.display;N(t.cursorDiv,e.cursors),N(t.selectionDiv,e.selection),null!=e.teTop&&(this.wrapper.style.top=e.teTop+"px",this.wrapper.style.left=e.teLeft+"px")},Gl.prototype.reset=function(e){if(!this.contextMenuPending&&!this.composing){var t=this.cm;if(t.somethingSelected()){this.prevInput="";var r=t.getSelection();this.textarea.value=r,t.state.focused&&P(this.textarea),l&&s>=9&&(this.hasSelection=r)}else e||(this.prevInput=this.textarea.value="",l&&s>=9&&(this.hasSelection=null))}},Gl.prototype.getField=function(){return this.textarea},Gl.prototype.supportsTouch=function(){return!1},Gl.prototype.focus=function(){if("nocursor"!=this.cm.options.readOnly&&(!m||W()!=this.textarea))try{this.textarea.focus()}catch(e){}},Gl.prototype.blur=function(){this.textarea.blur()},Gl.prototype.resetPosition=function(){this.wrapper.style.top=this.wrapper.style.left=0},Gl.prototype.receivedFocus=function(){this.slowPoll()},Gl.prototype.slowPoll=function(){var e=this;this.pollingFast||this.polling.set(this.cm.options.pollInterval,function(){e.poll(),e.cm.state.focused&&e.slowPoll()})},Gl.prototype.fastPoll=function(){var e=!1,t=this;t.pollingFast=!0,t.polling.set(20,function r(){t.poll()||e?(t.pollingFast=!1,t.slowPoll()):(e=!0,t.polling.set(60,r))})},Gl.prototype.poll=function(){var e=this,t=this.cm,r=this.textarea,n=this.prevInput;if(this.contextMenuPending||!t.state.focused||He(r)&&!n&&!this.composing||t.isReadOnly()||t.options.disableInput||t.state.keySeq)return!1;var i=r.value;if(i==n&&!t.somethingSelected())return!1;if(l&&s>=9&&this.hasSelection===i||y&&/[\uf700-\uf7ff]/.test(i))return t.display.input.reset(),!1;if(t.doc.sel==t.display.selForContextMenu){var o=i.charCodeAt(0);if(8203!=o||n||(n="​"),8666==o)return this.reset(),this.cm.execCommand("undo")}for(var a=0,u=Math.min(n.length,i.length);a1e3||i.indexOf("\n")>-1?r.value=e.prevInput="":e.prevInput=i,e.composing&&(e.composing.range.clear(),e.composing.range=t.markText(e.composing.start,t.getCursor("to"),{className:"CodeMirror-composing"}))}),!0},Gl.prototype.ensurePolled=function(){this.pollingFast&&this.poll()&&(this.pollingFast=!1)},Gl.prototype.onKeyPress=function(){l&&s>=9&&(this.hasSelection=null),this.fastPoll()},Gl.prototype.onContextMenu=function(e){var t=this,r=t.cm,n=r.display,i=t.textarea;t.contextMenuPending&&t.contextMenuPending();var o=sn(r,e),u=n.scroller.scrollTop;if(o&&!h){r.options.resetSelectionOnContextMenu&&-1==r.doc.sel.contains(o)&&Zn(r,$i)(r.doc,xi(o),V);var c,f=i.style.cssText,d=t.wrapper.style.cssText,p=t.wrapper.offsetParent.getBoundingClientRect();if(t.wrapper.style.cssText="position: static",i.style.cssText="position: absolute; width: 30px; height: 30px;\n top: "+(e.clientY-p.top-5)+"px; left: "+(e.clientX-p.left-5)+"px;\n z-index: 1000; background: "+(l?"rgba(255, 255, 255, .05)":"transparent")+";\n outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);",a&&(c=window.scrollY),n.input.focus(),a&&window.scrollTo(null,c),n.input.reset(),r.somethingSelected()||(i.value=t.prevInput=" "),t.contextMenuPending=m,n.selForContextMenu=r.doc.sel,clearTimeout(n.detectingSelectAll),l&&s>=9&&v(),S){Se(e);var g=function(){pe(window,"mouseup",g),setTimeout(m,20)};fe(window,"mouseup",g)}else setTimeout(m,50)}function v(){if(null!=i.selectionStart){var e=r.somethingSelected(),o="​"+(e?i.value:"");i.value="⇚",i.value=o,t.prevInput=e?"":"​",i.selectionStart=1,i.selectionEnd=o.length,n.selForContextMenu=r.doc.sel}}function m(){if(t.contextMenuPending==m&&(t.contextMenuPending=!1,t.wrapper.style.cssText=d,i.style.cssText=f,l&&s<9&&n.scrollbars.setScrollTop(n.scroller.scrollTop=u),null!=i.selectionStart)){(!l||l&&s<9)&&v();var e=0,o=function(){n.selForContextMenu==r.doc.sel&&0==i.selectionStart&&i.selectionEnd>0&&"​"==t.prevInput?Zn(r,no)(r):e++<10?n.detectingSelectAll=setTimeout(o,500):(n.selForContextMenu=null,n.input.reset())};n.detectingSelectAll=setTimeout(o,200)}}},Gl.prototype.readOnlyChanged=function(e){e||this.reset(),this.textarea.disabled="nocursor"==e},Gl.prototype.setUneditable=function(){},Gl.prototype.needsContentAttribute=!1,function(e){var t=e.optionHandlers;function r(r,n,i,o){e.defaults[r]=n,i&&(t[r]=o?function(e,t,r){r!=yl&&i(e,t,r)}:i)}e.defineOption=r,e.Init=yl,r("value","",function(e,t){return e.setValue(t)},!0),r("mode",null,function(e,t){e.doc.modeOption=t,Ti(e)},!0),r("indentUnit",2,Ti,!0),r("indentWithTabs",!1),r("smartIndent",!0),r("tabSize",4,function(e){Mi(e),Rr(e),un(e)},!0),r("lineSeparator",null,function(e,t){if(e.doc.lineSep=t,t){var r=[],n=e.doc.first;e.doc.iter(function(e){for(var i=0;;){var o=e.text.indexOf(t,i);if(-1==o)break;i=o+t.length,r.push(et(n,o))}n++});for(var i=r.length-1;i>=0;i--)co(e.doc,t,r[i],et(r[i].line,r[i].ch+t.length))}}),r("specialChars",/[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b-\u200f\u2028\u2029\ufeff\ufff9-\ufffc]/g,function(e,t,r){e.state.specialChars=new RegExp(t.source+(t.test("\t")?"":"|\t"),"g"),r!=yl&&e.refresh()}),r("specialCharPlaceholder",Qt,function(e){return e.refresh()},!0),r("electricChars",!0),r("inputStyle",m?"contenteditable":"textarea",function(){throw new Error("inputStyle can not (yet) be changed in a running editor")},!0),r("spellcheck",!1,function(e,t){return e.getInputField().spellcheck=t},!0),r("autocorrect",!1,function(e,t){return e.getInputField().autocorrect=t},!0),r("autocapitalize",!1,function(e,t){return e.getInputField().autocapitalize=t},!0),r("rtlMoveVisually",!w),r("wholeLineUpdateBefore",!0),r("theme","default",function(e){ml(e),fi(e)},!0),r("keyMap","default",function(e,t,r){var n=Xo(t),i=r!=yl&&Xo(r);i&&i.detach&&i.detach(e,n),n.attach&&n.attach(e,i||null)}),r("extraKeys",null),r("configureMouse",null),r("lineWrapping",!1,Cl,!0),r("gutters",[],function(e,t){e.display.gutterSpecs=ci(t,e.options.lineNumbers),fi(e)},!0),r("fixedGutter",!0,function(e,t){e.display.gutters.style.left=t?nn(e.display)+"px":"0",e.refresh()},!0),r("coverGutterNextToScrollbar",!1,function(e){return Rn(e)},!0),r("scrollbarStyle","native",function(e){Un(e),Rn(e),e.display.scrollbars.setScrollTop(e.doc.scrollTop),e.display.scrollbars.setScrollLeft(e.doc.scrollLeft)},!0),r("lineNumbers",!1,function(e,t){e.display.gutterSpecs=ci(e.options.gutters,t),fi(e)},!0),r("firstLineNumber",1,fi,!0),r("lineNumberFormatter",function(e){return e},fi,!0),r("showCursorWhenSelecting",!1,pn,!0),r("resetSelectionOnContextMenu",!0),r("lineWiseCopyCut",!0),r("pasteLinesPerSelection",!0),r("selectionsMayTouch",!1),r("readOnly",!1,function(e,t){"nocursor"==t&&(Sn(e),e.display.input.blur()),e.display.input.readOnlyChanged(t)}),r("disableInput",!1,function(e,t){t||e.display.input.reset()},!0),r("dragDrop",!0,xl),r("allowDropFileTypes",null),r("cursorBlinkRate",530),r("cursorScrollMargin",0),r("cursorHeight",1,pn,!0),r("singleCursorHeightPerLine",!0,pn,!0),r("workTime",100),r("workDelay",100),r("flattenSpans",!0,Mi,!0),r("addModeClass",!1,Mi,!0),r("pollInterval",100),r("undoDepth",200,function(e,t){return e.doc.history.undoDepth=t}),r("historyEventDelay",1250),r("viewportMargin",10,function(e){return e.refresh()},!0),r("maxHighlightLength",1e4,Mi,!0),r("moveInputWithCursor",!0,function(e,t){t||e.display.input.resetPosition()}),r("tabindex",null,function(e,t){return e.display.input.getField().tabIndex=t||""}),r("autofocus",null),r("direction","ltr",function(e,t){return e.doc.setDirection(t)},!0),r("phrases",null)}(Sl),function(e){var t=e.optionHandlers,r=e.helpers={};e.prototype={constructor:e,focus:function(){window.focus(),this.display.input.focus()},setOption:function(e,r){var n=this.options,i=n[e];n[e]==r&&"mode"!=e||(n[e]=r,t.hasOwnProperty(e)&&Zn(this,t[e])(this,r,i),ge(this,"optionChange",this,e))},getOption:function(e){return this.options[e]},getDoc:function(){return this.doc},addKeyMap:function(e,t){this.state.keyMaps[t?"push":"unshift"](Xo(e))},removeKeyMap:function(e){for(var t=this.state.keyMaps,r=0;rr&&(kl(this,i.head.line,e,!0),r=i.head.line,n==this.doc.sel.primIndex&&On(this));else{var o=i.from(),l=i.to(),s=Math.max(r,o.line);r=Math.min(this.lastLine(),l.line-(l.ch?0:1))+1;for(var a=s;a0&&Xi(this.doc,n,new bi(o,u[n].to()),V)}}}),getTokenAt:function(e,t){return yt(this,e,t)},getLineTokens:function(e,t){return yt(this,et(e),t,!0)},getTokenTypeAt:function(e){e=st(this.doc,e);var t,r=ft(this,Xe(this.doc,e.line)),n=0,i=(r.length-1)/2,o=e.ch;if(0==o)t=r[2];else for(;;){var l=n+i>>1;if((l?r[2*l-1]:0)>=o)i=l;else{if(!(r[2*l+1]o&&(e=o,i=!0),n=Xe(this.doc,e)}else n=e;return Vr(this,n,{top:0,left:0},t||"page",r||i).top+(i?this.doc.height-Vt(n):0)},defaultTextHeight:function(){return en(this.display)},defaultCharWidth:function(){return tn(this.display)},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(e,t,r,n,i){var o,l,s,a=this.display,u=(e=Xr(this,st(this.doc,e))).bottom,c=e.left;if(t.style.position="absolute",t.setAttribute("cm-ignore-events","true"),this.display.input.setUneditable(t),a.sizer.appendChild(t),"over"==n)u=e.top;else if("above"==n||"near"==n){var h=Math.max(a.wrapper.clientHeight,this.doc.height),f=Math.max(a.sizer.clientWidth,a.lineSpace.clientWidth);("above"==n||e.bottom+t.offsetHeight>h)&&e.top>t.offsetHeight?u=e.top-t.offsetHeight:e.bottom+t.offsetHeight<=h&&(u=e.bottom),c+t.offsetWidth>f&&(c=f-t.offsetWidth)}t.style.top=u+"px",t.style.left=t.style.right="","right"==i?(c=a.sizer.clientWidth-t.offsetWidth,t.style.right="0px"):("left"==i?c=0:"middle"==i&&(c=(a.sizer.clientWidth-t.offsetWidth)/2),t.style.left=c+"px"),r&&(o=this,l={left:c,top:u,right:c+t.offsetWidth,bottom:u+t.offsetHeight},null!=(s=Mn(o,l)).scrollTop&&Hn(o,s.scrollTop),null!=s.scrollLeft&&Pn(o,s.scrollLeft))},triggerOnKeyDown:Qn(ll),triggerOnKeyPress:Qn(al),triggerOnKeyUp:sl,triggerOnMouseDown:Qn(fl),execCommand:function(e){if(Zo.hasOwnProperty(e))return Zo[e].call(null,this)},triggerElectric:Qn(function(e){Al(this,e)}),findPosH:function(e,t,r,n){var i=1;t<0&&(i=-1,t=-t);for(var o=st(this.doc,e),l=0;l0&&l(t.charAt(r-1));)--r;for(;n.5)&&ln(this),ge(this,"refresh",this)}),swapDoc:Qn(function(e){var t=this.doc;return t.cm=null,this.state.selectingText&&this.state.selectingText(),Di(this,e),Rr(this),this.display.input.reset(),An(this,e.scrollLeft,e.scrollTop),this.curOp.forceScroll=!0,sr(this,"swapDoc",this,t),t}),phrase:function(e){var t=this.options.phrases;return t&&Object.prototype.hasOwnProperty.call(t,e)?t[e]:e},getInputField:function(){return this.display.input.getField()},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}},be(e),e.registerHelper=function(t,n,i){r.hasOwnProperty(t)||(r[t]=e[t]={_global:[]}),r[t][n]=i},e.registerGlobalHelper=function(t,n,i,o){e.registerHelper(t,n,o),r[t]._global.push({pred:i,val:o})}}(Sl);var Ul="iter insert remove copy getEditor constructor".split(" ");for(var Vl in Mo.prototype)Mo.prototype.hasOwnProperty(Vl)&&B(Ul,Vl)<0&&(Sl.prototype[Vl]=function(e){return function(){return e.apply(this.doc,arguments)}}(Mo.prototype[Vl]));return be(Mo),Sl.inputStyles={textarea:Gl,contenteditable:El},Sl.defineMode=function(e){Sl.defaults.mode||"null"==e||(Sl.defaults.mode=e),function(e,t){arguments.length>2&&(t.dependencies=Array.prototype.slice.call(arguments,2)),Ee[e]=t}.apply(this,arguments)},Sl.defineMIME=function(e,t){Ie[e]=t},Sl.defineMode("null",function(){return{token:function(e){return e.skipToEnd()}}}),Sl.defineMIME("text/plain","null"),Sl.defineExtension=function(e,t){Sl.prototype[e]=t},Sl.defineDocExtension=function(e,t){Mo.prototype[e]=t},Sl.fromTextArea=function(e,t){if((t=t?I(t):{}).value=e.value,!t.tabindex&&e.tabIndex&&(t.tabindex=e.tabIndex),!t.placeholder&&e.placeholder&&(t.placeholder=e.placeholder),null==t.autofocus){var r=W();t.autofocus=r==e||null!=e.getAttribute("autofocus")&&r==document.body}function n(){e.value=s.getValue()}var i;if(e.form&&(fe(e.form,"submit",n),!t.leaveSubmitMethodAlone)){var o=e.form;i=o.submit;try{var l=o.submit=function(){n(),o.submit=i,o.submit(),o.submit=l}}catch(e){}}t.finishInit=function(r){r.save=n,r.getTextArea=function(){return e},r.toTextArea=function(){r.toTextArea=isNaN,n(),e.parentNode.removeChild(r.getWrapperElement()),e.style.display="",e.form&&(pe(e.form,"submit",n),t.leaveSubmitMethodAlone||"function"!=typeof e.form.submit||(e.form.submit=i))}},e.style.display="none";var s=Sl(function(t){return e.parentNode.insertBefore(t,e.nextSibling)},t);return s},function(e){e.off=pe,e.on=fe,e.wheelEventPixels=vi,e.Doc=Mo,e.splitLines=We,e.countColumn=z,e.findColumn=X,e.isWordChar=ee,e.Pass=U,e.signal=ge,e.Line=Xt,e.changeEnd=Ci,e.scrollbarModel=Gn,e.Pos=et,e.cmpPos=tt,e.modes=Ee,e.mimeModes=Ie,e.resolveMode=ze,e.getMode=Re,e.modeExtensions=Be,e.extendMode=Ge,e.copyState=Ue,e.startState=Ke,e.innerMode=Ve,e.commands=Zo,e.keyMap=Ro,e.keyName=jo,e.isModifierKey=Vo,e.lookupKey=Uo,e.normalizeKeyMap=Go,e.StringStream=je,e.SharedTextMarker=So,e.TextMarker=xo,e.LineWidget=yo,e.e_preventDefault=we,e.e_stopPropagation=xe,e.e_stop=Se,e.addClass=H,e.contains=D,e.rmClass=T,e.keyNames=Po}(Sl),Sl.version="5.49.2",Sl}); \ No newline at end of file diff --git a/luci-app-mosdns/root/www/luci-static/resources/mosdns/mode/yaml/yaml.js b/luci-app-mosdns/root/www/luci-static/resources/mosdns/mode/yaml/yaml.js new file mode 100644 index 00000000..4a5e499b --- /dev/null +++ b/luci-app-mosdns/root/www/luci-static/resources/mosdns/mode/yaml/yaml.js @@ -0,0 +1 @@ +!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";e.defineMode("yaml",function(){var e=new RegExp("\\b(("+["true","false","on","off","yes","no"].join(")|(")+"))$","i");return{token:function(i,t){var r=i.peek(),n=t.escaped;if(t.escaped=!1,"#"==r&&(0==i.pos||/\s/.test(i.string.charAt(i.pos-1))))return i.skipToEnd(),"comment";if(i.match(/^('([^']|\\.)*'?|"([^"]|\\.)*"?)/))return"string";if(t.literal&&i.indentation()>t.keyCol)return i.skipToEnd(),"string";if(t.literal&&(t.literal=!1),i.sol()){if(t.keyCol=0,t.pair=!1,t.pairStart=!1,i.match(/---/))return"def";if(i.match(/\.\.\./))return"def";if(i.match(/\s*-\s+/))return"meta"}if(i.match(/^(\{|\}|\[|\])/))return"{"==r?t.inlinePairs++:"}"==r?t.inlinePairs--:"["==r?t.inlineList++:t.inlineList--,"meta";if(t.inlineList>0&&!n&&","==r)return i.next(),"meta";if(t.inlinePairs>0&&!n&&","==r)return t.keyCol=0,t.pair=!1,t.pairStart=!1,i.next(),"meta";if(t.pairStart){if(i.match(/^\s*(\||\>)\s*/))return t.literal=!0,"meta";if(i.match(/^\s*(\&|\*)[a-z0-9\._-]+\b/i))return"variable-2";if(0==t.inlinePairs&&i.match(/^\s*-?[0-9\.\,]+\s?$/))return"number";if(t.inlinePairs>0&&i.match(/^\s*-?[0-9\.\,]+\s?(?=(,|}))/))return"number";if(i.match(e))return"keyword"}return!t.pair&&i.match(/^\s*(?:[,\[\]{}&*!|>'"%@`][^\s'":]|[^,\[\]{}#&*!|>'"%@`])[^#]*?(?=\s*:($|\s))/)?(t.pair=!0,t.keyCol=i.indentation(),"atom"):t.pair&&i.match(/^:\s*/)?(t.pairStart=!0,"meta"):(t.pairStart=!1,t.escaped="\\"==r,i.next(),null)},startState:function(){return{pair:!1,pairStart:!1,keyCol:0,inlinePairs:0,inlineList:0,literal:!1,escaped:!1}},lineComment:"#",fold:"indent"}}),e.defineMIME("text/x-yaml","yaml"),e.defineMIME("text/yaml","yaml")}); \ No newline at end of file diff --git a/luci-app-mosdns/root/www/luci-static/resources/mosdns/theme/dracula.css b/luci-app-mosdns/root/www/luci-static/resources/mosdns/theme/dracula.css new file mode 100644 index 00000000..6c708c01 --- /dev/null +++ b/luci-app-mosdns/root/www/luci-static/resources/mosdns/theme/dracula.css @@ -0,0 +1 @@ +.cm-s-dracula.CodeMirror,.cm-s-dracula .CodeMirror-gutters{background-color:#282a36 !important;color:#f8f8f2 !important;border:0}.cm-s-dracula .CodeMirror-gutters{color:#282a36}.cm-s-dracula .CodeMirror-cursor{border-left:solid thin #f8f8f0}.cm-s-dracula .CodeMirror-linenumber{color:#6d8a88}.cm-s-dracula .CodeMirror-selected{background:rgba(255,255,255,0.10)}.cm-s-dracula .CodeMirror-line::selection,.cm-s-dracula .CodeMirror-line>span::selection,.cm-s-dracula .CodeMirror-line>span>span::selection{background:rgba(255,255,255,0.10)}.cm-s-dracula .CodeMirror-line::-moz-selection,.cm-s-dracula .CodeMirror-line>span::-moz-selection,.cm-s-dracula .CodeMirror-line>span>span::-moz-selection{background:rgba(255,255,255,0.10)}.cm-s-dracula span.cm-comment{color:#6272a4}.cm-s-dracula span.cm-string,.cm-s-dracula span.cm-string-2{color:#f1fa8c}.cm-s-dracula span.cm-number{color:#bd93f9}.cm-s-dracula span.cm-variable{color:#50fa7b}.cm-s-dracula span.cm-variable-2{color:white}.cm-s-dracula span.cm-def{color:#50fa7b}.cm-s-dracula span.cm-operator{color:#ff79c6}.cm-s-dracula span.cm-keyword{color:#ff79c6}.cm-s-dracula span.cm-atom{color:#bd93f9}.cm-s-dracula span.cm-meta{color:#f8f8f2}.cm-s-dracula span.cm-tag{color:#ff79c6}.cm-s-dracula span.cm-attribute{color:#50fa7b}.cm-s-dracula span.cm-qualifier{color:#50fa7b}.cm-s-dracula span.cm-property{color:#66d9ef}.cm-s-dracula span.cm-builtin{color:#50fa7b}.cm-s-dracula span.cm-variable-3,.cm-s-dracula span.cm-type{color:#ffb86c}.cm-s-dracula .CodeMirror-activeline-background{background:rgba(255,255,255,0.1)}.cm-s-dracula .CodeMirror-matchingbracket{text-decoration:underline;color:white !important} diff --git a/luci-app-netdata b/luci-app-netdata deleted file mode 160000 index bbb54331..00000000 --- a/luci-app-netdata +++ /dev/null @@ -1 +0,0 @@ -Subproject commit bbb54331405ab70084a95d50eaebf58ddd9d9202 diff --git a/luci-app-netdata/Makefile b/luci-app-netdata/Makefile new file mode 100644 index 00000000..3b81668f --- /dev/null +++ b/luci-app-netdata/Makefile @@ -0,0 +1,24 @@ +# Copyright (C) 2016 Openwrt.org +# Copyright (C) 2020-2021 sirpdboy +# https://github.com/sirpdboy/luci-app-netdata for v 1.33.1 cn +# This is free software, licensed under the Apache License, Version 2.0 . +# + +include $(TOPDIR)/rules.mk + +LUCI_TITLE:=LuCI support for Netdata +LUCI_DEPENDS:=+netdata +LUCI_PKGARCH:=all + +PKG_NAME:=luci-app-netdata +PKG_VERSION:=1.1 +PKG_RELEASE:=20221124 + +define Build/Compile +endef + + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature + diff --git a/luci-app-netdata/README.md b/luci-app-netdata/README.md new file mode 100644 index 00000000..550bb08e --- /dev/null +++ b/luci-app-netdata/README.md @@ -0,0 +1,83 @@ +### 访问数:[![](https://visitor-badge.glitch.me/badge?page_id=sirpdboy-visitor-badge)] [![](https://img.shields.io/badge/TG群-点击加入-FFFFFF.svg)](https://t.me/joinchat/AAAAAEpRF88NfOK5vBXGBQ) + +![screenshots](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/说明1.jpg) + +[luci-app-netdata可控制的实时监控 ](https://github.com/sirpdboy/luci-app-netdata) +====================== + +### 下载源码方法: + + ```Brach + + # 下载源码 + + git clone https://github.com/sirpdboy/luci-app-netdata package/luci-app-netdata + make menuconfig + + ``` +### 配置菜单 + + ```Brach + make menuconfig + # 找到 LuCI -> Applications, 选择 luci-app-netdata, 保存后退出。 + ``` + +### 编译 + + ```Brach + # 编译固件 + make package/luci-app-netdata/compile V=s + ``` + + +## 界面 +![screenshots](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/netdata1.jpg) + +![screenshots](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/netdata2.jpg) + +![screenshots](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/说明2.jpg) + + + +## 使用与授权相关说明 + +- 本人开源的所有源码,任何引用需注明本处出处,如需修改二次发布必告之本人,未经许可不得做于任何商用用途。 + + +# My other project + +- 网络速度测试 :https://github.com/sirpdboy/NetSpeedTest + +- 定时设置插件 : https://github.com/sirpdboy/luci-app-autotimeset + +- 关机功能插件 : https://github.com/sirpdboy/luci-app-poweroffdevice + +- opentopd主题 : https://github.com/sirpdboy/luci-theme-opentopd + +- kucat 主题: https://github.com/sirpdboy/luci-theme-kucat + +- 家长控制: https://github.com/sirpdboy/luci-theme-parentcontrol + +- 系统高级设置 : https://github.com/sirpdboy/luci-app-advanced + +- ddns-go动态域名: https://github.com/sirpdboy/luci-app-ddns-go + +- 进阶设置(系统高级设置+主题设置kucat/agron/opentopd): https://github.com/sirpdboy/luci-app-advancedplus + +- 设置向导: https://github.com/sirpdboy/luci-app-wizard + +- 分区扩容: https://github.com/sirpdboy/luci-app-partexp + +- lukcy大吉: https://github.com/sirpdboy/luci-app-lukcy + +## 捐助 + +![screenshots](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/说明3.jpg) + +| 图飞了😂 | 图飞了😂 | +| :-----------------: | :-------------: | +|![xm1](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/支付宝.png) | ![xm1](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/微信.png) | + + + 图飞了😂 + diff --git a/luci-app-netdata/luasrc/controller/netdata.lua b/luci-app-netdata/luasrc/controller/netdata.lua new file mode 100644 index 00000000..95b71ad1 --- /dev/null +++ b/luci-app-netdata/luasrc/controller/netdata.lua @@ -0,0 +1,24 @@ +-- Copyright (C) 2018-2022 sirpdboy https://github.com/sirpdboy/luci-app-netdata +-- Licensed to the public under the Apache License 2.0. + +module("luci.controller.netdata", package.seeall) + +function index() + if not nixio.fs.access("/etc/config/netdata") then + return + end + local page + entry({"admin", "status", "netdata"}, alias("admin", "status", "netdata", "setting"),_("NetData"), 10).dependent = true + + entry({"admin", "status", "netdata", "setting"}, cbi("netdata/netdata"), _("Base Setting"), 20).leaf=true + entry({"admin", "status", "netdata", "netdata"}, template("netdata"), _("NetData"), 30).leaf = true + entry({"admin", "status", "netdata_status"}, call("act_status")) +end + +function act_status() + local sys = require "luci.sys" + local e = { } + e.running = sys.call("pidof netdata >/dev/null") == 0 + luci.http.prepare_content("application/json") + luci.http.write_json(e) +end diff --git a/luci-app-netdata/luasrc/model/cbi/netdata/netdata.lua b/luci-app-netdata/luasrc/model/cbi/netdata/netdata.lua new file mode 100644 index 00000000..12469e9a --- /dev/null +++ b/luci-app-netdata/luasrc/model/cbi/netdata/netdata.lua @@ -0,0 +1,25 @@ +-- Copyright 2018-2022 sirpdboy (herboy2008@gmail.com) +-- https://github.com/sirpdboy/luci-app-netdata +require("luci.util") + +local m, s ,o + +m = Map("netdata", translate("NetData"), translate("Netdata is high-fidelity infrastructure monitoring and troubleshooting.Open-source, free, preconfigured, opinionated, and always real-time.")..translate("
For specific usage, see:")..translate("GitHub @sirpdboy/luci-app-netdata ") ) +m:section(SimpleSection).template = "netdata_status" +s = m:section(TypedSection, "netdata", translate("Global Settings")) +s.addremove=false +s.anonymous=true + +o=s:option(Flag,"enabled",translate("Enable")) +o.default=0 + +o=s:option(Value, "port",translate("Set the netdata access port")) +o.datatype="uinteger" +o.default=19999 + +m.apply_on_parse = true +m.on_after_apply = function(self,map) + luci.sys.exec("/etc/init.d/netdata start") +end + +return m diff --git a/luci-app-netdata/luasrc/view/netdata.htm b/luci-app-netdata/luasrc/view/netdata.htm new file mode 100644 index 00000000..eea0c50d --- /dev/null +++ b/luci-app-netdata/luasrc/view/netdata.htm @@ -0,0 +1,20 @@ +<%# + Copyright 2008-2022 by sirpdboy + https://github.com/sirpdboy/luci-app-netdata + Licensed to the public under the Apache License 2.0. +-%> + +<%+header%> +
+ + + +
+ +<%+footer%> diff --git a/luci-app-netdata/luasrc/view/netdata_status.htm b/luci-app-netdata/luasrc/view/netdata_status.htm new file mode 100644 index 00000000..318a0282 --- /dev/null +++ b/luci-app-netdata/luasrc/view/netdata_status.htm @@ -0,0 +1,25 @@ + + +
+ <%:NetData Status%> +

+ <%:Collecting data...%> +

+
\ No newline at end of file diff --git a/luci-app-netdata/po/zh-cn/netdata.po b/luci-app-netdata/po/zh-cn/netdata.po new file mode 100644 index 00000000..3e52538d --- /dev/null +++ b/luci-app-netdata/po/zh-cn/netdata.po @@ -0,0 +1,29 @@ +msgid "" +msgstr "Content-Type: text/plain; charset=UTF-8" + +msgid "Running state" +msgstr "运行状态" + +msgid "The Netdata service is running." +msgstr "NetData服务已启动" + +msgid "The Netdata service is not running." +msgstr "NetData服务未启动" + +msgid "NetData Status" +msgstr "NetData服务状态" + +msgid "NetData" +msgstr "实时监控" + +msgid "Set the netdata access port" +msgstr "设置访问端口" + +msgid "Base Setting" +msgstr "基本设置" + +msgid "Netdata is high-fidelity infrastructure monitoring and troubleshooting.Open-source, free, preconfigured, opinionated, and always real-time." +msgstr "Netdata是高保真的基础设施监控和故障排除。开源、免费、预配置、始终实时." + +msgid "
For specific usage, see:" +msgstr "
具体使用方法参见:" \ No newline at end of file diff --git a/luci-app-netdata/po/zh_Hans b/luci-app-netdata/po/zh_Hans new file mode 120000 index 00000000..41451e4a --- /dev/null +++ b/luci-app-netdata/po/zh_Hans @@ -0,0 +1 @@ +zh-cn \ No newline at end of file diff --git a/luci-app-netdata/root/etc/config/netdata b/luci-app-netdata/root/etc/config/netdata new file mode 100644 index 00000000..83f9eda9 --- /dev/null +++ b/luci-app-netdata/root/etc/config/netdata @@ -0,0 +1,6 @@ + +config netdata 'netdata' + option logger '1' + option enabled '0' + option port '19990' + diff --git a/luci-app-netdata/root/etc/uci-defaults/40_luci-app-netdata b/luci-app-netdata/root/etc/uci-defaults/40_luci-app-netdata new file mode 100644 index 00000000..c091f6e0 --- /dev/null +++ b/luci-app-netdata/root/etc/uci-defaults/40_luci-app-netdata @@ -0,0 +1,10 @@ +#!/bin/sh +[ -f /usr/share/netdata/webcn/netdata.conf ] && mv -f /usr/share/netdata/webcn/netdata.conf /etc/netdata/netdata.conf +[ -f /usr/share/netdata/webcn/netdata ] && mv -f /usr/share/netdata/webcn/netdata /etc/config/netdata +[ -f /usr/share/netdata/webcn/dashboard.js ] && mv -f /usr/share/netdata/webcn/dashboard.js /usr/share/netdata/web/dashboard.js +[ -f /usr/share/netdata/webcn/dashboard_info.js ] && mv -f /usr/share/netdata/webcn/dashboard_info.js /usr/share/netdata/web/dashboard_info.js +[ -f /usr/share/netdata/webcn/main.js ] && mv -f /usr/share/netdata/webcn/main.js /usr/share/netdata/web/main.js +[ -f /usr/share/netdata/webcn/index.html ] && mv -f /usr/share/netdata/webcn/index.html /usr/share/netdata/web/index.html +[ -f /usr/share/netdata/webcn/netdata.init ] && mv -f /usr/share/netdata/webcn/netdata.init /etc/init.d/netdata +rm -rf /tmp/luci-modulecache /tmp/luci-indexcache* +exit 0 diff --git a/luci-app-netdata/root/usr/share/netdata/webcn/dashboard.js b/luci-app-netdata/root/usr/share/netdata/webcn/dashboard.js new file mode 100644 index 00000000..1065e771 --- /dev/null +++ b/luci-app-netdata/root/usr/share/netdata/webcn/dashboard.js @@ -0,0 +1,10377 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +// DO NOT EDIT: This file is automatically generated from the source files in src/ + +// ---------------------------------------------------------------------------- +// You can set the following variables before loading this script: + +// 'use strict'; + +/*global netdataNoDygraphs *//* boolean, disable dygraph charts + * (default: false) */ +/*global netdataNoSparklines *//* boolean, disable sparkline charts + * (default: false) */ +/*global netdataNoPeitys *//* boolean, disable peity charts + * (default: false) */ +/*global netdataNoGoogleCharts *//* boolean, disable google charts + * (default: false) */ +/*global netdataNoMorris *//* boolean, disable morris charts + * (default: false) */ +/*global netdataNoEasyPieChart *//* boolean, disable easypiechart charts + * (default: false) */ +/*global netdataNoGauge *//* boolean, disable gauge.js charts + * (default: false) */ +/*global netdataNoD3 *//* boolean, disable d3 charts + * (default: false) */ +/*global netdataNoC3 *//* boolean, disable c3 charts + * (default: false) */ +/*global netdataNoD3pie *//* boolean, disable d3pie charts + * (default: false) */ +/*global netdataNoBootstrap *//* boolean, disable bootstrap - disables help too + * (default: false) */ +/*global netdataNoFontAwesome *//* boolean, disable fontawesome (do not load it) + * (default: false) */ +/*global netdataIcons *//* object, overwrite netdata fontawesome icons + * (default: null) */ +/*global netdataDontStart *//* boolean, do not start the thread to process the charts + * (default: false) */ +/*global netdataErrorCallback *//* function, callback to be called when the dashboard encounters an error + * (default: null) */ +/*global netdataRegistry:true *//* boolean, use the netdata registry + * (default: false) */ +/*global netdataNoRegistry *//* boolean, included only for compatibility with existing custom dashboard + * (obsolete - do not use this any more) */ +/*global netdataRegistryCallback *//* function, callback that will be invoked with one param: the URLs from the registry + * (default: null) */ +/*global netdataShowHelp:true *//* boolean, disable charts help + * (default: true) */ +/*global netdataShowAlarms:true *//* boolean, enable alarms checks and notifications + * (default: false) */ +/*global netdataRegistryAfterMs:true *//* ms, delay registry use at started + * (default: 1500) */ +/*global netdataCallback *//* function, callback to be called when netdata is ready to start + * (default: null) + * netdata will be running while this is called + * (call NETDATA.pause to stop it) */ +/*global netdataPrepCallback *//* function, callback to be called before netdata does anything else + * (default: null) */ +/*global netdataServer *//* string, the URL of the netdata server to use + * (default: the URL the page is hosted at) */ +/*global netdataServerStatic *//* string, the URL of the netdata server to use for static files + * (default: netdataServer) */ +/*global netdataSnapshotData *//* object, a netdata snapshot loaded + * (default: null) */ +/*global netdataAlarmsRecipients *//* array, an array of alarm recipients to show notifications for + * (default: null) */ +/*global netdataAlarmsRemember *//* boolean, keep our position in the alarm log at browser local storage + * (default: true) */ +/*global netdataAlarmsActiveCallback *//* function, a hook for the alarm logs + * (default: undefined) */ +/*global netdataAlarmsNotifCallback *//* function, a hook for alarm notifications + * (default: undefined) */ +/*global netdataIntersectionObserver *//* boolean, enable or disable the use of intersection observer + * (default: true) */ +/*global netdataCheckXSS *//* boolean, enable or disable checking for XSS issues + * (default: false) */ + +// ---------------------------------------------------------------------------- +// global namespace + +// Should stay var! +var NETDATA = window.NETDATA || {}; + +(function(window, document, $, undefined) { + +// *** src/dashboard.js/utils.js + +NETDATA.name2id = function (s) { + return s + .replace(/ /g, '_') + .replace(/:/g, '_') + .replace(/\(/g, '_') + .replace(/\)/g, '_') + .replace(/\./g, '_') + .replace(/\//g, '_'); +}; + +NETDATA.encodeURIComponent = function (s) { + if (typeof(s) === 'string') { + return encodeURIComponent(s); + } + + return s; +}; + +/// A heuristic for detecting slow devices. +let isSlowDeviceResult = undefined; +const isSlowDevice = function () { + if (!isSlowDeviceResult) { + return isSlowDeviceResult; + } + + try { + let ua = navigator.userAgent.toLowerCase(); + + let iOS = /ipad|iphone|ipod/.test(ua) && !window.MSStream; + let android = /android/.test(ua) && !window.MSStream; + isSlowDeviceResult = (iOS || android); + } catch (e) { + isSlowDeviceResult = false; + } + + return isSlowDeviceResult; +}; + +NETDATA.guid = function () { + function s4() { + return Math.floor((1 + Math.random()) * 0x10000) + .toString(16) + .substring(1); + } + + return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4(); +}; + +NETDATA.zeropad = function (x) { + if (x > -10 && x < 10) { + return '0' + x.toString(); + } else { + return x.toString(); + } +}; + +NETDATA.seconds4human = function (seconds, options) { + let defaultOptions = { + now: 'now', + space: ' ', + negative_suffix: 'ago', + day: 'day', + days: 'days', + hour: 'hour', + hours: 'hours', + minute: 'min', + minutes: 'mins', + second: 'sec', + seconds: 'secs', + and: 'and' + }; + + if (typeof options !== 'object') { + options = defaultOptions; + } else { + for (var x in defaultOptions) { + if (typeof options[x] !== 'string') { + options[x] = defaultOptions[x]; + } + } + } + + if (typeof seconds === 'string') { + seconds = parseInt(seconds, 10); + } + + if (seconds === 0) { + return options.now; + } + + let suffix = ''; + if (seconds < 0) { + seconds = -seconds; + if (options.negative_suffix !== '') { + suffix = options.space + options.negative_suffix; + } + } + + let days = Math.floor(seconds / 86400); + seconds -= (days * 86400); + + let hours = Math.floor(seconds / 3600); + seconds -= (hours * 3600); + + let minutes = Math.floor(seconds / 60); + seconds -= (minutes * 60); + + let strings = []; + + if (days > 1) { + strings.push(days.toString() + options.space + options.days); + } else if (days === 1) { + strings.push(days.toString() + options.space + options.day); + } + + if (hours > 1) { + strings.push(hours.toString() + options.space + options.hours); + } else if (hours === 1) { + strings.push(hours.toString() + options.space + options.hour); + } + + if (minutes > 1) { + strings.push(minutes.toString() + options.space + options.minutes); + } else if (minutes === 1) { + strings.push(minutes.toString() + options.space + options.minute); + } + + if (seconds > 1) { + strings.push(Math.floor(seconds).toString() + options.space + options.seconds); + } else if (seconds === 1) { + strings.push(Math.floor(seconds).toString() + options.space + options.second); + } + + if (strings.length === 1) { + return strings.pop() + suffix; + } + + let last = strings.pop(); + return strings.join(", ") + " " + options.and + " " + last + suffix; +}; + +// ---------------------------------------------------------------------------------------------------------------- +// element data attributes + +NETDATA.dataAttribute = function (element, attribute, def) { + let key = 'data-' + attribute.toString(); + if (element.hasAttribute(key)) { + let data = element.getAttribute(key); + + if (data === 'true') { + return true; + } + if (data === 'false') { + return false; + } + if (data === 'null') { + return null; + } + + // Only convert to a number if it doesn't change the string + if (data === +data + '') { + return +data; + } + + if (/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/.test(data)) { + return JSON.parse(data); + } + + return data; + } else { + return def; + } +}; + +NETDATA.dataAttributeBoolean = function (element, attribute, def) { + let value = NETDATA.dataAttribute(element, attribute, def); + + if (value === true || value === false) // gmosx: Love this :) + { + return value; + } + + if (typeof(value) === 'string') { + if (value === 'yes' || value === 'on') { + return true; + } + + if (value === '' || value === 'no' || value === 'off' || value === 'null') { + return false; + } + + return def; + } + + if (typeof(value) === 'number') { + return value !== 0; + } + + return def; +}; + +// ---------------------------------------------------------------------------------------------------------------- +// fast numbers formatting + +NETDATA.fastNumberFormat = { + formattersFixed: [], + formattersZeroBased: [], + + // this is the fastest and the preferred + getIntlNumberFormat: function (min, max) { + let key = max; + if (min === max) { + if (typeof this.formattersFixed[key] === 'undefined') { + this.formattersFixed[key] = new Intl.NumberFormat(undefined, { + // style: 'decimal', + // minimumIntegerDigits: 1, + // minimumSignificantDigits: 1, + // maximumSignificantDigits: 1, + useGrouping: true, + minimumFractionDigits: min, + maximumFractionDigits: max + }); + } + + return this.formattersFixed[key]; + } else if (min === 0) { + if (typeof this.formattersZeroBased[key] === 'undefined') { + this.formattersZeroBased[key] = new Intl.NumberFormat(undefined, { + // style: 'decimal', + // minimumIntegerDigits: 1, + // minimumSignificantDigits: 1, + // maximumSignificantDigits: 1, + useGrouping: true, + minimumFractionDigits: min, + maximumFractionDigits: max + }); + } + + return this.formattersZeroBased[key]; + } else { + // this is never used + // it is added just for completeness + return new Intl.NumberFormat(undefined, { + // style: 'decimal', + // minimumIntegerDigits: 1, + // minimumSignificantDigits: 1, + // maximumSignificantDigits: 1, + useGrouping: true, + minimumFractionDigits: min, + maximumFractionDigits: max + }); + } + }, + + // this respects locale + getLocaleString: function (min, max) { + let key = max; + if (min === max) { + if (typeof this.formattersFixed[key] === 'undefined') { + this.formattersFixed[key] = { + format: function (value) { + return value.toLocaleString(undefined, { + // style: 'decimal', + // minimumIntegerDigits: 1, + // minimumSignificantDigits: 1, + // maximumSignificantDigits: 1, + useGrouping: true, + minimumFractionDigits: min, + maximumFractionDigits: max + }); + } + }; + } + + return this.formattersFixed[key]; + } else if (min === 0) { + if (typeof this.formattersZeroBased[key] === 'undefined') { + this.formattersZeroBased[key] = { + format: function (value) { + return value.toLocaleString(undefined, { + // style: 'decimal', + // minimumIntegerDigits: 1, + // minimumSignificantDigits: 1, + // maximumSignificantDigits: 1, + useGrouping: true, + minimumFractionDigits: min, + maximumFractionDigits: max + }); + } + }; + } + + return this.formattersZeroBased[key]; + } else { + return { + format: function (value) { + return value.toLocaleString(undefined, { + // style: 'decimal', + // minimumIntegerDigits: 1, + // minimumSignificantDigits: 1, + // maximumSignificantDigits: 1, + useGrouping: true, + minimumFractionDigits: min, + maximumFractionDigits: max + }); + } + }; + } + }, + + // the fallback + getFixed: function (min, max) { + let key = max; + if (min === max) { + if (typeof this.formattersFixed[key] === 'undefined') { + this.formattersFixed[key] = { + format: function (value) { + if (value === 0) { + return "0"; + } + return value.toFixed(max); + } + }; + } + + return this.formattersFixed[key]; + } else if (min === 0) { + if (typeof this.formattersZeroBased[key] === 'undefined') { + this.formattersZeroBased[key] = { + format: function (value) { + if (value === 0) { + return "0"; + } + return value.toFixed(max); + } + }; + } + + return this.formattersZeroBased[key]; + } else { + return { + format: function (value) { + if (value === 0) { + return "0"; + } + return value.toFixed(max); + } + }; + } + }, + + testIntlNumberFormat: function () { + let value = 1.12345; + let e1 = "1.12", e2 = "1,12"; + let s = ""; + + try { + let x = new Intl.NumberFormat(undefined, { + useGrouping: true, + minimumFractionDigits: 2, + maximumFractionDigits: 2 + }); + + s = x.format(value); + } catch (e) { + s = ""; + } + + // console.log('NumberFormat: ', s); + return (s === e1 || s === e2); + }, + + testLocaleString: function () { + let value = 1.12345; + let e1 = "1.12", e2 = "1,12"; + let s = ""; + + try { + s = value.toLocaleString(undefined, { + useGrouping: true, + minimumFractionDigits: 2, + maximumFractionDigits: 2 + }); + } catch (e) { + s = ""; + } + + // console.log('localeString: ', s); + return (s === e1 || s === e2); + }, + + // on first run we decide which formatter to use + get: function (min, max) { + if (this.testIntlNumberFormat()) { + // console.log('numberformat'); + this.get = this.getIntlNumberFormat; + } else if (this.testLocaleString()) { + // console.log('localestring'); + this.get = this.getLocaleString; + } else { + // console.log('fixed'); + this.get = this.getFixed; + } + return this.get(min, max); + } +}; + +// ---------------------------------------------------------------------------------------------------------------- +// Detect the netdata server + +// http://stackoverflow.com/questions/984510/what-is-my-script-src-url +// http://stackoverflow.com/questions/6941533/get-protocol-domain-and-port-from-url +NETDATA._scriptSource = function () { + let script = null; + + if (typeof document.currentScript !== 'undefined') { + script = document.currentScript; + } else { + const all_scripts = document.getElementsByTagName('script'); + script = all_scripts[all_scripts.length - 1]; + } + + if (typeof script.getAttribute.length !== 'undefined') { + script = script.src; + } else { + script = script.getAttribute('src', -1); + } + + return script; +}; + +// *** src/dashboard.js/server-detection.js + +if (typeof netdataServer !== 'undefined') { + NETDATA.serverDefault = netdataServer; +} else { + let s = NETDATA._scriptSource(); + if (s) { + NETDATA.serverDefault = s.replace(/\/dashboard.js(\?.*)?$/g, ""); + } else { + console.log('WARNING: Cannot detect the URL of the netdata server.'); + NETDATA.serverDefault = null; + } +} + +if (NETDATA.serverDefault === null) { + NETDATA.serverDefault = ''; +} else if (NETDATA.serverDefault.slice(-1) !== '/') { + NETDATA.serverDefault += '/'; +} + +if (typeof netdataServerStatic !== 'undefined' && netdataServerStatic !== null && netdataServerStatic !== '') { + NETDATA.serverStatic = netdataServerStatic; + if (NETDATA.serverStatic.slice(-1) !== '/') { + NETDATA.serverStatic += '/'; + } +} else { + NETDATA.serverStatic = NETDATA.serverDefault; +} + +// *** src/dashboard.js/dependencies.js + +// default URLs for all the external files we need +// make them RELATIVE so that the whole thing can also be +// installed under a web server +NETDATA.jQuery = NETDATA.serverStatic + 'lib/jquery-3.6.0.min.js'; +NETDATA.peity_js = NETDATA.serverStatic + 'lib/jquery.peity-3.2.0.min.js'; +NETDATA.sparkline_js = NETDATA.serverStatic + 'lib/jquery.sparkline-2.1.2.min.js'; +NETDATA.easypiechart_js = NETDATA.serverStatic + 'lib/jquery.easypiechart-97b5824.min.js'; +NETDATA.gauge_js = NETDATA.serverStatic + 'lib/gauge-1.3.2.min.js'; +NETDATA.dygraph_js = NETDATA.serverStatic + 'lib/dygraph-c91c859.min.js'; +NETDATA.dygraph_smooth_js = NETDATA.serverStatic + 'lib/dygraph-smooth-plotter-c91c859.js'; +// NETDATA.raphael_js = NETDATA.serverStatic + 'lib/raphael-2.2.4-min.js'; +// NETDATA.c3_js = NETDATA.serverStatic + 'lib/c3-0.4.18.min.js'; +// NETDATA.c3_css = NETDATA.serverStatic + 'css/c3-0.4.18.min.css'; +NETDATA.d3pie_js = NETDATA.serverStatic + 'lib/d3pie-0.2.1-netdata-3.js'; +NETDATA.d3_js = NETDATA.serverStatic + 'lib/d3-4.12.2.min.js'; +// NETDATA.morris_js = NETDATA.serverStatic + 'lib/morris-0.5.1.min.js'; +// NETDATA.morris_css = NETDATA.serverStatic + 'css/morris-0.5.1.css'; +NETDATA.google_js = 'https://www.google.com/jsapi'; +// Error Handling + +NETDATA.errorCodes = { + 100: {message: "Cannot load chart library", alert: true}, + 101: {message: "Cannot load jQuery", alert: true}, + 402: {message: "Chart library not found", alert: false}, + 403: {message: "Chart library not enabled/is failed", alert: false}, + 404: {message: "Chart not found", alert: false}, + 405: {message: "Cannot download charts index from server", alert: true}, + 406: {message: "Invalid charts index downloaded from server", alert: true}, + 407: {message: "Cannot HELLO netdata server", alert: false}, + 408: {message: "Netdata servers sent invalid response to HELLO", alert: false}, + 409: {message: "Cannot ACCESS netdata registry", alert: false}, + 410: {message: "Netdata registry ACCESS failed", alert: false}, + 411: {message: "Netdata registry server send invalid response to DELETE ", alert: false}, + 412: {message: "Netdata registry DELETE failed", alert: false}, + 413: {message: "Netdata registry server send invalid response to SWITCH ", alert: false}, + 414: {message: "Netdata registry SWITCH failed", alert: false}, + 415: {message: "Netdata alarms download failed", alert: false}, + 416: {message: "Netdata alarms log download failed", alert: false}, + 417: {message: "Netdata registry server send invalid response to SEARCH ", alert: false}, + 418: {message: "Netdata registry SEARCH failed", alert: false} +}; + +NETDATA.errorLast = { + code: 0, + message: "", + datetime: 0 +}; + +NETDATA.error = function (code, msg) { + NETDATA.errorLast.code = code; + NETDATA.errorLast.message = msg; + NETDATA.errorLast.datetime = Date.now(); + + console.log("ERROR " + code + ": " + NETDATA.errorCodes[code].message + ": " + msg); + + let ret = true; + if (typeof netdataErrorCallback === 'function') { + ret = netdataErrorCallback('system', code, msg); + } + + if (ret && NETDATA.errorCodes[code].alert) { + alert("ERROR " + code + ": " + NETDATA.errorCodes[code].message + ": " + msg); + } +}; + +NETDATA.errorReset = function () { + NETDATA.errorLast.code = 0; + NETDATA.errorLast.message = "You are doing fine!"; + NETDATA.errorLast.datetime = 0; +}; +// *** src/dashboard.js/compatibility.js + +// Compatibility fixes. + +// fix IE issue with console +if (!window.console) { + window.console = { + log: function () { + } + }; +} + +// if string.endsWith is not defined, define it +if (typeof String.prototype.endsWith !== 'function') { + String.prototype.endsWith = function (s) { + if (s.length > this.length) { + return false; + } + return this.slice(-s.length) === s; + }; +} + +// if string.startsWith is not defined, define it +if (typeof String.prototype.startsWith !== 'function') { + String.prototype.startsWith = function (s) { + if (s.length > this.length) { + return false; + } + return this.slice(s.length) === s; + }; +} +// ---------------------------------------------------------------------------------------------------------------- +// XSS checks + +NETDATA.xss = { + enabled: (typeof netdataCheckXSS === 'undefined') ? false : netdataCheckXSS, + enabled_for_data: (typeof netdataCheckXSS === 'undefined') ? false : netdataCheckXSS, + + string: function (s) { + return s.toString() + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); + }, + + object: function (name, obj, ignore_regex) { + if (typeof ignore_regex !== 'undefined' && ignore_regex.test(name)) { + // console.log('XSS: ignoring "' + name + '"'); + return obj; + } + + switch (typeof(obj)) { + case 'string': + const ret = this.string(obj); + if (ret !== obj) { + console.log('XSS protection changed string ' + name + ' from "' + obj + '" to "' + ret + '"'); + } + return ret; + + case 'object': + if (obj === null) { + return obj; + } + + if (Array.isArray(obj)) { + // console.log('checking array "' + name + '"'); + + let len = obj.length; + while (len--) { + obj[len] = this.object(name + '[' + len + ']', obj[len], ignore_regex); + } + } else { + // console.log('checking object "' + name + '"'); + + for (var i in obj) { + if (obj.hasOwnProperty(i) === false) { + continue; + } + if (this.string(i) !== i) { + console.log('XSS protection removed invalid object member "' + name + '.' + i + '"'); + delete obj[i]; + } else { + obj[i] = this.object(name + '.' + i, obj[i], ignore_regex); + } + } + } + return obj; + + default: + return obj; + } + }, + + checkOptional: function (name, obj, ignore_regex) { + if (this.enabled) { + //console.log('XSS: checking optional "' + name + '"...'); + return this.object(name, obj, ignore_regex); + } + return obj; + }, + + checkAlways: function (name, obj, ignore_regex) { + //console.log('XSS: checking always "' + name + '"...'); + return this.object(name, obj, ignore_regex); + }, + + checkData: function (name, obj, ignore_regex) { + if (this.enabled_for_data) { + //console.log('XSS: checking data "' + name + '"...'); + return this.object(name, obj, ignore_regex); + } + return obj; + } +}; +NETDATA.colorHex2Rgb = function (hex) { + // Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF") + let shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i; + hex = hex.replace(shorthandRegex, function (m, r, g, b) { + return r + r + g + g + b + b; + }); + + let result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); + return result ? { + r: parseInt(result[1], 16), + g: parseInt(result[2], 16), + b: parseInt(result[3], 16) + } : null; +}; + +NETDATA.colorLuminance = function (hex, lum) { + // validate hex string + hex = String(hex).replace(/[^0-9a-f]/gi, ''); + if (hex.length < 6) { + hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2]; + } + + lum = lum || 0; + + // convert to decimal and change luminosity + let rgb = "#"; + for (let i = 0; i < 3; i++) { + let c = parseInt(hex.substr(i * 2, 2), 16); + c = Math.round(Math.min(Math.max(0, c + (c * lum)), 255)).toString(16); + rgb += ("00" + c).substr(c.length); + } + + return rgb; +}; +NETDATA.unitsConversion = { + keys: {}, // keys for data-common-units + latest: {}, // latest selected units for data-common-units + + globalReset: function () { + this.keys = {}; + this.latest = {}; + }, + + scalableUnits: { + 'packets/s': { + 'pps': 1, + 'Kpps': 1000, + 'Mpps': 1000000 + }, + 'pps': { + 'pps': 1, + 'Kpps': 1000, + 'Mpps': 1000000 + }, + 'kilobits/s': { + 'bits/s': 1 / 1000, + 'kilobits/s': 1, + 'megabits/s': 1000, + 'gigabits/s': 1000000, + 'terabits/s': 1000000000 + }, + 'bytes/s': { + 'bytes/s': 1, + 'kilobytes/s': 1024, + 'megabytes/s': 1024 * 1024, + 'gigabytes/s': 1024 * 1024 * 1024, + 'terabytes/s': 1024 * 1024 * 1024 * 1024 + }, + 'kilobytes/s': { + 'bytes/s': 1 / 1024, + 'kilobytes/s': 1, + 'megabytes/s': 1024, + 'gigabytes/s': 1024 * 1024, + 'terabytes/s': 1024 * 1024 * 1024 + }, + 'B/s': { + 'B/s': 1, + 'KiB/s': 1024, + 'MiB/s': 1024 * 1024, + 'GiB/s': 1024 * 1024 * 1024, + 'TiB/s': 1024 * 1024 * 1024 * 1024 + }, + 'KB/s': { + 'B/s': 1 / 1024, + 'KB/s': 1, + 'MB/s': 1024, + 'GB/s': 1024 * 1024, + 'TB/s': 1024 * 1024 * 1024 + }, + 'KiB/s': { + 'B/s': 1 / 1024, + 'KiB/s': 1, + 'MiB/s': 1024, + 'GiB/s': 1024 * 1024, + 'TiB/s': 1024 * 1024 * 1024 + }, + 'B': { + 'B': 1, + 'KiB': 1024, + 'MiB': 1024 * 1024, + 'GiB': 1024 * 1024 * 1024, + 'TiB': 1024 * 1024 * 1024 * 1024, + 'PiB': 1024 * 1024 * 1024 * 1024 * 1024 + }, + 'KB': { + 'B': 1 / 1024, + 'KB': 1, + 'MB': 1024, + 'GB': 1024 * 1024, + 'TB': 1024 * 1024 * 1024 + }, + 'KiB': { + 'B': 1 / 1024, + 'KiB': 1, + 'MiB': 1024, + 'GiB': 1024 * 1024, + 'TiB': 1024 * 1024 * 1024 + }, + 'MB': { + 'B': 1 / (1024 * 1024), + 'KB': 1 / 1024, + 'MB': 1, + 'GB': 1024, + 'TB': 1024 * 1024, + 'PB': 1024 * 1024 * 1024 + }, + 'MiB': { + 'B': 1 / (1024 * 1024), + 'KiB': 1 / 1024, + 'MiB': 1, + 'GiB': 1024, + 'TiB': 1024 * 1024, + 'PiB': 1024 * 1024 * 1024 + }, + 'GB': { + 'B': 1 / (1024 * 1024 * 1024), + 'KB': 1 / (1024 * 1024), + 'MB': 1 / 1024, + 'GB': 1, + 'TB': 1024, + 'PB': 1024 * 1024, + 'EB': 1024 * 1024 * 1024 + }, + 'GiB': { + 'B': 1 / (1024 * 1024 * 1024), + 'KiB': 1 / (1024 * 1024), + 'MiB': 1 / 1024, + 'GiB': 1, + 'TiB': 1024, + 'PiB': 1024 * 1024, + 'EiB': 1024 * 1024 * 1024 + }, + 'num': { + 'num': 1, + 'num (K)': 1000, + 'num (M)': 1000000, + 'num (G)': 1000000000, + 'num (T)': 1000000000000 + } + /* + 'milliseconds': { + 'seconds': 1000 + }, + 'seconds': { + 'milliseconds': 0.001, + 'seconds': 1, + 'minutes': 60, + 'hours': 3600, + 'days': 86400 + } + */ + }, + + convertibleUnits: { + 'Celsius': { + 'Fahrenheit': { + check: function (max) { + void(max); + return NETDATA.options.current.temperature === 'fahrenheit'; + }, + convert: function (value) { + return value * 9 / 5 + 32; + } + } + }, + 'celsius': { + 'fahrenheit': { + check: function (max) { + void(max); + return NETDATA.options.current.temperature === 'fahrenheit'; + }, + convert: function (value) { + return value * 9 / 5 + 32; + } + } + }, + 'seconds': { + 'time': { + check: function (max) { + void(max); + return NETDATA.options.current.seconds_as_time; + }, + convert: function (seconds) { + return NETDATA.unitsConversion.seconds2time(seconds); + } + } + }, + 'milliseconds': { + 'milliseconds': { + check: function (max) { + return NETDATA.options.current.seconds_as_time && max < 1000; + }, + convert: function (milliseconds) { + let tms = Math.round(milliseconds * 10); + milliseconds = Math.floor(tms / 10); + + tms -= milliseconds * 10; + + return (milliseconds).toString() + '.' + tms.toString(); + } + }, + 'seconds': { + check: function (max) { + return NETDATA.options.current.seconds_as_time && max >= 1000 && max < 60000; + }, + convert: function (milliseconds) { + milliseconds = Math.round(milliseconds); + + let seconds = Math.floor(milliseconds / 1000); + milliseconds -= seconds * 1000; + + milliseconds = Math.round(milliseconds / 10); + + return seconds.toString() + '.' + + NETDATA.zeropad(milliseconds); + } + }, + 'M:SS.ms': { + check: function (max) { + return NETDATA.options.current.seconds_as_time && max >= 60000; + }, + convert: function (milliseconds) { + milliseconds = Math.round(milliseconds); + + let minutes = Math.floor(milliseconds / 60000); + milliseconds -= minutes * 60000; + + let seconds = Math.floor(milliseconds / 1000); + milliseconds -= seconds * 1000; + + milliseconds = Math.round(milliseconds / 10); + + return minutes.toString() + ':' + + NETDATA.zeropad(seconds) + '.' + + NETDATA.zeropad(milliseconds); + } + } + }, + 'nanoseconds': { + 'nanoseconds': { + check: function (max) { + return NETDATA.options.current.seconds_as_time && max < 1000; + }, + convert: function (nanoseconds) { + let tms = Math.round(nanoseconds * 10); + nanoseconds = Math.floor(tms / 10); + + tms -= nanoseconds * 10; + + return (nanoseconds).toString() + '.' + tms.toString(); + } + }, + 'microseconds': { + check: function (max) { + return NETDATA.options.current.seconds_as_time + && max >= 1000 && max < 1000 * 1000; + }, + convert: function (nanoseconds) { + nanoseconds = Math.round(nanoseconds); + + let microseconds = Math.floor(nanoseconds / 1000); + nanoseconds -= microseconds * 1000; + + nanoseconds = Math.round(nanoseconds / 10 ); + + return microseconds.toString() + '.' + + NETDATA.zeropad(nanoseconds); + } + }, + 'milliseconds': { + check: function (max) { + return NETDATA.options.current.seconds_as_time + && max >= 1000 * 1000 && max < 1000 * 1000 * 1000; + }, + convert: function (nanoseconds) { + nanoseconds = Math.round(nanoseconds); + + let milliseconds = Math.floor(nanoseconds / 1000 / 1000); + nanoseconds -= milliseconds * 1000 * 1000; + + nanoseconds = Math.round(nanoseconds / 1000 / 10); + + return milliseconds.toString() + '.' + + NETDATA.zeropad(nanoseconds); + } + }, + 'seconds': { + check: function (max) { + return NETDATA.options.current.seconds_as_time + && max >= 1000 * 1000 * 1000; + }, + convert: function (nanoseconds) { + nanoseconds = Math.round(nanoseconds); + + let seconds = Math.floor(nanoseconds / 1000 / 1000 / 1000); + nanoseconds -= seconds * 1000 * 1000 * 1000; + + nanoseconds = Math.round(nanoseconds / 1000 / 1000 / 10); + + return seconds.toString() + '.' + + NETDATA.zeropad(nanoseconds); + } + }, + } + }, + + seconds2time: function (seconds) { + seconds = Math.abs(seconds); + + let days = Math.floor(seconds / 86400); + seconds -= days * 86400; + + let hours = Math.floor(seconds / 3600); + seconds -= hours * 3600; + + let minutes = Math.floor(seconds / 60); + seconds -= minutes * 60; + + seconds = Math.round(seconds); + + let ms_txt = ''; + /* + let ms = seconds - Math.floor(seconds); + seconds -= ms; + ms = Math.round(ms * 1000); + + if (ms > 1) { + if (ms < 10) + ms_txt = '.00' + ms.toString(); + else if (ms < 100) + ms_txt = '.0' + ms.toString(); + else + ms_txt = '.' + ms.toString(); + } + */ + + return ((days > 0) ? days.toString() + 'd:' : '').toString() + + NETDATA.zeropad(hours) + ':' + + NETDATA.zeropad(minutes) + ':' + + NETDATA.zeropad(seconds) + + ms_txt; + }, + + // get a function that converts the units + // + every time units are switched call the callback + get: function (uuid, min, max, units, desired_units, common_units_name, switch_units_callback) { + // validate the parameters + if (typeof units === 'undefined') { + units = 'undefined'; + } + + // check if we support units conversion + if (typeof this.scalableUnits[units] === 'undefined' && typeof this.convertibleUnits[units] === 'undefined') { + // we can't convert these units + //console.log('DEBUG: ' + uuid.toString() + ' can\'t convert units: ' + units.toString()); + return function (value) { + return value; + }; + } + + // check if the caller wants the original units + if (typeof desired_units === 'undefined' || desired_units === null || desired_units === 'original' || desired_units === units) { + //console.log('DEBUG: ' + uuid.toString() + ' original units wanted'); + switch_units_callback(units); + return function (value) { + return value; + }; + } + + // now we know we can convert the units + // and the caller wants some kind of conversion + + let tunits = null; + let tdivider = 0; + + if (typeof this.scalableUnits[units] !== 'undefined') { + // units that can be scaled + // we decide a divider + + // console.log('NETDATA.unitsConversion.get(' + units.toString() + ', ' + desired_units.toString() + ', function()) decide divider with min = ' + min.toString() + ', max = ' + max.toString()); + + if (desired_units === 'auto') { + // the caller wants to auto-scale the units + + // find the absolute maximum value that is rendered on the chart + // based on this we decide the scale + min = Math.abs(min); + max = Math.abs(max); + if (min > max) { + max = min; + } + + // find the smallest scale that provides integers + // for (x in this.scalableUnits[units]) { + // if (this.scalableUnits[units].hasOwnProperty(x)) { + // let m = this.scalableUnits[units][x]; + // if (m <= max && m > tdivider) { + // tunits = x; + // tdivider = m; + // } + // } + // } + const sunit = this.scalableUnits[units]; + for (var x of Object.keys(sunit)) { + let m = sunit[x]; + if (m <= max && m > tdivider) { + tunits = x; + tdivider = m; + } + } + + if (tunits === null || tdivider <= 0) { + // we couldn't find one + //console.log('DEBUG: ' + uuid.toString() + ' cannot find an auto-scaling candidate for units: ' + units.toString() + ' (max: ' + max.toString() + ')'); + switch_units_callback(units); + return function (value) { + return value; + }; + } + + if (typeof common_units_name === 'string' && typeof uuid === 'string') { + // the caller wants several charts to have the same units + // data-common-units + + let common_units_key = common_units_name + '-' + units; + + // add our divider into the list of keys + let t = this.keys[common_units_key]; + if (typeof t === 'undefined') { + this.keys[common_units_key] = {}; + t = this.keys[common_units_key]; + } + t[uuid] = { + units: tunits, + divider: tdivider + }; + + // find the max divider of all charts + let common_units = t[uuid]; + for (var x in t) { + if (t.hasOwnProperty(x) && t[x].divider > common_units.divider) { + common_units = t[x]; + } + } + + // save our common_max to the latest keys + let latest = this.latest[common_units_key]; + if (typeof latest === 'undefined') { + this.latest[common_units_key] = {}; + latest = this.latest[common_units_key]; + } + latest.units = common_units.units; + latest.divider = common_units.divider; + + tunits = latest.units; + tdivider = latest.divider; + + //console.log('DEBUG: ' + uuid.toString() + ' converted units: ' + units.toString() + ' to units: ' + tunits.toString() + ' with divider ' + tdivider.toString() + ', common-units=' + common_units_name.toString() + ((t[uuid].divider !== tdivider)?' USED COMMON, mine was ' + t[uuid].units:' set common').toString()); + + // apply it to this chart + switch_units_callback(tunits); + return function (value) { + if (tdivider !== latest.divider) { + // another chart switched our common units + // we should switch them too + //console.log('DEBUG: ' + uuid + ' switching units due to a common-units change, from ' + tunits.toString() + ' to ' + latest.units.toString()); + tunits = latest.units; + tdivider = latest.divider; + switch_units_callback(tunits); + } + + return value / tdivider; + }; + } else { + // the caller did not give data-common-units + // this chart auto-scales independently of all others + //console.log('DEBUG: ' + uuid.toString() + ' converted units: ' + units.toString() + ' to units: ' + tunits.toString() + ' with divider ' + tdivider.toString() + ', autonomously'); + + switch_units_callback(tunits); + return function (value) { + return value / tdivider; + }; + } + } else { + // the caller wants specific units + + if (typeof this.scalableUnits[units][desired_units] !== 'undefined') { + // all good, set the new units + tdivider = this.scalableUnits[units][desired_units]; + // console.log('DEBUG: ' + uuid.toString() + ' converted units: ' + units.toString() + ' to units: ' + desired_units.toString() + ' with divider ' + tdivider.toString() + ', by reference'); + switch_units_callback(desired_units); + return function (value) { + return value / tdivider; + }; + } else { + // oops! switch back to original units + console.log('Units conversion from ' + units.toString() + ' to ' + desired_units.toString() + ' is not supported.'); + switch_units_callback(units); + return function (value) { + return value; + }; + } + } + } else if (typeof this.convertibleUnits[units] !== 'undefined') { + // units that can be converted + if (desired_units === 'auto') { + for (var x in this.convertibleUnits[units]) { + if (this.convertibleUnits[units].hasOwnProperty(x)) { + if (this.convertibleUnits[units][x].check(max)) { + //console.log('DEBUG: ' + uuid.toString() + ' converting ' + units.toString() + ' to: ' + x.toString()); + switch_units_callback(x); + return this.convertibleUnits[units][x].convert; + } + } + } + + // none checked ok + //console.log('DEBUG: ' + uuid.toString() + ' no conversion available for ' + units.toString() + ' to: ' + desired_units.toString()); + switch_units_callback(units); + return function (value) { + return value; + }; + } else if (typeof this.convertibleUnits[units][desired_units] !== 'undefined') { + switch_units_callback(desired_units); + return this.convertibleUnits[units][desired_units].convert; + } else { + console.log('Units conversion from ' + units.toString() + ' to ' + desired_units.toString() + ' is not supported.'); + switch_units_callback(units); + return function (value) { + return value; + }; + } + } else { + // hm... did we forget to implement the new type? + console.log(`Unmatched unit conversion method for units ${units.toString()}`); + switch_units_callback(units); + return function (value) { + return value; + }; + } + } +}; + +NETDATA.icons = { + left: '', + reset: '', + right: '', + zoomIn: '', + zoomOut: '', + resize: '', + lineChart: '', + areaChart: '', + noChart: '', + loading: '', + noData: '' +}; + +if (typeof netdataIcons === 'object') { + // for (let icon in NETDATA.icons) { + // if (NETDATA.icons.hasOwnProperty(icon) && typeof(netdataIcons[icon]) === 'string') + // NETDATA.icons[icon] = netdataIcons[icon]; + // } + for (var icon of Object.keys(NETDATA.icons)) { + if (typeof(netdataIcons[icon]) === 'string') { + NETDATA.icons[icon] = netdataIcons[icon] + } + } +} + +if (typeof netdataSnapshotData === 'undefined') { + netdataSnapshotData = null; +} + +if (typeof netdataShowHelp === 'undefined') { + netdataShowHelp = true; +} + +if (typeof netdataShowAlarms === 'undefined') { + netdataShowAlarms = false; +} + +if (typeof netdataRegistryAfterMs !== 'number' || netdataRegistryAfterMs < 0) { + netdataRegistryAfterMs = 0; // 1500; +} + +if (typeof netdataRegistry === 'undefined') { + // backward compatibility + netdataRegistry = (typeof netdataNoRegistry !== 'undefined' && netdataNoRegistry === false); +} + +if (netdataRegistry === false && typeof netdataRegistryCallback === 'function') { + netdataRegistry = true; +} + +// ---------------------------------------------------------------------------------------------------------------- +// the defaults for all charts + +// if the user does not specify any of these, the following will be used + +NETDATA.chartDefaults = { + width: '100%', // the chart width - can be null + height: '100%', // the chart height - can be null + min_width: null, // the chart minimum width - can be null + library: 'dygraph', // the graphing library to use + method: 'average', // the grouping method + before: 0, // panning + after: -600, // panning + pixels_per_point: 1, // the detail of the chart + fill_luminance: 0.8 // luminance of colors in solid areas +}; + +// ---------------------------------------------------------------------------------------------------------------- +// global options + +NETDATA.options = { + pauseCallback: null, // a callback when we are really paused + + pause: false, // when enabled we don't auto-refresh the charts + + targets: [], // an array of all the state objects that are + // currently active (independently of their + // viewport visibility) + + updated_dom: true, // when true, the DOM has been updated with + // new elements we have to check. + + auto_refresher_fast_weight: 0, // this is the current time in ms, spent + // rendering charts continuously. + // used with .current.fast_render_timeframe + + page_is_visible: true, // when true, this page is visible + + auto_refresher_stop_until: 0, // timestamp in ms - used internally, to stop the + // auto-refresher for some time (when a chart is + // performing pan or zoom, we need to stop refreshing + // all other charts, to have the maximum speed for + // rendering the chart that is panned or zoomed). + // Used with .current.global_pan_sync_time + + on_scroll_refresher_stop_until: 0, // timestamp in ms - used to stop evaluating + // charts for some time, after a page scroll + + last_page_resize: Date.now(), // the timestamp of the last resize request + + last_page_scroll: 0, // the timestamp the last time the page was scrolled + + browser_timezone: 'unknown', // timezone detected by javascript + server_timezone: 'unknown', // timezone reported by the server + + force_data_points: 0, // force the number of points to be returned for charts + fake_chart_rendering: false, // when set to true, the dashboard will download data but will not render the charts + + passive_events: null, // true if the browser supports passive events + + // the current profile + // we may have many... + current: { + units: 'auto', // can be 'auto' or 'original' + temperature: 'celsius', // can be 'celsius' or 'fahrenheit' + seconds_as_time: true, // show seconds as DDd:HH:MM:SS ? + timezone: 'default', // the timezone to use, or 'default' + user_set_server_timezone: 'default', // as set by the user on the dashboard + + legend_toolbox: true, // show the legend toolbox on charts + resize_charts: true, // show the resize handler on charts + + pixels_per_point: isSlowDevice() ? 5 : 1, // the minimum pixels per point for all charts + // increase this to speed javascript up + // each chart library has its own limit too + // the max of this and the chart library is used + // the final is calculated every time, so a change + // here will have immediate effect on the next chart + // update + + idle_between_charts: 100, // ms - how much time to wait between chart updates + + fast_render_timeframe: 200, // ms - render continuously until this time of continuous + // rendering has been reached + // this setting is used to make it render e.g. 10 + // charts at once, sleep idle_between_charts time + // and continue for another 10 charts. + + idle_between_loops: 500, // ms - if all charts have been updated, wait this + // time before starting again. + + idle_parallel_loops: 100, // ms - the time between parallel refresher updates + + idle_lost_focus: 500, // ms - when the window does not have focus, check + // if focus has been regained, every this time + + global_pan_sync_time: 300, // ms - when you pan or zoom a chart, the background + // auto-refreshing of charts is paused for this amount + // of time + + sync_selection_delay: 400, // ms - when you pan or zoom a chart, wait this amount + // of time before setting up synchronized selections + // on hover. + + sync_selection: true, // enable or disable selection sync + + pan_and_zoom_delay: 50, // when panning or zooming, how ofter to update the chart + + sync_pan_and_zoom: true, // enable or disable pan and zoom sync + + pan_and_zoom_data_padding: true, // fetch more data for the master chart when panning or zooming + + update_only_visible: true, // enable or disable visibility management / used for printing + + parallel_refresher: !isSlowDevice(), // enable parallel refresh of charts + + concurrent_refreshes: true, // when parallel_refresher is enabled, sync also the charts + + destroy_on_hide: isSlowDevice(), // destroy charts when they are not visible + + show_help: netdataShowHelp, // when enabled the charts will show some help + show_help_delay_show_ms: 500, + show_help_delay_hide_ms: 0, + + eliminate_zero_dimensions: true, // do not show dimensions with just zeros + + stop_updates_when_focus_is_lost: true, // boolean - shall we stop auto-refreshes when document does not have user focus + stop_updates_while_resizing: 1000, // ms - time to stop auto-refreshes while resizing the charts + + double_click_speed: 500, // ms - time between clicks / taps to detect double click/tap + + smooth_plot: !isSlowDevice(), // enable smooth plot, where possible + + color_fill_opacity_line: 1.0, + color_fill_opacity_area: 0.2, + color_fill_opacity_stacked: 0.8, + + pan_and_zoom_factor: 0.25, // the increment when panning and zooming with the toolbox + pan_and_zoom_factor_multiplier_control: 2.0, + pan_and_zoom_factor_multiplier_shift: 3.0, + pan_and_zoom_factor_multiplier_alt: 4.0, + + abort_ajax_on_scroll: false, // kill pending ajax page scroll + async_on_scroll: false, // sync/async onscroll handler + onscroll_worker_duration_threshold: 30, // time in ms, for async scroll handler + + retries_on_data_failures: 3, // how many retries to make if we can't fetch chart data from the server + + setOptionCallback: function () { + } + }, + + debug: { + show_boxes: false, + main_loop: false, + focus: false, + visibility: false, + chart_data_url: false, + chart_errors: true, // remember to set it to false before merging + chart_timing: false, + chart_calls: false, + libraries: false, + dygraph: false, + globalSelectionSync: false, + globalPanAndZoom: false + } +}; + +NETDATA.statistics = { + refreshes_total: 0, + refreshes_active: 0, + refreshes_active_max: 0 +}; + +// local storage options + +NETDATA.localStorage = { + default: {}, + current: {}, + callback: {} // only used for resetting back to defaults +}; + +NETDATA.localStorageTested = -1; +NETDATA.localStorageTest = function () { + if (NETDATA.localStorageTested !== -1) { + return NETDATA.localStorageTested; + } + + if (typeof Storage !== "undefined" && typeof localStorage === 'object') { + let test = 'test'; + try { + localStorage.setItem(test, test); + localStorage.removeItem(test); + NETDATA.localStorageTested = true; + } catch (e) { + NETDATA.localStorageTested = false; + } + } else { + NETDATA.localStorageTested = false; + } + + return NETDATA.localStorageTested; +}; + +NETDATA.localStorageGet = function (key, def, callback) { + let ret = def; + + if (typeof NETDATA.localStorage.default[key.toString()] === 'undefined') { + NETDATA.localStorage.default[key.toString()] = def; + NETDATA.localStorage.callback[key.toString()] = callback; + } + + if (NETDATA.localStorageTest()) { + try { + // console.log('localStorage: loading "' + key.toString() + '"'); + ret = localStorage.getItem(key.toString()); + // console.log('netdata loaded: ' + key.toString() + ' = ' + ret.toString()); + if (ret === null || ret === 'undefined') { + // console.log('localStorage: cannot load it, saving "' + key.toString() + '" with value "' + JSON.stringify(def) + '"'); + localStorage.setItem(key.toString(), JSON.stringify(def)); + ret = def; + } else { + // console.log('localStorage: got "' + key.toString() + '" with value "' + ret + '"'); + ret = JSON.parse(ret); + // console.log('localStorage: loaded "' + key.toString() + '" as value ' + ret + ' of type ' + typeof(ret)); + } + } catch (error) { + console.log('localStorage: failed to read "' + key.toString() + '", using default: "' + def.toString() + '"'); + ret = def; + } + } + + if (typeof ret === 'undefined' || ret === 'undefined') { + console.log('localStorage: LOADED UNDEFINED "' + key.toString() + '" as value ' + ret + ' of type ' + typeof(ret)); + ret = def; + } + + NETDATA.localStorage.current[key.toString()] = ret; + return ret; +}; + +NETDATA.localStorageSet = function (key, value, callback) { + if (typeof value === 'undefined' || value === 'undefined') { + console.log('localStorage: ATTEMPT TO SET UNDEFINED "' + key.toString() + '" as value ' + value + ' of type ' + typeof(value)); + } + + if (typeof NETDATA.localStorage.default[key.toString()] === 'undefined') { + NETDATA.localStorage.default[key.toString()] = value; + NETDATA.localStorage.current[key.toString()] = value; + NETDATA.localStorage.callback[key.toString()] = callback; + } + + if (NETDATA.localStorageTest()) { + // console.log('localStorage: saving "' + key.toString() + '" with value "' + JSON.stringify(value) + '"'); + try { + localStorage.setItem(key.toString(), JSON.stringify(value)); + } catch (e) { + console.log('localStorage: failed to save "' + key.toString() + '" with value: "' + value.toString() + '"'); + } + } + + NETDATA.localStorage.current[key.toString()] = value; + return value; +}; + +NETDATA.localStorageGetRecursive = function (obj, prefix, callback) { + let keys = Object.keys(obj); + let len = keys.length; + while (len--) { + let i = keys[len]; + + if (typeof obj[i] === 'object') { + //console.log('object ' + prefix + '.' + i.toString()); + NETDATA.localStorageGetRecursive(obj[i], prefix + '.' + i.toString(), callback); + continue; + } + + obj[i] = NETDATA.localStorageGet(prefix + '.' + i.toString(), obj[i], callback); + } +}; + +NETDATA.setOption = function (key, value) { + if (key.toString() === 'setOptionCallback') { + if (typeof NETDATA.options.current.setOptionCallback === 'function') { + NETDATA.options.current[key.toString()] = value; + NETDATA.options.current.setOptionCallback(); + } + } else if (NETDATA.options.current[key.toString()] !== value) { + let name = 'options.' + key.toString(); + + if (typeof NETDATA.localStorage.default[name.toString()] === 'undefined') { + console.log('localStorage: setOption() on unsaved option: "' + name.toString() + '", value: ' + value); + } + + //console.log(NETDATA.localStorage); + //console.log('setOption: setting "' + key.toString() + '" to "' + value + '" of type ' + typeof(value) + ' original type ' + typeof(NETDATA.options.current[key.toString()])); + //console.log(NETDATA.options); + NETDATA.options.current[key.toString()] = NETDATA.localStorageSet(name.toString(), value, null); + + if (typeof NETDATA.options.current.setOptionCallback === 'function') { + NETDATA.options.current.setOptionCallback(); + } + } + + return true; +}; + +NETDATA.getOption = function (key) { + return NETDATA.options.current[key.toString()]; +}; + +// read settings from local storage +NETDATA.localStorageGetRecursive(NETDATA.options.current, 'options', null); + +// always start with this option enabled. +NETDATA.setOption('stop_updates_when_focus_is_lost', true); + +NETDATA.resetOptions = function () { + let keys = Object.keys(NETDATA.localStorage.default); + let len = keys.length; + + while (len--) { + let i = keys[len]; + let a = i.split('.'); + + if (a[0] === 'options') { + if (a[1] === 'setOptionCallback') { + continue; + } + if (typeof NETDATA.localStorage.default[i] === 'undefined') { + continue; + } + if (NETDATA.options.current[i] === NETDATA.localStorage.default[i]) { + continue; + } + + NETDATA.setOption(a[1], NETDATA.localStorage.default[i]); + } else if (a[0] === 'chart_heights') { + if (typeof NETDATA.localStorage.callback[i] === 'function' && typeof NETDATA.localStorage.default[i] !== 'undefined') { + NETDATA.localStorage.callback[i](NETDATA.localStorage.default[i]); + } + } + } + + NETDATA.dateTime.init(NETDATA.options.current.timezone); +}; + +// *** src/dashboard.js/timeout.js + +// TODO: Better name needed + +NETDATA.timeout = { + // by default, these are just wrappers to setTimeout() / clearTimeout() + + step: function (callback) { + return window.setTimeout(callback, 1000 / 60); + }, + + set: function (callback, delay) { + return window.setTimeout(callback, delay); + }, + + clear: function (id) { + return window.clearTimeout(id); + }, + + init: function () { + let custom = true; + + if (window.requestAnimationFrame) { + this.step = function (callback) { + return window.requestAnimationFrame(callback); + }; + + this.clear = function (handle) { + return window.cancelAnimationFrame(handle.value); + }; + // } else if (window.webkitRequestAnimationFrame) { + // this.step = function (callback) { + // return window.webkitRequestAnimationFrame(callback); + // }; + + // if (window.webkitCancelAnimationFrame) { + // this.clear = function (handle) { + // return window.webkitCancelAnimationFrame(handle.value); + // }; + // } else if (window.webkitCancelRequestAnimationFrame) { + // this.clear = function (handle) { + // return window.webkitCancelRequestAnimationFrame(handle.value); + // }; + // } + // } else if (window.mozRequestAnimationFrame) { + // this.step = function (callback) { + // return window.mozRequestAnimationFrame(callback); + // }; + + // this.clear = function (handle) { + // return window.mozCancelRequestAnimationFrame(handle.value); + // }; + // } else if (window.oRequestAnimationFrame) { + // this.step = function (callback) { + // return window.oRequestAnimationFrame(callback); + // }; + + // this.clear = function (handle) { + // return window.oCancelRequestAnimationFrame(handle.value); + // }; + // } else if (window.msRequestAnimationFrame) { + // this.step = function (callback) { + // return window.msRequestAnimationFrame(callback); + // }; + + // this.clear = function (handle) { + // return window.msCancelRequestAnimationFrame(handle.value); + // }; + } else { + custom = false; + } + + if (custom) { + // we have installed custom .step() / .clear() functions + // overwrite the .set() too + + this.set = function (callback, delay) { + let start = Date.now(), + handle = new Object(); + + const loop = () => { + let current = Date.now(), + delta = current - start; + + if (delta >= delay) { + callback.call(); + } else { + handle.value = this.step(loop); + } + } + + handle.value = this.step(loop); + return handle; + }; + } + } +}; + +NETDATA.timeout.init(); +// Codacy declarations +/* global netdataTheme */ + +NETDATA.themes = { + white: { + bootstrap_css: NETDATA.serverStatic + 'css/bootstrap-3.3.7.css', + dashboard_css: NETDATA.serverStatic + 'dashboard.css?v20190902-0', + background: '#FFFFFF', + foreground: '#000000', + grid: '#F0F0F0', + axis: '#F0F0F0', + highlight: '#F5F5F5', + colors: ['#3366CC', '#DC3912', '#109618', '#FF9900', '#990099', '#DD4477', + '#3B3EAC', '#66AA00', '#0099C6', '#B82E2E', '#AAAA11', '#5574A6', + '#994499', '#22AA99', '#6633CC', '#E67300', '#316395', '#8B0707', + '#329262', '#3B3EAC'], + easypiechart_track: '#f0f0f0', + easypiechart_scale: '#dfe0e0', + gauge_pointer: '#C0C0C0', + gauge_stroke: '#F0F0F0', + gauge_gradient: false, + d3pie: { + title: '#333333', + subtitle: '#666666', + footer: '#888888', + other: '#aaaaaa', + mainlabel: '#333333', + percentage: '#dddddd', + value: '#aaaa22', + tooltip_bg: '#000000', + tooltip_fg: '#efefef', + segment_stroke: "#ffffff", + gradient_color: '#000000' + } + }, + slate: { + bootstrap_css: NETDATA.serverStatic + 'css/bootstrap-slate-flat-3.3.7.css?v20161229-1', + dashboard_css: NETDATA.serverStatic + 'dashboard.slate.css?v20190902-0', + background: '#272b30', + foreground: '#C8C8C8', + grid: '#283236', + axis: '#283236', + highlight: '#383838', + /* colors: [ '#55bb33', '#ff2222', '#0099C6', '#faa11b', '#adbce0', '#DDDD00', + '#4178ba', '#f58122', '#a5cc39', '#f58667', '#f5ef89', '#cf93c0', + '#a5d18a', '#b8539d', '#3954a3', '#c8a9cf', '#c7de8a', '#fad20a', + '#a6a479', '#a66da8' ], + */ + colors: ['#66AA00', '#FE3912', '#3366CC', '#D66300', '#0099C6', '#DDDD00', + '#5054e6', '#EE9911', '#BB44CC', '#e45757', '#ef0aef', '#CC7700', + '#22AA99', '#109618', '#905bfd', '#f54882', '#4381bf', '#ff3737', + '#329262', '#3B3EFF'], + easypiechart_track: '#373b40', + easypiechart_scale: '#373b40', + gauge_pointer: '#474b50', + gauge_stroke: '#373b40', + gauge_gradient: false, + d3pie: { + title: '#C8C8C8', + subtitle: '#283236', + footer: '#283236', + other: '#283236', + mainlabel: '#C8C8C8', + percentage: '#dddddd', + value: '#cccc44', + tooltip_bg: '#272b30', + tooltip_fg: '#C8C8C8', + segment_stroke: "#283236", + gradient_color: '#000000' + } + } +}; + +if (typeof netdataTheme !== 'undefined' && typeof NETDATA.themes[netdataTheme] !== 'undefined') { + NETDATA.themes.current = NETDATA.themes[netdataTheme]; +} else { + NETDATA.themes.current = NETDATA.themes.white; +} + +NETDATA.colors = NETDATA.themes.current.colors; + +// these are the colors Google Charts are using +// we have them here to attempt emulate their look and feel on the other chart libraries +// http://there4.io/2012/05/02/google-chart-color-list/ +//NETDATA.colors = [ '#3366CC', '#DC3912', '#FF9900', '#109618', '#990099', '#3B3EAC', '#0099C6', +// '#DD4477', '#66AA00', '#B82E2E', '#316395', '#994499', '#22AA99', '#AAAA11', +// '#6633CC', '#E67300', '#8B0707', '#329262', '#5574A6', '#3B3EAC' ]; + +// an alternative set +// http://www.mulinblog.com/a-color-palette-optimized-for-data-visualization/ +// (blue) (red) (orange) (green) (pink) (brown) (purple) (yellow) (gray) +//NETDATA.colors = [ '#5DA5DA', '#F15854', '#FAA43A', '#60BD68', '#F17CB0', '#B2912F', '#B276B2', '#DECF3F', '#4D4D4D' ]; +// dygraph + +// Codacy declarations +/* global smoothPlotter */ +/* global Dygraph */ + +NETDATA.dygraph = { + smooth: false +}; + +NETDATA.dygraphToolboxPanAndZoom = function (state, after, before) { + if (after < state.netdata_first) { + after = state.netdata_first; + } + + if (before > state.netdata_last) { + before = state.netdata_last; + } + + state.setMode('zoom'); + NETDATA.globalSelectionSync.stop(); + NETDATA.globalSelectionSync.delay(); + state.tmp.dygraph_user_action = true; + state.tmp.dygraph_force_zoom = true; + // state.log('toolboxPanAndZoom'); + state.updateChartPanOrZoom(after, before); + NETDATA.globalPanAndZoom.setMaster(state, after, before); +}; + +NETDATA.dygraphSetSelection = function (state, t) { + if (typeof state.tmp.dygraph_instance !== 'undefined') { + let r = state.calculateRowForTime(t); + if (r !== -1) { + state.tmp.dygraph_instance.setSelection(r); + return true; + } else { + state.tmp.dygraph_instance.clearSelection(); + state.legendShowUndefined(); + } + } + + return false; +}; + +NETDATA.dygraphClearSelection = function (state) { + if (typeof state.tmp.dygraph_instance !== 'undefined') { + state.tmp.dygraph_instance.clearSelection(); + } + return true; +}; + +NETDATA.dygraphSmoothInitialize = function (callback) { + $.ajax({ + url: NETDATA.dygraph_smooth_js, + cache: true, + dataType: "script", + xhrFields: {withCredentials: true} // required for the cookie + }) + .done(function () { + NETDATA.dygraph.smooth = true; + smoothPlotter.smoothing = 0.3; + }) + .fail(function () { + NETDATA.dygraph.smooth = false; + }) + .always(function () { + if (typeof callback === "function") { + return callback(); + } + }); +}; + +NETDATA.dygraphInitialize = function (callback) { + if (typeof netdataNoDygraphs === 'undefined' || !netdataNoDygraphs) { + $.ajax({ + url: NETDATA.dygraph_js, + cache: true, + dataType: "script", + xhrFields: {withCredentials: true} // required for the cookie + }) + .done(function () { + NETDATA.registerChartLibrary('dygraph', NETDATA.dygraph_js); + }) + .fail(function () { + NETDATA.chartLibraries.dygraph.enabled = false; + NETDATA.error(100, NETDATA.dygraph_js); + }) + .always(function () { + if (NETDATA.chartLibraries.dygraph.enabled && NETDATA.options.current.smooth_plot) { + NETDATA.dygraphSmoothInitialize(callback); + } else if (typeof callback === "function") { + return callback(); + } + }); + } else { + NETDATA.chartLibraries.dygraph.enabled = false; + if (typeof callback === "function") { + return callback(); + } + } +}; + +NETDATA.dygraphChartUpdate = function (state, data) { + let dygraph = state.tmp.dygraph_instance; + + if (typeof dygraph === 'undefined') { + return NETDATA.dygraphChartCreate(state, data); + } + + // when the chart is not visible, and hidden + // if there is a window resize, dygraph detects + // its element size as 0x0. + // this will make it re-appear properly + + if (state.tm.last_unhidden > state.tmp.dygraph_last_rendered) { + dygraph.resize(); + } + + let options = { + file: data.result.data, + colors: state.chartColors(), + labels: data.result.labels, + //labelsDivWidth: state.chartWidth() - 70, + includeZero: state.tmp.dygraph_include_zero, + visibility: state.dimensions_visibility.selected2BooleanArray(state.data.dimension_names) + }; + + if (state.tmp.dygraph_chart_type === 'stacked') { + if (options.includeZero && state.dimensions_visibility.countSelected() < options.visibility.length) { + options.includeZero = 0; + } + } + + if (!NETDATA.chartLibraries.dygraph.isSparkline(state)) { + options.ylabel = state.units_current; // (state.units_desired === 'auto')?"":state.units_current; + } + + if (state.tmp.dygraph_force_zoom) { + if (NETDATA.options.debug.dygraph || state.debug) { + state.log('dygraphChartUpdate() forced zoom update'); + } + + options.dateWindow = (state.requested_padding !== null) ? [state.view_after, state.view_before] : null; + //options.isZoomedIgnoreProgrammaticZoom = true; + state.tmp.dygraph_force_zoom = false; + } else if (state.current.name !== 'auto') { + if (NETDATA.options.debug.dygraph || state.debug) { + state.log('dygraphChartUpdate() loose update'); + } + } else { + if (NETDATA.options.debug.dygraph || state.debug) { + state.log('dygraphChartUpdate() strict update'); + } + + options.dateWindow = (state.requested_padding !== null) ? [state.view_after, state.view_before] : null; + //options.isZoomedIgnoreProgrammaticZoom = true; + } + + options.valueRange = state.tmp.dygraph_options.valueRange; + + let oldMax = null, oldMin = null; + if (state.tmp.__commonMin !== null) { + state.data.min = state.tmp.dygraph_instance.axes_[0].extremeRange[0]; + oldMin = options.valueRange[0] = NETDATA.commonMin.get(state); + } + if (state.tmp.__commonMax !== null) { + state.data.max = state.tmp.dygraph_instance.axes_[0].extremeRange[1]; + oldMax = options.valueRange[1] = NETDATA.commonMax.get(state); + } + + if (state.tmp.dygraph_smooth_eligible) { + if ((NETDATA.options.current.smooth_plot && state.tmp.dygraph_options.plotter !== smoothPlotter) + || (NETDATA.options.current.smooth_plot === false && state.tmp.dygraph_options.plotter === smoothPlotter)) { + NETDATA.dygraphChartCreate(state, data); + return; + } + } + + if (netdataSnapshotData !== null && NETDATA.globalPanAndZoom.isActive() && NETDATA.globalPanAndZoom.isMaster(state) === false) { + // pan and zoom on snapshots + options.dateWindow = [NETDATA.globalPanAndZoom.force_after_ms, NETDATA.globalPanAndZoom.force_before_ms]; + //options.isZoomedIgnoreProgrammaticZoom = true; + } + + if (NETDATA.chartLibraries.dygraph.isLogScale(state)) { + if (Array.isArray(options.valueRange) && options.valueRange[0] <= 0) { + options.valueRange[0] = null; + } + } + + dygraph.updateOptions(options); + + let redraw = false; + if (oldMin !== null && oldMin > state.tmp.dygraph_instance.axes_[0].extremeRange[0]) { + state.data.min = state.tmp.dygraph_instance.axes_[0].extremeRange[0]; + options.valueRange[0] = NETDATA.commonMin.get(state); + redraw = true; + } + if (oldMax !== null && oldMax < state.tmp.dygraph_instance.axes_[0].extremeRange[1]) { + state.data.max = state.tmp.dygraph_instance.axes_[0].extremeRange[1]; + options.valueRange[1] = NETDATA.commonMax.get(state); + redraw = true; + } + + if (redraw) { + // state.log('forcing redraw to adapt to common- min/max'); + dygraph.updateOptions(options); + } + + state.tmp.dygraph_last_rendered = Date.now(); + return true; +}; + +NETDATA.dygraphChartCreate = function (state, data) { + if (NETDATA.options.debug.dygraph || state.debug) { + state.log('dygraphChartCreate()'); + } + + state.tmp.dygraph_chart_type = NETDATA.dataAttribute(state.element, 'dygraph-type', state.chart.chart_type); + if (state.tmp.dygraph_chart_type === 'stacked' && data.dimensions === 1) { + state.tmp.dygraph_chart_type = 'area'; + } + if (state.tmp.dygraph_chart_type === 'stacked' && NETDATA.chartLibraries.dygraph.isLogScale(state)) { + state.tmp.dygraph_chart_type = 'area'; + } + + let highlightCircleSize = NETDATA.chartLibraries.dygraph.isSparkline(state) ? 3 : 4; + + let smooth = NETDATA.dygraph.smooth + ? (NETDATA.dataAttributeBoolean(state.element, 'dygraph-smooth', (state.tmp.dygraph_chart_type === 'line' && NETDATA.chartLibraries.dygraph.isSparkline(state) === false))) + : false; + + state.tmp.dygraph_include_zero = NETDATA.dataAttribute(state.element, 'dygraph-includezero', (state.tmp.dygraph_chart_type === 'stacked')); + let drawAxis = NETDATA.dataAttributeBoolean(state.element, 'dygraph-drawaxis', true); + + state.tmp.dygraph_options = { + colors: NETDATA.dataAttribute(state.element, 'dygraph-colors', state.chartColors()), + + // leave a few pixels empty on the right of the chart + rightGap: NETDATA.dataAttribute(state.element, 'dygraph-rightgap', 5), + showRangeSelector: NETDATA.dataAttributeBoolean(state.element, 'dygraph-showrangeselector', false), + showRoller: NETDATA.dataAttributeBoolean(state.element, 'dygraph-showroller', false), + title: NETDATA.dataAttribute(state.element, 'dygraph-title', state.title), + titleHeight: NETDATA.dataAttribute(state.element, 'dygraph-titleheight', 19), + legend: NETDATA.dataAttribute(state.element, 'dygraph-legend', 'always'), // we need this to get selection events + labels: data.result.labels, + labelsDiv: NETDATA.dataAttribute(state.element, 'dygraph-labelsdiv', state.element_legend_childs.hidden), + //labelsDivStyles: NETDATA.dataAttribute(state.element, 'dygraph-labelsdivstyles', { 'fontSize':'1px' }), + //labelsDivWidth: NETDATA.dataAttribute(state.element, 'dygraph-labelsdivwidth', state.chartWidth() - 70), + labelsSeparateLines: NETDATA.dataAttributeBoolean(state.element, 'dygraph-labelsseparatelines', true), + labelsShowZeroValues: NETDATA.chartLibraries.dygraph.isLogScale(state) ? false : NETDATA.dataAttributeBoolean(state.element, 'dygraph-labelsshowzerovalues', true), + labelsKMB: false, + labelsKMG2: false, + showLabelsOnHighlight: NETDATA.dataAttributeBoolean(state.element, 'dygraph-showlabelsonhighlight', true), + hideOverlayOnMouseOut: NETDATA.dataAttributeBoolean(state.element, 'dygraph-hideoverlayonmouseout', true), + includeZero: state.tmp.dygraph_include_zero, + xRangePad: NETDATA.dataAttribute(state.element, 'dygraph-xrangepad', 0), + yRangePad: NETDATA.dataAttribute(state.element, 'dygraph-yrangepad', 1), + valueRange: NETDATA.dataAttribute(state.element, 'dygraph-valuerange', [null, null]), + ylabel: state.units_current, // (state.units_desired === 'auto')?"":state.units_current, + yLabelWidth: NETDATA.dataAttribute(state.element, 'dygraph-ylabelwidth', 12), + + // the function to plot the chart + plotter: null, + + // The width of the lines connecting data points. + // This can be used to increase the contrast or some graphs. + strokeWidth: NETDATA.dataAttribute(state.element, 'dygraph-strokewidth', ((state.tmp.dygraph_chart_type === 'stacked') ? 0.1 : ((smooth === true) ? 1.5 : 0.7))), + strokePattern: NETDATA.dataAttribute(state.element, 'dygraph-strokepattern', undefined), + + // The size of the dot to draw on each point in pixels (see drawPoints). + // A dot is always drawn when a point is "isolated", + // i.e. there is a missing point on either side of it. + // This also controls the size of those dots. + drawPoints: NETDATA.dataAttributeBoolean(state.element, 'dygraph-drawpoints', false), + + // Draw points at the edges of gaps in the data. + // This improves visibility of small data segments or other data irregularities. + drawGapEdgePoints: NETDATA.dataAttributeBoolean(state.element, 'dygraph-drawgapedgepoints', true), + connectSeparatedPoints: NETDATA.chartLibraries.dygraph.isLogScale(state) ? false : NETDATA.dataAttributeBoolean(state.element, 'dygraph-connectseparatedpoints', false), + pointSize: NETDATA.dataAttribute(state.element, 'dygraph-pointsize', 1), + + // enabling this makes the chart with little square lines + stepPlot: NETDATA.dataAttributeBoolean(state.element, 'dygraph-stepplot', false), + + // Draw a border around graph lines to make crossing lines more easily + // distinguishable. Useful for graphs with many lines. + strokeBorderColor: NETDATA.dataAttribute(state.element, 'dygraph-strokebordercolor', NETDATA.themes.current.background), + strokeBorderWidth: NETDATA.dataAttribute(state.element, 'dygraph-strokeborderwidth', (state.tmp.dygraph_chart_type === 'stacked') ? 0.0 : 0.0), + fillGraph: NETDATA.dataAttribute(state.element, 'dygraph-fillgraph', (state.tmp.dygraph_chart_type === 'area' || state.tmp.dygraph_chart_type === 'stacked')), + fillAlpha: NETDATA.dataAttribute(state.element, 'dygraph-fillalpha', + ((state.tmp.dygraph_chart_type === 'stacked') + ? NETDATA.options.current.color_fill_opacity_stacked + : NETDATA.options.current.color_fill_opacity_area) + ), + stackedGraph: NETDATA.dataAttribute(state.element, 'dygraph-stackedgraph', (state.tmp.dygraph_chart_type === 'stacked')), + stackedGraphNaNFill: NETDATA.dataAttribute(state.element, 'dygraph-stackedgraphnanfill', 'none'), + drawAxis: drawAxis, + axisLabelFontSize: NETDATA.dataAttribute(state.element, 'dygraph-axislabelfontsize', 10), + axisLineColor: NETDATA.dataAttribute(state.element, 'dygraph-axislinecolor', NETDATA.themes.current.axis), + axisLineWidth: NETDATA.dataAttribute(state.element, 'dygraph-axislinewidth', 1.0), + drawGrid: NETDATA.dataAttributeBoolean(state.element, 'dygraph-drawgrid', true), + gridLinePattern: NETDATA.dataAttribute(state.element, 'dygraph-gridlinepattern', null), + gridLineWidth: NETDATA.dataAttribute(state.element, 'dygraph-gridlinewidth', 1.0), + gridLineColor: NETDATA.dataAttribute(state.element, 'dygraph-gridlinecolor', NETDATA.themes.current.grid), + maxNumberWidth: NETDATA.dataAttribute(state.element, 'dygraph-maxnumberwidth', 8), + sigFigs: NETDATA.dataAttribute(state.element, 'dygraph-sigfigs', null), + digitsAfterDecimal: NETDATA.dataAttribute(state.element, 'dygraph-digitsafterdecimal', 2), + valueFormatter: NETDATA.dataAttribute(state.element, 'dygraph-valueformatter', undefined), + highlightCircleSize: NETDATA.dataAttribute(state.element, 'dygraph-highlightcirclesize', highlightCircleSize), + highlightSeriesOpts: NETDATA.dataAttribute(state.element, 'dygraph-highlightseriesopts', null), // TOO SLOW: { strokeWidth: 1.5 }, + highlightSeriesBackgroundAlpha: NETDATA.dataAttribute(state.element, 'dygraph-highlightseriesbackgroundalpha', null), // TOO SLOW: (state.tmp.dygraph_chart_type === 'stacked')?0.7:0.5, + pointClickCallback: NETDATA.dataAttribute(state.element, 'dygraph-pointclickcallback', undefined), + visibility: state.dimensions_visibility.selected2BooleanArray(state.data.dimension_names), + logscale: NETDATA.chartLibraries.dygraph.isLogScale(state) ? 'y' : undefined, + + // Expects a string in the format ":
You must enable JavaScript in order to use Netdata!
You can do this in your browser settings.
\ No newline at end of file diff --git a/luci-app-netdata/root/usr/share/netdata/webcn/main.js b/luci-app-netdata/root/usr/share/netdata/webcn/main.js new file mode 100644 index 00000000..8c00600d --- /dev/null +++ b/luci-app-netdata/root/usr/share/netdata/webcn/main.js @@ -0,0 +1,5146 @@ +// Main JavaScript file for the Netdata GUI. + +// Codacy declarations +/* global NETDATA */ + +// netdata snapshot data +var netdataSnapshotData = null; + +// enable alarms checking and notifications +var netdataShowAlarms = true; + +// enable registry updates +var netdataRegistry = true; + +// forward definition only - not used here +var netdataServer = undefined; +var netdataServerStatic = undefined; +var netdataCheckXSS = undefined; + +// control the welcome modal and analytics +var this_is_demo = null; + +function escapeUserInputHTML(s) { + return s.toString() + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/#/g, '#') + .replace(/'/g, ''') + .replace(/\(/g, '(') + .replace(/\)/g, ')') + .replace(/\//g, '/'); +} + +function verifyURL(s) { + if (typeof (s) === 'string' && (s.startsWith('http://') || s.startsWith('https://'))) { + return s + .replace(/'/g, '%22') + .replace(/"/g, '%27') + .replace(/\)/g, '%28') + .replace(/\(/g, '%29'); + } + + console.log('invalid URL detected:'); + console.log(s); + return 'javascript:alert("invalid url");'; +} + +// -------------------------------------------------------------------- +// urlOptions + +var urlOptions = { + hash: '#', + theme: null, + help: null, + mode: 'live', // 'live', 'print' + update_always: false, + pan_and_zoom: false, + server: null, + after: 0, + before: 0, + highlight: false, + highlight_after: 0, + highlight_before: 0, + nowelcome: false, + show_alarms: false, + chart: null, + family: null, + alarm: null, + alarm_unique_id: 0, + alarm_id: 0, + alarm_event_id: 0, + alarm_when: 0, + + hasProperty: function (property) { + // console.log('checking property ' + property + ' of type ' + typeof(this[property])); + return typeof this[property] !== 'undefined'; + }, + + genHash: function (forReload) { + var hash = urlOptions.hash; + + if (urlOptions.pan_and_zoom === true) { + hash += ';after=' + urlOptions.after.toString() + + ';before=' + urlOptions.before.toString(); + } + + if (urlOptions.highlight === true) { + hash += ';highlight_after=' + urlOptions.highlight_after.toString() + + ';highlight_before=' + urlOptions.highlight_before.toString(); + } + + if (urlOptions.theme !== null) { + hash += ';theme=' + urlOptions.theme.toString(); + } + + if (urlOptions.help !== null) { + hash += ';help=' + urlOptions.help.toString(); + } + + if (urlOptions.update_always === true) { + hash += ';update_always=true'; + } + + if (forReload === true && urlOptions.server !== null) { + hash += ';server=' + urlOptions.server.toString(); + } + + if (urlOptions.mode !== 'live') { + hash += ';mode=' + urlOptions.mode; + } + + return hash; + }, + + parseHash: function () { + var variables = document.location.hash.split(';'); + var len = variables.length; + while (len--) { + if (len !== 0) { + var p = variables[len].split('='); + if (urlOptions.hasProperty(p[0]) && typeof p[1] !== 'undefined') { + urlOptions[p[0]] = decodeURIComponent(p[1]); + } + } else { + if (variables[len].length > 0) { + urlOptions.hash = variables[len]; + } + } + } + + var booleans = ['nowelcome', 'show_alarms', 'update_always']; + len = booleans.length; + while (len--) { + if (urlOptions[booleans[len]] === 'true' || urlOptions[booleans[len]] === true || urlOptions[booleans[len]] === '1' || urlOptions[booleans[len]] === 1) { + urlOptions[booleans[len]] = true; + } else { + urlOptions[booleans[len]] = false; + } + } + + var numeric = ['after', 'before', 'highlight_after', 'highlight_before', 'alarm_when']; + len = numeric.length; + while (len--) { + if (typeof urlOptions[numeric[len]] === 'string') { + try { + urlOptions[numeric[len]] = parseInt(urlOptions[numeric[len]]); + } + catch (e) { + console.log('failed to parse URL hash parameter ' + numeric[len]); + urlOptions[numeric[len]] = 0; + } + } + } + + if (urlOptions.alarm_when) { + // if alarm_when exists, create after/before params + // -/+ 2 minutes from the alarm, and reload the page + const alarmTime = new Date(urlOptions.alarm_when * 1000).valueOf(); + const timeMarginMs = 120000; // 2 mins + + const after = alarmTime - timeMarginMs; + const before = alarmTime + timeMarginMs; + const newHash = document.location.hash.replace( + /;alarm_when=[0-9]*/i, + ";after=" + after + ";before=" + before, + ); + history.replaceState(null, '', newHash); + location.reload(); + } + + if (urlOptions.server !== null && urlOptions.server !== '') { + netdataServerStatic = document.location.origin.toString() + document.location.pathname.toString(); + netdataServer = urlOptions.server; + netdataCheckXSS = true; + } else { + urlOptions.server = null; + } + + if (urlOptions.before > 0 && urlOptions.after > 0) { + urlOptions.pan_and_zoom = true; + urlOptions.nowelcome = true; + } else { + urlOptions.pan_and_zoom = false; + } + + if (urlOptions.highlight_before > 0 && urlOptions.highlight_after > 0) { + urlOptions.highlight = true; + } else { + urlOptions.highlight = false; + } + + switch (urlOptions.mode) { + case 'print': + urlOptions.theme = 'white'; + urlOptions.welcome = false; + urlOptions.help = false; + urlOptions.show_alarms = false; + + if (urlOptions.pan_and_zoom === false) { + urlOptions.pan_and_zoom = true; + urlOptions.before = Date.now(); + urlOptions.after = urlOptions.before - 600000; + } + + netdataShowAlarms = false; + netdataRegistry = false; + this_is_demo = false; + break; + + case 'live': + default: + urlOptions.mode = 'live'; + break; + } + + // console.log(urlOptions); + }, + + hashUpdate: function () { + history.replaceState(null, '', urlOptions.genHash(true)); + }, + + netdataPanAndZoomCallback: function (status, after, before) { + //console.log(1); + //console.log(new Error().stack); + + if (netdataSnapshotData === null) { + urlOptions.pan_and_zoom = status; + urlOptions.after = after; + urlOptions.before = before; + urlOptions.hashUpdate(); + } + }, + + netdataHighlightCallback: function (status, after, before) { + //console.log(2); + //console.log(new Error().stack); + + if (status === true && (after === null || before === null || after <= 0 || before <= 0 || after >= before)) { + status = false; + after = 0; + before = 0; + } + + if (netdataSnapshotData === null) { + urlOptions.highlight = status; + } else { + urlOptions.highlight = false; + } + + urlOptions.highlight_after = Math.round(after); + urlOptions.highlight_before = Math.round(before); + urlOptions.hashUpdate(); + + var show_eye = NETDATA.globalChartUnderlay.hasViewport(); + + if (status === true && after > 0 && before > 0 && after < before) { + var d1 = NETDATA.dateTime.localeDateString(after); + var d2 = NETDATA.dateTime.localeDateString(before); + if (d1 === d2) { + d2 = ''; + } + document.getElementById('navbar-highlight-content').innerHTML = + ((show_eye === true) ? '' : '').toString() + + 'highlighted time-frame' + + ' ' + d1 + ' ' + NETDATA.dateTime.localeTimeString(after) + ' to ' + + ' ' + d2 + ' ' + NETDATA.dateTime.localeTimeString(before) + ', ' + + 'duration ' + NETDATA.seconds4human(Math.round((before - after) / 1000)) + '' + + '' + + ''; + + $('.navbar-highlight').show(); + + $('.highlight-tooltip').tooltip({ + html: true, + delay: { show: 500, hide: 0 }, + container: 'body' + }); + } else { + $('.navbar-highlight').hide(); + } + }, + + clearHighlight: function () { + NETDATA.globalChartUnderlay.clear(); + + if (NETDATA.globalPanAndZoom.isActive() === true) { + NETDATA.globalPanAndZoom.clearMaster(); + } + }, + + showHighlight: function () { + NETDATA.globalChartUnderlay.focus(); + } +}; + +urlOptions.parseHash(); + +// -------------------------------------------------------------------- +// check options that should be processed before loading netdata.js + +var localStorageTested = -1; + +function localStorageTest() { + if (localStorageTested !== -1) { + return localStorageTested; + } + + if (typeof Storage !== "undefined" && typeof localStorage === 'object') { + var test = 'test'; + try { + localStorage.setItem(test, test); + localStorage.removeItem(test); + localStorageTested = true; + } + catch (e) { + console.log(e); + localStorageTested = false; + } + } else { + localStorageTested = false; + } + + return localStorageTested; +} + +function loadLocalStorage(name) { + var ret = null; + + try { + if (localStorageTest() === true) { + ret = localStorage.getItem(name); + } else { + console.log('localStorage is not available'); + } + } + catch (error) { + console.log(error); + return null; + } + + if (typeof ret === 'undefined' || ret === null) { + return null; + } + + // console.log('loaded: ' + name.toString() + ' = ' + ret.toString()); + + return ret; +} + +function saveLocalStorage(name, value) { + // console.log('saving: ' + name.toString() + ' = ' + value.toString()); + try { + if (localStorageTest() === true) { + localStorage.setItem(name, value.toString()); + return true; + } + } + catch (error) { + console.log(error); + } + + return false; +} + +function getTheme(def) { + if (urlOptions.mode === 'print') { + return 'white'; + } + + var ret = loadLocalStorage('netdataTheme'); + if (typeof ret === 'undefined' || ret === null || ret === 'undefined') { + return def; + } else { + return ret; + } +} + +function setTheme(theme) { + if (urlOptions.mode === 'print') { + return false; + } + + if (theme === netdataTheme) { + return false; + } + return saveLocalStorage('netdataTheme', theme); +} + +var netdataTheme = getTheme('slate'); +var netdataShowHelp = true; + +if (urlOptions.theme !== null) { + setTheme(urlOptions.theme); + netdataTheme = urlOptions.theme; +} else { + urlOptions.theme = netdataTheme; +} + +if (urlOptions.help !== null) { + saveLocalStorage('options.show_help', urlOptions.help); + netdataShowHelp = urlOptions.help; +} else { + urlOptions.help = loadLocalStorage('options.show_help'); +} + +// -------------------------------------------------------------------- +// natural sorting +// http://www.davekoelle.com/files/alphanum.js - LGPL + +function naturalSortChunkify(t) { + var tz = []; + var x = 0, y = -1, n = 0, i, j; + + while (i = (j = t.charAt(x++)).charCodeAt(0)) { + var m = (i >= 48 && i <= 57); + if (m !== n) { + tz[++y] = ""; + n = m; + } + tz[y] += j; + } + + return tz; +} + +function naturalSortCompare(a, b) { + var aa = naturalSortChunkify(a.toLowerCase()); + var bb = naturalSortChunkify(b.toLowerCase()); + + for (var x = 0; aa[x] && bb[x]; x++) { + if (aa[x] !== bb[x]) { + var c = Number(aa[x]), d = Number(bb[x]); + if (c.toString() === aa[x] && d.toString() === bb[x]) { + return c - d; + } else { + return (aa[x] > bb[x]) ? 1 : -1; + } + } + } + + return aa.length - bb.length; +} + +// -------------------------------------------------------------------- +// saving files to client + +function saveTextToClient(data, filename) { + var blob = new Blob([data], { + type: 'application/octet-stream' + }); + + var url = URL.createObjectURL(blob); + var link = document.createElement('a'); + link.setAttribute('href', url); + link.setAttribute('download', filename); + + var el = document.getElementById('hiddenDownloadLinks'); + el.innerHTML = ''; + el.appendChild(link); + + setTimeout(function () { + el.removeChild(link); + URL.revokeObjectURL(url); + }, 60); + + link.click(); +} + +function saveObjectToClient(data, filename) { + saveTextToClient(JSON.stringify(data), filename); +} + +// ----------------------------------------------------------------------------- +// registry call back to render my-netdata menu + +function toggleExpandIcon(svgEl) { + if (svgEl.getAttribute('data-icon') === 'caret-down') { + svgEl.setAttribute('data-icon', 'caret-up'); + } else { + svgEl.setAttribute('data-icon', 'caret-down'); + } +} + +function toggleAgentItem(e, guid) { + e.stopPropagation(); + e.preventDefault(); + + toggleExpandIcon(e.currentTarget.children[0]); + + const el = document.querySelector(`.agent-alternate-urls.agent-${guid}`); + if (el) { + el.classList.toggle('collapsed'); + } +} + +// When you stream metrics from netdata to netdata, the receiving netdata now +// has multiple host databases. It's own, and multiple mirrored. Mirrored databases +// can be accessed with +const OLD_DASHBOARD_SUFFIX = "old" +let isOldSuffix = true +try { + const currentScriptMainJs = document.currentScript; + const mainJsSrc = currentScriptMainJs.getAttribute("src") + isOldSuffix = mainJsSrc.startsWith("../main.js") +} catch { + console.warn("current script not detecting, assuming the dashboard is running with /old suffix") +} + +function transformWithOldSuffix(url) { + return isOldSuffix ? `../${url}` : url +} + +function renderStreamedHosts(options) { + let html = `
Databases streamed to this agent
`; + + var base = document.location.origin.toString() + + document.location.pathname.toString() + .replace(isOldSuffix ? `/${OLD_DASHBOARD_SUFFIX}` : "", ""); + if (base.endsWith("/host/" + options.hostname + "/")) { + base = base.substring(0, base.length - ("/host/" + options.hostname + "/").toString().length); + } + + if (base.endsWith("/")) { + base = base.substring(0, base.length - 1); + } + + var master = options.hosts[0].hostname; + // We sort a clone of options.hosts, to keep the master as the first element + // for future calls. + var sorted = options.hosts.slice(0).sort(function (a, b) { + if (a.hostname === master) { + return -1; + } + return naturalSortCompare(a.hostname, b.hostname); + }); + + let displayedDatabases = false; + + for (var s of sorted) { + let url, icon; + const hostname = s.hostname; + + if (myNetdataMenuFilterValue !== "") { + if (!hostname.includes(myNetdataMenuFilterValue)) { + continue; + } + } + + displayedDatabases = true; + + if (hostname === master) { + url = isOldSuffix ? `${base}/${OLD_DASHBOARD_SUFFIX}/` : `${base}/`; + icon = 'home'; + } else { + url = isOldSuffix ? `${base}/host/${hostname}/${OLD_DASHBOARD_SUFFIX}/` : `${base}/host/${hostname}/`; + icon = 'window-restore'; + } + + html += ( + `
+ + + + + ${hostname} + +
+
` + ) + } + + if (!displayedDatabases) { + html += ( + `
+ + no databases match the filter criteria. +
` + ) + } + + return html; +} + +function renderMachines(machinesArray) { + let html = `
My nodes
`; + + if (machinesArray === null) { + let ret = loadLocalStorage("registryCallback"); + if (ret) { + machinesArray = JSON.parse(ret); + console.log("failed to contact the registry - loaded registry data from browser local storage"); + } + } + + let found = false; + let displayedAgents = false; + + const maskedURL = NETDATA.registry.MASKED_DATA; + + if (machinesArray) { + saveLocalStorage("registryCallback", JSON.stringify(machinesArray)); + + var machines = machinesArray.sort(function (a, b) { + return naturalSortCompare(a.name, b.name); + }); + + for (var machine of machines) { + found = true; + + if (myNetdataMenuFilterValue !== "") { + if (!machine.name.includes(myNetdataMenuFilterValue)) { + continue; + } + } + + displayedAgents = true; + + const alternateUrlItems = ( + `` + ) + + html += ( + ` + ${alternateUrlItems}` + ) + } + + if (found && (!displayedAgents)) { + html += ( + `
+ + zero nodes are matching the filter value. +
` + ) + } + } + + if (!found) { + if (machines) { + html += ( + `` + ) + } else { + html += ( + `` + ) + } + + html += `
`; + html += `
Demo netdata nodes
`; + + const demoServers = [ + { url: "//london.netdata.rocks/default.html", title: "UK - London (DigitalOcean.com)" }, + { url: "//newyork.netdata.rocks/default.html", title: "US - New York (DigitalOcean.com)" }, + { url: "//sanfrancisco.netdata.rocks/default.html", title: "US - San Francisco (DigitalOcean.com)" }, + { url: "//atlanta.netdata.rocks/default.html", title: "US - Atlanta (CDN77.com)" }, + { url: "//frankfurt.netdata.rocks/default.html", title: "Germany - Frankfurt (DigitalOcean.com)" }, + { url: "//toronto.netdata.rocks/default.html", title: "Canada - Toronto (DigitalOcean.com)" }, + { url: "//singapore.netdata.rocks/default.html", title: "Japan - Singapore (DigitalOcean.com)" }, + { url: "//bangalore.netdata.rocks/default.html", title: "India - Bangalore (DigitalOcean.com)" }, + + ] + + for (var server of demoServers) { + html += ( + `
+ + ${server.title} +
+
+ ` + ); + } + } + + return html; +} + +function setMyNetdataMenu(html) { + const el = document.getElementById('my-netdata-dropdown-content') + el.innerHTML = html; +} + +function clearMyNetdataMenu() { + setMyNetdataMenu(`
+ + Loading, please wait... +
+
`); +} + +function errorMyNetdataMenu() { + setMyNetdataMenu(`
+ + Cannot load known Netdata agents from Netdata Cloud! Please make sure you have the latest version of Netdata. +
`); +} + +function restrictMyNetdataMenu() { + setMyNetdataMenu(`
+ Please sign in to netdata.cloud to view your nodes! +
+
`); +} + +function openAuthenticatedUrl(url) { + if (isSignedIn()) { + window.open(url); + } else { + window.open(`${NETDATA.registry.cloudBaseURL}/account/sign-in-agent?id=${NETDATA.registry.machine_guid}&name=${encodeURIComponent(NETDATA.registry.hostname)}&origin=${encodeURIComponent(window.location.origin + "/")}&redirect_uri=${encodeURIComponent(window.location.origin + "/" + url)}`); + } +} + +function renderMyNetdataMenu(machinesArray) { + const el = document.getElementById('my-netdata-dropdown-content'); + el.classList.add(`theme-${netdataTheme}`); + + if (machinesArray == registryAgents) { + console.log("Rendering my-netdata menu from registry"); + } else { + console.log("Rendering my-netdata menu from netdata.cloud", machinesArray); + } + + let html = ''; + + if (!isSignedIn()) { + if (!NETDATA.registry.isRegistryEnabled()) { + html += ( + `` + ); + } + } + + if (isSignedIn()) { + html += ( + `
+ + +
+
` + ); + } + + // options.hosts = [ + // { + // hostname: "streamed1", + // }, + // { + // hostname: "streamed2", + // }, + // ] + + if (options.hosts.length > 1) { + html += `
${renderStreamedHosts(options)}

`; + } + + if (isSignedIn() || NETDATA.registry.isRegistryEnabled()) { + html += `
${renderMachines(machinesArray)}

`; + } + + if (!isSignedIn()) { + html += ( + `
+ + 更换标识 +
+
+
+ + 这是什么? +
+
` + ) + } else { + html += ( + `
+ + Nodes beta +
+
+ +
+ + What is this? +
+
` + ) + } + + el.innerHTML = html; + + gotoServerInit(); +} + +function isdemo() { + if (this_is_demo !== null) { + return this_is_demo; + } + this_is_demo = false; + + try { + if (typeof document.location.hostname === 'string') { + if (document.location.hostname.endsWith('.my-netdata.io') || + document.location.hostname.endsWith('.mynetdata.io') || + document.location.hostname.endsWith('.netdata.rocks') || + document.location.hostname.endsWith('.netdata.ai') || + document.location.hostname.endsWith('.netdata.live') || + document.location.hostname.endsWith('.firehol.org') || + document.location.hostname.endsWith('.netdata.online') || + document.location.hostname.endsWith('.netdata.cloud')) { + this_is_demo = true; + } + } + } + catch (error) { + } + return this_is_demo; +} + +function netdataURL(url, forReload) { + if (typeof url === 'undefined') + // url = document.location.toString(); + { + url = ''; + } + + if (url.indexOf('#') !== -1) { + url = url.substring(0, url.indexOf('#')); + } + + var hash = urlOptions.genHash(forReload); + + // console.log('netdataURL: ' + url + hash); + + return url + hash; +} + +function netdataReload(url) { + document.location = verifyURL(netdataURL(url, true)); + + // since we play with hash + // this is needed to reload the page + location.reload(); +} + +function gotoHostedModalHandler(url) { + document.location = verifyURL(url + urlOptions.genHash()); + return false; +} + +var gotoServerValidateRemaining = 0; +var gotoServerMiddleClick = false; +var gotoServerStop = false; + +function gotoServerValidateUrl(id, guid, url) { + var penalty = 0; + var error = 'failed'; + + if (document.location.toString().startsWith('http://') && url.toString().startsWith('https://')) + // we penalize https only if the current url is http + // to allow the user walk through all its servers. + { + penalty = 500; + } else if (document.location.toString().startsWith('https://') && url.toString().startsWith('http://')) { + error = 'can\'t check'; + } + + var finalURL = netdataURL(url); + + setTimeout(function () { + document.getElementById('gotoServerList').innerHTML += '' + escapeUserInputHTML(url) + 'checking...'; + + NETDATA.registry.hello(url, function (data) { + if (typeof data !== 'undefined' && data !== null && typeof data.machine_guid === 'string' && data.machine_guid === guid) { + // console.log('OK ' + id + ' URL: ' + url); + document.getElementById(guid + '-' + id + '-status').innerHTML = "OK"; + + if (!gotoServerStop) { + gotoServerStop = true; + + if (gotoServerMiddleClick) { + window.open(verifyURL(finalURL), '_blank'); + gotoServerMiddleClick = false; + document.getElementById('gotoServerResponse').innerHTML = 'Opening new window to ' + NETDATA.registry.machines[guid].name + '
' + escapeUserInputHTML(url) + '

(check your pop-up blocker if it fails)'; + } else { + document.getElementById('gotoServerResponse').innerHTML += 'found it! It is at:
' + escapeUserInputHTML(url) + ''; + document.location = verifyURL(finalURL); + $('#gotoServerModal').modal('hide'); + } + } + } else { + if (typeof data !== 'undefined' && data !== null && typeof data.machine_guid === 'string' && data.machine_guid !== guid) { + error = 'wrong machine'; + } + + document.getElementById(guid + '-' + id + '-status').innerHTML = error; + gotoServerValidateRemaining--; + if (gotoServerValidateRemaining <= 0) { + gotoServerMiddleClick = false; + document.getElementById('gotoServerResponse').innerHTML = 'Sorry! I cannot find any operational URL for this server'; + } + } + }); + }, (id * 50) + penalty); +} + +function gotoServerModalHandler(guid) { + // console.log('goto server: ' + guid); + + gotoServerStop = false; + var checked = {}; + var len = NETDATA.registry.machines[guid].alternate_urls.length; + var count = 0; + + document.getElementById('gotoServerResponse').innerHTML = ''; + document.getElementById('gotoServerList').innerHTML = ''; + document.getElementById('gotoServerName').innerHTML = NETDATA.registry.machines[guid].name; + $('#gotoServerModal').modal('show'); + + gotoServerValidateRemaining = len; + while (len--) { + var url = NETDATA.registry.machines[guid].alternate_urls[len]; + checked[url] = true; + gotoServerValidateUrl(count++, guid, url); + } + + if (!isSignedIn()) { + // When the registry is enabled, if the user's known URLs are not working + // we consult the registry to get additional URLs. + setTimeout(function () { + if (gotoServerStop === false) { + document.getElementById('gotoServerResponse').innerHTML = 'Added all the known URLs for this machine.'; + NETDATA.registry.search(guid, function (data) { + // console.log(data); + len = data.urls.length; + while (len--) { + var url = data.urls[len][1]; + // console.log(url); + if (typeof checked[url] === 'undefined') { + gotoServerValidateRemaining++; + checked[url] = true; + gotoServerValidateUrl(count++, guid, url); + } + } + }); + } + }, 2000); + } + + return false; +} + +function gotoServerInit() { + $(".registry_link").on('click', function (e) { + if (e.which === 2) { + e.preventDefault(); + gotoServerMiddleClick = true; + } else { + gotoServerMiddleClick = false; + } + + return true; + }); +} + +function switchRegistryModalHandler() { + document.getElementById('switchRegistryPersonGUID').value = NETDATA.registry.person_guid; + document.getElementById('switchRegistryURL').innerHTML = NETDATA.registry.server; + document.getElementById('switchRegistryResponse').innerHTML = ''; + $('#switchRegistryModal').modal('show'); +} + +function notifyForSwitchRegistry() { + var n = document.getElementById('switchRegistryPersonGUID').value; + + if (n !== '' && n.length === 36) { + NETDATA.registry.switch(n, function (result) { + if (result !== null) { + $('#switchRegistryModal').modal('hide'); + NETDATA.registry.init(); + } else { + document.getElementById('switchRegistryResponse').innerHTML = "Sorry! The registry rejected your request."; + } + }); + } else { + document.getElementById('switchRegistryResponse').innerHTML = "The ID you have entered is not a GUID."; + } +} + +var deleteRegistryGuid = null; +var deleteRegistryUrl = null; + +function deleteRegistryModalHandler(guid, name, url) { + // void (guid); + + deleteRegistryGuid = guid; + deleteRegistryUrl = url; + + document.getElementById('deleteRegistryServerName').innerHTML = name; + document.getElementById('deleteRegistryServerName2').innerHTML = name; + document.getElementById('deleteRegistryServerURL').innerHTML = url; + document.getElementById('deleteRegistryResponse').innerHTML = ''; + + $('#deleteRegistryModal').modal('show'); +} + +function notifyForDeleteRegistry() { + const responseEl = document.getElementById('deleteRegistryResponse'); + + if (deleteRegistryUrl) { + if (isSignedIn()) { + deleteCloudAgentURL(deleteRegistryGuid, deleteRegistryUrl) + .then((count) => { + if (!count) { + responseEl.innerHTML = "Sorry, this command was rejected by netdata.cloud!"; + return; + } + NETDATA.registry.delete(deleteRegistryUrl, function (result) { + if (result === null) { + console.log("Received error from registry", result); + } + + deleteRegistryUrl = null; + $('#deleteRegistryModal').modal('hide'); + NETDATA.registry.init(); + }); + }); + } else { + NETDATA.registry.delete(deleteRegistryUrl, function (result) { + if (result !== null) { + deleteRegistryUrl = null; + $('#deleteRegistryModal').modal('hide'); + NETDATA.registry.init(); + } else { + responseEl.innerHTML = "Sorry, this command was rejected by the registry server!"; + } + }); + } + } +} + +var options = { + menus: {}, + submenu_names: {}, + data: null, + hostname: 'netdata_server', // will be overwritten by the netdata server + version: 'unknown', + release_channel: 'unknown', + hosts: [], + + duration: 0, // the default duration of the charts + update_every: 1, + + chartsPerRow: 0, + // chartsMinWidth: 1450, + chartsHeight: 180, +}; + +function chartsPerRow(total) { + void (total); + + if (options.chartsPerRow === 0) { + return 1; + //var width = Math.floor(total / options.chartsMinWidth); + //if(width === 0) width = 1; + //return width; + } else { + return options.chartsPerRow; + } +} + +function prioritySort(a, b) { + if (a.priority < b.priority) { + return -1; + } + if (a.priority > b.priority) { + return 1; + } + return naturalSortCompare(a.name, b.name); +} + +function sortObjectByPriority(object) { + var idx = {}; + var sorted = []; + + for (var i in object) { + if (!object.hasOwnProperty(i)) { + continue; + } + + if (typeof idx[i] === 'undefined') { + idx[i] = object[i]; + sorted.push(i); + } + } + + sorted.sort(function (a, b) { + if (idx[a].priority < idx[b].priority) { + return -1; + } + if (idx[a].priority > idx[b].priority) { + return 1; + } + return naturalSortCompare(a, b); + }); + + return sorted; +} + +// ---------------------------------------------------------------------------- +// scroll to a section, without changing the browser history + +function scrollToId(hash) { + if (hash && hash !== '' && document.getElementById(hash) !== null) { + var offset = $('#' + hash).offset(); + if (typeof offset !== 'undefined') { + //console.log('scrolling to ' + hash + ' at ' + offset.top.toString()); + $('html, body').animate({ scrollTop: offset.top - 30 }, 0); + } + } + + // we must return false to prevent the default action + return false; +} + +// ---------------------------------------------------------------------------- + +// user editable information +var customDashboard = { + menu: {}, + submenu: {}, + context: {} +}; + +// netdata standard information +var netdataDashboard = { + sparklines_registry: {}, + os: 'unknown', + + menu: {}, + submenu: {}, + context: {}, + + // generate a sparkline + // used in the documentation + sparkline: function (prefix, chart, dimension, units, suffix) { + if (options.data === null || typeof options.data.charts === 'undefined') { + return ''; + } + + if (typeof options.data.charts[chart] === 'undefined') { + return ''; + } + + if (typeof options.data.charts[chart].dimensions === 'undefined') { + return ''; + } + + if (typeof options.data.charts[chart].dimensions[dimension] === 'undefined') { + return ''; + } + + var key = chart + '.' + dimension; + + if (typeof units === 'undefined') { + units = ''; + } + + if (typeof this.sparklines_registry[key] === 'undefined') { + this.sparklines_registry[key] = { count: 1 }; + } else { + this.sparklines_registry[key].count++; + } + + key = key + '.' + this.sparklines_registry[key].count; + + return prefix + '
(X' + units + ')' + suffix; + }, + + gaugeChart: function (title, width, dimensions, colors) { + if (typeof colors === 'undefined') { + colors = ''; + } + + if (typeof dimensions === 'undefined') { + dimensions = ''; + } + + return '
'; + }, + + anyAttribute: function (obj, attr, key, def) { + if (typeof (obj[key]) !== 'undefined') { + var x = obj[key][attr]; + + if (typeof (x) === 'undefined') { + return def; + } + + if (typeof (x) === 'function') { + return x(netdataDashboard.os); + } + + return x; + } + + return def; + }, + + menuTitle: function (chart) { + if (typeof chart.menu_pattern !== 'undefined') { + return (this.anyAttribute(this.menu, 'title', chart.menu_pattern, chart.menu_pattern).toString() + + ' ' + chart.type.slice(-(chart.type.length - chart.menu_pattern.length - 1)).toString()).replace(/_/g, ' '); + } + + return (this.anyAttribute(this.menu, 'title', chart.menu, chart.menu)).toString().replace(/_/g, ' '); + }, + + menuIcon: function (chart) { + if (typeof chart.menu_pattern !== 'undefined') { + return this.anyAttribute(this.menu, 'icon', chart.menu_pattern, '').toString(); + } + + return this.anyAttribute(this.menu, 'icon', chart.menu, ''); + }, + + menuInfo: function (chart) { + if (typeof chart.menu_pattern !== 'undefined') { + return this.anyAttribute(this.menu, 'info', chart.menu_pattern, null); + } + + return this.anyAttribute(this.menu, 'info', chart.menu, null); + }, + + menuHeight: function (chart) { + if (typeof chart.menu_pattern !== 'undefined') { + return this.anyAttribute(this.menu, 'height', chart.menu_pattern, 1.0); + } + + return this.anyAttribute(this.menu, 'height', chart.menu, 1.0); + }, + + submenuTitle: function (menu, submenu) { + var key = menu + '.' + submenu; + // console.log(key); + var title = this.anyAttribute(this.submenu, 'title', key, submenu).toString().replace(/_/g, ' '); + if (title.length > 28) { + var a = title.substring(0, 13); + var b = title.substring(title.length - 12, title.length); + return a + '...' + b; + } + return title; + }, + + submenuInfo: function (menu, submenu) { + var key = menu + '.' + submenu; + return this.anyAttribute(this.submenu, 'info', key, null); + }, + + submenuHeight: function (menu, submenu, relative) { + var key = menu + '.' + submenu; + return this.anyAttribute(this.submenu, 'height', key, 1.0) * relative; + }, + + contextInfo: function (id) { + var x = this.anyAttribute(this.context, 'info', id, null); + + if (x !== null) { + return '
' + x + '
'; + } else { + return ''; + } + }, + + contextValueRange: function (id) { + if (typeof this.context[id] !== 'undefined' && typeof this.context[id].valueRange !== 'undefined') { + return this.context[id].valueRange; + } else { + return '[null, null]'; + } + }, + + contextHeight: function (id, def) { + if (typeof this.context[id] !== 'undefined' && typeof this.context[id].height !== 'undefined') { + return def * this.context[id].height; + } else { + return def; + } + }, + + contextDecimalDigits: function (id, def) { + if (typeof this.context[id] !== 'undefined' && typeof this.context[id].decimalDigits !== 'undefined') { + return this.context[id].decimalDigits; + } else { + return def; + } + } +}; + +// ---------------------------------------------------------------------------- + +// enrich the data structure returned by netdata +// to reflect our menu system and content +// TODO: this is a shame - we should fix charts naming (issue #807) +function enrichChartData(chart) { + var parts = chart.type.split('_'); + var tmp = parts[0]; + + switch (tmp) { + case 'ap': + case 'net': + case 'disk': + case 'powersupply': + case 'statsd': + chart.menu = tmp; + break; + + case 'apache': + chart.menu = chart.type; + if (parts.length > 2 && parts[1] === 'cache') { + chart.menu_pattern = tmp + '_' + parts[1]; + } else if (parts.length > 1) { + chart.menu_pattern = tmp; + } + break; + + case 'bind': + chart.menu = chart.type; + if (parts.length > 2 && parts[1] === 'rndc') { + chart.menu_pattern = tmp + '_' + parts[1]; + } else if (parts.length > 1) { + chart.menu_pattern = tmp; + } + break; + + case 'cgroup': + chart.menu = chart.type; + if (chart.id.match(/.*[\._\/-:]qemu[\._\/-:]*/) || chart.id.match(/.*[\._\/-:]kvm[\._\/-:]*/)) { + chart.menu_pattern = 'cgqemu'; + } else { + chart.menu_pattern = 'cgroup'; + } + break; + + case 'go': + chart.menu = chart.type; + if (parts.length > 2 && parts[1] === 'expvar') { + chart.menu_pattern = tmp + '_' + parts[1]; + } else if (parts.length > 1) { + chart.menu_pattern = tmp; + } + break; + + case 'mount': + if (parts.length > 2) { + chart.menu = tmp + '_' + parts[1]; + } else { + chart.menu = tmp; + } + break; + + case 'isc': + chart.menu = chart.type; + if (parts.length > 2 && parts[1] === 'dhcpd') { + chart.menu_pattern = tmp + '_' + parts[1]; + } else if (parts.length > 1) { + chart.menu_pattern = tmp; + } + break; + + case 'ovpn': + chart.menu = chart.type; + if (parts.length > 3 && parts[1] === 'status' && parts[2] === 'log') { + chart.menu_pattern = tmp + '_' + parts[1]; + } else if (parts.length > 1) { + chart.menu_pattern = tmp; + } + break; + + case 'smartd': + case 'web': + chart.menu = chart.type; + if (parts.length > 2 && parts[1] === 'log') { + chart.menu_pattern = tmp + '_' + parts[1]; + } else if (parts.length > 1) { + chart.menu_pattern = tmp; + } + break; + + case 'tc': + chart.menu = tmp; + + // find a name for this device from fireqos info + // we strip '_(in|out)' or '(in|out)_' + if (chart.context === 'tc.qos' && (typeof options.submenu_names[chart.family] === 'undefined' || options.submenu_names[chart.family] === chart.family)) { + var n = chart.name.split('.')[1]; + if (n.endsWith('_in')) { + options.submenu_names[chart.family] = n.slice(0, n.lastIndexOf('_in')); + } else if (n.endsWith('_out')) { + options.submenu_names[chart.family] = n.slice(0, n.lastIndexOf('_out')); + } else if (n.startsWith('in_')) { + options.submenu_names[chart.family] = n.slice(3, n.length); + } else if (n.startsWith('out_')) { + options.submenu_names[chart.family] = n.slice(4, n.length); + } else { + options.submenu_names[chart.family] = n; + } + } + + // increase the priority of IFB devices + // to have inbound appear before outbound + if (chart.id.match(/.*-ifb$/)) { + chart.priority--; + } + + break; + + default: + chart.menu = chart.type; + if (parts.length > 1) { + chart.menu_pattern = tmp; + } + break; + } + + chart.submenu = chart.family; +} + +// ---------------------------------------------------------------------------- + +function headMain(os, charts, duration) { + void (os); + + if (urlOptions.mode === 'print') { + return ''; + } + + var head = ''; + + if (typeof charts['system.swap'] !== 'undefined') { + head += '
'; + } + + if (typeof charts['system.io'] !== 'undefined') { + head += '
'; + + head += '
'; + } + else if (typeof charts['system.pgpgio'] !== 'undefined') { + head += '
'; + + head += '
'; + } + + if (typeof charts['system.cpu'] !== 'undefined') { + head += '
'; + } + + if (typeof charts['system.net'] !== 'undefined') { + head += '
'; + + head += '
'; + } + else if (typeof charts['system.ip'] !== 'undefined') { + head += '
'; + + head += '
'; + } + else if (typeof charts['system.ipv4'] !== 'undefined') { + head += '
'; + + head += '
'; + } + else if (typeof charts['system.ipv6'] !== 'undefined') { + head += '
'; + + head += '
'; + } + + if (typeof charts['system.ram'] !== 'undefined') { + head += '
'; + } + + return head; +} + +function generateHeadCharts(type, chart, duration) { + if (urlOptions.mode === 'print') { + return ''; + } + + var head = ''; + var hcharts = netdataDashboard.anyAttribute(netdataDashboard.context, type, chart.context, []); + if (hcharts.length > 0) { + var hi = 0, hlen = hcharts.length; + while (hi < hlen) { + if (typeof hcharts[hi] === 'function') { + head += hcharts[hi](netdataDashboard.os, chart.id).replace(/CHART_DURATION/g, duration.toString()).replace(/CHART_UNIQUE_ID/g, chart.id); + } else { + head += hcharts[hi].replace(/CHART_DURATION/g, duration.toString()).replace(/CHART_UNIQUE_ID/g, chart.id); + } + hi++; + } + } + return head; +} + +function renderPage(menus, data) { + var div = document.getElementById('charts_div'); + var pcent_width = Math.floor(100 / chartsPerRow($(div).width())); + + // find the proper duration for per-second updates + var duration = Math.round(($(div).width() * pcent_width / 100 * data.update_every / 3) / 60) * 60; + options.duration = duration; + options.update_every = data.update_every; + + var html = ''; + var sidebar = ''; + div.innerHTML = html; + document.getElementById('sidebar').innerHTML = sidebar; + + if (urlOptions.highlight === true) { + NETDATA.globalChartUnderlay.init(null + , urlOptions.highlight_after + , urlOptions.highlight_before + , (urlOptions.after > 0) ? urlOptions.after : null + , (urlOptions.before > 0) ? urlOptions.before : null + ); + } else { + NETDATA.globalChartUnderlay.clear(); + } + + if (urlOptions.mode === 'print') { + printPage(); + } else { + finalizePage(); + } +} + +function renderChartsAndMenu(data) { + options.menus = {}; + options.submenu_names = {}; + + var menus = options.menus; + var charts = data.charts; + var m, menu_key; + + for (var c in charts) { + if (!charts.hasOwnProperty(c)) { + continue; + } + + var chart = charts[c]; + enrichChartData(chart); + m = chart.menu; + + // create the menu + if (typeof menus[m] === 'undefined') { + menus[m] = { + menu_pattern: chart.menu_pattern, + priority: chart.priority, + submenus: {}, + title: netdataDashboard.menuTitle(chart), + icon: netdataDashboard.menuIcon(chart), + info: netdataDashboard.menuInfo(chart), + height: netdataDashboard.menuHeight(chart) * options.chartsHeight + }; + } else { + if (typeof (menus[m].menu_pattern) === 'undefined') { + menus[m].menu_pattern = chart.menu_pattern; + } + + if (chart.priority < menus[m].priority) { + menus[m].priority = chart.priority; + } + } + + menu_key = (typeof (menus[m].menu_pattern) !== 'undefined') ? menus[m].menu_pattern : m; + + // create the submenu + if (typeof menus[m].submenus[chart.submenu] === 'undefined') { + menus[m].submenus[chart.submenu] = { + priority: chart.priority, + charts: [], + title: null, + info: netdataDashboard.submenuInfo(menu_key, chart.submenu), + height: netdataDashboard.submenuHeight(menu_key, chart.submenu, menus[m].height) + }; + } else { + if (chart.priority < menus[m].submenus[chart.submenu].priority) { + menus[m].submenus[chart.submenu].priority = chart.priority; + } + } + + // index the chart in the menu/submenu + menus[m].submenus[chart.submenu].charts.push(chart); + } + + // propagate the descriptive subname given to QoS + // to all the other submenus with the same name + for (var m in menus) { + if (!menus.hasOwnProperty(m)) { + continue; + } + + for (var s in menus[m].submenus) { + if (!menus[m].submenus.hasOwnProperty(s)) { + continue; + } + + // set the family using a name + if (typeof options.submenu_names[s] !== 'undefined') { + menus[m].submenus[s].title = s + ' (' + options.submenu_names[s] + ')'; + } else { + menu_key = (typeof (menus[m].menu_pattern) !== 'undefined') ? menus[m].menu_pattern : m; + menus[m].submenus[s].title = netdataDashboard.submenuTitle(menu_key, s); + } + } + } + + renderPage(menus, data); +} + +// ---------------------------------------------------------------------------- + +function loadJs(url, callback) { + $.ajax({ + url: url.startsWith("http") ? url : transformWithOldSuffix(url), + cache: true, + dataType: "script", + xhrFields: { withCredentials: true } // required for the cookie + }) + .fail(function () { + alert('Cannot load required JS library: ' + url); + }) + .always(function () { + if (typeof callback === 'function') { + callback(); + } + }) +} + +var clipboardLoaded = false; + +function loadClipboard(callback) { + if (clipboardLoaded === false) { + clipboardLoaded = true; + loadJs('lib/clipboard-polyfill-be05dad.js', callback); + } else { + callback(); + } +} + +var bootstrapTableLoaded = false; + +function loadBootstrapTable(callback) { + if (bootstrapTableLoaded === false) { + bootstrapTableLoaded = true; + loadJs('lib/bootstrap-table-1.11.0.min.js', function () { + loadJs('lib/bootstrap-table-export-1.11.0.min.js', function () { + loadJs('lib/tableExport-1.6.0.min.js', callback); + }) + }); + } else { + callback(); + } +} + +var bootstrapSliderLoaded = false; + +function loadBootstrapSlider(callback) { + if (bootstrapSliderLoaded === false) { + bootstrapSliderLoaded = true; + loadJs('lib/bootstrap-slider-10.0.0.min.js', function () { + NETDATA._loadCSS(transformWithOldSuffix("css/bootstrap-slider-10.0.0.min.css")); + callback(); + }); + } else { + callback(); + } +} + +var lzStringLoaded = false; + +function loadLzString(callback) { + if (lzStringLoaded === false) { + lzStringLoaded = true; + loadJs('lib/lz-string-1.4.4.min.js', callback); + } else { + callback(); + } +} + +var pakoLoaded = false; + +function loadPako(callback) { + if (pakoLoaded === false) { + pakoLoaded = true; + loadJs('lib/pako-1.0.6.min.js', callback); + } else { + callback(); + } +} + +// ---------------------------------------------------------------------------- + +function clipboardCopy(text) { + clipboard.writeText(text); +} + +function clipboardCopyBadgeEmbed(url) { + clipboard.writeText(''); +} + +// ---------------------------------------------------------------------------- + +function alarmsUpdateModal() { + var active = '

触发警报

'; + var all = '

所有作用中的警报

'; + var footer = '
netdata badges 会自动重新整理。不同颜色分表代表的警报状态: 红色  表示重大, 橘色  表示警告, 绿色  表示良好, 灰色  表示未定义 (例如无资料或无状态), 黑色  表示尚未初始化。您可以复制这里的网址并将它们嵌入到任一个网页。
netdata 能够发送这些警报通知。请参阅 这个设定档 了解更多资讯。'; + + loadClipboard(function () { + }); + + NETDATA.alarms.get('all', function (data) { + options.alarm_families = []; + + alarmsCallback(data); + + if (data === null) { + document.getElementById('alarms_active').innerHTML = + document.getElementById('alarms_all').innerHTML = + document.getElementById('alarms_log').innerHTML = + 'failed to load alarm data!'; + return; + } + + function alarmid4human(id) { + if (id === 0) { + return '-'; + } + + return id.toString(); + } + + function timestamp4human(timestamp, space) { + if (timestamp === 0) { + return '-'; + } + + if (typeof space === 'undefined') { + space = ' '; + } + + var t = new Date(timestamp * 1000); + var now = new Date(); + + if (t.toDateString() === now.toDateString()) { + return t.toLocaleTimeString(); + } + + return t.toLocaleDateString() + space + t.toLocaleTimeString(); + } + + function alarm_lookup_explain(alarm, chart) { + var dimensions = ' of all values '; + + if (chart.dimensions.length > 1) { + dimensions = ' of the sum of all dimensions '; + } + + if (typeof alarm.lookup_dimensions !== 'undefined') { + var d = alarm.lookup_dimensions.replace(/|/g, ','); + var x = d.split(','); + if (x.length > 1) { + dimensions = 'of the sum of dimensions ' + alarm.lookup_dimensions + ' '; + } else { + dimensions = 'of all values of dimension ' + alarm.lookup_dimensions + ' '; + } + } + + return '' + alarm.lookup_method + ' ' + + dimensions + ', of chart ' + alarm.chart + '' + + ', starting ' + NETDATA.seconds4human(alarm.lookup_after + alarm.lookup_before, { space: ' ' }) + ' and up to ' + NETDATA.seconds4human(alarm.lookup_before, { space: ' ' }) + '' + + ((alarm.lookup_options) ? (', with options ' + alarm.lookup_options.replace(/ /g, ', ') + '') : '') + + '.'; + } + + function alarm_to_html(alarm, full) { + var chart = options.data.charts[alarm.chart]; + if (typeof (chart) === 'undefined') { + chart = options.data.charts_by_name[alarm.chart]; + if (typeof (chart) === 'undefined') { + // this means the charts loaded are incomplete + // probably netdata was restarted and more alarms + // are now available. + console.log('Cannot find chart ' + alarm.chart + ', you probably need to refresh the page.'); + return ''; + } + } + + var has_alarm = (typeof alarm.warn !== 'undefined' || typeof alarm.crit !== 'undefined'); + var badge_url = NETDATA.alarms.server + '/api/v1/badge.svg?chart=' + alarm.chart + '&alarm=' + alarm.name + '&refresh=auto'; + + var action_buttons = '
 
role: ' + alarm.recipient + '
 
' + + '
' + + '
' + + '
'; + + var html = '
' + + ''; + + return html; + } + + function alarm_family_show(id) { + var html = '
' + alarm.chart + '
 

 
' + alarm.info + '' + action_buttons + '
' + + ((typeof alarm.warn !== 'undefined') ? ('') : '') + + ((typeof alarm.crit !== 'undefined') ? ('') : ''); + + if (full === true) { + var units = chart.units; + if (units === '%') { + units = '%'; + } + + html += ((typeof alarm.lookup_after !== 'undefined') ? ('') : '') + + ((typeof alarm.calc !== 'undefined') ? ('') : '') + + ((chart.green !== null) ? ('') : '') + + ((chart.red !== null) ? ('') : ''); + } + + if (alarm.warn_repeat_every > 0) { + html += ''; + } + + if (alarm.crit_repeat_every > 0) { + html += ''; + } + + var delay = ''; + if ((alarm.delay_up_duration > 0 || alarm.delay_down_duration > 0) && alarm.delay_multiplier !== 0 && alarm.delay_max_duration > 0) { + if (alarm.delay_up_duration === alarm.delay_down_duration) { + delay += '
hysteresis ' + NETDATA.seconds4human(alarm.delay_up_duration, { + space: ' ', + negative_suffix: '' + }); + } else { + delay = '
hysteresis '; + if (alarm.delay_up_duration > 0) { + delay += 'on escalation ' + NETDATA.seconds4human(alarm.delay_up_duration, { + space: ' ', + negative_suffix: '' + }) + ', '; + } + if (alarm.delay_down_duration > 0) { + delay += 'on recovery ' + NETDATA.seconds4human(alarm.delay_down_duration, { + space: ' ', + negative_suffix: '' + }) + ', '; + } + } + if (alarm.delay_multiplier !== 1.0) { + delay += 'multiplied by ' + alarm.delay_multiplier.toString() + ''; + delay += ', up to ' + NETDATA.seconds4human(alarm.delay_max_duration, { + space: ' ', + negative_suffix: '' + }) + ''; + } + delay += '
'; + } + + html += '
' + + ((has_alarm === true) ? ('') : '') + + '' + + '
warning when' + alarm.warn + '
critical when' + alarm.crit + '
db lookup' + alarm_lookup_explain(alarm, chart) + '
calculation' + alarm.calc + '
green threshold' + chart.green + ' ' + units + '
red threshold' + chart.red + ' ' + units + '
repeat warning' + NETDATA.seconds4human(alarm.warn_repeat_every) + '
repeat critical' + NETDATA.seconds4human(alarm.crit_repeat_every) + '
check every' + NETDATA.seconds4human(alarm.update_every, { + space: ' ', + negative_suffix: '' + }) + '
execute' + alarm.exec + '' + delay + '
source' + alarm.source + '
'; + var family = options.alarm_families[id]; + var len = family.arr.length; + while (len--) { + var alarm = family.arr[len]; + html += alarm_to_html(alarm, true); + } + html += '
'; + + $('#alarm_all_' + id.toString()).html(html); + enableTooltipsAndPopovers(); + } + + // find the proper family of each alarm + var x, family, alarm; + var count_active = 0; + var count_all = 0; + var families = {}; + var families_sort = []; + for (x in data.alarms) { + if (!data.alarms.hasOwnProperty(x)) { + continue; + } + + alarm = data.alarms[x]; + family = alarm.family; + + // find the chart + var chart = options.data.charts[alarm.chart]; + if (typeof chart === 'undefined') { + chart = options.data.charts_by_name[alarm.chart]; + } + + // not found - this should never happen! + if (typeof chart === 'undefined') { + console.log('WARNING: alarm ' + x + ' is linked to chart ' + alarm.chart + ', which is not found in the list of chart got from the server.'); + chart = { priority: 9999999 }; + } + else if (typeof chart.menu !== 'undefined' && typeof chart.submenu !== 'undefined') + // the family based on the chart + { + family = chart.menu + ' - ' + chart.submenu; + } + + if (typeof families[family] === 'undefined') { + families[family] = { + name: family, + arr: [], + priority: chart.priority + }; + + families_sort.push(families[family]); + } + + if (chart.priority < families[family].priority) { + families[family].priority = chart.priority; + } + + families[family].arr.unshift(alarm); + } + + // sort the families, like the dashboard menu does + var families_sorted = families_sort.sort(function (a, b) { + if (a.priority < b.priority) { + return -1; + } + if (a.priority > b.priority) { + return 1; + } + return naturalSortCompare(a.name, b.name); + }); + + var i = 0; + var fc = 0; + var len = families_sorted.length; + while (len--) { + family = families_sorted[i++].name; + var active_family_added = false; + var expanded = 'true'; + var collapsed = ''; + var cin = 'in'; + + if (fc !== 0) { + all += ""; + expanded = 'false'; + collapsed = 'class="collapsed"'; + cin = ''; + } + + all += '
'; + + options.alarm_families[fc] = families[family]; + + fc++; + + var arr = families[family].arr; + var c = arr.length; + while (c--) { + alarm = arr[c]; + if (alarm.status === 'WARNING' || alarm.status === 'CRITICAL') { + if (!active_family_added) { + active_family_added = true; + active += '

' + family + '

'; + } + count_active++; + active += alarm_to_html(alarm, true); + } + + count_all++; + } + } + active += ""; + if (families_sorted.length > 0) { + all += "
"; + } + all += ""; + + if (!count_active) { + active += '

Everything is normal. No raised alarms.
'; + } else { + active += footer; + } + + if (!count_all) { + all += "

此系统中没有运行警报。

"; + } else { + all += footer; + } + + document.getElementById('alarms_active').innerHTML = active; + document.getElementById('alarms_all').innerHTML = all; + enableTooltipsAndPopovers(); + + if (families_sorted.length > 0) { + alarm_family_show(0); + } + + // register bootstrap events + var $accordion = $('#alarms_all_accordion'); + $accordion.on('show.bs.collapse', function (d) { + var target = $(d.target); + var id = $(target).data('alarm-id'); + alarm_family_show(id); + }); + $accordion.on('hidden.bs.collapse', function (d) { + var target = $(d.target); + var id = $(target).data('alarm-id'); + $('#alarm_all_' + id.toString()).html(''); + }); + + document.getElementById('alarms_log').innerHTML = '

警报记录

'; + + loadBootstrapTable(function () { + $('#alarms_log_table').bootstrapTable({ + url: NETDATA.alarms.server + '/api/v1/alarm_log?all', + cache: false, + pagination: true, + pageSize: 10, + showPaginationSwitch: false, + search: true, + searchTimeOut: 300, + searchAlign: 'left', + showColumns: true, + showExport: true, + exportDataType: 'basic', + exportOptions: { + fileName: 'netdata_alarm_log' + }, + onClickRow: function (row, $element,field) { + void (field); + void ($element); + let main_url; + let common_url = "&host=" + encodeURIComponent(row['hostname']) + "&chart=" + encodeURIComponent(row['chart']) + "&family=" + encodeURIComponent(row['family']) + "&alarm=" + encodeURIComponent(row['name']) + "&alarm_unique_id=" + row['unique_id'] + "&alarm_id=" + row['alarm_id'] + "&alarm_event_id=" + row['alarm_event_id'] + "&alarm_when=" + row['when']; + if (NETDATA.registry.isUsingGlobalRegistry() && NETDATA.registry.machine_guid != null) { + main_url = "https://netdata.cloud/alarms/redirect?agentID=" + NETDATA.registry.machine_guid + common_url; + } else { + main_url = NETDATA.registry.server + "/goto-host-from-alarm.html?" + common_url ; + } + window.open(main_url,"_blank"); + }, + rowStyle: function (row, index) { + void (index); + + switch (row.status) { + case 'CRITICAL': + return { classes: 'danger' }; + break; + case 'WARNING': + return { classes: 'warning' }; + break; + case 'UNDEFINED': + return { classes: 'info' }; + break; + case 'CLEAR': + return { classes: 'success' }; + break; + } + return {}; + }, + showFooter: false, + showHeader: true, + showRefresh: true, + showToggle: false, + sortable: true, + silentSort: false, + columns: [ + { + field: 'when', + title: '事件日期', + valign: 'middle', + titleTooltip: 'The date and time the even took place', + formatter: function (value, row, index) { + void (row); + void (index); + return timestamp4human(value, ' '); + }, + align: 'center', + switchable: false, + sortable: true + }, + { + field: 'hostname', + title: '主机', + valign: 'middle', + titleTooltip: 'The host that generated this event', + align: 'center', + visible: false, + sortable: true + }, + { + field: 'unique_id', + title: '唯一 ID', + titleTooltip: 'The host unique ID for this event', + formatter: function (value, row, index) { + void (row); + void (index); + return alarmid4human(value); + }, + align: 'center', + valign: 'middle', + visible: false, + sortable: true + }, + { + field: 'alarm_id', + title: '警报 ID', + titleTooltip: 'The ID of the alarm that generated this event', + formatter: function (value, row, index) { + void (row); + void (index); + return alarmid4human(value); + }, + align: 'center', + valign: 'middle', + visible: false, + sortable: true + }, + { + field: 'alarm_event_id', + title: '警报事件 ID', + titleTooltip: 'The incremental ID of this event for the given alarm', + formatter: function (value, row, index) { + void (row); + void (index); + return alarmid4human(value); + }, + align: 'center', + valign: 'middle', + visible: false, + sortable: true + }, + { + field: 'chart', + title: '图表', + titleTooltip: 'The chart the alarm is attached to', + align: 'center', + valign: 'middle', + switchable: false, + sortable: true + }, + { + field: 'family', + title: 'Family', + titleTooltip: 'The family of the chart the alarm is attached to', + align: 'center', + valign: 'middle', + visible: false, + sortable: true + }, + { + field: 'name', + title: '警报', + titleTooltip: 'The alarm name that generated this event', + formatter: function (value, row, index) { + void (row); + void (index); + return value.toString().replace(/_/g, ' '); + }, + align: 'center', + valign: 'middle', + switchable: false, + sortable: true + }, + { + field: 'value_string', + title: 'Friendly Value', + titleTooltip: 'The value of the alarm, that triggered this event', + align: 'right', + valign: 'middle', + sortable: true + }, + { + field: 'old_value_string', + title: 'Friendly Old Value', + titleTooltip: 'The value of the alarm, just before this event', + align: 'right', + valign: 'middle', + visible: false, + sortable: true + }, + { + field: 'old_value', + title: 'Old Value', + titleTooltip: 'The value of the alarm, just before this event', + formatter: function (value, row, index) { + void (row); + void (index); + return ((value !== null) ? Math.round(value * 100) / 100 : 'NaN').toString(); + }, + align: 'center', + valign: 'middle', + visible: false, + sortable: true + }, + { + field: 'value', + title: 'Value', + titleTooltip: 'The value of the alarm, that triggered this event', + formatter: function (value, row, index) { + void (row); + void (index); + return ((value !== null) ? Math.round(value * 100) / 100 : 'NaN').toString(); + }, + align: 'right', + valign: 'middle', + visible: false, + sortable: true + }, + { + field: 'units', + title: '单位', + titleTooltip: 'The units of the value of the alarm', + align: 'left', + valign: 'middle', + visible: false, + sortable: true + }, + { + field: 'old_status', + title: '先前状态', + titleTooltip: 'The status of the alarm, just before this event', + align: 'center', + valign: 'middle', + visible: false, + sortable: true + }, + { + field: 'status', + title: '状态', + titleTooltip: 'The status of the alarm, that was set due to this event', + align: 'center', + valign: 'middle', + switchable: false, + sortable: true + }, + { + field: 'duration', + title: '上次持续时间', + titleTooltip: 'The duration the alarm was at its previous state, just before this event', + formatter: function (value, row, index) { + void (row); + void (index); + return NETDATA.seconds4human(value, { negative_suffix: '', space: ' ', now: 'no time' }); + }, + align: 'center', + valign: 'middle', + visible: false, + sortable: true + }, + { + field: 'non_clear_duration', + title: '提升的持续时间', + titleTooltip: 'The duration the alarm was raised, just before this event', + formatter: function (value, row, index) { + void (row); + void (index); + return NETDATA.seconds4human(value, { negative_suffix: '', space: ' ', now: 'no time' }); + }, + align: 'center', + valign: 'middle', + visible: false, + sortable: true + }, + { + field: 'recipient', + title: '收件人', + titleTooltip: 'The recipient of this event', + align: 'center', + valign: 'middle', + visible: false, + sortable: true + }, + { + field: 'processed', + title: '已处理状态', + titleTooltip: 'True when this event is processed', + formatter: function (value, row, index) { + void (row); + void (index); + + if (value === true) { + return 'DONE'; + } else { + return 'PENDING'; + } + }, + align: 'center', + valign: 'middle', + visible: false, + sortable: true + }, + { + field: 'updated', + title: '更新的状态', + titleTooltip: 'True when this event has been updated by another event', + formatter: function (value, row, index) { + void (row); + void (index); + + if (value === true) { + return 'UPDATED'; + } else { + return 'CURRENT'; + } + }, + align: 'center', + valign: 'middle', + visible: false, + sortable: true + }, + { + field: 'updated_by_id', + title: '由ID更新', + titleTooltip: 'The unique ID of the event that obsoleted this one', + formatter: function (value, row, index) { + void (row); + void (index); + return alarmid4human(value); + }, + align: 'center', + valign: 'middle', + visible: false, + sortable: true + }, + { + field: 'updates_id', + title: '更新ID', + titleTooltip: 'The unique ID of the event obsoleted because of this event', + formatter: function (value, row, index) { + void (row); + void (index); + return alarmid4human(value); + }, + align: 'center', + valign: 'middle', + visible: false, + sortable: true + }, + { + field: 'exec', + title: '脚本', + titleTooltip: 'The script to handle the event notification', + align: 'center', + valign: 'middle', + visible: false, + sortable: true + }, + { + field: 'exec_run', + title: '脚本运行时间', + titleTooltip: 'The date and time the script has been ran', + formatter: function (value, row, index) { + void (row); + void (index); + return timestamp4human(value, ' '); + }, + align: 'center', + valign: 'middle', + visible: false, + sortable: true + }, + { + field: 'exec_code', + title: '脚本返回值', + titleTooltip: 'The return code of the script', + formatter: function (value, row, index) { + void (row); + void (index); + + if (value === 0) { + return 'OK (returned 0)'; + } else { + return 'FAILED (with code ' + value.toString() + ')'; + } + }, + align: 'center', + valign: 'middle', + visible: false, + sortable: true + }, + { + field: 'delay', + title: '脚本延迟', + titleTooltip: 'The hysteresis of the notification', + formatter: function (value, row, index) { + void (row); + void (index); + + return NETDATA.seconds4human(value, { negative_suffix: '', space: ' ', now: 'no time' }); + }, + align: 'center', + valign: 'middle', + visible: false, + sortable: true + }, + { + field: 'delay_up_to_timestamp', + title: '脚本延迟运行时间', + titleTooltip: 'The date and time the script should be run, after hysteresis', + formatter: function (value, row, index) { + void (row); + void (index); + return timestamp4human(value, ' '); + }, + align: 'center', + valign: 'middle', + visible: false, + sortable: true + }, + { + field: 'info', + title: '描述', + titleTooltip: 'A short description of the alarm', + align: 'center', + valign: 'middle', + visible: false, + sortable: true + }, + { + field: 'source', + title: '报警源', + titleTooltip: 'The source of configuration of the alarm', + align: 'center', + valign: 'middle', + visible: false, + sortable: true + } + ] + }); + // console.log($('#alarms_log_table').bootstrapTable('getOptions')); + }); + }); +} + +function alarmsCallback(data) { + var count = 0, x; + for (x in data.alarms) { + if (!data.alarms.hasOwnProperty(x)) { + continue; + } + + var alarm = data.alarms[x]; + if (alarm.status === 'WARNING' || alarm.status === 'CRITICAL') { + count++; + } + } + + if (count > 0) { + document.getElementById('alarms_count_badge').innerHTML = count.toString(); + } else { + document.getElementById('alarms_count_badge').innerHTML = ''; + } +} + +function initializeDynamicDashboardWithData(data) { + if (data !== null) { + options.hostname = data.hostname; + options.data = data; + options.version = data.version; + options.release_channel = data.release_channel; + netdataDashboard.os = data.os; + + if (typeof data.hosts !== 'undefined') { + options.hosts = data.hosts; + } + + // update the dashboard hostname + document.getElementById('hostname').innerHTML = '' + options.hostname + ((netdataSnapshotData !== null) ? ' (snap)' : '').toString() + '  '; + document.getElementById('hostname').href = NETDATA.serverDefault; + document.getElementById('netdataVersion').innerHTML = options.version; + + if (netdataSnapshotData !== null) { + $('#alarmsButton').hide(); + $('#updateButton').hide(); + // $('#loadButton').hide(); + $('#saveButton').hide(); + $('#printButton').hide(); + } + + // update the dashboard title + document.title = options.hostname + ' netdata 仪表板'; + + // close the splash screen + $("#loadOverlay").css("display", "none"); + + // create a chart_by_name index + data.charts_by_name = {}; + var charts = data.charts; + var x; + for (x in charts) { + if (!charts.hasOwnProperty(x)) { + continue; + } + + var chart = charts[x]; + data.charts_by_name[chart.name] = chart; + } + + // render all charts + renderChartsAndMenu(data); + + // Ensure MyNetdata menu is rendered with latest host info #5370 + renderMyNetdataMenu(isSignedIn() ? cloudAgents : registryAgents); + } +} + +// an object to keep initialization configuration +// needed due to the async nature of the XSS modal +var initializeConfig = { + url: null, + custom_info: true, +}; + +function loadCustomDashboardInfo(url, callback) { + loadJs(url, function () { + $.extend(true, netdataDashboard, customDashboard); + callback(); + }); +} + +function initializeChartsAndCustomInfo() { + NETDATA.alarms.callback = alarmsCallback; + + // download all the charts the server knows + NETDATA.chartRegistry.downloadAll(initializeConfig.url, function (data) { + if (data !== null) { + if (initializeConfig.custom_info === true && typeof data.custom_info !== 'undefined' && data.custom_info !== "" && netdataSnapshotData === null) { + //console.log('loading custom dashboard decorations from server ' + initializeConfig.url); + loadCustomDashboardInfo(NETDATA.serverDefault + data.custom_info, function () { + initializeDynamicDashboardWithData(data); + }); + } else { + //console.log('not loading custom dashboard decorations from server ' + initializeConfig.url); + initializeDynamicDashboardWithData(data); + } + } + }); +} + +function xssModalDisableXss() { + //console.log('disabling xss checks'); + NETDATA.xss.enabled = false; + NETDATA.xss.enabled_for_data = false; + initializeConfig.custom_info = true; + initializeChartsAndCustomInfo(); + return false; +} + +function xssModalKeepXss() { + //console.log('keeping xss checks'); + NETDATA.xss.enabled = true; + NETDATA.xss.enabled_for_data = true; + initializeConfig.custom_info = false; + initializeChartsAndCustomInfo(); + return false; +} + +function initializeDynamicDashboard(netdata_url) { + if (typeof netdata_url === 'undefined' || netdata_url === null) { + netdata_url = NETDATA.serverDefault; + } + + initializeConfig.url = netdata_url; + + // initialize clickable alarms + NETDATA.alarms.chart_div_offset = -50; + NETDATA.alarms.chart_div_id_prefix = 'chart_'; + NETDATA.alarms.chart_div_animation_duration = 0; + + NETDATA.pause(function () { + if (typeof netdataCheckXSS !== 'undefined' && netdataCheckXSS === true) { + //$("#loadOverlay").css("display","none"); + document.getElementById('netdataXssModalServer').innerText = initializeConfig.url; + $('#xssModal').modal('show'); + } else { + initializeChartsAndCustomInfo(); + } + }); +} + +// ---------------------------------------------------------------------------- + +function versionLog(msg) { + document.getElementById('versionCheckLog').innerHTML = msg; +} + +// New way of checking for updates, based only on versions + +function versionsMatch(v1, v2) { + if (v1 == v2) { + return true; + } else { + let s1 = v1.split('.'); + let s2 = v2.split('.'); + // Check major version + let n1 = parseInt(s1[0].substring(1, 2), 10); + let n2 = parseInt(s2[0].substring(1, 2), 10); + if (n1 < n2) return false; + else if (n1 > n2) return true; + + // Check minor version + n1 = parseInt(s1[1], 10); + n2 = parseInt(s2[1], 10); + if (n1 < n2) return false; + else if (n1 > n2) return true; + + // Split patch: format could be e.g. 0-22-nightly + s1 = s1[2].split('-'); + s2 = s2[2].split('-'); + + n1 = parseInt(s1[0], 10); + n2 = parseInt(s2[0], 10); + if (n1 < n2) return false; + else if (n1 > n2) return true; + + n1 = (s1.length > 1) ? parseInt(s1[1], 10) : 0; + n2 = (s2.length > 1) ? parseInt(s2[1], 10) : 0; + if (n1 < n2) return false; + else return true; + } +} + +function getGithubLatestVersion(callback) { + versionLog('正在从 github 下载最新版本 ID...'); + + $.ajax({ + url: 'https://api.github.com/repos/netdata/netdata/releases/latest', + async: true, + cache: false + }) + .done(function (data) { + data = data.tag_name.replace(/(\r\n|\n|\r| |\t)/gm, ""); + versionLog('从 github 取得最新版本是 ' + data); + callback(data); + }) + .fail(function () { + versionLog('从 github 下载最新版本 ID 失败。'); + callback(null); + }); +} + +function getGCSLatestVersion(callback) { + versionLog('Downloading latest version id from GCS...'); + $.ajax({ + url: "https://www.googleapis.com/storage/v1/b/netdata-nightlies/o/latest-version.txt", + async: true, + cache: false + }) + .done(function (response) { + $.ajax({ + url: response.mediaLink, + async: true, + cache: false + }) + .done(function (data) { + data = data.replace(/(\r\n|\n|\r| |\t)/gm, ""); + versionLog('Latest nightly version from GCS is ' + data); + callback(data); + }) + .fail(function (xhr, textStatus, errorThrown) { + versionLog('Failed to download the latest nightly version id from GCS!'); + callback(null); + }); + }) + .fail(function (xhr, textStatus, errorThrown) { + versionLog('Failed to download the latest nightly version from GCS!'); + callback(null); + }); +} + + +function checkForUpdateByVersion(force, callback) { + if (options.release_channel === 'stable') { + getGithubLatestVersion(function (sha2) { + callback(options.version, sha2); + }); + } else { + getGCSLatestVersion(function (sha2) { + callback(options.version, sha2); + }); + } + return null; +} + +function notifyForUpdate(force) { + versionLog('

正在检查更新...

'); + + var now = Date.now(); + + if (typeof force === 'undefined' || force !== true) { + var last = loadLocalStorage('last_update_check'); + + if (typeof last === 'string') { + last = parseInt(last); + } else { + last = 0; + } + + if (now - last < 3600000 * 8) { + // no need to check it - too soon + return; + } + } + + checkForUpdateByVersion(force, function (sha1, sha2) { + var save = false; + + if (sha1 === null) { + save = false; + versionLog('

取得您的 netdata 版本失败!

'); + else { + save = true; + versionLog('

您已经是最新版本的 netdata!

'); + } + + if (save) { + saveLocalStorage('last_update_check', now.toString()); + } + }); +} + +// ---------------------------------------------------------------------------- +// printing dashboards + +function showPageFooter() { + document.getElementById('footer').style.display = 'block'; +} + +function printPreflight() { + var url = document.location.origin.toString() + document.location.pathname.toString() + document.location.search.toString() + urlOptions.genHash() + ';mode=print'; + var width = 990; + var height = screen.height * 90 / 100; + //console.log(url); + //console.log(document.location); + window.open(url, '', 'width=' + width.toString() + ',height=' + height.toString() + ',menubar=no,toolbar=no,personalbar=no,location=no,resizable=no,scrollbars=yes,status=no,chrome=yes,centerscreen=yes,attention=yes,dialog=yes'); + $('#printPreflightModal').modal('hide'); +} + +function printPage() { + var print_is_rendering = true; + + $('#printModal').on('hide.bs.modal', function (e) { + if (print_is_rendering === true) { + e.preventDefault(); + return false; + } + + return true; + }); + + $('#printModal').on('show.bs.modal', function () { + var print_options = { + stop_updates_when_focus_is_lost: false, + update_only_visible: false, + sync_selection: false, + eliminate_zero_dimensions: false, + pan_and_zoom_data_padding: false, + show_help: false, + legend_toolbox: false, + resize_charts: false, + pixels_per_point: 1 + }; + + var x; + for (x in print_options) { + if (print_options.hasOwnProperty(x)) { + NETDATA.options.current[x] = print_options[x]; + } + } + + NETDATA.parseDom(); + showPageFooter(); + + NETDATA.globalSelectionSync.stop(); + NETDATA.globalPanAndZoom.setMaster(NETDATA.options.targets[0], urlOptions.after, urlOptions.before); + // NETDATA.onresize(); + + var el = document.getElementById('printModalProgressBar'); + var eltxt = document.getElementById('printModalProgressBarText'); + + function update_chart(idx) { + var state = NETDATA.options.targets[--idx]; + + var pcent = (NETDATA.options.targets.length - idx) * 100 / NETDATA.options.targets.length; + $(el).css('width', pcent + '%').attr('aria-valuenow', pcent); + eltxt.innerText = Math.round(pcent).toString() + '%, ' + state.id; + + setTimeout(function () { + state.updateChart(function () { + NETDATA.options.targets[idx].resizeForPrint(); + + if (idx > 0) { + update_chart(idx); + } else { + print_is_rendering = false; + $('#printModal').modal('hide'); + window.print(); + window.close(); + } + }) + }, 0); + } + + print_is_rendering = true; + update_chart(NETDATA.options.targets.length); + }); + + $('#printModal').modal('show'); +} + +// -------------------------------------------------------------------- + +function jsonStringifyFn(obj) { + return JSON.stringify(obj, function (key, value) { + return (typeof value === 'function') ? value.toString() : value; + }); +} + +function jsonParseFn(str) { + return JSON.parse(str, function (key, value) { + if (typeof value != 'string') { + return value; + } + return (value.substring(0, 8) == 'function') ? eval('(' + value + ')') : value; + }); +} + +// -------------------------------------------------------------------- + +var snapshotOptions = { + bytes_per_chart: 2048, + compressionDefault: 'pako.deflate.base64', + + compressions: { + 'none': { + bytes_per_point_memory: 5.2, + bytes_per_point_disk: 5.6, + + compress: function (s) { + return s; + }, + + compressed_length: function (s) { + return s.length; + }, + + uncompress: function (s) { + return s; + } + }, + + 'pako.deflate.base64': { + bytes_per_point_memory: 1.8, + bytes_per_point_disk: 1.9, + + compress: function (s) { + return btoa(pako.deflate(s, { to: 'string' })); + }, + + compressed_length: function (s) { + return s.length; + }, + + uncompress: function (s) { + return pako.inflate(atob(s), { to: 'string' }); + } + }, + + 'pako.deflate': { + bytes_per_point_memory: 1.4, + bytes_per_point_disk: 3.2, + + compress: function (s) { + return pako.deflate(s, { to: 'string' }); + }, + + compressed_length: function (s) { + return s.length; + }, + + uncompress: function (s) { + return pako.inflate(s, { to: 'string' }); + } + }, + + 'lzstring.utf16': { + bytes_per_point_memory: 1.7, + bytes_per_point_disk: 2.6, + + compress: function (s) { + return LZString.compressToUTF16(s); + }, + + compressed_length: function (s) { + return s.length * 2; + }, + + uncompress: function (s) { + return LZString.decompressFromUTF16(s); + } + }, + + 'lzstring.base64': { + bytes_per_point_memory: 2.1, + bytes_per_point_disk: 2.3, + + compress: function (s) { + return LZString.compressToBase64(s); + }, + + compressed_length: function (s) { + return s.length; + }, + + uncompress: function (s) { + return LZString.decompressFromBase64(s); + } + }, + + 'lzstring.uri': { + bytes_per_point_memory: 2.1, + bytes_per_point_disk: 2.3, + + compress: function (s) { + return LZString.compressToEncodedURIComponent(s); + }, + + compressed_length: function (s) { + return s.length; + }, + + uncompress: function (s) { + return LZString.decompressFromEncodedURIComponent(s); + } + } + } +}; + +// -------------------------------------------------------------------- +// loading snapshots + +function loadSnapshotModalLog(priority, msg) { + document.getElementById('loadSnapshotStatus').className = "alert alert-" + priority; + document.getElementById('loadSnapshotStatus').innerHTML = msg; +} + +var tmpSnapshotData = null; + +function loadSnapshot() { + $('#loadSnapshotImport').addClass('disabled'); + + if (tmpSnapshotData === null) { + loadSnapshotPreflightEmpty(); + loadSnapshotModalLog('danger', 'no data have been loaded'); + return; + } + + loadPako(function () { + loadLzString(function () { + loadSnapshotModalLog('info', 'Please wait, activating snapshot...'); + $('#loadSnapshotModal').modal('hide'); + + netdataShowAlarms = false; + netdataRegistry = false; + netdataServer = tmpSnapshotData.server; + NETDATA.serverDefault = netdataServer; + + document.getElementById('charts_div').innerHTML = ''; + document.getElementById('sidebar').innerHTML = ''; + NETDATA.globalReset(); + + if (typeof tmpSnapshotData.hash !== 'undefined') { + urlOptions.hash = tmpSnapshotData.hash; + } else { + urlOptions.hash = '#'; + } + + if (typeof tmpSnapshotData.info !== 'undefined') { + var info = jsonParseFn(tmpSnapshotData.info); + if (typeof info.menu !== 'undefined') { + netdataDashboard.menu = info.menu; + } + + if (typeof info.submenu !== 'undefined') { + netdataDashboard.submenu = info.submenu; + } + + if (typeof info.context !== 'undefined') { + netdataDashboard.context = info.context; + } + } + + if (typeof tmpSnapshotData.compression !== 'string') { + tmpSnapshotData.compression = 'none'; + } + + if (typeof snapshotOptions.compressions[tmpSnapshotData.compression] === 'undefined') { + alert('unknown compression method: ' + tmpSnapshotData.compression); + tmpSnapshotData.compression = 'none'; + } + + tmpSnapshotData.uncompress = snapshotOptions.compressions[tmpSnapshotData.compression].uncompress; + netdataSnapshotData = tmpSnapshotData; + + urlOptions.after = tmpSnapshotData.after_ms; + urlOptions.before = tmpSnapshotData.before_ms; + + if (typeof tmpSnapshotData.highlight_after_ms !== 'undefined' + && tmpSnapshotData.highlight_after_ms !== null + && tmpSnapshotData.highlight_after_ms > 0 + && typeof tmpSnapshotData.highlight_before_ms !== 'undefined' + && tmpSnapshotData.highlight_before_ms !== null + && tmpSnapshotData.highlight_before_ms > 0 + ) { + urlOptions.highlight_after = tmpSnapshotData.highlight_after_ms; + urlOptions.highlight_before = tmpSnapshotData.highlight_before_ms; + urlOptions.highlight = true; + } else { + urlOptions.highlight_after = 0; + urlOptions.highlight_before = 0; + urlOptions.highlight = false; + } + + netdataCheckXSS = false; // disable the modal - this does not affect XSS checks, since dashboard.js is already loaded + NETDATA.xss.enabled = true; // we should not do any remote requests, but if we do, check them + NETDATA.xss.enabled_for_data = true; // check also snapshot data - that have been excluded from the initial check, due to compression + loadSnapshotPreflightEmpty(); + initializeDynamicDashboard(); + }); + }); +}; + +function loadSnapshotPreflightFile(file) { + var filename = NETDATA.xss.string(file.name); + var fr = new FileReader(); + fr.onload = function (e) { + document.getElementById('loadSnapshotFilename').innerHTML = filename; + var result = null; + try { + result = NETDATA.xss.checkAlways('snapshot', JSON.parse(e.target.result), /^(snapshot\.info|snapshot\.data)$/); + + //console.log(result); + var date_after = new Date(result.after_ms); + var date_before = new Date(result.before_ms); + + if (typeof result.charts_ok === 'undefined') { + result.charts_ok = 'unknown'; + } + + if (typeof result.charts_failed === 'undefined') { + result.charts_failed = 0; + } + + if (typeof result.compression === 'undefined') { + result.compression = 'none'; + } + + if (typeof result.data_size === 'undefined') { + result.data_size = 0; + } + + document.getElementById('loadSnapshotFilename').innerHTML = '' + filename + ''; + document.getElementById('loadSnapshotHostname').innerHTML = '' + result.hostname + ', netdata version: ' + result.netdata_version.toString() + ''; + document.getElementById('loadSnapshotURL').innerHTML = result.url; + document.getElementById('loadSnapshotCharts').innerHTML = result.charts.charts_count.toString() + ' charts, ' + result.charts.dimensions_count.toString() + ' dimensions, ' + result.data_points.toString() + ' points per dimension, ' + Math.round(result.duration_ms / result.data_points).toString() + ' ms per point'; + document.getElementById('loadSnapshotInfo').innerHTML = 'version: ' + result.snapshot_version.toString() + ', includes ' + result.charts_ok.toString() + ' unique chart data queries ' + ((result.charts_failed > 0) ? ('' + result.charts_failed.toString() + ' failed') : '').toString() + ', compressed with ' + result.compression.toString() + ', data size ' + (Math.round(result.data_size * 100 / 1024 / 1024) / 100).toString() + ' MB'; + document.getElementById('loadSnapshotTimeRange').innerHTML = '' + NETDATA.dateTime.localeDateString(date_after) + ' ' + NETDATA.dateTime.localeTimeString(date_after) + ' to ' + NETDATA.dateTime.localeDateString(date_before) + ' ' + NETDATA.dateTime.localeTimeString(date_before) + ''; + document.getElementById('loadSnapshotComments').innerHTML = ((result.comments) ? result.comments : '').toString(); + loadSnapshotModalLog('success', 'File loaded, click Import to render it!'); + $('#loadSnapshotImport').removeClass('disabled'); + + tmpSnapshotData = result; + } + catch (e) { + console.log(e); + document.getElementById('loadSnapshotStatus').className = "alert alert-danger"; + document.getElementById('loadSnapshotStatus').innerHTML = "Failed to parse this file!"; + $('#loadSnapshotImport').addClass('disabled'); + } + } + + //console.log(file); + fr.readAsText(file); +}; + +function loadSnapshotPreflightEmpty() { + document.getElementById('loadSnapshotFilename').innerHTML = ''; + document.getElementById('loadSnapshotHostname').innerHTML = ''; + document.getElementById('loadSnapshotURL').innerHTML = ''; + document.getElementById('loadSnapshotCharts').innerHTML = ''; + document.getElementById('loadSnapshotInfo').innerHTML = ''; + document.getElementById('loadSnapshotTimeRange').innerHTML = ''; + document.getElementById('loadSnapshotComments').innerHTML = ''; + loadSnapshotModalLog('success', 'Browse for a snapshot file (or drag it and drop it here), then click Import to render it.'); + $('#loadSnapshotImport').addClass('disabled'); +}; + +var loadSnapshotDragAndDropInitialized = false; + +function loadSnapshotDragAndDropSetup() { + if (loadSnapshotDragAndDropInitialized === false) { + loadSnapshotDragAndDropInitialized = true; + $('#loadSnapshotDragAndDrop') + .on('drag dragstart dragend dragover dragenter dragleave drop', function (e) { + e.preventDefault(); + e.stopPropagation(); + }) + .on('drop', function (e) { + if (e.originalEvent.dataTransfer.files.length) { + loadSnapshotPreflightFile(e.originalEvent.dataTransfer.files.item(0)); + } else { + loadSnapshotPreflightEmpty(); + loadSnapshotModalLog('danger', 'No file selected'); + } + }); + } +}; + +function loadSnapshotPreflight() { + var files = document.getElementById('loadSnapshotSelectFiles').files; + if (files.length <= 0) { + loadSnapshotPreflightEmpty(); + loadSnapshotModalLog('danger', 'No file selected'); + return; + } + + loadSnapshotModalLog('info', 'Loading file...'); + + loadSnapshotPreflightFile(files.item(0)); +} + +// -------------------------------------------------------------------- +// saving snapshots + +var saveSnapshotStop = false; + +function saveSnapshotCancel() { + saveSnapshotStop = true; +} + +var saveSnapshotModalInitialized = false; + +function saveSnapshotModalSetup() { + if (saveSnapshotModalInitialized === false) { + saveSnapshotModalInitialized = true; + $('#saveSnapshotModal') + .on('hide.bs.modal', saveSnapshotCancel) + .on('show.bs.modal', saveSnapshotModalInit) + .on('shown.bs.modal', function () { + $('#saveSnapshotResolutionSlider').find(".slider-handle:first").attr("tabindex", 1); + document.getElementById('saveSnapshotComments').focus(); + }); + } +}; + +function saveSnapshotModalLog(priority, msg) { + document.getElementById('saveSnapshotStatus').className = "alert alert-" + priority; + document.getElementById('saveSnapshotStatus').innerHTML = msg; +} + +function saveSnapshotModalShowExpectedSize() { + var points = Math.round(saveSnapshotViewDuration / saveSnapshotSelectedSecondsPerPoint); + var priority = 'info'; + var msg = 'A moderate snapshot.'; + + var sizemb = Math.round( + (options.data.charts_count * snapshotOptions.bytes_per_chart + + options.data.dimensions_count * points * snapshotOptions.compressions[saveSnapshotCompression].bytes_per_point_disk) + * 10 / 1024 / 1024) / 10; + + var memmb = Math.round( + (options.data.charts_count * snapshotOptions.bytes_per_chart + + options.data.dimensions_count * points * snapshotOptions.compressions[saveSnapshotCompression].bytes_per_point_memory) + * 10 / 1024 / 1024) / 10; + + if (sizemb < 10) { + priority = 'success'; + msg = 'A nice small snapshot!'; + } + if (sizemb > 50) { + priority = 'warning'; + msg = 'Will stress your browser...'; + } + if (sizemb > 100) { + priority = 'danger'; + msg = 'Hm... good luck...'; + } + + saveSnapshotModalLog(priority, 'The snapshot will have ' + points.toString() + ' points per dimension. Expected size on disk ' + sizemb + ' MB, at browser memory ' + memmb + ' MB.
' + msg); +} + +var saveSnapshotCompression = snapshotOptions.compressionDefault; + +function saveSnapshotSetCompression(name) { + saveSnapshotCompression = name; + document.getElementById('saveSnapshotCompressionName').innerHTML = saveSnapshotCompression; + saveSnapshotModalShowExpectedSize(); +} + +var saveSnapshotSlider = null; +var saveSnapshotSelectedSecondsPerPoint = 1; +var saveSnapshotViewDuration = 1; + +function saveSnapshotModalInit() { + $('#saveSnapshotModalProgressSection').hide(); + $('#saveSnapshotResolutionRadio').show(); + saveSnapshotModalLog('info', 'Select resolution and click Save'); + $('#saveSnapshotExport').removeClass('disabled'); + + loadBootstrapSlider(function () { + saveSnapshotViewDuration = options.duration; + var start_ms = Math.round(Date.now() - saveSnapshotViewDuration * 1000); + + if (NETDATA.globalPanAndZoom.isActive() === true) { + saveSnapshotViewDuration = Math.round((NETDATA.globalPanAndZoom.force_before_ms - NETDATA.globalPanAndZoom.force_after_ms) / 1000); + start_ms = NETDATA.globalPanAndZoom.force_after_ms; + } + + var start_date = new Date(start_ms); + var yyyymmddhhssmm = start_date.getFullYear() + NETDATA.zeropad(start_date.getMonth() + 1) + NETDATA.zeropad(start_date.getDate()) + '-' + NETDATA.zeropad(start_date.getHours()) + NETDATA.zeropad(start_date.getMinutes()) + NETDATA.zeropad(start_date.getSeconds()); + + document.getElementById('saveSnapshotFilename').value = 'netdata-' + options.hostname.toString() + '-' + yyyymmddhhssmm.toString() + '-' + saveSnapshotViewDuration.toString() + '.snapshot'; + saveSnapshotSetCompression(saveSnapshotCompression); + + var min = options.update_every; + var max = Math.round(saveSnapshotViewDuration / 100); + + if (NETDATA.globalPanAndZoom.isActive() === false) { + max = Math.round(saveSnapshotViewDuration / 50); + } + + var view = Math.round(saveSnapshotViewDuration / Math.round($(document.getElementById('charts_div')).width() / 2)); + + // console.log('view duration: ' + saveSnapshotViewDuration + ', min: ' + min + ', max: ' + max + ', view: ' + view); + + if (max < 10) { + max = 10; + } + if (max < min) { + max = min; + } + if (view < min) { + view = min; + } + if (view > max) { + view = max; + } + + if (saveSnapshotSlider !== null) { + saveSnapshotSlider.destroy(); + } + + saveSnapshotSlider = new Slider('#saveSnapshotResolutionSlider', { + ticks: [min, view, max], + min: min, + max: max, + step: options.update_every, + value: view, + scale: (max > 100) ? 'logarithmic' : 'linear', + tooltip: 'always', + formatter: function (value) { + if (value < 1) { + value = 1; + } + + if (value < options.data.update_every) { + value = options.data.update_every; + } + + saveSnapshotSelectedSecondsPerPoint = value; + saveSnapshotModalShowExpectedSize(); + + var seconds = ' seconds '; + if (value === 1) { + seconds = ' second '; + } + + return value + seconds + 'per point' + ((value === options.data.update_every) ? ', server default' : '').toString(); + } + }); + }); +} + +function saveSnapshot() { + loadPako(function () { + loadLzString(function () { + saveSnapshotStop = false; + $('#saveSnapshotModalProgressSection').show(); + $('#saveSnapshotResolutionRadio').hide(); + $('#saveSnapshotExport').addClass('disabled'); + + var filename = document.getElementById('saveSnapshotFilename').value; + // console.log(filename); + saveSnapshotModalLog('info', 'Generating snapshot as ' + filename.toString() + ''); + + var save_options = { + stop_updates_when_focus_is_lost: false, + update_only_visible: false, + sync_selection: false, + eliminate_zero_dimensions: true, + pan_and_zoom_data_padding: false, + show_help: false, + legend_toolbox: false, + resize_charts: false, + pixels_per_point: 1 + }; + var backedup_options = {}; + + var x; + for (x in save_options) { + if (save_options.hasOwnProperty(x)) { + backedup_options[x] = NETDATA.options.current[x]; + NETDATA.options.current[x] = save_options[x]; + } + } + + var el = document.getElementById('saveSnapshotModalProgressBar'); + var eltxt = document.getElementById('saveSnapshotModalProgressBarText'); + + options.data.charts_by_name = null; + + var saveData = { + hostname: options.hostname, + server: NETDATA.serverDefault, + netdata_version: options.data.version, + snapshot_version: 1, + after_ms: Date.now() - options.duration * 1000, + before_ms: Date.now(), + highlight_after_ms: urlOptions.highlight_after, + highlight_before_ms: urlOptions.highlight_before, + duration_ms: options.duration * 1000, + update_every_ms: options.update_every * 1000, + data_points: 0, + url: ((urlOptions.server !== null) ? urlOptions.server : document.location.origin.toString() + document.location.pathname.toString() + document.location.search.toString()).toString(), + comments: document.getElementById('saveSnapshotComments').value.toString(), + hash: urlOptions.hash, + charts: options.data, + info: jsonStringifyFn({ + menu: netdataDashboard.menu, + submenu: netdataDashboard.submenu, + context: netdataDashboard.context + }), + charts_ok: 0, + charts_failed: 0, + compression: saveSnapshotCompression, + data_size: 0, + data: {} + }; + + if (typeof snapshotOptions.compressions[saveData.compression] === 'undefined') { + alert('unknown compression method: ' + saveData.compression); + saveData.compression = 'none'; + } + + var compress = snapshotOptions.compressions[saveData.compression].compress; + var compressed_length = snapshotOptions.compressions[saveData.compression].compressed_length; + + function pack_api1_v1_chart_data(state) { + if (state.library_name === null || state.data === null) { + return; + } + + var data = state.data; + state.data = null; + data.state = null; + var str = JSON.stringify(data); + + if (typeof str === 'string') { + var cstr = compress(str); + saveData.data[state.chartDataUniqueID()] = cstr; + return compressed_length(cstr); + } else { + return 0; + } + } + + var clearPanAndZoom = false; + if (NETDATA.globalPanAndZoom.isActive() === false) { + NETDATA.globalPanAndZoom.setMaster(NETDATA.options.targets[0], saveData.after_ms, saveData.before_ms); + clearPanAndZoom = true; + } + + saveData.after_ms = NETDATA.globalPanAndZoom.force_after_ms; + saveData.before_ms = NETDATA.globalPanAndZoom.force_before_ms; + saveData.duration_ms = saveData.before_ms - saveData.after_ms; + saveData.data_points = Math.round((saveData.before_ms - saveData.after_ms) / (saveSnapshotSelectedSecondsPerPoint * 1000)); + saveSnapshotModalLog('info', 'Generating snapshot with ' + saveData.data_points.toString() + ' data points per dimension...'); + + var charts_count = 0; + var charts_ok = 0; + var charts_failed = 0; + + function saveSnapshotRestore() { + $('#saveSnapshotModal').modal('hide'); + + // restore the options + var x; + for (x in backedup_options) { + if (backedup_options.hasOwnProperty(x)) { + NETDATA.options.current[x] = backedup_options[x]; + } + } + + $(el).css('width', '0%').attr('aria-valuenow', 0); + eltxt.innerText = '0%'; + + if (clearPanAndZoom) { + NETDATA.globalPanAndZoom.clearMaster(); + } + + NETDATA.options.force_data_points = 0; + NETDATA.options.fake_chart_rendering = false; + NETDATA.onscroll_updater_enabled = true; + NETDATA.onresize(); + NETDATA.unpause(); + + $('#saveSnapshotExport').removeClass('disabled'); + } + + NETDATA.globalSelectionSync.stop(); + NETDATA.options.force_data_points = saveData.data_points; + NETDATA.options.fake_chart_rendering = true; + NETDATA.onscroll_updater_enabled = false; + NETDATA.abortAllRefreshes(); + + var size = 0; + var info = ' Resolution: ' + saveSnapshotSelectedSecondsPerPoint.toString() + ((saveSnapshotSelectedSecondsPerPoint === 1) ? ' second ' : ' seconds ').toString() + 'per point.'; + + function update_chart(idx) { + if (saveSnapshotStop === true) { + saveSnapshotModalLog('info', 'Cancelled!'); + saveSnapshotRestore(); + return; + } + + var state = NETDATA.options.targets[--idx]; + + var pcent = (NETDATA.options.targets.length - idx) * 100 / NETDATA.options.targets.length; + $(el).css('width', pcent + '%').attr('aria-valuenow', pcent); + eltxt.innerText = Math.round(pcent).toString() + '%, ' + state.id; + + setTimeout(function () { + charts_count++; + state.isVisible(true); + state.current.force_after_ms = saveData.after_ms; + state.current.force_before_ms = saveData.before_ms; + + state.updateChart(function (status, reason) { + state.current.force_after_ms = null; + state.current.force_before_ms = null; + + if (status === true) { + charts_ok++; + // state.log('ok'); + size += pack_api1_v1_chart_data(state); + } else { + charts_failed++; + state.log('failed to be updated: ' + reason); + } + + saveSnapshotModalLog((charts_failed) ? 'danger' : 'info', 'Generated snapshot data size ' + (Math.round(size * 100 / 1024 / 1024) / 100).toString() + ' MB. ' + ((charts_failed) ? (charts_failed.toString() + ' charts have failed to be downloaded') : '').toString() + info); + + if (idx > 0) { + update_chart(idx); + } else { + saveData.charts_ok = charts_ok; + saveData.charts_failed = charts_failed; + saveData.data_size = size; + // console.log(saveData.compression + ': ' + (size / (options.data.dimensions_count * Math.round(saveSnapshotViewDuration / saveSnapshotSelectedSecondsPerPoint))).toString()); + + // save it + // console.log(saveData); + saveObjectToClient(saveData, filename); + + if (charts_failed > 0) { + alert(charts_failed.toString() + ' failed to be downloaded'); + } + + saveSnapshotRestore(); + saveData = null; + } + }) + }, 0); + } + + update_chart(NETDATA.options.targets.length); + }); + }); +} + +// -------------------------------------------------------------------- +// activate netdata on the page + +function dashboardSettingsSetup() { + var update_options_modal = function () { + // console.log('update_options_modal'); + + var sync_option = function (option) { + var self = $('#' + option); + + if (self.prop('checked') !== NETDATA.getOption(option)) { + // console.log('switching ' + option.toString()); + self.bootstrapToggle(NETDATA.getOption(option) ? 'on' : 'off'); + } + }; + + var theme_sync_option = function (option) { + var self = $('#' + option); + + self.bootstrapToggle(netdataTheme === 'slate' ? 'on' : 'off'); + }; + var units_sync_option = function (option) { + var self = $('#' + option); + + if (self.prop('checked') !== (NETDATA.getOption('units') === 'auto')) { + self.bootstrapToggle(NETDATA.getOption('units') === 'auto' ? 'on' : 'off'); + } + + if (self.prop('checked') === true) { + $('#settingsLocaleTempRow').show(); + $('#settingsLocaleTimeRow').show(); + } else { + $('#settingsLocaleTempRow').hide(); + $('#settingsLocaleTimeRow').hide(); + } + }; + var temp_sync_option = function (option) { + var self = $('#' + option); + + if (self.prop('checked') !== (NETDATA.getOption('temperature') === 'celsius')) { + self.bootstrapToggle(NETDATA.getOption('temperature') === 'celsius' ? 'on' : 'off'); + } + }; + var timezone_sync_option = function (option) { + var self = $('#' + option); + + document.getElementById('browser_timezone').innerText = NETDATA.options.browser_timezone; + document.getElementById('server_timezone').innerText = NETDATA.options.server_timezone; + document.getElementById('current_timezone').innerText = (NETDATA.options.current.timezone === 'default') ? 'unset, using browser default' : NETDATA.options.current.timezone; + + if (self.prop('checked') === NETDATA.dateTime.using_timezone) { + self.bootstrapToggle(NETDATA.dateTime.using_timezone ? 'off' : 'on'); + } + }; + + sync_option('eliminate_zero_dimensions'); + sync_option('destroy_on_hide'); + sync_option('async_on_scroll'); + sync_option('parallel_refresher'); + sync_option('concurrent_refreshes'); + sync_option('sync_selection'); + sync_option('sync_pan_and_zoom'); + sync_option('stop_updates_when_focus_is_lost'); + sync_option('smooth_plot'); + sync_option('pan_and_zoom_data_padding'); + sync_option('show_help'); + sync_option('seconds_as_time'); + theme_sync_option('netdata_theme_control'); + units_sync_option('units_conversion'); + temp_sync_option('units_temp'); + timezone_sync_option('local_timezone'); + + if (NETDATA.getOption('parallel_refresher') === false) { + $('#concurrent_refreshes_row').hide(); + } else { + $('#concurrent_refreshes_row').show(); + } + }; + NETDATA.setOption('setOptionCallback', update_options_modal); + + // handle options changes + $('#eliminate_zero_dimensions').change(function () { + NETDATA.setOption('eliminate_zero_dimensions', $(this).prop('checked')); + }); + $('#destroy_on_hide').change(function () { + NETDATA.setOption('destroy_on_hide', $(this).prop('checked')); + }); + $('#async_on_scroll').change(function () { + NETDATA.setOption('async_on_scroll', $(this).prop('checked')); + }); + $('#parallel_refresher').change(function () { + NETDATA.setOption('parallel_refresher', $(this).prop('checked')); + }); + $('#concurrent_refreshes').change(function () { + NETDATA.setOption('concurrent_refreshes', $(this).prop('checked')); + }); + $('#sync_selection').change(function () { + NETDATA.setOption('sync_selection', $(this).prop('checked')); + }); + $('#sync_pan_and_zoom').change(function () { + NETDATA.setOption('sync_pan_and_zoom', $(this).prop('checked')); + }); + $('#stop_updates_when_focus_is_lost').change(function () { + urlOptions.update_always = !$(this).prop('checked'); + urlOptions.hashUpdate(); + + NETDATA.setOption('stop_updates_when_focus_is_lost', !urlOptions.update_always); + }); + $('#smooth_plot').change(function () { + NETDATA.setOption('smooth_plot', $(this).prop('checked')); + }); + $('#pan_and_zoom_data_padding').change(function () { + NETDATA.setOption('pan_and_zoom_data_padding', $(this).prop('checked')); + }); + $('#seconds_as_time').change(function () { + NETDATA.setOption('seconds_as_time', $(this).prop('checked')); + }); + $('#local_timezone').change(function () { + if ($(this).prop('checked')) { + selected_server_timezone('default', true); + } else { + selected_server_timezone('default', false); + } + }); + + $('#units_conversion').change(function () { + NETDATA.setOption('units', $(this).prop('checked') ? 'auto' : 'original'); + }); + $('#units_temp').change(function () { + NETDATA.setOption('temperature', $(this).prop('checked') ? 'celsius' : 'fahrenheit'); + }); + + $('#show_help').change(function () { + urlOptions.help = $(this).prop('checked'); + urlOptions.hashUpdate(); + + NETDATA.setOption('show_help', urlOptions.help); + netdataReload(); + }); + + // this has to be the last + // it reloads the page + $('#netdata_theme_control').change(function () { + urlOptions.theme = $(this).prop('checked') ? 'slate' : 'white'; + urlOptions.hashUpdate(); + + if (setTheme(urlOptions.theme)) { + netdataReload(); + } + }); +} + +function scrollDashboardTo() { + if (netdataSnapshotData !== null && typeof netdataSnapshotData.hash !== 'undefined') { + //console.log(netdataSnapshotData.hash); + scrollToId(netdataSnapshotData.hash.replace('#', '')); + } else { + // check if we have to jump to a specific section + scrollToId(urlOptions.hash.replace('#', '')); + + if (urlOptions.chart !== null) { + NETDATA.alarms.scrollToChart(urlOptions.chart); + //urlOptions.hash = '#' + NETDATA.name2id('menu_' + charts[c].menu + '_submenu_' + charts[c].submenu); + //urlOptions.hash = '#chart_' + NETDATA.name2id(urlOptions.chart); + //console.log('hash = ' + urlOptions.hash); + } + } +} + +var modalHiddenCallback = null; + +function scrollToChartAfterHidingModal(chart, alarmDate, alarmStatus) { + modalHiddenCallback = function () { + NETDATA.alarms.scrollToChart(chart, alarmDate); + + if (['WARNING', 'CRITICAL'].includes(alarmStatus)) { + const currentChartState = NETDATA.options.targets.find( + (chartState) => chartState.id === chart, + ) + const twoMinutes = 2 * 60 * 1000 + NETDATA.globalPanAndZoom.setMaster( + currentChartState, + alarmDate - twoMinutes, + alarmDate + twoMinutes, + ) + } + }; +} + +// ---------------------------------------------------------------------------- + +function enableTooltipsAndPopovers() { + $('[data-toggle="tooltip"]').tooltip({ + animated: 'fade', + trigger: 'hover', + html: true, + delay: { show: 500, hide: 0 }, + container: 'body' + }); + $('[data-toggle="popover"]').popover(); +} + +// ---------------------------------------------------------------------------- + +var runOnceOnDashboardLastRun = 0; + +function runOnceOnDashboardWithjQuery() { + if (runOnceOnDashboardLastRun !== 0) { + scrollDashboardTo(); + + // restore the scrollspy at the proper position + $(document.body).scrollspy('refresh'); + $(document.body).scrollspy('process'); + + return; + } + + runOnceOnDashboardLastRun = Date.now(); + + // ------------------------------------------------------------------------ + // bootstrap modals + + // prevent bootstrap modals from scrolling the page + // maintains the current scroll position + // https://stackoverflow.com/a/34754029/4525767 + + var scrollPos = 0; + var modal_depth = 0; // how many modals are currently open + var modal_shown = false; // set to true, if a modal is shown + var netdata_paused_on_modal = false; // set to true, if the modal paused netdata + var scrollspyOffset = $(window).height() / 3; // will be updated below - the offset of scrollspy to select an item + + $('.modal') + .on('show.bs.modal', function () { + if (modal_depth === 0) { + scrollPos = window.scrollY; + + $('body').css({ + overflow: 'hidden', + position: 'fixed', + top: -scrollPos + }); + + modal_shown = true; + + if (NETDATA.options.pauseCallback === null) { + NETDATA.pause(function () { + }); + netdata_paused_on_modal = true; + } else { + netdata_paused_on_modal = false; + } + } + + modal_depth++; + //console.log(urlOptions.after); + + }) + .on('hide.bs.modal', function () { + + modal_depth--; + + if (modal_depth <= 0) { + modal_depth = 0; + + $('body') + .css({ + overflow: '', + position: '', + top: '' + }); + + // scroll to the position we had open before the modal + $('html, body') + .animate({ scrollTop: scrollPos }, 0); + + // unpause netdata, if we paused it + if (netdata_paused_on_modal === true) { + NETDATA.unpause(); + netdata_paused_on_modal = false; + } + + // restore the scrollspy at the proper position + $(document.body).scrollspy('process'); + } + //console.log(urlOptions.after); + }) + .on('hidden.bs.modal', function () { + if (modal_depth === 0) { + modal_shown = false; + } + + if (typeof modalHiddenCallback === 'function') { + modalHiddenCallback(); + } + + modalHiddenCallback = null; + //console.log(urlOptions.after); + }); + + // ------------------------------------------------------------------------ + // sidebar / affix + + if (shouldShowSignInBanner()) { + const el = document.getElementById("sign-in-banner"); + if (el) { + el.style.display = "initial"; + el.classList.add(`theme-${netdataTheme}`); + } + } + + $('#sidebar') + .affix({ + offset: { + top: (isdemo()) ? 150 : 0, + bottom: 0 + } + }) + .on('affixed.bs.affix', function () { + // fix scrolling of very long affix lists + // http://stackoverflow.com/questions/21691585/bootstrap-3-1-0-affix-too-long + + $(this).removeAttr('style'); + }) + .on('affix-top.bs.affix', function () { + // fix bootstrap affix click bug + // https://stackoverflow.com/a/37847981/4525767 + + if (modal_shown) { + return false; + } + }) + .on('activate.bs.scrollspy', function (e) { + // change the URL based on the current position of the screen + + if (modal_shown === false) { + var el = $(e.target); + var hash = el.find('a').attr('href'); + if (typeof hash === 'string' && hash.substring(0, 1) === '#' && urlOptions.hash.startsWith(hash + '_submenu_') === false) { + urlOptions.hash = hash; + urlOptions.hashUpdate(); + } + } + }); + + Ps.initialize(document.getElementById('sidebar'), { + wheelSpeed: 0.5, + wheelPropagation: true, + swipePropagation: true, + minScrollbarLength: null, + maxScrollbarLength: null, + useBothWheelAxes: false, + suppressScrollX: true, + suppressScrollY: false, + scrollXMarginOffset: 0, + scrollYMarginOffset: 0, + theme: 'default' + }); + + // ------------------------------------------------------------------------ + // scrollspy + + if (scrollspyOffset > 250) { + scrollspyOffset = 250; + } + if (scrollspyOffset < 75) { + scrollspyOffset = 75; + } + document.body.setAttribute('data-offset', scrollspyOffset); + + // scroll the dashboard, before activating the scrollspy, so that our + // hash will not be updated before we got the chance to scroll to it + scrollDashboardTo(); + + $(document.body).scrollspy({ + target: '#sidebar', + offset: scrollspyOffset // controls the diff of the element to the top, to select it + }); + + // ------------------------------------------------------------------------ + // my-netdata menu + + Ps.initialize(document.getElementById('my-netdata-dropdown-content'), { + wheelSpeed: 1, + wheelPropagation: false, + swipePropagation: false, + minScrollbarLength: null, + maxScrollbarLength: null, + useBothWheelAxes: false, + suppressScrollX: true, + suppressScrollY: false, + scrollXMarginOffset: 0, + scrollYMarginOffset: 0, + theme: 'default' + }); + + $('#myNetdataDropdownParent') + .on('show.bs.dropdown', function () { + var hash = urlOptions.genHash(); + $('.registry_link').each(function (idx) { + this.setAttribute('href', this.getAttribute("href").replace(/#.*$/, hash)); + }); + + NETDATA.pause(function () { + }); + }) + .on('shown.bs.dropdown', function () { + Ps.update(document.getElementById('my-netdata-dropdown-content')); + myNetdataMenuDidShow(); + }) + .on('hidden.bs.dropdown', function () { + NETDATA.unpause(); + }); + + $('#deleteRegistryModal') + .on('hidden.bs.modal', function () { + deleteRegistryGuid = null; + }); + + // ------------------------------------------------------------------------ + // update modal + + $('#updateModal') + .on('show.bs.modal', function () { + versionLog('checking, please wait...'); + }) + .on('shown.bs.modal', function () { + }); + + // ------------------------------------------------------------------------ + // alarms modal + + $('#alarmsModal') + .on('shown.bs.modal', function () { + alarmsUpdateModal(); + }) + .on('hidden.bs.modal', function () { + document.getElementById('alarms_active').innerHTML = + document.getElementById('alarms_all').innerHTML = + document.getElementById('alarms_log').innerHTML = + 'loading...'; + }); + + // ------------------------------------------------------------------------ + + dashboardSettingsSetup(); + loadSnapshotDragAndDropSetup(); + saveSnapshotModalSetup(); + showPageFooter(); + + // ------------------------------------------------------------------------ + // https://github.com/viralpatel/jquery.shorten/blob/master/src/jquery.shorten.js + + $.fn.shorten = function (settings) { + "use strict"; + + var config = { + showChars: 750, + minHideChars: 10, + ellipsesText: "...", + moreText: ' show more information', + lessText: ' show less information', + onLess: function () { + NETDATA.onscroll(); + }, + onMore: function () { + NETDATA.onscroll(); + }, + errMsg: null, + force: false + }; + + if (settings) { + $.extend(config, settings); + } + + if ($(this).data('jquery.shorten') && !config.force) { + return false; + } + $(this).data('jquery.shorten', true); + + $(document).off("click", '.morelink'); + + $(document).on({ + click: function () { + + var $this = $(this); + if ($this.hasClass('less')) { + $this.removeClass('less'); + $this.html(config.moreText); + $this.parent().prev().animate({ 'height': '0' + '%' }, 0, function () { + $this.parent().prev().prev().show(); + }).hide(0, function () { + config.onLess(); + }); + } else { + $this.addClass('less'); + $this.html(config.lessText); + $this.parent().prev().animate({ 'height': '100' + '%' }, 0, function () { + $this.parent().prev().prev().hide(); + }).show(0, function () { + config.onMore(); + }); + } + return false; + } + }, '.morelink'); + + return this.each(function () { + var $this = $(this); + + var content = $this.html(); + var contentlen = $this.text().length; + if (contentlen > config.showChars + config.minHideChars) { + var c = content.substr(0, config.showChars); + if (c.indexOf('<') >= 0) // If there's HTML don't want to cut it + { + var inTag = false; // I'm in a tag? + var bag = ''; // Put the characters to be shown here + var countChars = 0; // Current bag size + var openTags = []; // Stack for opened tags, so I can close them later + var tagName = null; + + for (var i = 0, r = 0; r <= config.showChars; i++) { + if (content[i] === '<' && !inTag) { + inTag = true; + + // This could be "tag" or "/tag" + tagName = content.substring(i + 1, content.indexOf('>', i)); + + // If its a closing tag + if (tagName[0] === '/') { + + if (tagName !== ('/' + openTags[0])) { + config.errMsg = 'ERROR en HTML: the top of the stack should be the tag that closes'; + } else { + openTags.shift(); // Pops the last tag from the open tag stack (the tag is closed in the retult HTML!) + } + + } else { + // There are some nasty tags that don't have a close tag like
+ if (tagName.toLowerCase() !== 'br') { + openTags.unshift(tagName); // Add to start the name of the tag that opens + } + } + } + + if (inTag && content[i] === '>') { + inTag = false; + } + + if (inTag) { + bag += content.charAt(i); + } else { + // Add tag name chars to the result + r++; + if (countChars <= config.showChars) { + bag += content.charAt(i); // Fix to ie 7 not allowing you to reference string characters using the [] + countChars++; + } else { + // Now I have the characters needed + if (openTags.length > 0) { + // I have unclosed tags + + //console.log('They were open tags'); + //console.log(openTags); + for (var j = 0; j < openTags.length; j++) { + //console.log('Cierro tag ' + openTags[j]); + bag += ''; // Close all tags that were opened + + // You could shift the tag from the stack to check if you end with an empty stack, that means you have closed all open tags + } + break; + } + } + } + } + c = $('
').html(bag + '' + config.ellipsesText + '').html(); + } else { + c += config.ellipsesText; + } + + var html = '
' + c + + '
' + content + + '
' + config.moreText + ''; + + $this.html(html); + $this.find(".allcontent").hide(); // Hide all text + $('.shortcontent p:last', $this).css('margin-bottom', 0); //Remove bottom margin on last paragraph as it's likely shortened + } + }); + }; +} + +function finalizePage() { + // resize all charts - without starting the background thread + // this has to be done while NETDATA is paused + // if we omit this, the affix menu will be wrong, since all + // the Dom elements are initially zero-sized + NETDATA.parseDom(); + + // ------------------------------------------------------------------------ + + NETDATA.globalPanAndZoom.callback = null; + NETDATA.globalChartUnderlay.callback = null; + + if (urlOptions.pan_and_zoom === true && NETDATA.options.targets.length > 0) { + NETDATA.globalPanAndZoom.setMaster(NETDATA.options.targets[0], urlOptions.after, urlOptions.before); + } + + // callback for us to track PanAndZoom operations + NETDATA.globalPanAndZoom.callback = urlOptions.netdataPanAndZoomCallback; + NETDATA.globalChartUnderlay.callback = urlOptions.netdataHighlightCallback; + + // ------------------------------------------------------------------------ + + // let it run (update the charts) + NETDATA.unpause(); + + runOnceOnDashboardWithjQuery(); + $(".shorten").shorten(); + enableTooltipsAndPopovers(); + + if (isdemo()) { + // do not to give errors on netdata demo servers for 60 seconds + NETDATA.options.current.retries_on_data_failures = 60; + + // google analytics when this is used for the home page of the demo sites + // this does not run on user's installations + setTimeout(function () { + (function (i, s, o, g, r, a, m) { + i['GoogleAnalyticsObject'] = r; + i[r] = i[r] || function () { + (i[r].q = i[r].q || []).push(arguments) + }, i[r].l = 1 * new Date(); + a = s.createElement(o), + m = s.getElementsByTagName(o)[0]; + a.async = 1; + a.src = g; + m.parentNode.insertBefore(a, m) + })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga'); + + ga('create', 'UA-64295674-3', 'auto'); + ga('send', 'pageview', '/demosite/' + window.location.host); + }, 2000); + } else { + } + + if (urlOptions.show_alarms === true) { + setTimeout(function () { + $('#alarmsModal').modal('show'); + }, 1000); + } + + NETDATA.onresizeCallback = function () { + Ps.update(document.getElementById('sidebar')); + Ps.update(document.getElementById('my-netdata-dropdown-content')); + }; + NETDATA.onresizeCallback(); + + if (netdataSnapshotData !== null) { + NETDATA.globalPanAndZoom.setMaster(NETDATA.options.targets[0], netdataSnapshotData.after_ms, netdataSnapshotData.before_ms); + } + + //if (urlOptions.nowelcome !== true) { + // setTimeout(function () { + // $('#welcomeModal').modal(); + // }, 2000); + //} + + // var netdataEnded = performance.now(); + // console.log('start up time: ' + (netdataEnded - netdataStarted).toString() + ' ms'); +} + +function resetDashboardOptions() { + var help = NETDATA.options.current.show_help; + + NETDATA.resetOptions(); + if (setTheme('slate')) { + netdataReload(); + } + + if (help !== NETDATA.options.current.show_help) { + netdataReload(); + } +} + +// callback to add the dashboard info to the +// parallel javascript downloader in netdata +var netdataPrepCallback = function () { + NETDATA.requiredCSS.push({ + url: NETDATA.serverStatic + 'css/bootstrap-toggle-2.2.2.min.css', + isAlreadyLoaded: function () { + return false; + } + }); + + NETDATA.requiredJs.push({ + url: NETDATA.serverStatic + 'lib/bootstrap-toggle-2.2.2.min.js', + isAlreadyLoaded: function () { + return false; + } + }); + + NETDATA.requiredJs.push({ + url: NETDATA.serverStatic + 'dashboard_info.js?v20181019-1', + async: false, + isAlreadyLoaded: function () { + return false; + } + }); + + if (isdemo()) { + document.getElementById('masthead').style.display = 'block'; + } else { + if (urlOptions.update_always === true) { + NETDATA.setOption('stop_updates_when_focus_is_lost', !urlOptions.update_always); + } + } +}; + +var selected_server_timezone = function (timezone, status) { + //console.log('called with timezone: ' + timezone + ", status: " + ((typeof status === 'undefined')?'undefined':status).toString()); + + // clear the error + document.getElementById('timezone_error_message').innerHTML = ''; + + if (typeof status === 'undefined') { + // the user selected a timezone from the menu + + NETDATA.setOption('user_set_server_timezone', timezone); + + if (NETDATA.dateTime.init(timezone) === false) { + NETDATA.dateTime.init(); + + if (!$('#local_timezone').prop('checked')) { + $('#local_timezone').bootstrapToggle('on'); + } + + document.getElementById('timezone_error_message').innerHTML = 'Ooops! That timezone was not accepted by your browser. Please open a github issue to help us fix it.'; + NETDATA.setOption('user_set_server_timezone', NETDATA.options.server_timezone); + } else { + if ($('#local_timezone').prop('checked')) { + $('#local_timezone').bootstrapToggle('off'); + } + } + } else if (status === true) { + // the user wants the browser default timezone to be activated + + NETDATA.dateTime.init(); + } else { + // the user wants the server default timezone to be activated + //console.log('found ' + NETDATA.options.current.user_set_server_timezone); + + if (NETDATA.options.current.user_set_server_timezone === 'default') { + NETDATA.options.current.user_set_server_timezone = NETDATA.options.server_timezone; + } + + timezone = NETDATA.options.current.user_set_server_timezone; + + if (NETDATA.dateTime.init(timezone) === false) { + NETDATA.dateTime.init(); + + if (!$('#local_timezone').prop('checked')) { + $('#local_timezone').bootstrapToggle('on'); + } + + document.getElementById('timezone_error_message').innerHTML = 'Sorry. The timezone "' + timezone.toString() + '" is not accepted by your browser. Please select one from the list.'; + NETDATA.setOption('user_set_server_timezone', NETDATA.options.server_timezone); + } + } + + document.getElementById('current_timezone').innerText = (NETDATA.options.current.timezone === 'default') ? 'unset, using browser default' : NETDATA.options.current.timezone; + return false; +}; + +// our entry point +// var netdataStarted = performance.now(); + +var netdataCallback = initializeDynamicDashboard; + +// ================================================================================================= +// netdata.cloud + +let registryAgents = []; + +let cloudAgents = []; + +let myNetdataMenuFilterValue = ""; + +let cloudAccountID = null; + +let cloudAccountName = null; + +let cloudToken = null; + +/// Enforces a maximum string length while retaining the prefix and the postfix of +/// the string. +function truncateString(str, maxLength) { + if (str.length <= maxLength) { + return str; + } + + const spanLength = Math.floor((maxLength - 3) / 2); + return `${str.substring(0, spanLength)}...${str.substring(str.length - spanLength)}`; +} + +// ------------------------------------------------------------------------------------------------- +// netdata.cloud API Client +// ------------------------------------------------------------------------------------------------- + +function isValidAgent(a) { + return a.urls != null && a.urls.length > 0; +} + +// https://github.com/netdata/hub/issues/146 +function getCloudAccountAgents() { + if (!isSignedIn()) { + return []; + } + + return fetch( + `${NETDATA.registry.cloudBaseURL}/api/v1/accounts/${cloudAccountID}/agents`, + { + method: "GET", + mode: "cors", + headers: { + "Authorization": `Bearer ${cloudToken}` + } + } + ).then((response) => { + if (!response.ok) { + throw Error("Cannot fetch known accounts"); + } + return response.json(); + }).then((payload) => { + const agents = payload.result ? payload.result.agents : null; + + if (!agents) { + return []; + } + + return agents.filter((a) => isValidAgent(a)).map((a) => { + return { + "guid": a.id, + "name": a.name, + "url": a.urls[0], + "alternate_urls": a.urls + } + }) + }).catch(function (error) { + console.log(error); + return null; + }); +} + +/** Updates the lastAccessTime and accessCount properties of the agent for the account. */ +function touchAgent() { + if (!isSignedIn()) { + return []; + } + + const touchUrl = `${NETDATA.registry.cloudBaseURL}/api/v1/agents/${NETDATA.registry.machine_guid}/touch?account_id=${cloudAccountID}`; + return fetch( + touchUrl, + { + method: "post", + body: "", + mode: "cors", + headers: { + "Authorization": `Bearer ${cloudToken}` + } + } + ).then((response) => { + if (!response.ok) { + throw Error("Cannot touch agent" + JSON.stringify(response)); + } + return response.json(); + }).then((payload) => { + + }).catch(function (error) { + console.log(error); + return null; + }); +} + +// https://github.com/netdata/hub/issues/128 +function postCloudAccountAgents(agentsToSync) { + if (!isSignedIn()) { + return []; + } + + const maskedURL = NETDATA.registry.MASKED_DATA; + + const agents = agentsToSync.map((a) => { + const urls = a.alternate_urls.filter((url) => url != maskedURL); + + return { + "id": a.guid, + "name": a.name, + "urls": urls + } + }).filter((a) => isValidAgent(a)) + + const payload = { + "accountID": cloudAccountID, + "agents": agents, + "merge": false, + }; + + return fetch( + `${NETDATA.registry.cloudBaseURL}/api/v1/accounts/${cloudAccountID}/agents`, + { + method: "POST", + mode: "cors", + headers: { + "Content-Type": "application/json; charset=utf-8", + "Authorization": `Bearer ${cloudToken}` + }, + body: JSON.stringify(payload) + } + ).then((response) => { + return response.json(); + }).then((payload) => { + const agents = payload.result ? payload.result.agents : null; + + if (!agents) { + return []; + } + + return agents.filter((a) => isValidAgent(a)).map((a) => { + return { + "guid": a.id, + "name": a.name, + "url": a.urls[0], + "alternate_urls": a.urls + } + }) + }); +} + +function deleteCloudAgentURL(agentID, url) { + if (!isSignedIn()) { + return []; + } + + return fetch( + `${NETDATA.registry.cloudBaseURL}/api/v1/accounts/${cloudAccountID}/agents/${agentID}/url?value=${encodeURIComponent(url)}`, + { + method: "DELETE", + mode: "cors", + headers: { + "Content-Type": "application/json; charset=utf-8", + "Authorization": `Bearer ${cloudToken}` + }, + } + ).then((response) => { + return response.json(); + }).then((payload) => { + const count = payload.result ? payload.result.count : 0; + return count; + }); +} + +// ------------------------------------------------------------------------------------------------- + +function signInDidClick(e) { + e.preventDefault(); + e.stopPropagation(); + + if (!NETDATA.registry.isUsingGlobalRegistry()) { + // If user is using a private registry, request his consent for + // synchronizing with cloud. + showSignInModal(); + return; + } + + signIn(); +} + +function shouldShowSignInBanner() { + return false; +} + +function closeSignInBanner() { + localStorage.setItem("signInBannerClosed", "true"); + const el = document.getElementById("sign-in-banner"); + if (el) { + el.style.display = "none"; + } +} + +function closeSignInBannerDidClick(e) { + closeSignInBanner(); +} + +function signOutDidClick(e) { + e.preventDefault(); + e.stopPropagation(); + signOut(); +} + +// ------------------------------------------------------------------------------------------------- + +function updateMyNetdataAfterFilterChange() { + const machinesEl = document.getElementById("my-netdata-menu-machines") + machinesEl.innerHTML = renderMachines(cloudAgents); + + if (options.hosts.length > 1) { + const streamedEl = document.getElementById("my-netdata-menu-streamed") + streamedEl.innerHTML = renderStreamedHosts(options); + } +} + +function myNetdataMenuDidShow() { + const filterEl = document.getElementById("my-netdata-menu-filter-input"); + if (filterEl) { + filterEl.focus(); + } +} + +function myNetdataFilterDidChange(e) { + const inputEl = e.target; + setTimeout(() => { + myNetdataMenuFilterValue = inputEl.value; + updateMyNetdataAfterFilterChange(); + }, 1); +} + +function myNetdataFilterClearDidClick(e) { + e.preventDefault(); + e.stopPropagation(); + + const inputEl = document.getElementById("my-netdata-menu-filter-input"); + inputEl.value = ""; + myNetdataMenuFilterValue = ""; + + updateMyNetdataAfterFilterChange(); + + inputEl.focus(); +} + +// ------------------------------------------------------------------------------------------------- + +function clearCloudVariables() { + cloudAccountID = null; + cloudAccountName = null; + cloudToken = null; +} + +function clearCloudLocalStorageItems() { + localStorage.removeItem("cloud.baseURL"); + localStorage.removeItem("cloud.agentID"); + localStorage.removeItem("cloud.sync"); +} + +function signIn() { + const url = `${NETDATA.registry.cloudBaseURL}/account/sign-in-agent?id=${NETDATA.registry.machine_guid}&name=${encodeURIComponent(NETDATA.registry.hostname)}&origin=${encodeURIComponent(window.location.origin + "/")}`; + window.open(url); +} + +function signOut() { + cloudSSOSignOut(); +} + +function handleMessage(e) { + switch (e.data.type) { + case "sign-in": + handleSignInMessage(e); + break; + + case "sign-out": + handleSignOutMessage(e); + break; + + default: + return; + } +} + +function handleSignInMessage(e) { + closeSignInBanner(); + localStorage.setItem("cloud.baseURL", NETDATA.registry.cloudBaseURL); + + cloudAccountID = e.data.accountID; + cloudAccountName = e.data.accountName; + cloudToken = e.data.token; + + netdataRegistryCallback(registryAgents); + if (e.data.redirectURI && !window.location.href.includes(e.data.redirectURI)) { + // lgtm false-positive - redirectURI does not come from user input, but from iframe callback + window.location.replace(e.data.redirectURI); // lgtm[js/client-side-unvalidated-url-redirection] + } +} + +function handleSignOutMessage(e) { + clearCloudVariables(); + renderMyNetdataMenu(registryAgents); +} + +function isSignedIn() { + return cloudToken != null && cloudAccountID != null; +} + +function sortedArraysEqual(a, b) { + if (a.length != b.length) return false; + + for (var i = 0; i < a.length; ++i) { + if (a[i] !== b[i]) return false; + } + + return true; +} + +// If merging is needed returns the merged agents set, otherwise returns null. +function mergeAgents(cloud, local) { + let dirty = false; + + const union = new Map(); + + for (const cagent of cloud) { + union.set(cagent.guid, cagent); + } + + for (const lagent of local) { + const cagent = union.get(lagent.guid); + if (cagent) { + for (const u of lagent.alternate_urls) { + if (u === NETDATA.registry.MASKED_DATA) { // TODO: temp until registry is updated. + continue; + } + + if (!cagent.alternate_urls.includes(u)) { + dirty = true; + cagent.alternate_urls.push(u); + } + } + } else { + dirty = true; + union.set(lagent.guid, lagent); + } + } + + if (dirty) { + return Array.from(union.values()); + } + + return null; +} + +function showSignInModal() { + document.getElementById("sim-registry").innerHTML = NETDATA.registry.server; + $("#signInModal").modal("show"); +} + +function explicitlySignIn() { + $("#signInModal").modal("hide"); + signIn(); +} + +function showSyncModal() { + document.getElementById("sync-registry-modal-registry").innerHTML = NETDATA.registry.server; + $("#syncRegistryModal").modal("show"); +} + +function explicitlySyncAgents() { + $("#syncRegistryModal").modal("hide"); + + const json = localStorage.getItem("cloud.sync"); + const sync = json ? JSON.parse(json) : {}; + delete sync[cloudAccountID]; + localStorage.setItem("cloud.sync", JSON.stringify(sync)); + + NETDATA.registry.init(); +} + +function syncAgents(callback) { + const json = localStorage.getItem("cloud.sync"); + const sync = json ? JSON.parse(json) : {}; + + const currentAgent = { + guid: NETDATA.registry.machine_guid, + name: NETDATA.registry.hostname, + url: NETDATA.serverDefault, + alternate_urls: [NETDATA.serverDefault], + } + + const localAgents = sync[cloudAccountID] + ? [currentAgent] + : registryAgents.concat([currentAgent]); + + console.log("Checking if sync is needed.", localAgents); + + const agentsToSync = mergeAgents(cloudAgents, localAgents); + + if ((!sync[cloudAccountID]) || agentsToSync) { + sync[cloudAccountID] = new Date().getTime(); + localStorage.setItem("cloud.sync", JSON.stringify(sync)); + } + + if (agentsToSync) { + console.log("Synchronizing with netdata.cloud."); + + postCloudAccountAgents(agentsToSync).then((agents) => { + // TODO: clear syncTime on error! + cloudAgents = agents; + callback(cloudAgents); + }); + + return + } + + callback(cloudAgents); +} + +let isCloudSSOInitialized = false; + +function cloudSSOInit() { + const iframeEl = document.getElementById("ssoifrm"); + const url = `${NETDATA.registry.cloudBaseURL}/account/sso-agent?id=${NETDATA.registry.machine_guid}`; + iframeEl.src = url; + isCloudSSOInitialized = true; +} + +function cloudSSOSignOut() { + const iframe = document.getElementById("ssoifrm"); + const url = `${NETDATA.registry.cloudBaseURL}/account/sign-out-agent`; + iframe.src = url; +} + +function initCloud() { + if (!NETDATA.registry.isCloudEnabled) { + clearCloudVariables(); + clearCloudLocalStorageItems(); + return; + } + + if (NETDATA.registry.cloudBaseURL != localStorage.getItem("cloud.baseURL")) { + clearCloudVariables(); + clearCloudLocalStorageItems(); + if (NETDATA.registry.cloudBaseURL) { + localStorage.setItem("cloud.baseURL", NETDATA.registry.cloudBaseURL); + } + } + + if (!isCloudSSOInitialized) { + cloudSSOInit(); + } + + touchAgent(); +} + +// This callback is called after NETDATA.registry is initialized. +function netdataRegistryCallback(machinesArray) { + localStorage.setItem("cloud.agentID", NETDATA.registry.machine_guid); + + initCloud(); + + registryAgents = machinesArray; + + if (isSignedIn()) { + // We call getCloudAccountAgents() here because it requires that + // NETDATA.registry is initialized. + clearMyNetdataMenu(); + getCloudAccountAgents().then((agents) => { + if (!agents) { + errorMyNetdataMenu(); + return; + } + cloudAgents = agents; + syncAgents((agents) => { + const agentsMap = {} + for (const agent of agents) { + agentsMap[agent.guid] = agent; + } + + NETDATA.registry.machines = agentsMap; + NETDATA.registry.machines_array = agents; + + renderMyNetdataMenu(agents); + }); + }); + } else { + renderMyNetdataMenu(machinesArray) + } +}; + +// If we know the cloudBaseURL and agentID from local storage render (eagerly) +// the account ui before receiving the definitive response from the web server. +// This improves the perceived performance. +function tryFastInitCloud() { + const baseURL = localStorage.getItem("cloud.baseURL"); + const agentID = localStorage.getItem("cloud.agentID"); + + if (baseURL && agentID) { + NETDATA.registry.cloudBaseURL = baseURL; + NETDATA.registry.machine_guid = agentID; + NETDATA.registry.isCloudEnabled = true; + + initCloud(); + } +} + +function initializeApp() { + window.addEventListener("message", handleMessage, false); + + // tryFastInitCloud(); +} + +if (document.readyState === "complete") { + initializeApp(); +} else { + document.addEventListener("readystatechange", () => { + if (document.readyState === "complete") { + initializeApp(); + } + }); +} diff --git a/luci-app-netdata/root/usr/share/netdata/webcn/netdata b/luci-app-netdata/root/usr/share/netdata/webcn/netdata new file mode 100644 index 00000000..83f9eda9 --- /dev/null +++ b/luci-app-netdata/root/usr/share/netdata/webcn/netdata @@ -0,0 +1,6 @@ + +config netdata 'netdata' + option logger '1' + option enabled '0' + option port '19990' + diff --git a/luci-app-netdata/root/usr/share/netdata/webcn/netdata.conf b/luci-app-netdata/root/usr/share/netdata/webcn/netdata.conf new file mode 100644 index 00000000..9b2c9d24 --- /dev/null +++ b/luci-app-netdata/root/usr/share/netdata/webcn/netdata.conf @@ -0,0 +1,52 @@ +# Full configuration can be retrieved from the running +# server at http://localhost:19999/netdata.conf +# +# Example: +# curl -o /etc/netdata/netdata.conf http://localhost:19999/netdata.conf +# + +[global] + update every = 2 + memory deduplication (ksm) = no + debug log = syslog + error log = syslog + access log = none + run as user = root + +[web] + allow connections from = * + allow dashboard from = * + +[plugins] + cgroups = no + apps = no + charts.d = no + fping = no + node.d = no + python.d = no + +[plugin:proc] + ipc =no + /proc/sysvipc/shm = no + /sys/devices/system/edac/mc = no + /sys/devices/system/node = no + /proc/net/sockstat = no + /proc/net/netstat = no + /proc/net/snmp = no + /proc/net/softnet_stat = no + /proc/net/sctp/snmp = no + /proc/net/ip_vs/stats = no + /proc/net/stat/synproxy = no + /sys/kernel/mm/ksm = no + /dev/mapper = no + semaphore totals = no + +[plugin:proc:/proc/diskstats] + path to /dev/vx/dsk = + path to /dev/disk/by-label = + +[health] + enabled = no + +[plugin:proc:ipc] + shared memory totals = no diff --git a/luci-app-netdata/root/usr/share/netdata/webcn/netdata.init b/luci-app-netdata/root/usr/share/netdata/webcn/netdata.init new file mode 100755 index 00000000..9e088294 --- /dev/null +++ b/luci-app-netdata/root/usr/share/netdata/webcn/netdata.init @@ -0,0 +1,46 @@ +#!/bin/sh /etc/rc.common + +START=99 +USE_PROCD=1 + +APPBINARY=/usr/sbin/netdata +CONFIGFILE=/etc/netdata/netdata.conf + +get_config() { + config_get_bool enabled $1 enabled 1 + config_get_bool logger $1 logger 1 + config_get port $1 port 19999 +} + +netdata_prepare() { + pgrep -f /usr/sbin/netdata | xargs kill -9 >/dev/null 2>&1 + logger -t netdata -p warn "netdata is stop." +} + +stop_service() { + netdata_prepare +} + +start_service() { + netdata_prepare + config_load netdata + config_foreach get_config netdata + [ x$enabled == x1 ] || return 1 + mkdir -m 0755 -p /var/cache/netdata + logger -t netdata -p warn "netdata is start." + chown nobody /var/cache/netdata + mkdir -m 0755 -p /var/lib/netdata + chown nobody /var/lib/netdata + mkdir -m 0755 -p /var/log/netdata + chown nobody /var/log/netdata + procd_open_instance + procd_set_param command $APPBINARY -D -c $CONFIGFILE -p $port:$port + [ "x$logger" == x1 ] && procd_set_param stderr 1 + procd_set_param file $CONFIGFILE + procd_set_param respawn + procd_close_instance +} + +service_triggers() { + procd_add_reload_trigger "netdata" +} diff --git a/luci-app-netdata/root/usr/share/rpcd/acl.d/luci-app-netdata.json b/luci-app-netdata/root/usr/share/rpcd/acl.d/luci-app-netdata.json new file mode 100644 index 00000000..6f19d2ff --- /dev/null +++ b/luci-app-netdata/root/usr/share/rpcd/acl.d/luci-app-netdata.json @@ -0,0 +1,11 @@ +{ + "luci-app-nedata": { + "description": "Grant UCI access for luci-app-netdata", + "read": { + "uci": [ "netdata" ] + }, + "write": { + "uci": [ "netdata" ] + } + } +} diff --git a/luci-app-nginx-manager/Makefile b/luci-app-nginx-manager/Makefile new file mode 100644 index 00000000..08c66e41 --- /dev/null +++ b/luci-app-nginx-manager/Makefile @@ -0,0 +1,15 @@ +# Copyright (C) 2016 Openwrt.org +# +# This is free software, licensed under the Apache License, Version 2.0 . +# + +include $(TOPDIR)/rules.mk + +LUCI_TITLE:=LuCI support for NginxManager +LUCI_DEPENDS:=+luci-nginx +luci-ssl-nginx +luci-ssl-openssl +LUCI_PKGARCH:=all +PKG_VERSION:=1.0 +PKG_RELEASE:=20220222 +PKG_MAINTAINER:=Nginx + +include $(TOPDIR)/feeds/luci/luci.mk diff --git a/luci-app-nginx-manager/luasrc/controller/nginx-manager.lua b/luci-app-nginx-manager/luasrc/controller/nginx-manager.lua new file mode 100644 index 00000000..e03c6fbf --- /dev/null +++ b/luci-app-nginx-manager/luasrc/controller/nginx-manager.lua @@ -0,0 +1,39 @@ +module("luci.controller.nginx-manager", package.seeall) + +function index() + nixio.fs.rename ("/etc/nginx/uci.conf", "/etc/nginx/ucibak.conf") + if not nixio.fs.access("/etc/nginx/nginx.conf") then + nixio.fs.copyr("/var/lib/nginx/uci.conf", "/etc/nginx/nginx.conf") + luci.sys.call("/etc/init.d/nginx restart") + end + file=nixio.fs.readfile("/etc/uwsgi/vassals/luci-webui.ini") + if tonumber(file:match("limit%pas[%p%s]+(%d+)")) < 5000 then + file=file:gsub("limit%pas[%p%s]+(%d+)","limit-as = 5000") + nixio.fs.writefile("/etc/uwsgi/vassals/luci-webui.ini", file) + luci.sys.call("/etc/init.d/uwsgi restart") + end + nixio.fs.writefile("/etc/config/nginx-manager", "") + x = luci.model.uci.cursor() + x:set("nginx-manager", "main", "nginx") + x:set("nginx-manager", "main", "name", "main") + x:set("nginx-manager", "main", "filepath", "/etc/nginx/nginx.conf") + for path in nixio.fs.dir("/etc/nginx/conf.d") do + if path:find(".conf$") ~= nil then + name = path:gsub(".conf", "") + x:set("nginx-manager", name, "nginx") + x:set("nginx-manager", name, "name", name) + x:set("nginx-manager", name, "filepath", "/etc/nginx/conf.d/" .. path) + end + end + x:commit("nginx-manager") + entry({"admin", "services", "nginx-manager"}, cbi("nginx-manager"), _("Nginx Manager"), 95).dependent = true + entry({"admin", "services", "nginx-manager", "setstatus"}, call("setstatus")).leaf = true +end + +function setstatus() + local e = {} + local mode = luci.http.formvalue('mode') + e.code=luci.sys.call("/etc/init.d/nginx " .. mode) + luci.http.prepare_content("application/json") + luci.http.write_json(e) +end \ No newline at end of file diff --git a/luci-app-nginx-manager/luasrc/model/cbi/nginx-manager.lua b/luci-app-nginx-manager/luasrc/model/cbi/nginx-manager.lua new file mode 100644 index 00000000..af9bd1f4 --- /dev/null +++ b/luci-app-nginx-manager/luasrc/model/cbi/nginx-manager.lua @@ -0,0 +1,43 @@ +local fs = require "nixio.fs" +local m = Map("nginx-manager",translate("Nginx Manager"), translate("A simple Nginx manager")) +s = m:section(TypedSection, "nginx", translate("Web site list")) +s.template = "nginx-manager/index" +s.addremove = true +s.anonymous = false +s:tab("general", translate("General Info")) +s:tab("server", translate("Configuration File")) +s:taboption("general", DummyValue, "name", translate("name")) +s:taboption("general", DummyValue, "filepath", translate("File Path")) +file=s:taboption("server", TextValue, "") +file.template = "cbi/tvalue" +file.rows = 25 +file.wrap = "off" +file.rmempty = true + +function s.create(self,section) + path="/etc/nginx/conf.d/" .. section .. ".conf" + fs.copyr("/etc/nginx/conf.d/templates", path) + TypedSection.create(self,section) + self.map:set(section, "name", section) + self.map:set(section, "filepath", path) + return true +end +function s.remove(self,section) + path="/etc/nginx/conf.d/" .. section .. ".conf" + fs.remove(path) + TypedSection.remove(self,section) +end +function sync_value_to_file(value, file) + value = value:gsub("\r\n?", "\n") + local old_value = fs.readfile(file) + if value ~= old_value then + fs.writefile(file, value) + end +end +function file.cfgvalue(self,section) + return fs.readfile(self.map:get(section, "filepath")) or "" +end +function file.write(self, section, value) + sync_value_to_file(value, self.map:get(section, "filepath")) +end +return m diff --git a/luci-app-nginx-manager/luasrc/view/nginx-manager/index.htm b/luci-app-nginx-manager/luasrc/view/nginx-manager/index.htm new file mode 100644 index 00000000..66b14114 --- /dev/null +++ b/luci-app-nginx-manager/luasrc/view/nginx-manager/index.htm @@ -0,0 +1,65 @@ +
+ <% if self.title and #self.title > 0 then -%> + <%=self.title%> + <%- end %> + <% if self.description and #self.description > 0 then -%> +
<%=self.description%>
+ <%- end %> +
+ +
+ +
+ +
+ +
+
+ <% local isempty = true for i, k in ipairs(self:cfgsections()) do -%> + <%- section = k; isempty = false -%> + + <% if not self.anonymous then -%> +
+ <%=section:upper()%> + +
+ <%- end %> + + <%+cbi/tabmenu%> + +
+ <%+cbi/ucisection%> +
+ <%- end %> + + <% if isempty then -%> + <%:This section contains no values yet%>

+ <%- end %> + + <% if self.addremove then -%> + <% if self.template_addremove then include(self.template_addremove) else -%> +
+ <% if self.anonymous then -%> + + <%- else -%> + <% if self.invalid_cts then -%>
<% end %> + + + <% if self.invalid_cts then -%> +
<%:Invalid%>
+ <%- end %> + <%- end %> +
+ <%- end %> + <%- end %> +
+ + \ No newline at end of file diff --git a/luci-app-nginx-manager/po/zh-cn/nginx-manager.po b/luci-app-nginx-manager/po/zh-cn/nginx-manager.po new file mode 100644 index 00000000..e7751481 --- /dev/null +++ b/luci-app-nginx-manager/po/zh-cn/nginx-manager.po @@ -0,0 +1,26 @@ +msgid "Nginx Manager" +msgstr "Nginx管理器" + +msgid "A simple Nginx manager" +msgstr "一个简易的Nginx管理器" + +msgid "Web site list" +msgstr "网站列表" + +msgid "Restart the nginx" +msgstr "重新启动Nginx" + +msgid "Reload the nginx" +msgstr "重新加载Nginx" + +msgid "Reload" +msgstr "重新加载" + +msgid "Configuration File" +msgstr "配置文件" + +msgid "General Info" +msgstr "基础信息" + +msgid "File Path" +msgstr "文件路径" \ No newline at end of file diff --git a/luci-app-nginx-manager/po/zh_Hans b/luci-app-nginx-manager/po/zh_Hans new file mode 120000 index 00000000..41451e4a --- /dev/null +++ b/luci-app-nginx-manager/po/zh_Hans @@ -0,0 +1 @@ +zh-cn \ No newline at end of file diff --git a/luci-app-nginx-manager/root/etc/nginx/conf.d/templates b/luci-app-nginx-manager/root/etc/nginx/conf.d/templates new file mode 100644 index 00000000..aa1155ec --- /dev/null +++ b/luci-app-nginx-manager/root/etc/nginx/conf.d/templates @@ -0,0 +1,17 @@ +server { + listen 8080; #bind prot 绑定的端口 + root /www; #directory 网站路径 + ssl_session_timeout 5m; + gzip on; + gzip_types text/plain application/json application/javascript application/x-javascript text/css application/xml text/javascript; + gzip_proxied any; + gzip_vary on; + gzip_comp_level 6; + gzip_buffers 16 8k; + gzip_http_version 1.0; + + location / { + index index.html index.htm; #默认文件 + try_files $uri $uri/ /index.html; + } +} diff --git a/luci-app-nginx-manager/root/etc/uci-defaults/luci-app-nginx-manager b/luci-app-nginx-manager/root/etc/uci-defaults/luci-app-nginx-manager new file mode 100644 index 00000000..1db677c6 --- /dev/null +++ b/luci-app-nginx-manager/root/etc/uci-defaults/luci-app-nginx-manager @@ -0,0 +1,11 @@ +#!/bin/sh + +uci -q batch <<-EOF >/dev/null + delete ucitrack.@nginx-manager[-1] + add ucitrack nginx-manager + set ucitrack.@nginx-manage[-1].init=nginx + commit ucitrack +EOF + +rm -f /tmp/luci-indexcache +exit 0 diff --git a/luci-app-nginx-manager/root/usr/share/rpcd/acl.d/luci-app-nginx-manager.json b/luci-app-nginx-manager/root/usr/share/rpcd/acl.d/luci-app-nginx-manager.json new file mode 100644 index 00000000..35339440 --- /dev/null +++ b/luci-app-nginx-manager/root/usr/share/rpcd/acl.d/luci-app-nginx-manager.json @@ -0,0 +1,11 @@ +{ + "luci-app-nginx-manager": { + "description": "Grant UCI access for luci-app-nginx-manager", + "read": { + "uci": [ "nginx-manager" ] + }, + "write": { + "uci": [ "nginx-manager" ] + } + } +} diff --git a/luci-app-onliner b/luci-app-onliner deleted file mode 160000 index 85edcb3c..00000000 --- a/luci-app-onliner +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 85edcb3c2ec6e2abf778103e0b2a3877a071a456 diff --git a/luci-app-onliner/.gitattributes b/luci-app-onliner/.gitattributes new file mode 100644 index 00000000..dfe07704 --- /dev/null +++ b/luci-app-onliner/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/luci-app-onliner/.gitignore b/luci-app-onliner/.gitignore new file mode 100644 index 00000000..5b9bd874 --- /dev/null +++ b/luci-app-onliner/.gitignore @@ -0,0 +1,2 @@ + +*.bak diff --git a/luci-app-onliner/Makefile b/luci-app-onliner/Makefile new file mode 100644 index 00000000..e6c975ed --- /dev/null +++ b/luci-app-onliner/Makefile @@ -0,0 +1,32 @@ +# Copyright (C) 2016 Openwrt.org +# +# This is free software, licensed under the Apache License, Version 2.0 . +# + +include $(TOPDIR)/rules.mk + +LUCI_TITLE:=LuCI support arp online +LUCI_DEPENDS:= +LUCI_PKGARCH:=all +PKG_NAME:=luci-app-onliner +PKG_VERSION:=1.1 +PKG_RELEASE:=5 + +define Package/luci-app-onliner/install + $(INSTALL_DIR) $(1)/usr/lib/lua/luci + cp -pR ./luasrc/* $(1)/usr/lib/lua/luci + $(INSTALL_DIR) $(1)/ + cp -pR ./root/* $(1)/ +endef + +define Package/luci-app-onliner/postinst +#!/bin/sh + rm -f /tmp/luci-indexcache + rm -f /tmp/luci-modulecache/* + chmod -R 755 /usr/share/onliner/* +exit 0 +endef +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature + diff --git a/luci-app-onliner/luasrc/controller/onliner.lua b/luci-app-onliner/luasrc/controller/onliner.lua new file mode 100644 index 00000000..33267bfd --- /dev/null +++ b/luci-app-onliner/luasrc/controller/onliner.lua @@ -0,0 +1,17 @@ +module("luci.controller.onliner",package.seeall) +nixio=require"nixio" +function index() +entry({"admin","status","onliner"},alias("admin","status","onliner","onliner"),_("Online User")) +entry({"admin","status","onliner","onliner"},template("onliner/onliner"),_("Online User"),1) +entry({"admin", "status","onliner","speed"}, template("onliner/display"), _("speed"), 2) +entry({"admin", "status","onliner","setnlbw"}, call("set_nlbw")) +end +function set_nlbw() + if nixio.fs.access("/var/run/onsetnlbw") then + nixio.fs.writefile("/var/run/onsetnlbw","1"); + else + io.popen("/usr/share/onliner/setnlbw.sh &") + end + luci.http.prepare_content("application/json") + luci.http.write('') +end \ No newline at end of file diff --git a/luci-app-onliner/luasrc/view/onliner/display.htm b/luci-app-onliner/luasrc/view/onliner/display.htm new file mode 100644 index 00000000..5c047757 --- /dev/null +++ b/luci-app-onliner/luasrc/view/onliner/display.htm @@ -0,0 +1,921 @@ +<%# + Copyright 2017 Jo-Philipp Wich + Licensed to the public under the Apache License 2.0. +-%> + +<% css = [[ + + #chartjs-tooltip { + opacity: 0; + position: absolute; + background: rgba(0, 0, 0, .7); + color: white; + padding: 3px; + border-radius: 3px; + -webkit-transition: all .1s ease; + transition: all .1s ease; + pointer-events: none; + -webkit-transform: translate(-50%, 0); + transform: translate(-50%, 0); + z-index: 200; + } + + #chartjs-tooltip.above { + -webkit-transform: translate(-50%, -100%); + transform: translate(-50%, -100%); + } + + #chartjs-tooltip.above:before { + border: solid; + border-color: #111 transparent; + border-color: rgba(0, 0, 0, .8) transparent; + border-width: 8px 8px 0 8px; + bottom: 1em; + content: ""; + display: block; + left: 50%; + top: 100%; + position: absolute; + z-index: 99; + -webkit-transform: translate(-50%, 0); + transform: translate(-50%, 0); + } + + table { + border: 1px solid #999; + border-collapse: collapse; + margin: 0 0 2px !important; + } + + th, td, table table td { + border: 1px solid #999; + text-align: right; + padding: 1px 3px !important; + white-space: nowrap; + } + + tbody td { + border-bottom-color: #ccc; + } + tbody td:nth-last-child(4) { + width: 10%; + } + tbody td:nth-last-child(3) { + width: 10%; + } + tbody td:nth-last-child(2) { + width: 10%; + } + tbody td:nth-last-child(1) { + width: 10%; + } + tbody td[rowspan] { + border-bottom-color: #999; + } + + tbody tr:last-child td { + border-bottom-color: #999; + } + + .kpi { + display: inline-block; + vertical-align: top; + } + + .kpi ul { + list-style: none; + } + + .kpi li { + margin: 10px; + display: none; + } + + .kpi big { + font-weight: bold; + } + + #detail-bubble { + position: absolute; + opacity: 0; + visibility: hidden; + } + + #detail-bubble.in { + opacity: 1; + visibility: visible; + transition: opacity 0.5s; + } + + #detail-bubble > div { + border: 1px solid #ccc; + border-radius: 2px; + padding: 5px; + background: #fcfcfc; + } + + #detail-bubble .head { + text-align: center; + white-space: nowrap; + position: relative; + } + + #detail-bubble .head .dismiss { + top: 0; + right: 0; + width: 20px; + line-height: 20px; + text-align: center; + text-decoration: none; + font-weight: bold; + color: #000; + position: absolute; + font-size: 20px; + } + #detail-bubble .kpi { + margin: 40px 5px 5px; + font-size: smaller; + text-align: left; + } + + #detail-bubble .kpi ul { + margin: 0; + } + + #bubble-arrow { + border: 1px solid #ccc; + border-width: 1px 0 0 1px; + background: #fcfcfc; + width: 15px; + height: 15px; + position: absolute; + left: 0; + top: -8px; + transform: rotate(45deg); + margin: 0 0 0 -8px; + } + + tr.active > td { + border-bottom: 2px solid red; + } + + tr.active > td.active { + border: 2px solid red; + border-bottom: none; + } + + td.detail { + border: 2px solid red; + border-top: none; + opacity: 0; + transition: opacity 0.5s; + } + + td.detail.in { + opacity: 1; + } + + th.hostname, + td.hostname { + text-align: left; + } + +]] -%> + +<%+header%> + + + + + +

<%:Netlink Bandwidth Monitor%>

+ +
+ +
+
+ × +
+
    +
  • <%_Hostname: example.org%>
  • +
  • <%_Vendor: Example Corp.%>
  • +
+
+
+
+
+
+ + + +
+
+
+
    +
  • <%_0 hosts%>
  • +
  • <%_0 download%>
  • +
  • <%_0 upload%>
  • +
  • <%_0 connections%>
  • +
+
+
+ + + + + + + + +
<%:Host%><%:MAC%><%:Connections%><%:Download (Bytes / Packets)%><%:Upload (Bytes / Packets)%>
+
+ + + + + + + +<%+footer%> diff --git a/luci-app-onliner/luasrc/view/onliner/onliner.htm b/luci-app-onliner/luasrc/view/onliner/onliner.htm new file mode 100644 index 00000000..0f1a9e97 --- /dev/null +++ b/luci-app-onliner/luasrc/view/onliner/onliner.htm @@ -0,0 +1,99 @@ +<%# + Copyright 2008 Steven Barth + Copyright 2008-2011 Jo-Philipp Wich + Licensed to the public under the Apache License 2.0. +-%> + +<% +local util = require "luci.util" +local function online_data() + local rv = { } + local fd = util.execi('/usr/bin/awk \'BEGIN{while ((getline < "/tmp/dhcp.leases") > 0){a[$2]=$4;}while ((getline < "/proc/net/arp") > 0){if (!a[$4]){a[$4]="\?";}if (match($3,"0x[26]")){"ping -q -c 1 "$1" &";if (b[$4]){b[$4]=b[$4]"/"$1;}else{b[$4]=$1;}c[$4]=$6;}}while (("ip -6 neighbor show | grep -v fe80" | getline) > 0){if (b[$5]) {"ping -q -c 1 "$1" &";b[$5]=b[$5]"/"$1;}}for (mac in b){print(a[mac],b[mac],mac,c[mac]);}}\' ') + while true do + local ln = fd() + if ln == nil then break end + local name,ip,mac,dev = ln:match("^(%S+) (%S+) (%S+) (%S+)") + if mac and ip and name and dev then + rv[#rv+1] = { + hostname = name, + device = dev, + macaddr = mac, + ipaddr = ip + } + end + end + return rv +end + + +if luci.http.formvalue("status") == "1" then + local rv = { + onlines = online_data() + } + luci.http.prepare_content("application/json") + luci.http.write_json(rv) + return +end +-%> + +<%+header%> + + + + +

<%:Status%>

+ +
+ <%:user online%> + + + + + + + + + + + +
<%:Hostname%><%:IPv4-Address%><%:MAC-Address%><%:Interface%>

<%:Collecting data...%>
+
+ +<%+footer%> \ No newline at end of file diff --git a/luci-app-onliner/readme.md b/luci-app-onliner/readme.md new file mode 100644 index 00000000..3e4db61e --- /dev/null +++ b/luci-app-onliner/readme.md @@ -0,0 +1,6 @@ +### 通过arp实现的在线人员查看的luci界面,统计误差为arp老化时间 ### +### 通过nlbwmon实现的实时网速查看每两秒更新 需要luci-app-nlbwmon ### + +![图片](https://user-images.githubusercontent.com/22387141/70726447-0c01b000-1d39-11ea-914c-f539cf4943a0.png) + +![图片](https://user-images.githubusercontent.com/22387141/70726285-d2c94000-1d38-11ea-8ee6-10fc083533d3.png) diff --git a/luci-app-onliner/root/usr/share/onliner/setnlbw.sh b/luci-app-onliner/root/usr/share/onliner/setnlbw.sh new file mode 100644 index 00000000..1f36adf0 --- /dev/null +++ b/luci-app-onliner/root/usr/share/onliner/setnlbw.sh @@ -0,0 +1,20 @@ +#!/bin/sh +PATH="/usr/sbin:/usr/bin:/sbin:/bin" +echo "1">/var/run/onsetnlbw +interval=$(uci get nlbwmon.@nlbwmon[0].refresh_interval) +uci set nlbwmon.@nlbwmon[0].refresh_interval="2s" +/etc/init.d/nlbwmon reload +while true +do + sleep 12 + watchdog=$(cat /var/run/onsetnlbw) + if [ "$watchdog"x == "0"x ]; then + uci set nlbwmon.@nlbwmon[0].refresh_interval=$interval + uci commit nlbwmon + /etc/init.d/nlbwmon reload + rm -f /var/run/onsetnlbw + exit 0 + else + echo "0">/var/run/onsetnlbw + fi +done \ No newline at end of file diff --git a/luci-app-parentcontrol b/luci-app-parentcontrol deleted file mode 160000 index 54d39a4f..00000000 --- a/luci-app-parentcontrol +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 54d39a4f226bd007532fb601aa542dadb5e66b06 diff --git a/luci-app-parentcontrol/Makefile b/luci-app-parentcontrol/Makefile new file mode 100644 index 00000000..ca41cba1 --- /dev/null +++ b/luci-app-parentcontrol/Makefile @@ -0,0 +1,20 @@ +# Copyright (C) 2016 Openwrt.org +# +# This is free software, licensed under the Apache License, Version 2.0 . +# + +include $(TOPDIR)/rules.mk + + +PKG_NAME:=luci-app-parentcontrol +PKG_VERSION:=1.5 +PKG_RELEASE:=20230115 +PKG_LICENSE:=Apache-2.0 +LUCI_TITLE:=LuCI support for Parent Control +LUCI_DEPENDS:=+iptables-mod-filter +kmod-ipt-filter +LUCI_PKGARCH:=all +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature + + diff --git a/luci-app-parentcontrol/README.md b/luci-app-parentcontrol/README.md new file mode 100644 index 00000000..87d4554d --- /dev/null +++ b/luci-app-parentcontrol/README.md @@ -0,0 +1,60 @@ +# luci-app-parentcontrol + +https://github.com/sirpdboy/luci-app-parentcontrol + +家长控制 ,可以按时间控制机器,端口和关键字过滤等。 + +本家长控制,是2022年群里某生找本人出钱定制界面开发,代码原来网上开源代码只是不符合要求,请本人二次开发,现经和需求方协议将代码开源!以感谢大家的支持与鼓励!!也算是为OPENWRT开源代码添砖加瓦! + +当然,本身这代码也不是一个什么很高级的代码,权当是抛砖引玉,如果有什么不足之处,欢迎一起ISSE使之更完善。 + +最初版本参考Lienol大的网址过滤源码和参考部分网上开源代码而来。 + + +参考来源: +https://github.com/Lienol/openwrt-package/tree/main/luci-app-control-weburl + + + +## 使用与授权相关说明 + +- 本人开源的所有源码,任何引用需注明本处出处,如需修改二次发布必告之本人,未经许可不得做于任何商用用途。 + + +# My other project + +- 网络速度测试 :https://github.com/sirpdboy/NetSpeedTest + +- 定时设置插件 : https://github.com/sirpdboy/luci-app-autotimeset + +- 关机功能插件 : https://github.com/sirpdboy/luci-app-poweroffdevice + +- opentopd主题 : https://github.com/sirpdboy/luci-theme-opentopd + +- kucat 主题: https://github.com/sirpdboy/luci-theme-kucat + +- 家长控制: https://github.com/sirpdboy/luci-theme-parentcontrol + +- 系统高级设置 : https://github.com/sirpdboy/luci-app-advanced + +- ddns-go动态域名: https://github.com/sirpdboy/luci-app-ddns-go + +- 进阶设置(系统高级设置+主题设置kucat/agron/opentopd): https://github.com/sirpdboy/luci-app-advancedplus + +- 设置向导: https://github.com/sirpdboy/luci-app-wizard + +- 分区扩容: https://github.com/sirpdboy/luci-app-partexp + +- lukcy大吉: https://github.com/sirpdboy/luci-app-lukcy + +## 捐助 + +![screenshots](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/说明3.jpg) + +| 图飞了😂 | 图飞了😂 | +| :-----------------: | :-------------: | +|![xm1](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/支付宝.png) | ![xm1](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/微信.png) | + + + 图飞了😂 + diff --git a/luci-app-parentcontrol/luasrc/controller/parentcontrol.lua b/luci-app-parentcontrol/luasrc/controller/parentcontrol.lua new file mode 100644 index 00000000..fec42755 --- /dev/null +++ b/luci-app-parentcontrol/luasrc/controller/parentcontrol.lua @@ -0,0 +1,21 @@ +module("luci.controller.parentcontrol", package.seeall) + +function index() + if not nixio.fs.access("/etc/config/parentcontrol") then return end + + entry({"admin", "control"}, firstchild(), "Control", 44).dependent = false + local e=entry({"admin","control","parentcontrol"},firstchild(),_("Parent Control"),2) + e.dependent=false + entry({"admin","control","parentcontrol","time"},cbi("parentcontrol/time"),_("Time Control"),1).leaf=true + entry({"admin", "control", "parentcontrol","weburl"}, cbi("parentcontrol/weburl"), _("Weburl Control"), 20).leaf = true + entry({"admin", "control", "parentcontrol","protocol"}, cbi("parentcontrol/protocol"), _("Protocol Control"), 30).leaf = true + entry({"admin", "control", "parentcontrol","status"}, call("status")).leaf = true +end + +function status() + local e = {} + e.status = luci.sys.call("iptables -L FORWARD|grep PARENTCONTROL >/dev/null") == 0 + -- e.status=luci.sys.call("[ `iptables -L FORWARD 2>/dev/null|grep -c '^PARENTCONTROL' 2>/dev/null` -gt 0 ] > /dev/null") == 0 + luci.http.prepare_content("application/json") + luci.http.write_json(e) +end diff --git a/luci-app-parentcontrol/luasrc/model/cbi/parentcontrol/protocol.lua b/luci-app-parentcontrol/luasrc/model/cbi/parentcontrol/protocol.lua new file mode 100644 index 00000000..fe978845 --- /dev/null +++ b/luci-app-parentcontrol/luasrc/model/cbi/parentcontrol/protocol.lua @@ -0,0 +1,112 @@ +local o = require "luci.sys" +local fs = require "nixio.fs" +local ipc = require "luci.ip" +local net = require "luci.model.network".init() +local sys = require "luci.sys" +local a, t, e +a = Map("parentcontrol", translate("Parent Control"), translate("利用iptables来管控数据包过滤以禁止符合设定条件的用户连接互联网的工具软件。
\ +协议过滤:可以控制指定MAC机器是否使用指定协议端口,包括IPV4和IPV6,端口可以是连续端口范围用冒号分隔如5000:5100或多个端口用逗号分隔如:5100,5110,5001:5002,440:443
不指定MAC就是代表限制所有机器,起控时间要小于停控时间,不指定时间表示时段" )) + +a.template = "parentcontrol/index" +t = a:section(TypedSection, "basic", translate("")) +t.anonymous = true +e = t:option(DummyValue, "parentcontrol_status", translate("当前状态")) +e.template = "parentcontrol/parentcontrol" +e.value = translate("Collecting data...") + +e = t:option(Flag, "enabled", translate("开启")) +e.rmempty = false + +e = t:option(ListValue, "algos", translate("过滤力度")) +e:value("bm", "一般过滤") +e:value("kmp", "强效过滤") +e.default = "kmp" + +e = t:option(ListValue, "control_mode",translate("限制模式"), translate("黑名单模式,列表中的客户端设置将被禁止;白名单模式:仅有列表中的客户端设置允许。")) +e.rmempty = false +e:value("white_mode", "白名单") +e:value("black_mode", "黑名单") +e.default = "black_mode" + +t = a:section(TypedSection, "protocol", translate("协议过滤")) +t.template = "cbi/tblsection" +t.anonymous = true +t.addremove = true +e = t:option(Value, "mac", translate("MAC地址(留空则过滤全部客户端)")) +e.placeholder = "ALL" +e.rmempty = true +o.net.mac_hints(function(t, a) e:value(t, "%s (%s)" % {t, a}) end) +e = t:option(ListValue, "proto", translate("端口协议")) +e.rmempty = false +e.default = 'tcp' +e:value("tcp", translate("TCP")) +e:value("udp", translate("UDP")) +e:value("icmp", translate("ICMP")) +e = t:option(Value, "ports", translate("源端口")) +e.rmempty = true +e = t:option(Value, "portd", translate("目的端口")) +e:value("",translate("ICMP")) +e:value("80", "TCP-HTTP") +e:value("443", "TCP-HTTPS") +e:value("22", "TCP-SSH") +e:value("1723", "TCP-PPTP") +e:value("25", "TCP-SMTP") +e:value("110", "TCP-POP3") +e:value("21", "TCP-FTP21") +e:value("23", "TCP-TELNET") +e:value("53", "TCP-DNS53") +e:value("20", "UDP-FTP20") +e:value("1701", "UDP-L2TP") +e:value("69", "UDP-TFTP") +e:value("500", "UDP-IPSEC") +e:value("53", "UDP-DNS53") +e:value("161", "UDP-SNMP") +e.rmempty = true + function validate_time(self, value, section) + local hh, mm, ss + hh, mm, ss = string.match (value, "^(%d?%d):(%d%d)$") + hh = tonumber (hh) + mm = tonumber (mm) + if hh and mm and hh <= 23 and mm <= 59 then + return value + else + return nil, "时间格式必须为 HH:MM 或者留空" + end + end +e = t:option(Value, "timestart", translate("起控时间")) +e.placeholder = '00:00' +e.default = '00:00' +e.validate = validate_time +e.rmempty = true +e = t:option(Value, "timeend", translate("停控时间")) +e.placeholder = '00:00' +e.default = '00:00' +e.validate = validate_time +e.rmempty = true + +week=t:option(ListValue,"week",translate("Week Day")) +week.rmempty = true +week:value('*',translate("Everyday")) +week:value(7,translate("Sunday")) +week:value(1,translate("Monday")) +week:value(2,translate("Tuesday")) +week:value(3,translate("Wednesday")) +week:value(4,translate("Thursday")) +week:value(5,translate("Friday")) +week:value(6,translate("Saturday")) +week.default='*' + + +e = t:option(Flag, "enable", translate("开启")) +e.rmempty = false +e.default = '1' + +a.apply_on_parse = true +a.on_after_apply = function(self,map) + luci.sys.exec("/etc/init.d/parentcontrol restart") +end + +return a + + + diff --git a/luci-app-parentcontrol/luasrc/model/cbi/parentcontrol/time.lua b/luci-app-parentcontrol/luasrc/model/cbi/parentcontrol/time.lua new file mode 100644 index 00000000..889ec8c4 --- /dev/null +++ b/luci-app-parentcontrol/luasrc/model/cbi/parentcontrol/time.lua @@ -0,0 +1,87 @@ +local o = require "luci.sys" +local fs = require "nixio.fs" +local ipc = require "luci.ip" +local net = require "luci.model.network".init() +local sys = require "luci.sys" +local a, t, e +a = Map("parentcontrol", translate("Parent Control"), translate("利用iptables来管控数据包过滤以禁止符合设定条件的用户连接互联网的工具软件。
\ +时间限制:限制指定MAC地址机器是否联网.包括IPV4和IPV6
不指定MAC就是代表限制所有机器,起控时间要小于停控时间,不指定时间表示所有时段" )) + +a.template = "parentcontrol/index" +t = a:section(TypedSection, "basic", translate("")) +t.anonymous = true +e = t:option(DummyValue, "parentcontrol_status", translate("当前状态")) +e.template = "parentcontrol/parentcontrol" +e.value = translate("Collecting data...") + +e = t:option(Flag, "enabled", translate("开启")) +e.rmempty = false + +e = t:option(ListValue, "algos", translate("过滤力度")) +e:value("bm", "一般过滤") +e:value("kmp", "强效过滤") +e.default = "kmp" + +e = t:option(ListValue, "control_mode",translate("限制模式"), translate("黑名单模式,列表中的客户端设置将被禁止;白名单模式:仅有列表中的客户端设置允许。")) +e.rmempty = false +e:value("white_mode", "白名单") +e:value("black_mode", "黑名单") +e.default = "black_mode" + +t = a:section(TypedSection, "time", translate("时间限制")) +t.template = "cbi/tblsection" +t.anonymous = true +t.addremove = true + +e = t:option(Value, "mac", translate("MAC地址*")) +e.rmempty = true +o.net.mac_hints(function(t, a) e:value(t, "%s (%s)" % {t, a}) end) + + function validate_time(self, value, section) + local hh, mm, ss + hh, mm, ss = string.match (value, "^(%d?%d):(%d%d)$") + hh = tonumber (hh) + mm = tonumber (mm) + if hh and mm and hh <= 23 and mm <= 59 then + return value + else + return nil, "时间格式必须为 HH:MM 或者留空" + end + end +e = t:option(Value, "timestart", translate("起控时间")) +e.placeholder = '00:00' +e.default = '00:00' +e.validate = validate_time +e.rmempty = true +e = t:option(Value, "timeend", translate("停控时间")) +e.placeholder = '00:00' +e.default = '00:00' +e.validate = validate_time +e.rmempty = true + +week=t:option(ListValue,"week",translate("Week Day")) +week.rmempty = true +week:value('*',translate("Everyday")) +week:value(7,translate("Sunday")) +week:value(1,translate("Monday")) +week:value(2,translate("Tuesday")) +week:value(3,translate("Wednesday")) +week:value(4,translate("Thursday")) +week:value(5,translate("Friday")) +week:value(6,translate("Saturday")) +week.default='*' + + +e = t:option(Flag, "enable", translate("开启")) +e.rmempty = false +e.default = '1' + +a.apply_on_parse = true +a.on_after_apply = function(self,map) + luci.sys.exec("/etc/init.d/parentcontrol restart") +end + +return a + + + diff --git a/luci-app-parentcontrol/luasrc/model/cbi/parentcontrol/weburl.lua b/luci-app-parentcontrol/luasrc/model/cbi/parentcontrol/weburl.lua new file mode 100644 index 00000000..b279e12b --- /dev/null +++ b/luci-app-parentcontrol/luasrc/model/cbi/parentcontrol/weburl.lua @@ -0,0 +1,89 @@ + local o = require "luci.sys" +local fs = require "nixio.fs" +local ipc = require "luci.ip" +local net = require "luci.model.network".init() +local sys = require "luci.sys" + +local a, t, e +a = Map("parentcontrol", translate("Parent Control"), translate("利用iptables来管控数据包过滤以禁止符合设定条件的用户连接互联网的工具软件。
\ +网址过滤:指定“关键词/URL”过滤,可以是字符串或网址.包括IPV4和IPV6
不指定MAC就是代表控制所有机器,起控时间要小于停控时间,不指定时间就是所有时段" )) + + +a.template = "parentcontrol/index" +t = a:section(TypedSection, "basic", translate("")) +t.anonymous = true +e = t:option(DummyValue, "parentcontrol_status", translate("当前状态")) +e.template = "parentcontrol/parentcontrol" +e.value = translate("Collecting data...") + +e = t:option(Flag, "enabled", translate("开启")) +e.rmempty = false + +e = t:option(ListValue, "algos", translate("过滤力度")) +e:value("bm", "一般过滤") +e:value("kmp", "强效过滤") +e.default = "kmp" + +e = t:option(ListValue, "control_mode",translate("限制模式"), translate("黑名单模式,列表中的客户端设置将被禁止;白名单模式:仅有列表中的客户端设置允许。")) +e.rmempty = false +e:value("white_mode", "白名单") +e:value("black_mode", "黑名单") +e.default = "black_mode" + +t = a:section(TypedSection, "weburl", translate("网址过滤")) +t.template = "cbi/tblsection" +t.anonymous = true +t.addremove = true + +e = t:option(Value, "mac", translate("MAC地址(留空则过滤全部客户端)")) +e.rmempty = true +o.net.mac_hints(function(t, a) e:value(t, "%s (%s)" % {t, a}) end) +e = t:option( Value, "word", translate("关键词/URL(可留空)")) +e.rmempty = true + function validate_time(self, value, section) + local hh, mm, ss + hh, mm, ss = string.match (value, "^(%d?%d):(%d%d)$") + hh = tonumber (hh) + mm = tonumber (mm) + if hh and mm and hh <= 23 and mm <= 59 then + return value + else + return nil, "时间格式必须为 HH:MM 或者留空" + end + end +e = t:option(Value, "timestart", translate("起控时间")) +e.placeholder = '00:00' +e.default = '00:00' +e.validate = validate_time +e.rmempty = true +e = t:option(Value, "timeend", translate("停控时间")) +e.placeholder = '00:00' +e.default = '00:00' +e.validate = validate_time +e.rmempty = true + +week=t:option(ListValue,"week",translate("Week Day")) +week.rmempty = true +week:value('*',translate("Everyday")) +week:value(7,translate("Sunday")) +week:value(1,translate("Monday")) +week:value(2,translate("Tuesday")) +week:value(3,translate("Wednesday")) +week:value(4,translate("Thursday")) +week:value(5,translate("Friday")) +week:value(6,translate("Saturday")) +week.default='*' + +e = t:option(Flag, "enable", translate("开启")) +e.rmempty = false +e.default = '1' + +a.apply_on_parse = true +a.on_after_apply = function(self,map) + luci.sys.exec("/etc/init.d/parentcontrol restart") +end + +return a + + + diff --git a/luci-app-parentcontrol/luasrc/view/parentcontrol/index.htm b/luci-app-parentcontrol/luasrc/view/parentcontrol/index.htm new file mode 100644 index 00000000..97bf43c7 --- /dev/null +++ b/luci-app-parentcontrol/luasrc/view/parentcontrol/index.htm @@ -0,0 +1,12 @@ +<% include("cbi/map") %> + \ No newline at end of file diff --git a/luci-app-parentcontrol/luasrc/view/parentcontrol/parentcontrol.htm b/luci-app-parentcontrol/luasrc/view/parentcontrol/parentcontrol.htm new file mode 100644 index 00000000..7c7e23f0 --- /dev/null +++ b/luci-app-parentcontrol/luasrc/view/parentcontrol/parentcontrol.htm @@ -0,0 +1,3 @@ +<%+cbi/valueheader%> +<%=pcdata(self:cfgvalue(section) or self.default or "")%> +<%+cbi/valuefooter%> \ No newline at end of file diff --git a/luci-app-parentcontrol/po/zh-cn/parentcontrol.po b/luci-app-parentcontrol/po/zh-cn/parentcontrol.po new file mode 100644 index 00000000..d4d8a00f --- /dev/null +++ b/luci-app-parentcontrol/po/zh-cn/parentcontrol.po @@ -0,0 +1,23 @@ +msgid "Control" +msgstr "管控" + +msgid "Parent Control" +msgstr "家长控制" + +msgid "Time Control" +msgstr "时间限制" + +msgid "Weburl Control" +msgstr "网址过滤" + +msgid "Protocol Control" +msgstr "协议过滤" + +msgid "feature Control" +msgstr "配置过滤库" + +msgid "Week Day" +msgstr "设定星期" + +msgid "Everyday" +msgstr "每天" diff --git a/luci-app-parentcontrol/po/zh_Hans b/luci-app-parentcontrol/po/zh_Hans new file mode 100644 index 00000000..41451e4a --- /dev/null +++ b/luci-app-parentcontrol/po/zh_Hans @@ -0,0 +1 @@ +zh-cn \ No newline at end of file diff --git a/luci-app-parentcontrol/root/etc/config/parentcontrol b/luci-app-parentcontrol/root/etc/config/parentcontrol new file mode 100644 index 00000000..7958f94b --- /dev/null +++ b/luci-app-parentcontrol/root/etc/config/parentcontrol @@ -0,0 +1,49 @@ +config basic + option algos 'kmp' + option control_mode 'black_mode' + option enabled '0' + +config time + option timeoff '00:00' + option timeon '00:00' + option daysofweek 'Monday Tuesday Wednesday Thursday Friday Saturday Sunday' + option enable '0' + + +config weburl + option timeon '00:00' + option timeoff '00:00' + option daysofweek 'Monday Tuesday Wednesday Thursday Friday Saturday Sunday' + option keyword 'baidu' + option enable '0' + +config weburl + option timeon '00:00' + option timeoff '00:00' + option daysofweek 'Monday Tuesday Wednesday Thursday Friday Saturday Sunday' + option keyword 'www' + option enable '0' + +config protocol + option timeon '00:00' + option daysofweek 'Monday Tuesday Wednesday Thursday Friday Saturday Sunday' + option proto 'tcp' + option timeoff '00:00' + option enable '0' + option dport '80' + +config protocol + option proto 'tcp' + option timeon '00:00' + option timeoff '00:00' + option daysofweek 'Monday Tuesday Wednesday Thursday Friday Saturday Sunday' + option enable '0' + option dport '443' + +config protocol + option proto 'tcp' + option timeon '00:00' + option timeoff '00:00' + option daysofweek 'Monday Tuesday Wednesday Thursday Friday Saturday Sunday' + option enable '0' + option dport '22' diff --git a/luci-app-parentcontrol/root/etc/init.d/parentcontrol b/luci-app-parentcontrol/root/etc/init.d/parentcontrol new file mode 100755 index 00000000..bac771c3 --- /dev/null +++ b/luci-app-parentcontrol/root/etc/init.d/parentcontrol @@ -0,0 +1,103 @@ +#!/bin/sh /etc/rc.common +# sirpdboy at 2021-2022 , + +START=98 + +LOCK=/var/lock/parentcontrol + +set_rules() { +mmode=$1 +rulessum=$(grep -c $mmode /etc/config/parentcontrol) +for i in $(seq 0 $((rulessum-1))) +do + enable=$(uci -q get parentcontrol.@$mmode[$i].enable ) + if [ "$enable" == 1 ]; then + mac=$(uci -q get parentcontrol.@$mmode[$i].mac ) && MAC="-m mac --mac-source $mac" || MAC="" + word=$(uci -q get parentcontrol.@$mmode[$i].word ) && STR="-m string --string ${word} --algo ${algos}" || STR="" + proto=$(uci -q get parentcontrol.@$mmode[$i].proto ) || proto="tcp" + ports=$(uci -q get parentcontrol.@$mmode[$i].ports ) && SPO="--sport ${ports}" || SPO="" + portd=$(uci -q get parentcontrol.@$mmode[$i].portd ) && DPO="--dport ${portd}" || DPO="" + mMPT=`echo "$sport"|grep ","` && mSPO="-m multiport" || mSPO="" + mMPT=`echo "$dport"|grep ","` && mDPO="-m multiport" || mDPO="" + [ -z "$sport" -a -z "$dport" ] && PTO="" || PTO="-p ${proto} ${mSPOT} ${SPO} ${mDPO} ${DPO}" + timestart=$(uci get parentcontrol.@$mmode[$i].timestart 2>/dev/null) || timestart="00:00" + timeend=$(uci get parentcontrol.@$mmode[$i].timeend 2>/dev/null) || timeend="00:00" + week=$(uci get parentcontrol.@$mmode[$i].week |sed 's/ /,/g' 2>/dev/null) + [ -z "$timestart" -o -z "$timeend" -o "$timestart" = "$timeend" ] && TIME="" || TIME="--timestart ${timestart} --timestop ${timeend}" + [ -z "$week" -o "$week" = "*" ] && WEEK="" || WEEK="--weekdays ${week}" + [ -n "$TIME" -o -n "$WEEK" ] && WT="-m time --kerneltz ${TIME} ${WEEK}" || WT="" + + logger "PARENTCONTROL:WT${WT} PTO${PTO} MAC${MAC} STR${STR} " + if [ -n "$STR" -a "x$word" = "x!" ] ; then + iptables -I PARENTCONTROL ${WT} ${PTO} ${MAC} -j ${mode_reo} 2>/dev/null + ip6tables -I PARENTCONTROL ${WT} ${PTO} ${MAC} -j ${mode_reo} 2>/dev/null + logger "PARENTCONTROL1:WT${WT} PTO${PTO} MAC${MAC} STR${STR} ${mode_reo}" + elif [ -z "$STR" ] ; then + iptables -A PARENTCONTROL ${WT} ${PTO} ${MAC} -j ${mode_rej} 2>/dev/null + ip6tables -A PARENTCONTROL ${WT} ${PTO} ${MAC} -j ${mode_rej} 2>/dev/null + logger "PARENTCONTROL2:WT${WT} PTO${PTO} MAC${MAC} STR${STR} ${mode_rej}" + fi + if [ $control_mode == "white_mode" -o -n "$STR" ]; then + iptables -I PARENTCONTROL ${STR} ${WT} ${MAC} -j ${mode_reo} 2>/dev/null + ip6tables -I PARENTCONTROL ${STR} ${WT} ${MAC} -j ${mode_reo} 2>/dev/null + logger "PARENTCONTROL3:WT${WT} PTO${PTO} MAC${MAC} STR${STR} ${mode_reo} " + elif [ -n "$STR" ] ; then + iptables -I PARENTCONTROL ${STR} ${WT} ${MAC} -j ${mode_rej} 2>/dev/null + ip6tables -I PARENTCONTROL ${STR} ${WT} ${MAC} -j ${mode_rej} 2>/dev/null + logger "PARENTCONTROL4:WT${WT} PTO${PTO} MAC${MAC} STR${STR} ${mode_rej}" + fi + unset STR MAC WT PTO +fi +done +} + +start(){ +[ -f $LOCK ] && exit +iptables -C FORWARD -j PARENTCONTROL 2>/dev/null && stop +enabled=`uci -q get parentcontrol.@basic[0].enabled ` +[ "p$enabled" == "p1" ] || exit 1 + +Ssum=`grep -c 'enable .1.' /etc/config/parentcontrol` +if [ "$Ssum" -gt 0 ]; then + touch $LOCK + algos=`uci -q get parentcontrol.@basic[0].algos ` + iptables -N PARENTCONTROL 2>/dev/null || iptables -F PARENTCONTROL 2>/dev/null + ip6tables -N PARENTCONTROL 2>/dev/null || ip6tables -F PARENTCONTROL 2>/dev/null + iptables -C FORWARD -j PARENTCONTROL 2>/dev/null || iptables -I FORWARD -j PARENTCONTROL 2>/dev/null + ip6tables -C FORWARD -j PARENTCONTROL 2>/dev/null || ip6tables -I FORWARD -j PARENTCONTROL 2>/dev/null + control_mode=`uci -q get parentcontrol.@basic[0].control_mode ` + if [ $control_mode == "black_mode" ]; then + mode_rej=REJECT + mode_reo=RETURN + else + mode_rej=RETURN + mode_reo=REJECT + fi + set_rules time + set_rules protocol + + set_rules weburl + if [ $control_mode == "white_mode" ]; then + iptables -A PARENTCONTROL -m conntrack --ctstate ESTABLISHED,RELATED -j RETURN 2>/dev/null + ip6tables -A PARENTCONTROL -m conntrack --ctstate ESTABLISHED,RELATED -j RETURN 2>/dev/null + iptables -A PARENTCONTROL -j REJECT 2>/dev/null + ip6tables -A PARENTCONTROL -j REJECT 2>/dev/null + + fi + # iptables -C FORWARD -j PARENTCONTROL 2>/dev/null && ip6tables -C FORWARD -j PARENTCONTROL 2>/dev/null + rm -f $LOCK 2>/dev/null +fi + +} + +stop(){ + +iptables -D FORWARD -j PARENTCONTROL 2>/dev/null +ip6tables -D FORWARD -j PARENTCONTROL 2>/dev/null +iptables -F PARENTCONTROL 2>/dev/null +ip6tables -F PARENTCONTROL 2>/dev/null +iptables -X PARENTCONTROL 2>/dev/null +ip6tables -X PARENTCONTROL 2>/dev/null + +} + diff --git a/luci-app-parentcontrol/root/etc/parentcontrol.include b/luci-app-parentcontrol/root/etc/parentcontrol.include new file mode 100644 index 00000000..170397ee --- /dev/null +++ b/luci-app-parentcontrol/root/etc/parentcontrol.include @@ -0,0 +1,2 @@ +/etc/init.d/parentcontrol start + diff --git a/luci-app-parentcontrol/root/etc/parentcontrol/black.list b/luci-app-parentcontrol/root/etc/parentcontrol/black.list new file mode 100644 index 00000000..2c45f824 --- /dev/null +++ b/luci-app-parentcontrol/root/etc/parentcontrol/black.list @@ -0,0 +1,3 @@ +baidu +163.com + diff --git a/luci-app-parentcontrol/root/etc/parentcontrol/white.list b/luci-app-parentcontrol/root/etc/parentcontrol/white.list new file mode 100644 index 00000000..6e9a94a0 --- /dev/null +++ b/luci-app-parentcontrol/root/etc/parentcontrol/white.list @@ -0,0 +1 @@ +baidu.com \ No newline at end of file diff --git a/luci-app-parentcontrol/root/etc/uci-defaults/luci-app-parentcontrol b/luci-app-parentcontrol/root/etc/uci-defaults/luci-app-parentcontrol new file mode 100644 index 00000000..9b2f52c9 --- /dev/null +++ b/luci-app-parentcontrol/root/etc/uci-defaults/luci-app-parentcontrol @@ -0,0 +1,17 @@ +#!/bin/sh + +uci -q batch <<-EOF >/dev/null + delete ucitrack.@parentcontrol[-1] + add ucitrack parentcontrol + set ucitrack.@parentcontrol[-1].init=parentcontrol + commit ucitrack +EOF + +uci delete firewall.parentcontrol +uci set firewall.parentcontrol=include +uci set firewall.parentcontrol.type=script +uci set firewall.parentcontrol.path=/etc/parentcontrol.include +uci set firewall.parentcontrol.reload=1 +uci commit firewall +rm -f /tmp/luci-indexcache +exit 0 diff --git a/luci-app-parentcontrol/root/usr/share/rpcd/acl.d/luci-app-parentcontrol.json b/luci-app-parentcontrol/root/usr/share/rpcd/acl.d/luci-app-parentcontrol.json new file mode 100644 index 00000000..478e9763 --- /dev/null +++ b/luci-app-parentcontrol/root/usr/share/rpcd/acl.d/luci-app-parentcontrol.json @@ -0,0 +1,11 @@ +{ + "luci-app-parentcontrol": { + "description": "Grant UCI access for luci-app-parentcontrol", + "read": { + "uci": [ "parentcontrol" ] + }, + "write": { + "uci": [ "parentcontrol" ] + } + } +} diff --git a/luci-app-partexp b/luci-app-partexp deleted file mode 160000 index 0f0085fa..00000000 --- a/luci-app-partexp +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 0f0085fa0a0500bfe8bd5b5bab71853db463900c diff --git a/luci-app-partexp/Makefile b/luci-app-partexp/Makefile new file mode 100644 index 00000000..368b1b24 --- /dev/null +++ b/luci-app-partexp/Makefile @@ -0,0 +1,24 @@ +# +# Copyright (C) 2020-2022 sirpdboy +# +# This is free software, licensed under the GNU General Public License v3. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=luci-app-partexp +PKG_VERSION:=0.1.9 +PKG_RELEASE:=20221201 + +PKG_LICENSE:=Apache-2.0 +PKG_MAINTAINER:=Sirpdboy + +LUCI_TITLE:=LuCI Support for Automatic Partition Mount +LUCI_DEPENDS:=+fdisk +block-mount +LUCI_PKGARCH:=all + + +include $(TOPDIR)/feeds/luci/luci.mk + + +# call BuildPackage - OpenWrt buildroot signature diff --git a/luci-app-partexp/README.md b/luci-app-partexp/README.md new file mode 100644 index 00000000..b2dd875c --- /dev/null +++ b/luci-app-partexp/README.md @@ -0,0 +1,116 @@ +### 访问数:[![](https://visitor-badge.glitch.me/badge?page_id=sirpdboy-visitor-badge)] [![](https://img.shields.io/badge/TG群-点击加入-FFFFFF.svg)](https://t.me/joinchat/AAAAAEpRF88NfOK5vBXGBQ) + +![screenshots](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/说明1.jpg) + += +# luci-app-partexp + +luci-app-partexp 一键自动格式化分区、扩容、自动挂载插件 +[![若部分图片无法正常显示,请挂上机场浏览或点这里到末尾看修复教程](https://visitor-badge.glitch.me/badge?page_id=sirpdboy-visitor-badge)](#解决-github-网页上图片显示失败的问题) [![](https://img.shields.io/badge/TG群-点击加入-FFFFFF.svg)](https://t.me/joinchat/AAAAAEpRF88NfOK5vBXGBQ) + +[luci-app-partexp](https://github.com/sirpdboy/luci-app-partexp) +====================== + + +请 **认真阅读完毕** 本页面,本页面包含注意事项和如何使用。 + +## 功能说明: + + +#### 一键自动格式化分区、扩容、自动挂载插件,专为OPENWRT设计,简化OPENWRT在分区挂载上烦锁的操作。本插件是sirpdboy耗费大量精力制作测试,请勿删除制作者信息!! + + + +- [partexp](#luci-app-partexp) + - [特性](#特性) + - [使用方法](#使用方法) + - [说明](#说明) + - [界面](#界面) + - [捐助](#捐助) + + + +## 特性 + luci-app-partexp 自动获格式化分区扩容,自动挂载插件 + +## 使用方法 + +- 将luci-app-partexp添加至 LEDE/OpenWRT 源码的方法。 + +### 下载源码方法: + + ```Brach + + # 下载源码 + + git clone https://github.com/sirpdboy/luci-app-partexp.git package/luci-app-partexp + make menuconfig + + ``` +### 配置菜单 + + ```Brach + make menuconfig + # 找到 LuCI -> Applications, 选择 luci-app-partexp, 保存后退出。 + ``` + +### 编译 + + ```Brach + # 编译固件 + make package/luci-app-partexp/compile V=s + ``` + +## 说明 + +![screenshots](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/说明2.jpg) + +## 界面 + +![screenshots](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/partexp.jpg) + + + + +## 使用与授权相关说明 + +- 本人开源的所有源码,任何引用需注明本处出处,如需修改二次发布必告之本人,未经许可不得做于任何商用用途。 + + +# My other project + +- 网络速度测试 :https://github.com/sirpdboy/NetSpeedTest + +- 定时设置插件 : https://github.com/sirpdboy/luci-app-autotimeset + +- 关机功能插件 : https://github.com/sirpdboy/luci-app-poweroffdevice + +- opentopd主题 : https://github.com/sirpdboy/luci-theme-opentopd + +- kucat 主题: https://github.com/sirpdboy/luci-theme-kucat + +- 家长控制: https://github.com/sirpdboy/luci-theme-parentcontrol + +- 系统高级设置 : https://github.com/sirpdboy/luci-app-advanced + +- ddns-go动态域名: https://github.com/sirpdboy/luci-app-ddns-go + +- 进阶设置(系统高级设置+主题设置kucat/agron/opentopd): https://github.com/sirpdboy/luci-app-advancedplus + +- 设置向导: https://github.com/sirpdboy/luci-app-wizard + +- 分区扩容: https://github.com/sirpdboy/luci-app-partexp + +- lukcy大吉: https://github.com/sirpdboy/luci-app-lukcy + +## 捐助 + +![screenshots](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/说明3.jpg) + +| 图飞了😂 | 图飞了😂 | +| :-----------------: | :-------------: | +|![xm1](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/支付宝.png) | ![xm1](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/微信.png) | + + + 图飞了😂 + diff --git a/luci-app-partexp/luasrc/controller/partexp.lua b/luci-app-partexp/luasrc/controller/partexp.lua new file mode 100644 index 00000000..bf840dff --- /dev/null +++ b/luci-app-partexp/luasrc/controller/partexp.lua @@ -0,0 +1,80 @@ +--[[ +LuCI - Lua Configuration Partition Expansion + Copyright (C) 2022 sirpdboy https://github.com/sirpdboy/luci-app-partexp +]]-- +require "luci.util" +local name = 'partexp' + +module("luci.controller.partexp", package.seeall) +function index() + entry({"admin","system","partexp"},alias("admin", "system", "partexp", "global"),_("Partition Expansion"), 54) +-- entry({"admin", "system", "partexp", "global"}, form("partexp/global"), nil).leaf = true + entry({"admin", "system", "partexp", "global"}, cbi('partexp/global', {hideapplybtn = true, hidesavebtn = true, hideresetbtn = true}), _('Partition Expansion'), 10).leaf = true + entry({"admin", "system", "partexp","partexprun"}, call("partexprun")).leaf = true +end + +function get_log() + local e = {} + e.running = luci.sys.call("busybox ps -w | grep partexp | grep -v grep >/dev/null") == 0 + e.log = fs.readfile("/etc/partexp/partexp.log") or "" + luci.http.prepare_content("application/json") + luci.http.write_json(e) +end + +function partexprun() + local uci = luci.model.uci.cursor() + local keep_config = luci.http.formvalue('keep_config') + local auto_format = luci.http.formvalue('auto_format') + local target_function = luci.http.formvalue('target_function') + local target_disk = luci.http.formvalue('target_disk') + --uci:delete(name, '@global[0]', global) + uci:set(name, '@global[0]', 'target_disk', target_disk) + uci:set(name, '@global[0]', 'target_function', target_function) + uci:set(name, '@global[0]', 'auto_format', auto_format) + uci:set(name, '@global[0]', 'keep_config', keep_config) + uci:commit(name) + -- e = nixio.exec("/bin/sh", "-c" ,"/etc/init.d/partexp autopart") + e = luci.sys.exec('/etc/init.d/partexp autopart') + + luci.http.prepare_content('application/json') + luci.http.write_json(e) +end + +function outexec(cmd) + luci.http.prepare_content("text/plain") + local util = io.popen(cmd) + if util then + while true do + local ln = util:read("*l") + if not ln then break end + luci.http.write(ln) + luci.http.write("\n") + end + util:close() + end + +end + +function fork_exec(command) + local pid = nixio.fork() + if pid > 0 then + return + elseif pid == 0 then + -- change to root dir + nixio.chdir("/") + + -- patch stdin, out, err to /dev/null + local null = nixio.open("/dev/null", "w+") + if null then + nixio.dup(null, nixio.stderr) + nixio.dup(null, nixio.stdout) + nixio.dup(null, nixio.stdin) + if null:fileno() > 2 then + null:close() + end + end + + -- replace with target command + nixio.exec("/bin/sh", "-c", command) + end +end \ No newline at end of file diff --git a/luci-app-partexp/luasrc/model/cbi/partexp/global.lua b/luci-app-partexp/luasrc/model/cbi/partexp/global.lua new file mode 100644 index 00000000..c66a9b04 --- /dev/null +++ b/luci-app-partexp/luasrc/model/cbi/partexp/global.lua @@ -0,0 +1,83 @@ +--[[ +LuCI - Lua Configuration Interface + Copyright (C) 2022 sirpdboy https://github.com/sirpdboy/luci-app-partexp +]]-- +local fs = require "nixio.fs" +local util = require "nixio.util" +local tp = require "luci.template.parser" +local uci=luci.model.uci.cursor() + -- get all device names (sdX and mmcblkX) + local target_devnames = {} + for dev in fs.dir("/dev") do + if dev:match("^sd[a-z]$") + or dev:match("^mmcblk%d+$") + or dev:match("^sata[a-z]$") + or dev:match("^nvme%d+n%d+$") + then + table.insert(target_devnames, dev) + end + end + local devices = {} + for i, bname in pairs(target_devnames) do + local device_info = {} + local device = "/dev/" .. bname + device_info["name"] = bname + device_info["dev"] = device + + s = tonumber((fs.readfile("/sys/class/block/%s/size" % bname))) + device_info["size"] = s and math.floor(s / 2048) + + devices[#devices+1] = device_info +end + +local m,t,e +m = Map("partexp", "" .. translate("One click partition expansion mounting tool") .."", +translate( "Automatically format and mount the target device partition. If there are multiple partitions, it is recommended to manually delete all partitions before using this tool.
For specific usage, see:") ..translate("GitHub @sirpdboy") ) + +t=m:section(TypedSection,"global") +t.anonymous=true + +e=t:option(ListValue,"target_function", translate("Select function"),translate("Select the function to be performed")) +e:value("/overlay", translate("Expand application space overlay (/overlay)")) +-- e:value("/", translate("Use as root filesystem (/)")) +e:value("/opt", translate("Used as Docker data disk (/opt)")) +e:value("/dev", translate("Normal mount and use by device name(/dev/x1)")) + +e=t:option(ListValue,"target_disk", translate("Destination hard disk"),translate("Select the hard disk device to operate")) +for i, d in ipairs(devices) do + if d.name and d.size then + e:value(d.name, "%s (%s, %d MB)" %{ d.name, d.dev, d.size }) + elseif d.name then + e:value(d.name, "%s (%s)" %{ d.name, d.dev }) + end +end + +o=t:option(Flag,"keep_config",translate("Keep configuration")) +o:depends("target_function", "/overlay") +o.default=0 + +o=t:option(Flag,'auto_format', translate('Format before use')) +o:depends("target_function", "/opt") +o:depends("target_function", "/dev") +o.default=0 + +o=t:option(DummyValue, '', '') +o.rawhtml = true +o.template ='partexp' + + +e=t:option(TextValue,"log") +e.rows=15 +e.wrap="on" +e.readonly=true +e.cfgvalue=function(t,t) +return fs.readfile("/etc/partexp/partexp.log")or"" +end +e.write=function(e,e,e) +end + +-- e =t:option(DummyValue, '', '') +-- e.rawhtml = true +-- e.template = 'partexplog' + +return m diff --git a/luci-app-partexp/luasrc/model/diskmount.lua b/luci-app-partexp/luasrc/model/diskmount.lua new file mode 100644 index 00000000..3d747c34 --- /dev/null +++ b/luci-app-partexp/luasrc/model/diskmount.lua @@ -0,0 +1,40 @@ +--[[ +LuCI - Lua Configuration Interface + Copyright (C) 2022 sirpdboy https://github.com/sirpdboy/luci-app-partexp +]]-- + +local fs = require "nixio.fs" +local util = require "nixio.util" +local tp = require "luci.template.parser" +local uci=luci.model.uci.cursor() +local ver = require "luci.version" + +local d.list_disks = function() + -- get all device names (sdX and mmcblkX) + local target_devnames = {} + for dev in fs.dir("/dev") do + if dev:match("^sd[a-z]$") + or dev:match("^mmcblk%d+$") + or dev:match("^sata[a-z]$") + or dev:match("^nvme%d+n%d+$") + then + table.insert(target_devnames, dev) + end + end + local devices = {} + for i, bname in pairs(target_devnames) do + local device_info = {} + local device = "/dev/" .. bname + device_info["name"] = bname + device_info["dev"] = device + + s = tonumber((fs.readfile("/sys/class/block/%s/size" % bname))) + device_info["size"] = s and math.floor(s / 2048) + + devices[#devices+1] = device_info + end + return devices +end + + +return d diff --git a/luci-app-partexp/luasrc/view/partexp.htm b/luci-app-partexp/luasrc/view/partexp.htm new file mode 100644 index 00000000..457813f0 --- /dev/null +++ b/luci-app-partexp/luasrc/view/partexp.htm @@ -0,0 +1,106 @@ +<%# +Copyright (C) 2022 sirpdboy https://github.com/sirpdboy/luci-app-partexp +-%> +<% +local fs = require "nixio.fs" +%> + +<%+cbi/valueheader%> + + + +
+ "> + +
+ + + + +<%+cbi/valuefooter%> diff --git a/luci-app-partexp/luasrc/view/partexp/log.htm b/luci-app-partexp/luasrc/view/partexp/log.htm new file mode 100644 index 00000000..298a32f0 --- /dev/null +++ b/luci-app-partexp/luasrc/view/partexp/log.htm @@ -0,0 +1,16 @@ +<%+cbi/valueheader%> + + + +<%+cbi/valuefooter%> diff --git a/luci-app-partexp/po/zh-cn/partexp.po b/luci-app-partexp/po/zh-cn/partexp.po new file mode 100644 index 00000000..77573421 --- /dev/null +++ b/luci-app-partexp/po/zh-cn/partexp.po @@ -0,0 +1,70 @@ +msgid "" +msgstr "" +"Copyright (C) 2022 sirpdboy herboy2008@gmail.com https://github.com/sirpdboy/luci-app-partexp" +"This is free software, licensed under the GNU General Public License v3." + +msgid "Partition Expansion" +msgstr "分区扩容" + +msgid "One click partition expansion mounting tool" +msgstr "一键分区扩容挂载工具" + +msgid "Automatically format and mount the target device partition. If there are multiple partitions, it is recommended to manually delete all partitions before using this tool.
For specific usage, see:" +msgstr "自动对目标设备分区格式化挂载,如果有多分区建议手动删除所有分区再使用本工具.
使用说明见:" + +msgid "Select the function to be performed" +msgstr "选择需要执行的功能" + +msgid "Expand application space overlay (/overlay)" +msgstr "用于overlay软件空间 (/overlay)" + +msgid "Use as root filesystem (/)" +msgstr "用作根文件系统(/)" + +msgid "Used as Docker data disk (/opt)" +msgstr "用作Docker数据盘 (/opt)" + +msgid "Normal mount and use by device name(/dev/x1)" +msgstr "按设备名普通挂载使用(/dev/x1)" + +msgid "Destination hard disk" +msgstr "目标硬盘" + +msgid "Keep configuration" +msgstr "保留配置" + +msgid "Format before use" +msgstr "使用前格式化" + +msgid "Select the hard disk device to operate" +msgstr "选择需要操作的硬盘设备" + +msgid "Select function" +msgstr "选择功能" + +msgid "Perform operation" +msgstr "执行操作" + +msgid "To make the operation effective, the device will restart. Are you sure to execute?" +msgstr "警告:操作一旦确定无法取消,设备将会重启,是否确定执行?" + +msgid "Operation in progress, please wait..." +msgstr "操作执行中,请稍候..." + +msgid "After operation, restart the machine, please wait..." +msgstr "操作完毕,机器重启,请稍候..." + +msgid "Please delete the partition or share and try again" +msgstr "错误,请检查是否有足够空间或是共享使用中。" + +msgid "Restart the device to take effect. Confirm whether to continue?" +msgstr "重启设备操作才生效,确定是否继续执行?" + +msgid "Operation execution complete" +msgstr "操作执行完毕" + +msgid "Ticking indicates formatting" +msgstr "打勾选择表示格式化" + +msgid "Tick means to retain the settings" +msgstr "打勾选择表示保留设置" \ No newline at end of file diff --git a/luci-app-partexp/po/zh_Hans b/luci-app-partexp/po/zh_Hans new file mode 100644 index 00000000..41451e4a --- /dev/null +++ b/luci-app-partexp/po/zh_Hans @@ -0,0 +1 @@ +zh-cn \ No newline at end of file diff --git a/luci-app-partexp/root/etc/config/partexp b/luci-app-partexp/root/etc/config/partexp new file mode 100644 index 00000000..39986dfe --- /dev/null +++ b/luci-app-partexp/root/etc/config/partexp @@ -0,0 +1,5 @@ +config global + option target_function '/overlay' + option target_disk '' + option keep_config '1' + option auto_format '1' diff --git a/luci-app-partexp/root/etc/init.d/partexp b/luci-app-partexp/root/etc/init.d/partexp new file mode 100644 index 00000000..8d0789b5 --- /dev/null +++ b/luci-app-partexp/root/etc/init.d/partexp @@ -0,0 +1,298 @@ +#!/bin/sh /etc/rc.common + +# +# Copyright (C) 2021-2022 sirpdboy https://github.com/sirpdboy/luci-app-partexp + +# This is free software, licensed under the Apache License, Version 2.0 . +# + +START=99 +USE_PROCD=1 + +EXTRA_COMMANDS="autopart" + +LOCK=/var/lock/partexp.lock +LOGD=/etc/partexp +LOG=/etc/partexp/partexp.log + +limit_log() { + local logf=$1 + [ ! -f "$logf" ] && return + local sc=100 + [ -n "$2" ] && sc=$2 + local count=$(grep -c "" $logf) + if [ $count -gt $sc ];then + let count=count-$sc + sed -i "1,$count d" $logf + fi +} + +init_env() { +[ -d "$LOGD" ] || mkdir -p $LOGD +[ ! -f "$LOG" ] && echo "" > $LOG + +} + + +gen_log()( + [ -s $LOG ] && echo " ---------------------------------------------------------------------- " >> $LOG + log "自动分区扩展挂载开始执行..." +) + +log(){ + echo " $(date +'%Y-%m-%d %H:%M:%S') $*" >> $LOG +} + + +get_config() { + config_get target_function $1 target_function 1 + config_get target_disk $1 target_disk 1 + config_get_bool keep_config $1 keep_config 1 + config_get_bool auto_format $1 auto_format 1 +} +nfdisk(){ +#Start partition + fdisk /dev/$a << EOF >/dev/null 2> /dev/null +n +p + + + +wq +EOF + +} + +fdiskB(){ + a=$1 + b=$2 + log "检测$a是否分区..." + isP=`fdisk -l /dev/$a |grep -v "bytes"|grep "/dev/$a$b" ` + sleep 2 + isfdisk=0 + if [ ! "$isP" ];then + nfdisk + sleep 2 + isfdisk=1 + + else + isfdisk=2 + fi + isP=`fdisk -l /dev/$a |grep -v "bytes" | grep "/dev/$a$b"` + if [ "$isP" -a "$isfdisk" = 1 ] ;then + log "分区$a$b建立成功!" + elif [ "$isP" -a "$isfdisk" = 2 ] ;then + log "检测目标分区$a$b已存在." + else + log "分区$a$b建立失败,没有足够的空间操作失败!" + expquit 1 + fi + isD=`df -T | grep /dev/$a$b ` + if [ "$isD" ];then + eval $(block info "/dev/$a$b" | grep -o -e "MOUNT=\S*") + log "检测$a$b是不是被共享..." + sleep 1 + if [ "$MOUNT" ] ; then + msum=$(grep -c "config sambashare" /etc/config/samba4) + for i in $(seq 0 $((msum-1))) + do + dev=`uci -q get samba4.@sambashare[$i].device ` + [ $? -ne 0 ] && break + [ "$dev" = "$a$b" ] && { + uci delete samba4.@sambashare[$i] + uci commit + /etc/init.d/samba4 restart & + sleep 5 + + } + done + block umount /dev/$a$b + sleep 5 + eval $(block info "/dev/$a$b" | grep -o -e "MOUNT=\S*") + if [ "$MOUNT" ] ;then + log "分区$a$b被挂载$MOUNT共享使用,删除共享失败,请手动删除共享再重新操作!" + expquit 1 + else + log "分区$a$b被挂载$MOUNT共享使用,自动删除共享成功!" + fi + else + log "检测目标硬盘$a$b未被共享..." + fi + fi + isD=`df -T | grep /dev/$a$b | awk '{print $2}'` + if [ "$target_function" = "/" -o "$target_function" = "/overlay" ] ; then + mkfs.ext4 -L extroot /dev/$a$b >/dev/null 2> /dev/null + log "硬盘/dev/$a$b格式化成功!" + elif [ "$auto_format" = "1" -o "$isfdisk" = "1" - ! "$isD" ] ; then + mkfs.ext4 -F /dev/$a$b >/dev/null 2> /dev/null + log "硬盘/dev/$a$b格式化成功!" + else + log "硬盘/dev/$a$b无需格式化!" + fi + eval $(block info /dev/$a$b | grep -o -e "UUID=\S*") + if [ "$UUID" = "" ] ; then + log "获取/dev/$a$b分区信息失败!" + expquit 1 + else + log "成功获取/dev/$a$b分区信息!" + fi + [ -d "/mnt/$a$b" ] || mkdir -p /mnt/$a$b + isM=`block info /dev/$a$b` + isD=`df -T | grep /dev/$a$b | awk '{print $2}'` + if [ "$isM" -a "$isD" ] ;then + umount /mnt/$a$b + eval $(block info "/dev/$a$b" | grep -o -e "MOUNT=\S*") + if [ "$MOUNT" ] ; then + log "检测设备/dev/$a$b挂载$MOUNT,请取消读写权限再重试!" + expquit 1 + else + [ "$isD" == "ntfs" ] && mount -t ntfs-3g /dev/$a$b /mnt/$a$b || mount -o rw,noatime,discard /dev/$a$b /mnt/$a$b + fi + fi + log "检测设备/dev/$a$b分区是$isD格式!" + + if [ "$target_function" = "/" ] ; then + mkdir -p /tmp/introot + mount --bind / /tmp/introot + tar -C /tmp/introot -cvf - . | tar -C /mnt/$a$b -xf - + umount /tmp/introot + umount /mnt/$a$b + block detect > /etc/config/fstab + log "保留数据根目录扩展/dev/$a$b成功!" + uci set fstab.@global[0].delay_root="15" + uci -q set fstab.@mount[0].uuid="${UUID}" + uci -q set fstab.@mount[0].target='/' + uci -q set fstab.@mount[0].enabled='1' + uci commit fstab + + expquit 2 + + elif [ "$target_function" = "/overlay" ] ; then + if [ "$keep_config" = "1" ] ; then + + # cp -a -f /overlay/* /mnt/$a$b/ || cp -a -f /rom/overlay/* /mnt/$a$b/ + tar -C /overlay -cvf - . | tar -C /mnt/$a$b/ -xf - || tar -C /rom/overlay -cvf - . | tar -C /mnt/$a$b/ -xf - + umount /mnt/$a$b + block detect > /etc/config/fstab + + msum=$(grep -c "'mount'" /etc/config/fstab) + for i in $(seq 0 $((msum-1))) + do + zuuid=`uci -q get fstab.@mount[$i].uuid ` + [ $? -ne 0 ] && break + if [ "$zuuid" = "$UUID" ] ; then + uci -q set fstab.@mount[$i].target="/overlay" + uci -q set fstab.@mount[$i].enabled='1' + fi + done + uci set fstab.@global[0].delay_root="15" + uci commit fstab + log "保留数据overlay扩展/dev/$a$b成功!" + log "设备重启才能生效,重启中..." + expquit 2 + + else + + umount /mnt/$a$b + block detect > /etc/config/fstab + + + msum=$(grep -c "'mount'" /etc/config/fstab) + for i in $(seq 0 $((msum-1))) + do + zuuid=`uci -q get fstab.@mount[$i].uuid ` + [ $? -ne 0 ] && break + if [ "$zuuid" = "$UUID" ] ; then + uci -q set fstab.@mount[$i].target="/overlay" + uci -q set fstab.@mount[$i].enabled='1' + fi + done + uci set fstab.@global[0].delay_root="15" + uci commit fstab + log "不保留数据overlay扩展/dev/$a$b成功!" + log "设备重启才能生效,重启中..." + expquit 2 + + fi + else + block detect > /etc/config/fstab + mkdir -p $target_function + msum=$(grep -c "'mount'" /etc/config/fstab) + for i in $(seq 0 $((msum-1))) + do + zuuid=`uci -q get fstab.@mount[$i].uuid ` + [ $? -ne 0 ] && break + if [ "$zuuid" = "$UUID" ] ; then + + [ "$target_function" = "/opt" ] && uci -q set fstab.@mount[$i].target="$target_function" || uci -q set fstab.@mount[$i].target="/mnt/$a$b" + + uci -q set fstab.@mount[$i].enabled='1' + fi + done + uci commit fstab + [ "$target_function" = "/opt" ] && log "挂载/dev/$a$b到$target_function成功!" || log "挂载/dev/$a$b到/mnt/$a$b成功!" + log "设备重启才能生效,重启中..." + expquit 2 + + fi +} + +autopart() { + # [ -f $LOCK ] && exit + config_load partexp + config_foreach get_config global + init_env + limit_log $LOG 500 + # touch $LOCK + cat $LOG 2>/dev/null | sed -n '$p' | grep -q '自动分区扩展挂载开始执行...' || gen_log + + isB=`df -P|grep '/boot' | head -n1 | awk -F ' ' '{print $1}'` + isb=`fdisk -l | grep /dev/$target_disk | grep -v "bytes" | wc -l` + if [ "$isb" = 0 -o "$isb" = "" -o "$isb" = 1 ] ;then + isb=1 + elif [ "$isb" = 3 -o "$isb" = 4 ] ;then + isb=3 + fi + isP=`fdisk -l /dev/$target_disk |grep "Disk /dev/$target_disk"` + if [ "$isP" = "" ];then + log "没有检测到/dev/$target_disk目标硬盘!操作失败!" + expquit 1 + else + log "检测到操作目标硬盘:/dev/$target_disk$isb!" + + case "$target_disk" in + sd*) + [ "$isB" = "/dev/${target_disk}1" -a "$target_function" = "/overlay" ] && fdiskB $target_disk 3 || fdiskB $target_disk $isb + ;; + nvme*) + [ "$isB" = "/dev/${target_disk}p1" -a "$target_function" = "/overlay" ] && fdiskB $target_disk p3 || fdiskB $target_disk p$isb + ;; + mmc*) + [ "$isB" = "/dev/${target_disk}p1" -a "$target_function" = "/overlay" ] && fdiskB $target_disk p3 || fdiskB $target_disk p$isb + ;; + *) + log "未能识别/dev/$target_disk目标硬盘!请联系作者sirpdboy!" + expquit 1 + ;; + esac + + fi + # rm -f $LOCK +} + +start() { +init_env +[ x$x = x1 ] && exit || autopart + +} + +boot() { +x=1 +} + +expquit() { + rm -f $LOCK + echo $1 + [ $1 == 2 ] &&reboot + exit $1 +} diff --git a/luci-app-partexp/root/etc/uci-defaults/40_luci-partexp b/luci-app-partexp/root/etc/uci-defaults/40_luci-partexp new file mode 100644 index 00000000..6cd1ec09 --- /dev/null +++ b/luci-app-partexp/root/etc/uci-defaults/40_luci-partexp @@ -0,0 +1,5 @@ +#!/bin/sh +chmod +x /etc/init.d/partexp >/dev/null 2>&1 + +rm -rf /tmp/luci-modulecache /tmp/luci-indexcache* +exit 0 diff --git a/luci-app-partexp/root/usr/share/rpcd/acl.d/luci-app-partexp.json b/luci-app-partexp/root/usr/share/rpcd/acl.d/luci-app-partexp.json new file mode 100644 index 00000000..da249bf5 --- /dev/null +++ b/luci-app-partexp/root/usr/share/rpcd/acl.d/luci-app-partexp.json @@ -0,0 +1,11 @@ +{ + "luci-app-partexp": { + "description": "Grant UCI access for luci-app-partexp", + "read": { + "uci": [ "partexp" ] + }, + "write": { + "uci": [ "partexp" ] + } + } +} diff --git a/luci-app-poweroff b/luci-app-poweroff deleted file mode 160000 index 425b7a07..00000000 --- a/luci-app-poweroff +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 425b7a073cf9794a922af57c7008890e0111b79a diff --git a/luci-app-poweroff/LICENSE b/luci-app-poweroff/LICENSE new file mode 100644 index 00000000..930b26f1 --- /dev/null +++ b/luci-app-poweroff/LICENSE @@ -0,0 +1,379 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + Preamble + The GNU General Public License is a free, copyleft license for software and other kinds of works. + The licenses for most software and other practical works are designed to take away your freedom to share and change the works. +By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a +program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public +License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your +programs, too. + When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure +that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code +or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you +can do these things. + To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. +Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to +respect the freedom of others. + For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the +same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them +these terms so they know their rights. + Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you +this License giving you legal permission to copy, distribute and/or modify it. + For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For +both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be +attributed erroneously to authors of previous versions. + Some devices are designed to deny users access to install or run modified versions of the software inside them, although the +manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. +The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most +unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such +problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of +the GPL, as needed to protect the freedom of users. + Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development +and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied +to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render +the program non-free. + The precise terms and conditions for copying, distribution and modification follow. + TERMS AND CONDITIONS + 0. Definitions. + "This License" refers to version 3 of the GNU General Public License. + "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. + "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" +and "recipients" may be individuals or organizations. + To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than +the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the +earlier work. + A "covered work" means either the unmodified Program or a work based on the Program. + To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation +includes copying, distribution (with or without modification), making available to the public, and in some countries other +activities as well. + To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with +a user through a computer network, with no transfer of a copy, is not conveying. + An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently +visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work +(except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a +copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the +list meets this criterion. + 1. Source Code. + The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any +non-source form of a work. + A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in +the case of interfaces specified for a particular programming language, one that is widely used among developers working in that +language. + The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the +normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of +the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public +in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) +of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an +object code interpreter used to run it. + The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an +executable work) run the object code and to modify the work, including scripts to control those activities. However, it does +not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified +in performing those activities but which are not part of the work. For example, Corresponding Source includes interface +definition files associated with source files for the work, and the source code for shared libraries and dynamically linked +subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between +those subprograms and other parts of the work. + The Corresponding Source need not include anything that users can regenerate automatically from other parts of the +Corresponding Source. + The Corresponding Source for a work in source code form is that same work. + 2. Basic Permissions. + All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the +stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output +from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This +License acknowledges your rights of fair use or other equivalent, as provided by copyright law. + You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise +remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for +you, or provide you with facilities for running those works, provided that you comply with the terms of this License in +conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do +so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your +copyrighted material outside their relationship with you. + Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; +section 10 makes it unnecessary. + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations +under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting +circumvention of such measures. + When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such +circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any +intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third +parties' legal rights to forbid circumvention of technological measures. + 4. Conveying Verbatim Copies. + You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously +and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and +any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any +warranty; and give all recipients a copy of this License along with the Program. + You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a +fee. + 5. Conveying Modified Source Versions. + You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code +under the terms of section 4, provided that you also meet all of these conditions: + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the +covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or +distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or +legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate +does not cause this License to apply to the other parts of the aggregate. + 6. Conveying Non-Source Forms. + You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, in one of these ways: + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need +not be included in conveying the object code work. + A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for +personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining +whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product +received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the +status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the +product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or +non-consumer uses, unless such uses represent the only significant mode of use of the product. + "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required +to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding +Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case +prevented or interfered with solely because modification has been made. + If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the +conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the +recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source +conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither +you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been +installed in ROM). + The requirement to provide Installation Information does not include a requirement to continue to provide support service, +warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has +been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the +operation of the network or violates the rules and protocols for communication across the network. + Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is +publicly documented (and with an implementation available to the public in source code form), and must require no special +password or key for unpacking, reading or copying. + 7. Additional Terms. + "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its +conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in +this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the +Program, that part may be used separately under those permissions, but the entire Program remains governed by this License +without regard to the additional permissions. + When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any +part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) +You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate +copyright permission. + Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the +copyright holders of that material) supplement the terms of this License with terms: + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the +Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term +that is a further restriction, you may remove that term. If a license document contains a further restriction but permits +relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license +document, provided that the further restriction does not survive such relicensing or conveying. + If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of +the additional terms that apply to those files, or a notice indicating where to find the applicable terms. + Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as +exceptions; the above requirements apply either way. + 8. Termination. + You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to +propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses +granted under the third paragraph of section 11). + However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the +copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. + Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of +the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any +work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. + Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights +from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive +new licenses for the same material under section 10. + 9. Acceptance Not Required for Having Copies. + You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a +covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require +acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These +actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you +indicate your acceptance of this License to do so. + 10. Automatic Licensing of Downstream Recipients. + Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, +modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with +this License. + An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or +subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, +each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's +predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source +of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. + You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For +example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you +may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed +by making, using, selling, offering for sale, or importing the Program or any portion of it. + 11. Patents. + A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is +based. The work thus licensed is called the contributor's "contributor version". + A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already +acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling +its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the +contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner +consistent with the requirements of this License. + Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent +claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor +version. + In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to +enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To +"grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the +party. + If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available +for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other +readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive +yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the +requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual +knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered +work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. + If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance +of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, +propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to +all recipients of the covered work and works based on it. + A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not +convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, +under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the +third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in +connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in +connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or +that patent license was granted, prior to 28 March 2007. + Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that +may otherwise be available to you under applicable patent law. + 12. No Surrender of Others' Freedom. + If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this +License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy +simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey +it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom +you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from +conveying the Program. + 13. Use with the GNU Affero General Public License. + Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work +licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. +The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU +Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. + 14. Revised Versions of this License. + The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. +Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or +concerns. + Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU +General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of +that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a +version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. + If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that +proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. + Later license versions may give you additional or different permissions. However, no additional obligations are imposed on +any author or copyright holder as a result of your choosing to follow a later version. + 15. Disclaimer of Warranty. + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE +COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK +AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL +NECESSARY SERVICING, REPAIR OR CORRECTION. + 16. Limitation of Liability. + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO +MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL +OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR +DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + 17. Interpretation of Sections 15 and 16. + If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their +terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in +connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. + END OF TERMS AND CONDITIONS + How to Apply These Terms to Your New Programs + If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this +is to make it free software which everyone can redistribute and change under these terms. + To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most +effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the +full notice is found. + + Copyright (C) + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + You should have received a copy of the GNU General Public License + along with this program. If not, see . Also add information on how to contact you by +electronic and paper mail. + If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the +appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, +you would use an "about box". + You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the +program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see +. + The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a +subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is +what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read +. diff --git a/luci-app-poweroff/Makefile b/luci-app-poweroff/Makefile new file mode 100644 index 00000000..46990b42 --- /dev/null +++ b/luci-app-poweroff/Makefile @@ -0,0 +1,16 @@ +# Copyright (C) 2016 Openwrt.org +# +# This is free software, licensed under the Apache License, Version 2.0 . +# Maintained by eSir Playground + +include $(TOPDIR)/rules.mk + +PKG_NAME:=luci-app-poweroff +PKG_VERSION:=20200726 +PKG_RELEASE:=1 +LUCI_TITLE:=LuCI Support of PowerOff Router +LUCI_PKGARCH:=all + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/luci-app-poweroff/README.md b/luci-app-poweroff/README.md new file mode 100644 index 00000000..994222aa --- /dev/null +++ b/luci-app-poweroff/README.md @@ -0,0 +1,4 @@ +# Shut Down Your Router +[![GitHub](https://img.shields.io/github/license/esirplayground/luci-app-poweroff?label=LICENSE&logo=github&logoColor=%20)](https://github.com/esirplayground/luci-app-poweroff/blob/master/LICENSE) +![GitHub Stars](https://img.shields.io/github/stars/esirplayground/luci-app-poweroff.svg?style=flat&logo=appveyor&label=Stars&logo=github) +![GitHub Forks](https://img.shields.io/github/forks/esirplayground/luci-app-poweroff.svg?style=flat&logo=appveyor&label=Forks&logo=github) diff --git a/luci-app-poweroff/luasrc/controller/poweroff.lua b/luci-app-poweroff/luasrc/controller/poweroff.lua new file mode 100644 index 00000000..dcddbe32 --- /dev/null +++ b/luci-app-poweroff/luasrc/controller/poweroff.lua @@ -0,0 +1,10 @@ +module("luci.controller.poweroff",package.seeall) + +function index() + entry({"admin","system","poweroff"},template("poweroff"),_("PowerOff"),99) + entry({"admin","system","poweroff","call"},post("action_poweroff")) +end + +function action_poweroff() +luci.util.exec("/sbin/poweroff") +end \ No newline at end of file diff --git a/luci-app-poweroff/luasrc/view/poweroff.htm b/luci-app-poweroff/luasrc/view/poweroff.htm new file mode 100644 index 00000000..f843ddf2 --- /dev/null +++ b/luci-app-poweroff/luasrc/view/poweroff.htm @@ -0,0 +1,58 @@ +<%# + Maintained by eSirPlayground + Licensed to the public under the Apache License 2.0. +-%> + +<%+header%> + +

<%:PowerOff%>

+
+ +

<%:Shut down your router%>

+ +<%- local c = require("luci.model.uci").cursor():changes(); if c and next(c) then -%> +

<%:Warning: There are unsaved changes that will get lost on shutting down!%>

+<%- end -%> + +
+ + + + + + + +<%+footer%> diff --git a/luci-app-poweroff/po/zh-cn/poweroff.po b/luci-app-poweroff/po/zh-cn/poweroff.po new file mode 100644 index 00000000..2dfe25d2 --- /dev/null +++ b/luci-app-poweroff/po/zh-cn/poweroff.po @@ -0,0 +1,31 @@ +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2.4\n" +"Last-Translator: eSirPlayground \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Language: zh_CN\n" + +msgid "PowerOff" +msgstr "关机" + +msgid "Shut down your router" +msgstr "吹灯拔蜡,关机回家" + +msgid "Perform PowerOff" +msgstr "关机,走你~" + +msgid "Warning: There are unsaved changes that will get lost on shutting down!" +msgstr "警告:没保存的改动在关机的时候都会丢失!别惊讶,要么保存,要么放弃" + +msgid "Waiting for device..." +msgstr "设备有点懵,要等一下..." + +msgid "Router is shutting down..." +msgstr "正在关机,说啥也不好使了..." diff --git a/luci-app-poweroff/po/zh-tw/poweroff.po b/luci-app-poweroff/po/zh-tw/poweroff.po new file mode 100644 index 00000000..b9e0e63e --- /dev/null +++ b/luci-app-poweroff/po/zh-tw/poweroff.po @@ -0,0 +1,31 @@ +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2.4\n" +"Last-Translator: ystartgo \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Language: zh_tw\n" + +msgid "PowerOff" +msgstr "關機" + +msgid "Shut down your router" +msgstr "關閉您的路由器" + +msgid "Perform PowerOff" +msgstr "執行關機" + +msgid "Warning: There are unsaved changes that will get lost on shutting down!" +msgstr "警告:沒存檔的更動在關機的時候都會移失!別驚訝,要麼存檔,要麼放棄關機" + +msgid "Waiting for device..." +msgstr "設備努力中,要等一下..." + +msgid "Router is shutting down..." +msgstr "正在關機,等等就會自動關..." diff --git a/luci-app-poweroff/po/zh_Hans b/luci-app-poweroff/po/zh_Hans new file mode 120000 index 00000000..41451e4a --- /dev/null +++ b/luci-app-poweroff/po/zh_Hans @@ -0,0 +1 @@ +zh-cn \ No newline at end of file diff --git a/luci-app-poweroffdevice b/luci-app-poweroffdevice deleted file mode 160000 index bdca3af5..00000000 --- a/luci-app-poweroffdevice +++ /dev/null @@ -1 +0,0 @@ -Subproject commit bdca3af5bb72200acbec3bfd4cf363aacf378c0d diff --git a/luci-app-poweroffdevice/Makefile b/luci-app-poweroffdevice/Makefile new file mode 100644 index 00000000..309b2ba3 --- /dev/null +++ b/luci-app-poweroffdevice/Makefile @@ -0,0 +1,18 @@ +# +# provides Web UI to shut down (power off) your device. +# routers are listed at https://github.com/sirpdboy/luci-app-poweroffdevice +# This is free software, licensed under the GNU General Public License v3. + +include $(TOPDIR)/rules.mk + +PKG_NAME:=luci-app-poweroffdevice +LUCI_TITLE:=LuCI support for poweroffdevice Router +LUCI_DESCRIPTION:=provides Web UI to shut down (power off) your device. + +LUCI_PKGARCH:=all +PKG_VERSION:=1 +PKG_RELEASE:=4 + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/luci-app-poweroffdevice/README.md b/luci-app-poweroffdevice/README.md new file mode 100644 index 00000000..2babe50d --- /dev/null +++ b/luci-app-poweroffdevice/README.md @@ -0,0 +1,105 @@ +[![若部分图片无法正常显示,请挂上机场浏览或点这里到末尾看修复教程](https://visitor-badge.glitch.me/badge?page_id=sirpdboy-visitor-badge)](#解决-github-网页上图片显示失败的问题) [![](https://img.shields.io/badge/TG群-点击加入-FFFFFF.svg)](https://t.me/joinchat/AAAAAEpRF88NfOK5vBXGBQ) + + 图飞了😂 + + +![screenshots](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/说明1.jpg) + +[poweroffdevice 设备关机功能](luci-app-poweroffdevice) +========================================== + +[![](https://img.shields.io/badge/-目录:-696969.svg)](#readme) [![](https://img.shields.io/badge/-使用说明-F5F5F5.svg)](#使用说明-) [![](https://img.shields.io/badge/-说明-F5F5F5.svg)](#说明-) [![](https://img.shields.io/badge/-捐助-F5F5F5.svg)](#捐助-) + +请 **认真阅读完毕** 本页面,本页面包含注意事项和如何使用。 + +poweroffdevice是一款基于OPNEWRT编译的关机源码插件。 +----------------------------------------- + +## 写在前面: +---------------------------------- + -这个关机功能最早使用者是KOOLSHARE的固件。苦于OPENWRT中没有关机补丁,有感于前辈们的付出,苦思2020年4月动手在OPENWRT上首次使用此插件,此源码源于官方源码重启的源码修改而来. +之前一直有朋友在问,怎么使用关机插件,关机插件是有二种使用方式。一种是下载插件编译,这相对来说占用资源多一点,另一种就是在系统的源码上修改。 + +## 使用说明 [![](https://img.shields.io/badge/-使用说明-F5F5F5.svg)](#使用说明-) + +将poweroffdevice关机功能 添加至 LEDE/OpenWRT 源码的二种方法。 + +## 使用关机功能方法一: +标准方法使用关机插件。 + + ```Brach + # 下载源码 + + git clone https://github.com/sirpdboy/luci-app-poweroffdevice package/luci-app-poweroffdevice + + make menuconfig + ``` + ```Brach + # 配置菜单 + make menuconfig + # 找到 LuCI -> Applications, 选择 luci-app-poweroffdevice, 保存后退出。 + ``` + ```Brach + # 编译固件 + make package/luci-app-poweroffdevice/{clean,compile} V=s + ``` +## 使用关机功能方法二【推荐此方法】: +系统的源码上修改,集成到系统源码菜单中,不需要另外选择和设置即可使用关机功能 + ```Brach + #在编译前,运行如下二条命令,集成到系统源码菜单中,不需要另外选择和设置即可使用关机功能。 + cd openwrt #进入源码目录 + curl -fsSL https://raw.githubusercontent.com/sirpdboy/other/master/patch/poweroff/poweroff.htm > ./feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/poweroff.htm + curl -fsSL https://raw.githubusercontent.com/sirpdboy/other/master/patch/poweroff/system.lua > ./feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/system.lua + + ``` +![screenshots](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/说明2.jpg) + +## 说明 [![](https://img.shields.io/badge/-说明-F5F5F5.svg)](#说明-) + +源码来源:https://github.com/sirpdboy/luci-app-poweroffdevice + + + +## 使用与授权相关说明 + +- 本人开源的所有源码,任何引用需注明本处出处,如需修改二次发布必告之本人,未经许可不得做于任何商用用途。 + + +# My other project + +- 网络速度测试 :https://github.com/sirpdboy/NetSpeedTest + +- 定时设置插件 : https://github.com/sirpdboy/luci-app-autotimeset + +- 关机功能插件 : https://github.com/sirpdboy/luci-app-poweroffdevice + +- opentopd主题 : https://github.com/sirpdboy/luci-theme-opentopd + +- kucat 主题: https://github.com/sirpdboy/luci-theme-kucat + +- 家长控制: https://github.com/sirpdboy/luci-theme-parentcontrol + +- 系统高级设置 : https://github.com/sirpdboy/luci-app-advanced + +- ddns-go动态域名: https://github.com/sirpdboy/luci-app-ddns-go + +- 进阶设置(系统高级设置+主题设置kucat/agron/opentopd): https://github.com/sirpdboy/luci-app-advancedplus + +- 设置向导: https://github.com/sirpdboy/luci-app-wizard + +- 分区扩容: https://github.com/sirpdboy/luci-app-partexp + +- lukcy大吉: https://github.com/sirpdboy/luci-app-lukcy + +## 捐助 + +![screenshots](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/说明3.jpg) + +| 图飞了😂 | 图飞了😂 | +| :-----------------: | :-------------: | +|![xm1](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/支付宝.png) | ![xm1](https://raw.githubusercontent.com/sirpdboy/openwrt/master/doc/微信.png) | + + + 图飞了😂 + + diff --git a/luci-app-poweroffdevice/luasrc/controller/poweroffdevice.lua b/luci-app-poweroffdevice/luasrc/controller/poweroffdevice.lua new file mode 100644 index 00000000..4ce8d30b --- /dev/null +++ b/luci-app-poweroffdevice/luasrc/controller/poweroffdevice.lua @@ -0,0 +1,13 @@ + +module("luci.controller.poweroffdevice", package.seeall) + + +function index() + entry({"admin","system","poweroffdevice"},template("poweroffdevice/poweroffdevice"), _("PowerOff"), 92) + entry({"admin","system","poweroffdevice","call"},post("action_poweroff")) +end + +function action_poweroff() + luci.sys.exec("/sbin/poweroff" ) + +end diff --git a/luci-app-poweroffdevice/luasrc/view/poweroffdevice/poweroffdevice.htm b/luci-app-poweroffdevice/luasrc/view/poweroffdevice/poweroffdevice.htm new file mode 100644 index 00000000..996f4cd9 --- /dev/null +++ b/luci-app-poweroffdevice/luasrc/view/poweroffdevice/poweroffdevice.htm @@ -0,0 +1,57 @@ +<%# + Copyright routers are listed at https://github.com/sirpdboy/poweroffdevice + Licensed to the public under the Apache License 2.0. +-%> + + +<%+header%> + + +

<%:Power Off Device%>

+

<%:Turn off the power to the device you are using%>

+

<%:WARNING: Power off might result in a reboot on a device which not support power off.%>

+ + + + + + + +<%+footer%> diff --git a/luci-app-poweroffdevice/po/zh-cn/poweroffdevice.po b/luci-app-poweroffdevice/po/zh-cn/poweroffdevice.po new file mode 100644 index 00000000..3aa7ff27 --- /dev/null +++ b/luci-app-poweroffdevice/po/zh-cn/poweroffdevice.po @@ -0,0 +1,31 @@ +# +# provides Web UI to shut down (power off) your device. +# routers are listed at https://github.com/sirpdboy/luci-app-poweroffdevice +# This is free software, licensed under the GNU General Public License v3. + +msgid "PowerOff" +msgstr "关机" + +msgid "Power Off Device" +msgstr "设备关机" + +msgid "Perform Power Off" +msgstr "执行关机" + +msgid "Turn off the power to the device you are using" +msgstr "关闭您正在使用的设备的电源" + +msgid "WARNING: Power off might result in a reboot on a device which not support power off." +msgstr "警告:对于不支持关机的设备,关机可能会导致重新启动." + +msgid "Device unreachable" +msgstr "操作设备无效" + +msgid "Shutting Down..." +msgstr "正在关机..." + +msgid "Device shutdown complete!" +msgstr "设备关机完毕!" + + + diff --git a/luci-app-poweroffdevice/po/zh_Hans b/luci-app-poweroffdevice/po/zh_Hans new file mode 100644 index 00000000..41451e4a --- /dev/null +++ b/luci-app-poweroffdevice/po/zh_Hans @@ -0,0 +1 @@ +zh-cn \ No newline at end of file diff --git a/luci-app-pushbot b/luci-app-pushbot deleted file mode 160000 index 7f07b39d..00000000 --- a/luci-app-pushbot +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 7f07b39d7a6a924b8e3d14d8071daa0fad7c650b diff --git a/luci-app-pushbot/.github/workflows/build-package-onx86.yml b/luci-app-pushbot/.github/workflows/build-package-onx86.yml new file mode 100644 index 00000000..d56a7c66 --- /dev/null +++ b/luci-app-pushbot/.github/workflows/build-package-onx86.yml @@ -0,0 +1,189 @@ +# +# Copyright (c) 2019-2020 P3TERX +# +# This is free software, licensed under the MIT License. +# See /LICENSE for more information. +# +# https://github.com/P3TERX/Actions-OpenWrt +# Description: Build OpenWrt using GitHub Actions +# + +name: Build luci-app-pushbot-x86 + +on: + repository_dispatch: + workflow_dispatch: + inputs: + ssh: + description: 'SSH connection to Actions' + required: false + default: 'false' +# schedule: +# - cron: 10 14 * * 5 + +env: + SDK_URL: https://downloads.openwrt.org/releases/22.03.0-rc5/targets/x86/64/openwrt-sdk-22.03.0-rc5-x86-64_gcc-11.2.0_musl.Linux-x86_64.tar.xz + PackageName: luci-app-pushbot + PackageSource_URL: https://github.com/zzsj0928/luci-app-pushbot + UPLOAD_Package: true + UPLOAD_COWTRANSFER: false + UPLOAD_WETRANSFER: true + UPLOAD_RELEASE: true + TZ: Asia/Shanghai + UPLOAD_ZZNAS: false + ftp_username: ${{ secrets.FTP_USERNAME }} + ftp_psw: ${{ secrets.FTP_PSW }} + ftp_ip: ${{ secrets.FTP_IP }} + TargetPath: OpenwrtImgs/packages/luci-app-pushbot + upload_file: luci-app-pushbot_* + whkey: ${{ secrets.WEBHOOK }} + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@main + + - name: Initialization environment + env: + DEBIAN_FRONTEND: noninteractive + run: | + sudo rm -rf /etc/apt/sources.list.d/* /usr/share/dotnet /usr/local/lib/android /opt/ghc + sudo -E apt-get -qq update + sudo -E apt-get -qq install $(curl -fsSL git.io/depends-ubuntu-2004) + sudo -E apt-get -qq autoremove --purge + sudo -E apt-get -qq clean + sudo timedatectl set-timezone "$TZ" + sudo mkdir -p /workdir + sudo chown $USER:$GROUPS /workdir + + - name: Clone source code + working-directory: /workdir + run: | + df -hT $PWD + wget $SDK_URL + mkdir /workdir/openwrt + tar xf openwrt-sdk-* -C /workdir/openwrt --strip-components 1 + ln -sf /workdir/openwrt $GITHUB_WORKSPACE/openwrt + + - name: Update feeds + run: cd openwrt && ./scripts/feeds update -a + + - name: Install feeds + run: cd openwrt && ./scripts/feeds install -a + + - name: Load custom configuration + run: | + cd openwrt + git clone $PackageSource_URL package/$PackageName + make defconfig + echo "CONFIG_PACKAGE_$PackageName=y" >> ./.config + + + - name: SSH connection to Actions + uses: P3TERX/ssh2actions@v1.0.0 + if: (github.event.inputs.ssh == 'true' && github.event.inputs.ssh != 'false') || contains(github.event.action, 'ssh') + env: + TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }} + TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }} + + - name: Compile the package + id: compile + run: | + send_dingding="curl -s \"https://oapi.dingtalk.com/robot/send?access_token=${whkey}\" -H 'Content-Type: application/json' -d '{\"msgtype\": \"markdown\",\"markdown\": {\"title\":" + send_content0="【${PackageName}】正在启动编译!请稍后大约4小时..." + markdown_splitline="\n\n---\n\n" + GITHUB_WORKFLOW_URL=https://github.com/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID + nowtime=`date "+%Y-%m-%d %H:%M:%S"` + eval "$send_dingding \"${send_content0}\",\"text\":\"${nowtime} $markdown_splitline #### ${send_content0}\n\n[点此链接查看](${GITHUB_WORKFLOW_URL})\"}}'" + + + cd openwrt + echo -e "$(nproc) thread compile" + make package/$PackageName/compile V=s + echo "::set-output name=status::success" + + - name: Check space usage + if: (!cancelled()) + run: df -hT + + - name: Organize files + id: organize + if: env.UPLOAD_Package == 'true' && !cancelled() + run: | + cd openwrt/bin/packages/*/base + echo "PackagePath=$PWD" >> $GITHUB_ENV + echo "::set-output name=status::success" + + - name: Upload package + uses: actions/upload-artifact@main + if: steps.organize.outputs.status == 'success' && !cancelled() + with: + name: ${{ env.upload_file }} + path: ${{ env.PackagePath }} + + - name: Upload package to cowtransfer + id: cowtransfer + if: steps.organize.outputs.status == 'success' && env.UPLOAD_COWTRANSFER == 'true' && !cancelled() + run: | + curl -fsSL git.io/file-transfer | sh + ./transfer cow --block 2621440 -s -p 64 --no-progress ${PackagePath}/${upload_file} 2>&1 | tee cowtransfer.log + echo "::warning file=cowtransfer.com::$(cat cowtransfer.log | grep https)" + echo "::set-output name=url::$(cat cowtransfer.log | grep https | cut -f3 -d" ")" + + - name: Upload firmware to WeTransfer + id: wetransfer + if: steps.organize.outputs.status == 'success' && env.UPLOAD_WETRANSFER == 'true' && !cancelled() + run: | + curl -fsSL git.io/file-transfer | sh + ./transfer wet -s -p 16 --no-progress ${PackagePath}/${upload_file} 2>&1 | tee wetransfer.log + echo "::warning file=wetransfer.com::$(cat wetransfer.log | grep https)" + echo "::set-output name=url::$(cat wetransfer.log | grep https | cut -f3 -d" ")" + + - name: Upload firmware to my NAS + id: zz-nas + if: steps.organize.outputs.status == 'success' && env.UPLOAD_ZZNAS == 'true' && !cancelled() + run: | + send_dingding="curl -s \"https://oapi.dingtalk.com/robot/send?access_token=${whkey}\" -H 'Content-Type: application/json' -d '{\"msgtype\": \"markdown\",\"markdown\": {\"title\":" + send_content1="【${PackageName}】编译成功!正在上传固件到NAS..." + send_content2="【${PackageName}】编译成功!固件成功上传到NAS。" + markdown_splitline="\n\n---\n\n" + GITHUB_WORKFLOW_URL=https://github.com/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID + nowtime=`date "+%Y-%m-%d %H:%M:%S"` + eval "$send_dingding \"${send_content1}\",\"text\":\"${nowtime} $markdown_splitline #### ${send_content1}\n\n[点此链接查看](${GITHUB_WORKFLOW_URL})\"}}'" + + cd openwrt/bin/packages/*/base + echo $ftp_psw > /tmp/rsync.psw && chmod 600 /tmp/rsync.psw + rsync -avrzP $upload_file_1 $ftp_username@$ftp_ip::$TargetPath/$(date +"%Y.%m.%d-%H%M")/ --password-file=/tmp/rsync.psw + echo "::warning file=zz-nas.com::All Released Files Uploaded to ZZ-NAS" + + nowtime=`date "+%Y-%m-%d %H:%M:%S"` + eval "$send_dingding \"${send_content2}\",\"text\":\"${nowtime} $markdown_splitline #### ${send_content2}\n\n[点此链接查看](${GITHUB_WORKFLOW_URL})\"}}'" + + - name: Generate release tag + id: tag + if: env.UPLOAD_RELEASE == 'true' && !cancelled() + run: | + echo "::set-output name=release_tag::$(date +"%Y.%m.%d-%H%M")" + touch release.txt + [ $UPLOAD_COWTRANSFER = true ] && echo "🔗 [Cowtransfer](${{ steps.cowtransfer.outputs.url }})" >> release.txt + [ $UPLOAD_WETRANSFER = true ] && echo "🔗 [WeTransfer](${{ steps.wetransfer.outputs.url }})" >> release.txt + echo "::set-output name=status::success" + + - name: Upload package to release + uses: softprops/action-gh-release@v1 + if: steps.tag.outputs.status == 'success' && !cancelled() + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ steps.tag.outputs.release_tag }} + body_path: release.txt + files: ${{ env.PackagePath }}/${{ env.upload_file }} + + - name: Delete workflow runs + uses: GitRML/delete-workflow-runs@main + with: + retain_days: 1 + keep_minimum_runs: 3 diff --git a/luci-app-pushbot/Makefile b/luci-app-pushbot/Makefile new file mode 100644 index 00000000..2a779819 --- /dev/null +++ b/luci-app-pushbot/Makefile @@ -0,0 +1,22 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=luci-app-pushbot +PKG_VERSION:=3.60 +PKG_RELEASE:=1 + +PKG_MAINTAINER:=tty228 zzsj0928 + +LUCI_TITLE:=LuCI support for Pushbot +LUCI_PKGARCH:=all +LUCI_DEPENDS:=+iputils-arping +curl +jq + +define Package/$(PKG_NAME)/conffiles +/etc/config/pushbot +/usr/bin/pushbot/api/diy.json +/usr/bin/pushbot/api/ipv4.list +/usr/bin/pushbot/api/ipv6.list +endef + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/luci-app-pushbot/README.md b/luci-app-pushbot/README.md new file mode 100644 index 00000000..3c3284a5 --- /dev/null +++ b/luci-app-pushbot/README.md @@ -0,0 +1,93 @@ +# 改名公告 +#### 2021年04月25日 起luci-app-serverchand 改名为 luci-app-pushbot + +如需拉取编译 +请把: + +`# git clone https://github.com/zzsj0928/luci-app-serverchand package/luci-app-serverchand` + +改为 + +`git clone https://github.com/zzsj0928/luci-app-pushbot package/luci-app-pushbot` + +并把 .config 中 + +`CONFIG_PACKAGE_luci-app-serverchand=y` + +改为 + +`CONFIG_PACKAGE_luci-app-pushbot=y` + +注意:本次改名需要提前备份serverchand配置,并于PushBot中重新配置。 + +再次谢谢各位支持 + +# 申明 +- 本插件由[tty228/luci-app-serverchan](https://github.com/tty228/luci-app-serverchan)原创. +- 因微信推送存在诸多弊端(无法分开聊天工具与功能性消息推送,通知内不显示内容,内容需要点开才能查看等), +- 故由 然后七年 @zzsj0928 重新修改为本插件,为钉钉机器人API使用。 +- 本插件工作在:openwrt +- 本插件支持:钉钉推送,企业微信推送,PushPlus推送,微信推送,企业微信应用推送,飞书推送,钉钉机器人推送,企业微信机器人推送,飞书机器人推送,一对多推送,Bark推送(仅iOS),PushDeer,PushDeer自架 +- 自20210911之后的版本,支持Bark群组,群组名默认为设备名 +- 自20210901之后的版本,增加依赖jq,请重新编译或在安装前同步安装jq + +# 显示效果 +## 通知栏:直接显示推送主题,一目了然,按设备不同,分组显示 + + +## 消息列表:直接显示最新推送的标题 + + +## 消息内容:直接显示所有推送信息,不用二次点开再查看 + + +# 下载 +- [luci-app-pushbot](https://github.com/zzsj0928/luci-app-pushbot/releases) + + +----------------------------------------------------- +##################################################### +----------------------------------------------------- + +# 以下为原插件简介: + +# 简介 +- 用于 OpenWRT/LEDE 路由器上进行 Server酱 微信/Telegram 推送的插件 +- 基于 serverchan 提供的接口发送信息,Server酱说明:http://sc.ftqq.com/1.version +- **基于斐讯 k3 制作,不同系统不同设备,请自行修改部分代码,无测试条件无法重现的 bug 不考虑修复** +- 依赖 iputils-arping + curl 命令,安装前请 `opkg update`,小内存路由谨慎安装 +- 使用主动探测设备连接的方式检测设备在线状态,以避免WiFi休眠机制,主动探测较为耗时,**如遇设备休眠频繁,请自行调整超时设置** +- 流量统计功能依赖 wrtbwmon ,自行选装或编译,该插件与 Routing/NAT 、Flow Offloading 冲突,开启无法获取流量,自行选择,L大版本直接编译 luci-app-wrtbwmon + +#### 主要功能 +- 路由 ip/ipv6 变动推送 +- 设备别名 +- 设备上线推送 +- 设备离线推送及流量使用情况 +- CPU 负载、温度监视 +- 定时推送设备运行状态 +- MAC 白名单、黑名单、按接口检测设备 +- 免打扰 +- 无人值守任务 + +#### 说明 +- 潘多拉系统、或不支持 sh 的系统,请将脚本开头 `#!/bin/sh` 改为 `#!/bin/bash`,或手动安装 `sh` +- 追新是没有意义的,没有问题没必要更新,上班事情忙完了,摸鱼又不会摸,只能靠写几行 bug ,才能缓解无聊这样子 + +#### 已知问题 +- 直接关闭接口时,该接口的离线设备会忽略检测 +- 部分设备无法读取到设备名,脚本使用 `cat /var/dhcp.leases` 命令读取设备名,如果 dhcp 中不存在设备名,则无法读取设备名(如二级路由设备、静态ip设备),请使用设备名备注 + +# Download +- [luci-app-serverchan](https://github.com/tty228/luci-app-serverchan/releases) +- [wrtbwmon](https://github.com/brvphoenix/wrtbwmon) +- [luci-app-wrtbwmon](https://github.com/brvphoenix/luci-app-wrtbwmon) + +#### ps +- 新功能看情况开发 +- 王者荣耀新赛季,不思进取中 +- 欢迎各种代码提交 +- 提交bug时请尽量带上设备信息,日志与描述(如执行`/usr/bin/serverchan/serverchan`后的提示、日志信息、/tmp/serverchan/ipAddress 文件信息) +- 三言两句恕我无能为力 +- 武汉加油 + diff --git a/luci-app-pushbot/luasrc/controller/pushbot.lua b/luci-app-pushbot/luasrc/controller/pushbot.lua new file mode 100644 index 00000000..5b586154 --- /dev/null +++ b/luci-app-pushbot/luasrc/controller/pushbot.lua @@ -0,0 +1,32 @@ +module("luci.controller.pushbot",package.seeall) + +function index() + if not nixio.fs.access("/etc/config/pushbot") then + return + end + + entry({"admin", "services", "pushbot"}, alias("admin", "services", "pushbot", "setting"),_("全能推送"), 30).dependent = true + entry({"admin", "services", "pushbot", "setting"}, cbi("pushbot/setting"),_("配置"), 40).leaf = true + entry({"admin", "services", "pushbot", "advanced"}, cbi("pushbot/advanced"),_("高级设置"), 50).leaf = true + entry({"admin", "services", "pushbot", "client"}, form("pushbot/client"), "在线设备", 80) + entry({"admin", "services", "pushbot", "log"}, form("pushbot/log"),_("日志"), 99).leaf = true + entry({"admin", "services", "pushbot", "get_log"}, call("get_log")).leaf = true + entry({"admin", "services", "pushbot", "clear_log"}, call("clear_log")).leaf = true + entry({"admin", "services", "pushbot", "status"}, call("act_status")).leaf = true +end + +function act_status() + local e={} + e.running=luci.sys.call("busybox ps|grep -v grep|grep -c pushbot >/dev/null")==0 + luci.http.prepare_content("application/json") + luci.http.write_json(e) +end + +function get_log() + luci.http.write(luci.sys.exec( + "[ -f '/tmp/pushbot/pushbot.log' ] && cat /tmp/pushbot/pushbot.log")) +end + +function clear_log() + luci.sys.call("echo '' > /tmp/pushbot/pushbot.log") +end diff --git a/luci-app-pushbot/luasrc/model/cbi/pushbot/advanced.lua b/luci-app-pushbot/luasrc/model/cbi/pushbot/advanced.lua new file mode 100644 index 00000000..a6fb78ae --- /dev/null +++ b/luci-app-pushbot/luasrc/model/cbi/pushbot/advanced.lua @@ -0,0 +1,124 @@ +local nt = require "luci.sys".net +local fs=require"nixio.fs" + +m=Map("pushbot",translate("提示"), +translate("如果你不了解这些选项的含义,请不要修改这些选项。")) + +s = m:section(TypedSection, "pushbot", "高级设置") +s.anonymous = true +s.addremove = false + +a=s:option(Value,"up_timeout",translate('设备上线检测超时(s)')) +a.default = "2" +a.optional=false +a.datatype="uinteger" + +a=s:option(Value,"down_timeout",translate('设备离线检测超时(s)')) +a.default = "20" +a.optional=false +a.datatype="uinteger" + +a=s:option(Value,"timeout_retry_count",translate('离线检测次数')) +a.default = "2" +a.optional=false +a.datatype="uinteger" +a.description = translate("若无二级路由设备,信号强度良好,可以减少以上数值
因夜间 wifi 休眠较为玄学,遇到设备频繁推送断开,烦请自行调整参数
..╮(╯_╰)╭..") + +a=s:option(Value,"thread_num",translate('最大并发进程数')) +a.default = "3" +a.datatype="uinteger" + +a=s:option(Value, "soc_code", "自定义温度读取命令") +a.rmempty = true +a:value("",translate("默认")) +a:value("pve",translate("PVE 虚拟机")) +a.description = translate("请尽量避免使用特殊符号,如双引号、$、!等,执行结果需为数字,用于温度对比") + +a=s:option(Value,"pve_host",translate("宿主机地址")) +a.rmempty=true +a.default="10.0.0.2" +a.description = translate("请确认已经设置好密钥登陆,否则会引起脚本无法运行等错误!
PVE 安装 sensors 命令自行百度
密钥登陆例:
opkg update #更新列表
opkg install openssh-client openssh-keygen #安装openssh客户端
ssh-keygen -t rsa # 生成密钥文件(自行设定密码等信息)
ssh root@10.0.0.2 \"tee -a ~/.ssh/id_rsa.pub\" < ~/.ssh/id_rsa.pub # 传送公钥到 PVE
ssh root@10.0.0.2 \"cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys\" # 写入公钥到 PVE
ssh -i ~/.ssh/id_rsa root@10.0.0.2 sensors # 测试温度命令") +a:depends({soc_code="pve"}) + +a=s:option(Value,"pve_port",translate("SSH端口")) +a.rmempty=true +a.default="22" +a.description = translate("默认为22,如有自定义,请填写自定义SSH端口") +a:depends({soc_code="pve"}) + +a=s:option(Button,"soc",translate("测试温度命令")) +a.inputtitle = translate("输出信息") +a.write = function() + luci.sys.call("/usr/bin/pushbot/pushbot soc") + luci.http.redirect(luci.dispatcher.build_url("admin","services","pushbot","advanced")) +end + +if nixio.fs.access("/tmp/pushbot/soc_tmp") then +e=s:option(TextValue,"soc_tmp") +e.rows=2 +e.readonly=true +e.cfgvalue = function() + return luci.sys.exec("cat /tmp/pushbot/soc_tmp && rm -f /tmp/pushbot/soc_tmp") +end +end + +a=s:option(Flag,"err_enable",translate("无人值守任务")) +a.default=0 +a.rmempty=true +a.description = translate("请确认脚本可以正常运行,否则可能造成频繁重启等错误!") + +a=s:option(Flag,"err_sheep_enable",translate("仅在免打扰时段重拨")) +a.default=0 +a.rmempty=true +a.description = translate("避免白天重拨 ddns 域名等待解析,此功能不影响断网检测
因夜间跑流量问题,该功能可能不稳定") +a:depends({err_enable="1"}) + +a= s:option(DynamicList, "err_device_aliases", translate("关注列表")) +a.rmempty = true +a.description = translate("只会在列表中设备都不在线时才会执行
免打扰时段一小时后,关注设备五分钟低流量(约100kb/m)将视为离线") +nt.mac_hints(function(mac, name) a :value(mac, "%s (%s)" %{ mac, name }) end) +a:depends({err_enable="1"}) + +a=s:option(ListValue,"network_err_event",translate("网络断开时")) +a.default="" +a:depends({err_enable="1"}) +a:value("",translate("无操作")) +a:value("1",translate("重启路由器")) +a:value("2",translate("重新拨号")) +a:value("3",translate("修改相关设置项,尝试自动修复网络")) +a.description = translate("选项 1 选项 2 不会修改设置,并最多尝试 2 次。
选项 3 会将设置项备份于 /usr/bin/pushbot/configbak 目录,并在失败后还原。
【!!无法保证兼容性!!】不熟悉系统设置项,不会救砖请勿使用") + +a=s:option(ListValue,"system_time_event",translate("定时重启")) +a.default="" +a:depends({err_enable="1"}) +a:value("",translate("无操作")) +a:value("1",translate("重启路由器")) +a:value("2",translate("重新拨号")) + +a= s:option(Value, "autoreboot_time", "系统运行时间大于") +a.rmempty = true +a.default = "24" +a.datatype="uinteger" +a:depends({system_time_event="1"}) +a.description = translate("单位为小时") + +a=s:option(Value, "network_restart_time", "网络在线时间大于") +a.rmempty = true +a.default = "24" +a.datatype="uinteger" +a:depends({system_time_event="2"}) +a.description = translate("单位为小时") + +a=s:option(Flag,"public_ip_event",translate("重拨尝试获取公网 ip")) +a.default=0 +a.rmempty=true +a:depends({err_enable="1"}) +a.description = translate("重拨时不会推送 ip 变动通知,并会导致你的域名无法及时更新 ip 地址
请确认你可以通过重拨获取公网 ip,否则这不仅徒劳无功还会引起频繁断网
移动等大内网你就别挣扎了!!") + +a= s:option(Value, "public_ip_retry_count", "当天最大重试次数") +a.rmempty = true +a.default = "10" +a.datatype="uinteger" +a:depends({public_ip_event="1"}) + +return m diff --git a/luci-app-pushbot/luasrc/model/cbi/pushbot/client.lua b/luci-app-pushbot/luasrc/model/cbi/pushbot/client.lua new file mode 100644 index 00000000..dbb80f2b --- /dev/null +++ b/luci-app-pushbot/luasrc/model/cbi/pushbot/client.lua @@ -0,0 +1,6 @@ +f = SimpleForm("pushbot") +luci.sys.call("/usr/bin/pushbot/pushbot client") +f.reset = false +f.submit = false +f:append(Template("pushbot/pushbot_client")) +return f diff --git a/luci-app-pushbot/luasrc/model/cbi/pushbot/log.lua b/luci-app-pushbot/luasrc/model/cbi/pushbot/log.lua new file mode 100644 index 00000000..0b73ae08 --- /dev/null +++ b/luci-app-pushbot/luasrc/model/cbi/pushbot/log.lua @@ -0,0 +1,5 @@ +f = SimpleForm("pushbot") +f.reset = false +f.submit = false +f:append(Template("pushbot/pushbot_log")) +return f diff --git a/luci-app-pushbot/luasrc/model/cbi/pushbot/setting.lua b/luci-app-pushbot/luasrc/model/cbi/pushbot/setting.lua new file mode 100644 index 00000000..f6330cf2 --- /dev/null +++ b/luci-app-pushbot/luasrc/model/cbi/pushbot/setting.lua @@ -0,0 +1,552 @@ + +local nt = require "luci.sys".net +local fs=require"nixio.fs" +local e=luci.model.uci.cursor() +local net = require "luci.model.network".init() +local sys = require "luci.sys" +local ifaces = sys.net:devices() + +m=Map("pushbot",translate("PushBot"), +translate("「全能推送」,英文名「PushBot」,是一款从服务器推送报警信息和日志到各平台的工具。
支持钉钉推送,企业微信推送,PushPlus推送。
本插件由tty228/luci-app-serverchan创建,然后七年修改为全能推送自用。

如果你在使用中遇到问题,请到这里提交:") +.. [[]] +.. translate("github 项目地址") +.. [[]] +) + +m:section(SimpleSection).template = "pushbot/pushbot_status" + +s=m:section(NamedSection,"pushbot","pushbot",translate("")) +s:tab("basic", translate("基本设置")) +s:tab("content", translate("推送内容")) +s:tab("crontab", translate("定时推送")) +s:tab("disturb", translate("免打扰")) +s.addremove = false +s.anonymous = true + +--基本设置 +a=s:taboption("basic", Flag,"pushbot_enable",translate("启用")) +a.default=0 +a.rmempty = true + +--精简模式 +a = s:taboption("basic", MultiValue, "lite_enable", translate("精简模式")) +a:value("device", translate("精简当前设备列表")) +a:value("nowtime", translate("精简当前时间")) +a:value("content", translate("只推送标题")) +a.widget = "checkbox" +a.default = nil +a.optional = true + +--推送模式 +a=s:taboption("basic", ListValue,"jsonpath",translate("推送模式")) +a.default="/usr/bin/pushbot/api/dingding.json" +a.rmempty = true +a:value("/usr/bin/pushbot/api/dingding.json",translate("钉钉")) +a:value("/usr/bin/pushbot/api/ent_wechat.json",translate("企业微信")) +a:value("/usr/bin/pushbot/api/feishu.json",translate("飞书")) +a:value("/usr/bin/pushbot/api/bark.json",translate("Bark")) +a:value("/usr/bin/pushbot/api/pushplus.json",translate("PushPlus")) +a:value("/usr/bin/pushbot/api/pushdeer.json",translate("PushDeer")) +a:value("/usr/bin/pushbot/api/diy.json",translate("自定义推送")) + +a=s:taboption("basic", Value,"dd_webhook",translate('Webhook'), translate("钉钉机器人 Webhook")..",只输入access_token=后面的即可
调用代码获取点击这里

") +a.rmempty = true +a:depends("jsonpath","/usr/bin/pushbot/api/dingding.json") + +a=s:taboption("basic", Value, "we_webhook", translate("Webhook"),translate("企业微信机器人 Webhook")..",只输入key=后面的即可
调用代码获取点击这里

") +a.rmempty = true +a:depends("jsonpath","/usr/bin/pushbot/api/ent_wechat.json") + +a=s:taboption("basic", Value,"pp_token",translate('PushPlus Token'), translate("PushPlus Token").."
调用代码获取点击这里

") +a.rmempty = true +a:depends("jsonpath","/usr/bin/pushbot/api/pushplus.json") + +a=s:taboption("basic", ListValue,"pp_channel",translate('PushPlus Channel')) +a.rmempty = true +a:depends("jsonpath","/usr/bin/pushbot/api/pushplus.json") +a:value("wechat",translate("wechat:PushPlus微信公众号")) +a:value("cp",translate("cp:企业微信应用")) +a:value("webhook",translate("webhook:第三方webhook")) +a:value("sms",translate("sms:短信")) +a:value("mail",translate("mail:邮箱")) +a.description = translate("第三方webhook:企业微信、钉钉、飞书、server酱
sms短信/mail邮箱:PushPlus暂未开放
具体channel设定参见:点击这里") + +a=s:taboption("basic", Value,"pp_webhook",translate('PushPlus Custom Webhook'), translate("PushPlus 自定义Webhook").."
第三方webhook或企业微信调用
具体自定义Webhook设定参见:点击这里

") +a.rmempty = true +a:depends("pp_channel","cp") +a:depends("pp_channel","webhook") + +a=s:taboption("basic", Flag,"pp_topic_enable",translate("PushPlus 一对多推送")) +a.default=0 +a.rmempty = true +a:depends("pp_channel","wechat") + +a=s:taboption("basic", Value,"pp_topic",translate('PushPlus Topic'), translate("PushPlus 群组编码").."
一对多推送时指定的群组编码
具体群组编码Topic设定参见:点击这里

") +a.rmempty = true +a:depends("pp_topic_enable","1") + +a=s:taboption("basic", Value,"pushdeer_key",translate('PushDeer Key'), translate("PushDeer Key").."
调用代码获取点击这里

") +a.rmempty = true +a:depends("jsonpath","/usr/bin/pushbot/api/pushdeer.json") + +a=s:taboption("basic", Flag,"pushdeer_srv_enable",translate("自建 PushDeer 服务器")) +a.default=0 +a.rmempty = true +a:depends("jsonpath","/usr/bin/pushbot/api/pushdeer.json") + +a=s:taboption("basic", Value,"pushdeer_srv",translate('PushDeer Server'), translate("PushDeer 自建服务器地址").."
如https://your.domain:port
具体自建服务器设定参见:点击这里

") +a.rmempty = true +a:depends("pushdeer_srv_enable","1") + +a=s:taboption("basic", Value,"fs_webhook",translate('WebHook'), translate("飞书 WebHook").."
调用代码获取点击这里

") +a.rmempty = true +a:depends("jsonpath","/usr/bin/pushbot/api/feishu.json") + +a=s:taboption("basic", Value,"bark_token",translate('Bark Token'), translate("Bark Token").."
调用代码获取点击这里

") +a.rmempty = true +a:depends("jsonpath","/usr/bin/pushbot/api/bark.json") + +a=s:taboption("basic", Flag,"bark_srv_enable",translate("自建 Bark 服务器")) +a.default=0 +a.rmempty = true +a:depends("jsonpath","/usr/bin/pushbot/api/bark.json") + +a=s:taboption("basic", Value,"bark_srv",translate('Bark Server'), translate("Bark 自建服务器地址").."
如https://your.domain:port
具体自建服务器设定参见:点击这里

") +a.rmempty = true +a:depends("bark_srv_enable","1") + +a=s:taboption("basic", Value,"bark_sound",translate('Bark Sound'), translate("Bark 通知声音").."
如silence.caf
具体设定参见:点击这里

") +a.rmempty = true +a.default = "silence.caf" +a:depends("jsonpath","/usr/bin/pushbot/api/bark.json") + +a=s:taboption("basic", Flag,"bark_icon_enable",translate(" Bark 通知图标")) +a.default=0 +a.rmempty = true +a:depends("jsonpath","/usr/bin/pushbot/api/bark.json") + +a=s:taboption("basic", Value,"bark_icon",translate('Bark Icon'), translate("Bark 通知图标").."(仅 iOS15 或以上支持)
如http://day.app/assets/images/avatar.jpg
具体设定参见:点击这里

") +a.rmempty = true +a.default = "http://day.app/assets/images/avatar.jpg" +a:depends("bark_icon_enable","1") + +a=s:taboption("basic", Value,"bark_level",translate('Bark Level'), translate("Bark 时效性通知").."
可选参数值:
active:不设置时的默认值,系统会立即亮屏显示通知。
timeSensitive:时效性通知,可在专注状态下显示通知。
passive:仅将通知添加到通知列表,不会亮屏提醒。") +a.rmempty = true +a.default = "active" +a:depends("jsonpath","/usr/bin/pushbot/api/bark.json") + +a=s:taboption("basic", TextValue, "diy_json", translate("自定义推送")) +a.optional = false +a.rows = 28 +a.wrap = "soft" +a.cfgvalue = function(self, section) + return fs.readfile("/usr/bin/pushbot/api/diy.json") +end +a.write = function(self, section, value) + fs.writefile("/usr/bin/pushbot/api/diy.json", value:gsub("\r\n", "\n")) +end +a:depends("jsonpath","/usr/bin/pushbot/api/diy.json") + +a=s:taboption("basic", Button,"__add",translate("发送测试")) +a.inputtitle=translate("发送") +a.inputstyle = "apply" +function a.write(self, section) + luci.sys.call("cbi.apply") + luci.sys.call("/usr/bin/pushbot/pushbot test &") +end + +a=s:taboption("basic", Value,"device_name",translate('本设备名称')) +a.rmempty = true +a.description = translate("在推送信息标题中会标识本设备名称,用于区分推送信息的来源设备") + +a=s:taboption("basic", Value,"sleeptime",translate('检测时间间隔')) +a.rmempty = true +a.optional = false +a.default = "60" +a.datatype = "and(uinteger,min(10))" +a.description = translate("越短的时间时间响应越及时,但会占用更多的系统资源") + +a=s:taboption("basic", ListValue,"oui_data",translate("MAC设备信息数据库")) +a.rmempty = true +a.default="" +a:value("",translate("关闭")) +a:value("1",translate("简化版")) +a:value("2",translate("完整版")) +a:value("3",translate("网络查询")) +a.description = translate("需下载 4.36m 原始数据,处理后完整版约 1.2M,简化版约 250kb
若无梯子,请勿使用网络查询") + +a=s:taboption("basic", Flag,"oui_dir",translate("下载到内存")) +a.rmempty = true +a:depends("oui_data","1") +a:depends("oui_data","2") +a.description = translate("懒得做自动更新了,下载到内存中,重启会重新下载
若无梯子,还是下到机身吧") + +a=s:taboption("basic", Flag,"reset_regularly",translate("每天零点重置流量数据")) +a.rmempty = true + +a=s:taboption("basic", Flag,"debuglevel",translate("开启日志")) +a.rmempty = true + +a= s:taboption("basic", DynamicList, "device_aliases", translate("设备别名")) +a.rmempty = true +a.description = translate("
请输入设备 MAC 和设备别名,用“-”隔开,如:
XX:XX:XX:XX:XX:XX-我的手机") + +--设备状态 +a=s:taboption("content", ListValue,"pushbot_ipv4",translate("IPv4 变更通知")) +a.rmempty = true +a.default="" +a:value("",translate("关闭")) +a:value("1",translate("通过接口获取")) +a:value("2",translate("通过URL获取")) + +a = s:taboption("content", ListValue, "ipv4_interface", translate("接口名称")) +a.rmempty = true +a:depends({pushbot_ipv4="1"}) +for _, iface in ipairs(ifaces) do + if not (iface == "lo" or iface:match("^ifb.*")) then + local nets = net:get_interface(iface) + nets = nets and nets:get_networks() or {} + for k, v in pairs(nets) do + nets[k] = nets[k].sid + end + nets = table.concat(nets, ",") + a:value(iface, ((#nets > 0) and "%s (%s)" % {iface, nets} or iface)) + end +end +a.description = translate("
一般选择 wan 接口,多拨环境请自行选择") + +a=s:taboption("content", TextValue, "ipv4_list", translate("IPv4 API列表")) +a.optional = false +a.rows = 8 +a.wrap = "soft" +a.cfgvalue = function(self, section) + return fs.readfile("/usr/bin/pushbot/api/ipv4.list") +end +a.write = function(self, section, value) + fs.writefile("/usr/bin/pushbot/api/ipv4.list", value:gsub("\r\n", "\n")) +end +a.description = translate("
会因服务器稳定性、连接频繁等原因导致获取失败
如接口可以正常获取 IP,不推荐使用
从以上列表中随机地址访问") +a:depends({pushbot_ipv4="2"}) + +a=s:taboption("content", ListValue,"pushbot_ipv6",translate("IPv6 变更通知")) +a.rmempty = true +a.default="disable" +a:value("0",translate("关闭")) +a:value("1",translate("通过接口获取")) +a:value("2",translate("通过URL获取")) + +a = s:taboption("content", ListValue, "ipv6_interface", translate("接口名称")) +a.rmempty = true +a:depends({pushbot_ipv6="1"}) +for _, iface in ipairs(ifaces) do + if not (iface == "lo" or iface:match("^ifb.*")) then + local nets = net:get_interface(iface) + nets = nets and nets:get_networks() or {} + for k, v in pairs(nets) do + nets[k] = nets[k].sid + end + nets = table.concat(nets, ",") + a:value(iface, ((#nets > 0) and "%s (%s)" % {iface, nets} or iface)) + end +end +a.description = translate("
一般选择 wan 接口,多拨环境请自行选择") + +a=s:taboption("content", TextValue, "ipv6_list", translate("IPv6 API列表")) +a.optional = false +a.rows = 8 +a.wrap = "soft" +a.cfgvalue = function(self, section) + return fs.readfile("/usr/bin/pushbot/api/ipv6.list") +end +a.write = function(self, section, value) + fs.writefile("/usr/bin/pushbot/api/ipv6.list", value:gsub("\r\n", "\n")) +end +a.description = translate("
会因服务器稳定性、连接频繁等原因导致获取失败
如接口可以正常获取 IP,不推荐使用
从以上列表中随机地址访问") +a:depends({pushbot_ipv6="2"}) + +a=s:taboption("content", Flag,"pushbot_up",translate("设备上线通知")) +a.default=1 +a.rmempty = true + +a=s:taboption("content", Flag,"pushbot_down",translate("设备下线通知")) +a.default=1 +a.rmempty = true + +a=s:taboption("content", Flag,"cpuload_enable",translate("CPU 负载报警")) +a.default=1 +a.rmempty = true + +a= s:taboption("content", Value, "cpuload", "负载报警阈值") +a.default = 2 +a.rmempty = true +a:depends({cpuload_enable="1"}) + +a=s:taboption("content", Flag,"temperature_enable",translate("CPU 温度报警")) +a.default=1 +a.rmempty = true +a.description = translate("请确认设备可以获取温度,如需修改命令,请移步高级设置") + +a= s:taboption("content", Value, "temperature", "温度报警阈值") +a.rmempty = true +a.default = "80" +a.datatype="uinteger" +a:depends({temperature_enable="1"}) +a.description = translate("
设备报警只会在连续五分钟超过设定值时才会推送
而且一个小时内不会再提醒第二次") + +a=s:taboption("content", Flag,"client_usage",translate("设备异常流量")) +a.default=0 +a.rmempty = true + +a= s:taboption("content", Value, "client_usage_max", "每分钟流量限制") +a.default = "10M" +a.rmempty = true +a:depends({client_usage="1"}) +a.description = translate("设备异常流量警报(byte),你可以追加 K 或者 M") + +a=s:taboption("content", Flag,"client_usage_disturb",translate("异常流量免打扰")) +a.default=1 +a.rmempty = true +a:depends({client_usage="1"}) + +a = s:taboption("content", DynamicList, "client_usage_whitelist", translate("异常流量关注列表")) +nt.mac_hints(function(mac, name) a:value(mac, "%s (%s)" %{ mac, name }) end) +a.rmempty = true +a:depends({client_usage_disturb="1"}) +a.description = translate("请输入设备 MAC") + +--LoginNoti +a=s:taboption("content", Flag,"web_logged",translate("Web 登录提醒")) +a.default=0 +a.rmempty = true + +a=s:taboption("content", Flag,"ssh_logged",translate("SSH 登录提醒")) +a.default=0 +a.rmempty = true + +a=s:taboption("content", Flag,"web_login_failed",translate("Web 错误尝试提醒")) +a.default=0 +a.rmempty = true + +a=s:taboption("content", Flag,"ssh_login_failed",translate("SSH 错误尝试提醒")) +a.default=0 +a.rmempty = true + +a= s:taboption("content", Value, "login_max_num", "错误尝试次数") +a.default = "3" +a.datatype="and(uinteger,min(1))" +a:depends("web_login_failed","1") +a:depends("ssh_login_failed","1") +a.description = translate("超过次数后推送提醒") + +a=s:taboption("content", Flag,"web_login_black",translate("自动拉黑")) +a.default=0 +a.rmempty = true +a:depends("web_login_failed","1") +a:depends("ssh_login_failed","1") +a.description = translate("直到重启前都不会重置次数,请先添加白名单") + +a= s:taboption("content", Value, "ip_black_timeout", "拉黑时间(秒)") +a.default = "86400" +a.datatype="and(uinteger,min(0))" +a:depends("web_login_black","1") +a.description = translate("0 为永久拉黑,慎用
如不幸误操作,请更改设备 IP 进入 LUCI 界面清空规则") + +a=s:taboption("content", DynamicList, "ip_white_list", translate("白名单 IP 列表")) +a.datatype = "ipaddr" +a.rmempty = true +luci.ip.neighbors({family = 4}, function(entry) + if entry.reachable then + a:value(entry.dest:string()) + end +end) +a:depends("web_logged","1") +a:depends("ssh_logged","1") +a:depends("web_login_failed","1") +a:depends("ssh_login_failed","1") +a.description = translate("忽略白名单登陆提醒和拉黑操作,暂不支持掩码位表示") + +a=s:taboption("content", TextValue, "ip_black_list", translate("IP 黑名单列表")) +a.optional = false +a.rows = 8 +a.wrap = "soft" +a.cfgvalue = function(self, section) + return fs.readfile("/usr/bin/pushbot/api/ip_blacklist") +end +a.write = function(self, section, value) + fs.writefile("/usr/bin/pushbot/api/ip_blacklist", value:gsub("\r\n", "\n")) +end +a:depends("web_login_black","1") + +--定时推送 +a=s:taboption("crontab", ListValue,"crontab",translate("定时任务设定")) +a.rmempty = true +a.default="" +a:value("",translate("关闭")) +a:value("1",translate("定时发送")) +a:value("2",translate("间隔发送")) + +a=s:taboption("crontab", ListValue,"regular_time",translate("发送时间")) +a.rmempty = true +for t=0,23 do +a:value(t,translate("每天"..t.."点")) +end +a.default=8 +a.datatype=uinteger +a:depends("crontab","1") + +a=s:taboption("crontab", ListValue,"regular_time_2",translate("发送时间")) +a.rmempty = true +a:value("",translate("关闭")) +for t=0,23 do +a:value(t,translate("每天"..t.."点")) +end +a.default="关闭" +a.datatype=uinteger +a:depends("crontab","1") + +a=s:taboption("crontab", ListValue,"regular_time_3",translate("发送时间")) +a.rmempty = true + +a:value("",translate("关闭")) +for t=0,23 do +a:value(t,translate("每天"..t.."点")) +end +a.default="关闭" +a.datatype=uinteger +a:depends("crontab","1") + +a=s:taboption("crontab", ListValue,"interval_time",translate("发送间隔")) +a.rmempty = true +for t=1,23 do +a:value(t,translate(t.."小时")) +end +a.default=6 +a.datatype=uinteger +a:depends("crontab","2") +a.description = translate("
从 00:00 开始,每 * 小时发送一次") + +a= s:taboption("crontab", Value, "send_title", translate("推送标题")) +a:depends("crontab","1") +a:depends("crontab","2") +a.placeholder = "OpenWrt By tty228 路由状态:" +a.description = translate("
使用特殊符号可能会造成发送失败") + +a=s:taboption("crontab", Flag,"router_status",translate("系统运行情况")) +a.default=1 +a:depends("crontab","1") +a:depends("crontab","2") + +a=s:taboption("crontab", Flag,"router_temp",translate("设备温度")) +a.default=1 +a:depends("crontab","1") +a:depends("crontab","2") + +a=s:taboption("crontab", Flag,"router_wan",translate("WAN信息")) +a.default=1 +a:depends("crontab","1") +a:depends("crontab","2") + +a=s:taboption("crontab", Flag,"client_list",translate("客户端列表")) +a.default=1 +a:depends("crontab","1") +a:depends("crontab","2") + +a=s:taboption("crontab", Value,"google_check_timeout",translate("全球互联检测超时时间")) +a.rmempty = true +a.optional = false +a.default = "10" +a.datatype = "and(uinteger,min(3))" +a.description = translate("过短的时间可能导致检测不准确") + +e=s:taboption("crontab", Button,"_add",translate("手动发送")) +e.inputtitle=translate("发送") +e:depends("crontab","1") +e:depends("crontab","2") +e.inputstyle = "apply" +function e.write(self, section) +luci.sys.call("cbi.apply") + luci.sys.call("/usr/bin/pushbot/pushbot send &") +end + +--免打扰 +a=s:taboption("disturb", ListValue,"pushbot_sheep",translate("免打扰时段设置"),translate("在指定整点时间段内,暂停推送消息
免打扰时间中,定时推送也会被阻止。")) +a.rmempty = true + +a:value("",translate("关闭")) +a:value("1",translate("模式一:脚本挂起")) +a:value("2",translate("模式二:静默模式")) +a.description = translate("模式一停止一切检测,包括无人值守。") +a=s:taboption("disturb", ListValue,"starttime",translate("免打扰开始时间")) +a.rmempty = true + +for t=0,23 do +a:value(t,translate("每天"..t.."点")) +end +a.default=0 +a.datatype=uinteger +a:depends({pushbot_sheep="1"}) +a:depends({pushbot_sheep="2"}) +a=s:taboption("disturb", ListValue,"endtime",translate("免打扰结束时间")) +a.rmempty = true + +for t=0,23 do +a:value(t,translate("每天"..t.."点")) +end +a.default=8 +a.datatype=uinteger +a:depends({pushbot_sheep="1"}) +a:depends({pushbot_sheep="2"}) + +a=s:taboption("disturb", ListValue,"macmechanism",translate("MAC过滤")) +a:value("",translate("disable")) +a:value("allow",translate("忽略列表内设备")) +a:value("block",translate("仅通知列表内设备")) +a:value("interface",translate("仅通知此接口设备")) +a.rmempty = true + + +a = s:taboption("disturb", DynamicList, "pushbot_whitelist", translate("忽略列表")) +nt.mac_hints(function(mac, name) a :value(mac, "%s (%s)" %{ mac, name }) end) +a.rmempty = true +a:depends({macmechanism="allow"}) +a.description = translate("AA:AA:AA:AA:AA:AA\\|BB:BB:BB:BB:BB:B 可以将多个 MAC 视为同一用户
任一设备在线后不再推送,设备全部离线时才会推送,避免双 wifi 频繁推送") + +a = s:taboption("disturb", DynamicList, "pushbot_blacklist", translate("关注列表")) +nt.mac_hints(function(mac, name) a:value(mac, "%s (%s)" %{ mac, name }) end) +a.rmempty = true +a:depends({macmechanism="block"}) +a.description = translate("AA:AA:AA:AA:AA:AA\\|BB:BB:BB:BB:BB:B 可以将多个 MAC 视为同一用户
任一设备在线后不再推送,设备全部离线时才会推送,避免双 wifi 频繁推送") + +a = s:taboption("disturb", ListValue, "pushbot_interface", translate("接口名称")) +a:depends({macmechanism="interface"}) +a.rmempty = true + +for _, iface in ipairs(ifaces) do + if not (iface == "lo" or iface:match("^ifb.*")) then + local nets = net:get_interface(iface) + nets = nets and nets:get_networks() or {} + for k, v in pairs(nets) do + nets[k] = nets[k].sid + end + nets = table.concat(nets, ",") + a:value(iface, ((#nets > 0) and "%s (%s)" % {iface, nets} or iface)) + end +end + +a=s:taboption("disturb", ListValue,"macmechanism2",translate("MAC过滤2")) +a:value("",translate("disable")) +a:value("MAC_online",translate("列表内任意设备在线时免打扰")) +a:value("MAC_offline",translate("列表内设备都离线后免打扰")) +a.rmempty = true + +a = s:taboption("disturb", DynamicList, "MAC_online_list", translate("在线免打扰列表")) +nt.mac_hints(function(mac, name) a:value(mac, "%s (%s)" %{ mac, name }) end) +a.rmempty = true +a:depends({macmechanism2="MAC_online"}) + +a = s:taboption("disturb", DynamicList, "MAC_offline_list", translate("任意离线免打扰列表")) +nt.mac_hints(function(mac, name) a:value(mac, "%s (%s)" %{ mac, name }) end) +a.rmempty = true +a:depends({macmechanism2="MAC_offline"}) + +return m diff --git a/luci-app-pushbot/luasrc/view/pushbot/pushbot_log.htm b/luci-app-pushbot/luasrc/view/pushbot/pushbot_log.htm new file mode 100644 index 00000000..42b1e52e --- /dev/null +++ b/luci-app-pushbot/luasrc/view/pushbot/pushbot_log.htm @@ -0,0 +1,33 @@ +<% +local dsp = require "luci.dispatcher" +-%> + + +
+ <%:自动刷新%> + + +
diff --git a/luci-app-pushbot/luasrc/view/pushbot/pushbot_status.htm b/luci-app-pushbot/luasrc/view/pushbot/pushbot_status.htm new file mode 100644 index 00000000..a60c1967 --- /dev/null +++ b/luci-app-pushbot/luasrc/view/pushbot/pushbot_status.htm @@ -0,0 +1,22 @@ + + +
+

+ <%:Collecting data...%> +

+
diff --git a/luci-app-pushbot/root/etc/config/pushbot b/luci-app-pushbot/root/etc/config/pushbot new file mode 100644 index 00000000..89af5a7a --- /dev/null +++ b/luci-app-pushbot/root/etc/config/pushbot @@ -0,0 +1,10 @@ + +config pushbot 'pushbot' + option pushbot_enable '0' + option sleeptime '60' + option pushbot_ipv6 '0' + option pushbot_up '1' + option pushbot_down '1' + option cpuload_enable '1' + option cpuload '2' + option temperature_enable '0' diff --git a/luci-app-pushbot/root/etc/init.d/pushbot b/luci-app-pushbot/root/etc/init.d/pushbot new file mode 100755 index 00000000..915ee989 --- /dev/null +++ b/luci-app-pushbot/root/etc/init.d/pushbot @@ -0,0 +1,26 @@ +#!/bin/sh /etc/rc.common + +START=99 +STOP=10 + +start() { + state=`pgrep -f "/usr/bin/pushbot/pushbot"` + if [ ! -z "$state" ]; then + restart + else + /usr/bin/pushbot/pushbot & + fi + echo "pushbot is starting now ..." +} + +stop() { + kill -9 `pgrep -f "/usr/bin/pushbot/pushbot"` 2>/dev/null + echo "pushbot exit ..." +} + +restart(){ + stop + sleep 1 + start + echo "restarted." +} diff --git a/luci-app-pushbot/root/etc/uci-defaults/luci-pushbot b/luci-app-pushbot/root/etc/uci-defaults/luci-pushbot new file mode 100755 index 00000000..b29a280f --- /dev/null +++ b/luci-app-pushbot/root/etc/uci-defaults/luci-pushbot @@ -0,0 +1,11 @@ +#!/bin/sh + +uci -q batch <<-EOF >/dev/null + delete ucitrack.@pushbot[-1] + add ucitrack pushbot + set ucitrack.@pushbot[-1].init=pushbot + commit ucitrack +EOF + +rm -rf /tmp/luci-* +exit 0 diff --git a/luci-app-pushbot/root/usr/bin/pushbot/api/bark.json b/luci-app-pushbot/root/usr/bin/pushbot/api/bark.json new file mode 100644 index 00000000..8d1f73ab --- /dev/null +++ b/luci-app-pushbot/root/usr/bin/pushbot/api/bark.json @@ -0,0 +1,36 @@ +{ + "_api": "这是Bark推送 post 模板信息 api 文件", + "_api": "【Bark推送】", + + "url": "${bark_srv}/push", + "data": "@${tempjsonpath}", + "content_type": "Content-Type: application/json; charset=utf-8", + "str_title_start": "【", + "str_title_end": "】", + "str_linefeed": "\\n", + "str_splitline": "\\n\\n", + "str_space": " ", + "str_tab": " ", + "table_tab": "", + "font_green": "", + "font_green2": "", + "font_red": "", + "font_blue": "", + "font_purple": "", + "font_end": "", + "font_end2": "", + "percentsym": "", + "boldstar": "", + "type": { + "device_key": "\"${bark_token}\"", + "title": "\"${1}\"", + "body": "\"${nowtime}${str_linefeed}${2}\"", + "ext_params": { + "group": "\"${device_name}\"", + "isArchive": "1", + "icon": "\"${bark_icon}\"", + "level": "\"${bark_level}\"" + }, + "sound": "\"${bark_sound}\"" + } +} \ No newline at end of file diff --git a/luci-app-pushbot/root/usr/bin/pushbot/api/dingding.json b/luci-app-pushbot/root/usr/bin/pushbot/api/dingding.json new file mode 100644 index 00000000..c28a90ed --- /dev/null +++ b/luci-app-pushbot/root/usr/bin/pushbot/api/dingding.json @@ -0,0 +1,32 @@ +{ + "_api": "这是 Pushbot:钉钉 api 文件", + "_api": "【钉钉推送】", + + "url": "\"https://oapi.dingtalk.com/robot/send?access_token=${dd_webhook}\"", + "data": "@${tempjsonpath}", + "content_type": "Content-Type:application/json", + "str_title_start": "**", + "str_title_end": "**", + "str_linefeed": "\\n\\n", + "str_splitline": "\\n\\n---\\n\\n", + "str_space": " ", + "str_tab": " ", + "table_tab": "", + "font_green": "", + "font_green2": "", + "font_red": "", + "font_blue": "", + "font_purple": "", + "font_end": "", + "font_end2": "", + "percentsym": "", + "boldstar": "**", + "type": + { + "msgtype": "\"markdown\"", + "markdown": { + "title": "\"${1}\"", + "text": "\"${str_title_start}${font_purple}${1}${font_end}${str_title_end}${str_linefeed}${nowtime}${str_linefeed}${2}${str_linefeed}${font_purple}${1}${font_end}\"" + } + } +} diff --git a/luci-app-pushbot/root/usr/bin/pushbot/api/diy.json b/luci-app-pushbot/root/usr/bin/pushbot/api/diy.json new file mode 100644 index 00000000..c22f0bc7 --- /dev/null +++ b/luci-app-pushbot/root/usr/bin/pushbot/api/diy.json @@ -0,0 +1,50 @@ +{ + "_//": "-------------------------------------------------------------------------------", + "_readme": "这是 自定义 api 文件,这里以 telegram 为例", + "_readme": "特殊符号请使用斜杠转义,变量使用 ${var} 表示", + "_//": "-------------------------------------------------------------------------------", + "_api": "【DIY 推送】", + "_url": "api 地址", + "_data": "生成的 json 文件路径,一般不需要改,如 api 不支持 json,请参考 serverchan 推送接口", + "_content_type": "post 内容类型,这里为 json", + "_//": "-------------------------------------------------------------------------------", + "_str_title_start": "标题粗体字开始符号", + "_str_title_end": "标题粗体字结束符号", + "_str_linefeed": "换行符号", + "_str_splitline": "换行+分隔符", + "_str_space": "空格", + "_str_tab": "TAB(用在行首,生成文字区块)", + "_//": "-------------------------------------------------------------------------------", + "_type": + { + "_readme": "type 对象因为需要转义变量,前后必须使用 斜杠+双引号 转义", + "_readme": "参照上文说明,填写下文相关参数" + }, + "_//": "-------------------------------------------------------------------------------", + + "url": "https://api.telegram.org/bot${tg_token}/sendMessage", + "data": "@${tempjsonpath}", + "content_type": "Content-Type: application/json", + "str_title_start": "", + "str_title_end": "", + "str_linefeed": "\\n", + "str_splitline": "\\n----\\n", + "str_space": " ", + "str_tab": " ", + "table_tab": "", + "font_green": "", + "font_green2": "", + "font_red": "", + "font_blue": "", + "font_purple": "", + "font_end": "", + "font_end2": "", + "percentsym": "25", + "boldstar": "**", + "type": + { + "text":"\"${str_title_start}${1}${str_title_end}${str_splitline}${nowtime}${2}\"", + "chat_id":"\"${chat_id}\"", + "parse_mode":"\"HTML\"" + } +} diff --git a/luci-app-pushbot/root/usr/bin/pushbot/api/ent_wechat.json b/luci-app-pushbot/root/usr/bin/pushbot/api/ent_wechat.json new file mode 100644 index 00000000..14d3ea74 --- /dev/null +++ b/luci-app-pushbot/root/usr/bin/pushbot/api/ent_wechat.json @@ -0,0 +1,32 @@ +{ + "_api": "这是企业微信 markdown 模板信息 api 文件", + "_api": "【企业微信】", + + "url": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=${we_webhook}", + "data": "@${tempjsonpath}", + "content_type": "Content-Type: application/json", + "str_title_start": "#### ", + "str_title_end": "", + "str_linefeed": "\\n", + "str_splitline": "\\n------\\n", + "str_space": " ", + "str_tab": " ", + "table_tab": "", + "font_green": "", + "font_green2": "", + "font_red": "", + "font_blue": "", + "font_purple": "", + "font_end": "", + "font_end2": "", + "percentsym": "", + "boldstar": "**", + "type": + { + "msgtype": "\"markdown\"", + "markdown": { + "title": "\"${1}\"", + "content": "\"${str_title_start}${font_purple}${1}${font_end}${str_title_end}${str_linefeed}${nowtime}${str_linefeed}${2}\"" + } + } +} diff --git a/luci-app-pushbot/root/usr/bin/pushbot/api/feishu.json b/luci-app-pushbot/root/usr/bin/pushbot/api/feishu.json new file mode 100644 index 00000000..0d16bf93 --- /dev/null +++ b/luci-app-pushbot/root/usr/bin/pushbot/api/feishu.json @@ -0,0 +1,61 @@ +{ + "_api": "这是飞书推送 post 模板信息 api 文件", + "_api": "【飞书推送】", + + "url": "https://open.feishu.cn/open-apis/bot/v2/hook/${fs_webhook}", + "data": "@${tempjsonpath}", + "content_type": "Content-Type: application/json", + "str_title_start": "**", + "str_title_end": "**", + "str_linefeed": "\\n", + "str_splitline": "\\n\\n", + "str_space": " ", + "str_tab": " ", + "table_tab": "", + "font_green": "", + "font_green": "", + "font_red": "", + "font_blue": "", + "font_purple": "", + "font_end": "", + "font_end2": "", + "percentsym": "", + "boldstar": "**", + "type": + { + "msg_type": "\"interactive\"", + "card": { + "config": { + "wide_screen_mode": "true" + }, + "header": { + "template": "\"purple\"", + "title": { + "content": "\"${1}\"", + "tag": "\"plain_text\"" + } + }, + "elements": [ + { + "tag": "\"div\"", + "text": { + "content": "\"${nowtime}${str_linefeed}${2}\"", + "tag": "\"lark_md\"" + } + }, + { + "tag": "\"hr\"" + }, + { + "elements": [ + { + "content": "\"来自${device_name}\"", + "tag": "\"lark_md\"" + } + ], + "tag": "\"note\"" + } + ] + } + } +} diff --git a/luci-app-pushbot/root/usr/bin/pushbot/api/ip_blacklist b/luci-app-pushbot/root/usr/bin/pushbot/api/ip_blacklist new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/luci-app-pushbot/root/usr/bin/pushbot/api/ip_blacklist @@ -0,0 +1 @@ + diff --git a/luci-app-pushbot/root/usr/bin/pushbot/api/ipv4.list b/luci-app-pushbot/root/usr/bin/pushbot/api/ipv4.list new file mode 100644 index 00000000..72081532 --- /dev/null +++ b/luci-app-pushbot/root/usr/bin/pushbot/api/ipv4.list @@ -0,0 +1,6 @@ +www.cip.cc +ipv4.ddnspod.com +ifcfg.cn +speed.neu.edu.cn/getIP.php +ddns.oray.com/checkip +www.net.cn/static/customercare/yourip.asp diff --git a/luci-app-pushbot/root/usr/bin/pushbot/api/ipv6.list b/luci-app-pushbot/root/usr/bin/pushbot/api/ipv6.list new file mode 100644 index 00000000..5f1ca230 --- /dev/null +++ b/luci-app-pushbot/root/usr/bin/pushbot/api/ipv6.list @@ -0,0 +1,5 @@ +ip.sb +ipv6.ddnspod.com +api-ipv6.ip.sb/ip +speed.neu6.edu.cn/getIP.php +v6.myip.la/json diff --git a/luci-app-pushbot/root/usr/bin/pushbot/api/pushdeer.json b/luci-app-pushbot/root/usr/bin/pushbot/api/pushdeer.json new file mode 100644 index 00000000..441d7d30 --- /dev/null +++ b/luci-app-pushbot/root/usr/bin/pushbot/api/pushdeer.json @@ -0,0 +1,31 @@ +{ + "_api": "这是 PushDeer推送 api 文件", + "_api": "【PushDeer推送】", + + "url": "${pushdeer_srv}/message/push", + "data": "@${tempjsonpath}", + "content_type": "Content-Type:application/json", + "str_title_start": "**【", + "str_title_end": "】**", + "str_linefeed": "\\n\\n", + "str_splitline": "\\n\\n---\\n\\n", + "str_space": " ", + "str_tab": " ", + "table_tab": "┋", + "font_green": "", + "font_green2": "", + "font_red": "", + "font_blue": "", + "font_purple": "", + "font_end": "", + "font_end2": "", + "percentsym": "", + "boldstar": "**", + "type": + { + "pushkey": "\"${pushdeer_key}\"", + "type": "\"markdown\"", + "text": "\"${1}\"", + "desp": "\"${nowtime}${str_linefeed}${2}\"" + } +} diff --git a/luci-app-pushbot/root/usr/bin/pushbot/api/pushplus.json b/luci-app-pushbot/root/usr/bin/pushbot/api/pushplus.json new file mode 100644 index 00000000..855472ff --- /dev/null +++ b/luci-app-pushbot/root/usr/bin/pushbot/api/pushplus.json @@ -0,0 +1,34 @@ +{ + "_api": "这是 Pushbot:PushPlus api 文件", + "_api": "【PushPlus推送】", + + "url": "http://www.pushplus.plus/send", + "data": "@${tempjsonpath}", + "content_type": "Content-Type:application/json", + "str_title_start": "#### ", + "str_title_end": "", + "str_linefeed": "\\n\\n", + "str_splitline": "\\n----\\n", + "str_space": " ", + "str_tab": " ", + "table_tab": "", + "font_green": "", + "font_green2": "", + "font_red": "", + "font_blue": "", + "font_purple": "", + "font_end": "", + "font_end2": "", + "percentsym": "", + "boldstar": "", + "type": + { + "token": "\"${pp_token}\"", + "channel": "\"${pp_channel}\"", + "webhook": "\"${pp_webhook}\"", + "topic": "\"${pp_topic}\"", + "title": "\"${1}\"", + "content": "\"${2}\"", + "template": "\"markdown\"" + } +} diff --git a/luci-app-pushbot/root/usr/bin/pushbot/pushbot b/luci-app-pushbot/root/usr/bin/pushbot/pushbot new file mode 100755 index 00000000..7c9b7858 --- /dev/null +++ b/luci-app-pushbot/root/usr/bin/pushbot/pushbot @@ -0,0 +1,1274 @@ +#!/bin/sh + +# 读取设置文件 +function get_config(){ + while [[ "$*" != "" ]]; do + eval ${1}='`uci get pushbot.pushbot.$1`' 2>/dev/null + shift + done +} + +# 初始化设置信息 +function read_config(){ + get_config "pushbot_enable" "lite_enable" "device_name" "sleeptime" "oui_dir" "oui_data" "reset_regularly" "debuglevel" "device_aliases" \ + "pushbot_ipv4" "ipv4_interface" "pushbot_ipv6" "ipv6_interface" "pushbot_up" "pushbot_down" "cpuload_enable" "cpuload" "temperature_enable" "temperature" \ + "regular_time" "regular_time_2" "regular_time_3" "interval_time" \ + "client_usage" "client_usage_max" "client_usage_disturb" "client_usage_whitelist" \ + "web_logged" "ssh_logged" "web_login_failed" "ssh_login_failed" "login_max_num" "web_login_black" "ip_white_list" "ip_black_timeout" \ + "pushbot_sheep" "starttime" "endtime" "pushbot_whitelist" "pushbot_blacklist" "pushbot_interface" "MAC_online_list" "MAC_offline_list" \ + "up_timeout" "down_timeout" "timeout_retry_count" "thread_num" "soc_code" "pve_host" "pve_port"\ + "err_enable" "err_sheep_enable" "err_device_aliases" "network_err_event" "system_time_event" "autoreboot_time" "network_restart_time" "public_ip_event" "public_ip_retry_count" \ + "jsonpath" "dd_webhook" "we_webhook" "pp_token" "pp_channel" "pp_webhook" "pp_topic_enable" "pp_topic" "fs_webhook" "pushdeer_key" "pushdeer_srv_enable" "pushdeer_srv" "bark_srv_enable" "bark_srv" "bark_token" "bark_sound" "bark_icon" "bark_icon_enable" "bark_level" + + for str_version in "wrtbwmon" "iputils-arping" "curl" "iw"; do + eval `echo ${str_version:0:2}"_version"`=`opkg list-installed|grep -w ^${str_version}|awk '{print $3}'` 2>/dev/null + done + dir="/tmp/pushbot/" && mkdir -p ${dir} + tempjsonpath="/tmp/pushbot/temp.json" + ip_blacklist_path="/usr/bin/pushbot/api/ip_blacklist" + [ ! -z "$oui_dir" ] && [ "$oui_dir" -eq "1" ] && oui_base="${dir}oui_base.txt" || oui_base="/usr/bin/pushbot/oui_base.txt" + debuglevel=`echo "$debuglevel"` && [ -z "$debuglevel" ] && logfile="/dev/null" || logfile="${dir}pushbot.log" + pushbot_blacklist=`echo "$pushbot_blacklist"|sed 's/ /\n/g'` 2>/dev/null + pushbot_whitelist=`echo "$pushbot_whitelist"|sed 's/ /\n/g'` 2>/dev/null + device_aliases=`echo "$device_aliases"|sed 's/ /\n/g'|sed 's/-/ /'` 2>/dev/null + err_device_aliases=`echo "$err_device_aliases"|sed 's/ /\n/g'` 2>/dev/null + client_usage_whitelist=`echo "$client_usage_whitelist"|sed 's/ /\n/g'` 2>/dev/null + ip_white_list=`echo "$ip_white_list"|sed 's/ /\n/g'` 2>/dev/null + mark_mac_list="${MAC_online_list} ${MAC_offline_list}" + mark_mac_list=`echo "$mark_mac_list"|sed 's/ /\n/g'|sed 's/-/ /'` 2>/dev/null + ipv4_urllist=`cat /usr/bin/pushbot/api/ipv4.list` 2>/dev/null + ipv6_urllist=`cat /usr/bin/pushbot/api/ipv6.list` 2>/dev/null + [ -z "$pushbot_ipv4" ] && pushbot_ipv4=0 + [ -z "$pushbot_ipv6" ] && pushbot_ipv6=0 + [ "$iw_version" ] && wlan_interface=`iw dev|grep Interface|awk '{print $2}'` >/dev/null 2>&1 + [ -z "$up_timeout" ] || [ "$up_timeout" -eq "0" ] && up_timeout="2" + [ -z "$down_timeout" ] || [ "$down_timeout" -eq "0" ] && down_timeout="20";down_timeout=`expr ${down_timeout} / 2 + 1` + [ -z "$timeout_retry_count" ] && timeout_retry_count="2";[ "$timeout_retry_count" -eq "0" ] && timeout_retry_count="1" + [ ! -z "$bark_token" ] && [ -z "$bark_srv" ] && bark_srv="https://api.day.app" + [ ! -z "$pushdeer_key" ] && [ -z "$pushdeer_srv" ] && pushdeer_srv="https://api2.pushdeer.com" + +# 字符串读取 + str_title_start=`/usr/bin/jq -r '.str_title_start' ${jsonpath}` + str_title_end=`/usr/bin/jq -r '.str_title_end' ${jsonpath}` + str_linefeed=`/usr/bin/jq -r '.str_linefeed' ${jsonpath}` + str_splitline=`/usr/bin/jq -r '.str_splitline' ${jsonpath}` + str_space=`/usr/bin/jq -r '.str_space' ${jsonpath}` + str_tab=`/usr/bin/jq -r '.str_tab' ${jsonpath}` + font_red=`/usr/bin/jq -r '.font_red' ${jsonpath}` + font_green=`/usr/bin/jq -r '.font_green' ${jsonpath}` + font_green2=`/usr/bin/jq -r '.font_green2' ${jsonpath}` + font_blue=`/usr/bin/jq -r '.font_blue' ${jsonpath}` + font_purple=`/usr/bin/jq -r '.font_purple' ${jsonpath}` + font_end=`/usr/bin/jq -r '.font_end' ${jsonpath}` + font_end2=`/usr/bin/jq -r '.font_end2' ${jsonpath}` + percentsym=`/usr/bin/jq -r '.percentsym' ${jsonpath}` + boldstar=`/usr/bin/jq -r '.boldstar' ${jsonpath}` + table_tab=`/usr/bin/jq -r '.tabletab' ${jsonpath}` + ( echo "$lite_enable"|grep -q "content" ) && str_title_start="" && str_title_end="" && str_splitline="" && str_linefeed="" && str_tab="" +} + + + +# 初始化 +function pushbot_init(){ + enable_detection + if [ -f "/usr/bin/pushbot/errlog" ]; then + cat /usr/bin/pushbot/errlog > ${logfile} + echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】载入上次重启前日志" >> ${logfile} + echo "--------------------------------------------------------" >> ${logfile} + fi + down_oui & + deltemp + get_syslog + add_ip_black + + rm -f ${dir}fd1 ${dir}sheep_usage ${dir}old_sheep_usage ${dir}client_usage_aliases ${dir}old_client_usage_aliases /usr/bin/pushbot/errlog >/dev/null 2>&1 + [ ! -f "/usr/sbin/wrtbwmon" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】未安装 wrtbwmon ,流量统计不可用" >> ${logfile} + [ -z "$ip_version" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】无法获取依赖项 iputils-arping 版本号,请确认插件是否正常运行" >> ${logfile} + [ -z "$cu_version" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】无法获取依赖项 curl 版本号,请确认插件是否正常运行" >> ${logfile} + [ -z "${dd_webhook}${pp_token}${we_webhook}${fs_webhook}${bark_token}${pushdeer_key}" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】请填写正确的Token/Webhook " >> ${logfile} && return 1 + local interfacelist=`getinterfacelist` && [ -z "$interfacelist" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】无法正确获取接口信息,请确认插件是否正常运行" >> ${logfile} + return 0 +} + +# 推送 +function diy_send(){ + ( ! echo "$lite_enable"|grep -q "content" ) && ( ! echo "$lite_enable"|grep -q "nowtime" ) && local nowtime=`date "+%Y-%m-%d %H:%M:%S"` + local diyurl=`/usr/bin/jq -r .url ${3}` && local diyurl=`eval echo ${diyurl}` + local type=`/usr/bin/jq -r '.type' ${3}` && local type=`eval echo ${type}` + local data=`/usr/bin/jq -r '.data' ${3}` && local data=`eval echo ${data}` + local content_type=`/usr/bin/jq -r '.content_type' ${3}` + /usr/bin/jq ".type + $type" ${jsonpath} > ${tempjsonpath} + /usr/bin/jq -r '.[]' ${tempjsonpath}|grep -w "null" && echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】参数值错误,请检查设置项 `/usr/bin/jq -r '.' ${tempjsonpath}|grep "null"`" >> ${logfile} && return 1 + [ -f ${tempjsonpath} ] && local logrow=$(grep -c "" ${tempjsonpath}) || local logrow="0" + [ $logrow -eq "0" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】json 文件生成失败,请检查文件格式" >> ${logfile} && return 1 + /usr/bin/jq -r '.[]' ${tempjsonpath}|grep "null" && echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】参数变量生成失败,请检查设置项 `/usr/bin/jq -r '.' ${tempjsonpath}|grep "null"`" >> ${logfile} + + curl -X POST -H "$content_type" -d "${data}" "${diyurl}" +} + +# 下载设备MAC厂商信息 +function down_oui(){ + [ -f ${oui_base} ] && local logrow=$(grep -c "" ${oui_base}) || local logrow="0" + [ $logrow -lt "10" ] && rm -f ${oui_base} >/dev/null 2>&1 + if [ ! -z "$oui_data" ] && [ "$oui_data" -ne "3" ] && [ ! -f ${oui_base} ]; then + echo "`date "+%Y-%m-%d %H:%M:%S"` 【初始化】设备MAC厂商信息不存在,重新下载" >> ${logfile} + wget --no-check-certificate -t 3 -T 15 -O ${dir}oui.txt https://standards-oui.ieee.org/oui/oui.txt >/dev/null 2>&1 + if [ -f ${dir}oui.txt ] && [ "$oui_data" -eq "1" ]; then + cat ${dir}oui.txt|grep "base 16"|grep -i "apple\|aruba\|asus\|autelan\|belkin\|bhu\|buffalo\|cctf\|cisco\|comba\|datang\|dell\|dlink\|dowell\|ericsson\|fast\|feixun\|\ +fiberhome\|fujitsu\|grentech\|h3c\|hisense\|hiwifi\|honghai\|honghao\|hp\|htc\|huawei\|intel\|jinli\|jse\|lenovo\|lg\|liteon\|malata\|meizu\|mercury\|meru\|moto\|netcore\|\ +netgear\|nokia\|omron\|oneplus\|oppo\|philips\|router_unkown\|samsung\|shanzhai\|sony\|start_net\|sunyuanda\|tcl\|tenda\|texas\|tianyu\|tp-link\|ubq\|undefine\|VMware\|\ +utstarcom\|volans\|xerox\|xiaomi\|zdc\|zhongxing\|smartisan" > ${oui_base} && echo "`date "+%Y-%m-%d %H:%M:%S"` 【初始化】设备MAC厂商信息下载成功" >> ${logfile} || echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】设备MAC厂商信息下载失败" >> ${logfile} + fi + if [ -f ${dir}oui.txt ] && [ "$oui_data" -eq "2" ]; then + cat ${dir}oui.txt|grep "base 16" > ${oui_base} && echo "`date "+%Y-%m-%d %H:%M:%S"` 【初始化】设备MAC厂商信息下载成功" >> ${logfile} || echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】设备MAC厂商信息下载失败" >> ${logfile} + fi + rm -f ${dir}oui.txt >/dev/null 2>&1 + fi +} + +# 清理临时文件 +function deltemp(){ + unset title content ipAddress_logrow online_list online_mac mac_online_status + rm -f ${dir}title ${dir}content ${dir}tmp_downlist ${dir}send_enable.lock ${tempjsonpath} >/dev/null 2>&1 + LockFile unlock + [ -f ${logfile} ] && local logrow=$(grep -c "" ${logfile}) || local logrow="0" + [ $logrow -gt 500 ] && sed -i '1,100d' ${logfile} && echo "`date "+%Y-%m-%d %H:%M:%S"` 【清理】日志超出上限,删除前 100 条" >> ${logfile} +} + +# 检测程序开关 +function enable_detection(){ + [ ! "$1" ] && local time_n=1 + for i in `seq 1 $time_n`; do + get_config pushbot_enable;[ -z "$pushbot_enable" ] || [ "$pushbot_enable" -eq "0" ] && `/etc/init.d/pushbot stop` || sleep 1 + done +} + +# 获取 ip +function getip(){ + [ ! "$1" ] && return + if [ $1 == "wanipv4" ] ;then + [ ! -z "$ipv4_interface" ] && local wanIP=$(/sbin/ifconfig ${ipv4_interface}|awk '/inet addr/ {print $2}'|awk -F: '{print $2}'|grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}') + [ -z "$ipv4_interface" ] && local wanIP=$(getinterfacelist|grep '\"address\"'|grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}') + echo "$wanIP" + elif [ $1 == "hostipv4" ] ;then + function get_hostipv4() + { + local url_number=`echo "$ipv4_urllist"|wc -l` + local ipv4_URL=`echo "$ipv4_urllist"| sed -n "$(rand 1 $url_number)p"|sed -e 's/\r//g'` + [ ! -z "$ipv4_interface" ] && local hostIP=$(curl -k -s -4 --interface ${ipv4_interface} -m 5 ${ipv4_URL}) || local hostIP=$(curl -k -s -4 -m 5 ${ipv4_URL}) + echo $hostIP|grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'|head -n1 + } + local hostIP=`get_hostipv4` + [ -z "$hostIP" ] && local hostIP=`get_hostipv4` + [ -z "$hostIP" ] && local hostIP=`get_hostipv4` + echo $hostIP # 重试,偷懒,有空再优化 + elif [ $1 == "wanipv6" ] ;then + [ ! -z "$ipv6_interface" ] && local wanIPv6=$(ip addr show ${ipv6_interface}|grep -v deprecated|grep -A1 'inet6 [^f:]'|sed -nr ':a;N;s#^ +inet6 ([a-f0-9:]+)/.+? scope global .*? valid_lft ([0-9]+sec) .*#\2 \1#p;ta'|sort -nr|head -n1|awk '{print $2}') + [ -z "$ipv6_interface" ] && local wanIPv6=$(ip addr show|grep -v deprecated|grep -A1 'inet6 [^f:]'|sed -nr ':a;N;s#^ +inet6 ([a-f0-9:]+)/.+? scope global .*? valid_lft ([0-9]+sec) .*#\2 \1#p;ta'|sort -nr|head -n1|awk '{print $2}') + echo "$wanIPv6" + elif [ $1 == "hostipv6" ] ;then + function get_hostipv6() + { + local urlv6_number=`echo "$ipv6_urllist"|wc -l` + local ipv6_URL=`echo "$ipv6_urllist"| sed -n "$(rand 1 $urlv6_number)p"|sed -e 's/\r//g'` + [ ! -z "$ipv6_interface" ] && local hostIPv6=$(curl -k -s -6 --interface ${ipv6_interface} -m 5 ${ipv6_URL}) || local hostIPv6=$(curl -k -s -6 -m 5 ${ipv6_URL}) + echo $hostIPv6|grep -oE '([\da-fA-F0-9]{1,4}(:{1,2})){1,15}[\da-fA-F0-9]{1,4}'|head -n1 + } + local hostIPv6=`get_hostipv6` + [ -z "$hostIPv6" ] && local hostIPv6=`get_hostipv6` + [ -z "$hostIPv6" ] && local hostIPv6=`get_hostipv6` + echo $hostIPv6 # 重试,偷懒,有空再优化 + fi +} + +# 获取接口信息 +function getinterfacelist(){ + [ `ubus list|grep -w -i "network.interface.wan"|wc -l` -ge "1" ] && ubus call network.interface.wan status && return + [ `ubus list|grep -i "network.interface."|grep -v "loopback"|grep -v "wan6"|wc -l` -eq "1" ] && ubus call `ubus list|grep "network.interface."|grep -v "loopback"` status && return +} + +# 获取接口在线时间 +function getinterfaceuptime(){ + getinterfacelist|grep \"uptime\"|sed $'s/\"uptime": //g'|sed $'s/\,//g' +} + +# 查询 mac 地址 +function getmac(){ + ( echo "$tmp_mac"|grep -q "unknown" ) && unset tmp_mac # 为unknown时重新读取 + [ -f "${dir}ipAddress" ] && [ -z "$tmp_mac" ] && local tmp_mac=`cat ${dir}ipAddress|grep -w ${1}|awk '{print $2}'|grep -v "^$"|sort -u|head -n1` + [ -f "${dir}tmp_downlist" ] && [ -z "$tmp_mac" ] && local tmp_mac=`cat ${dir}tmp_downlist|grep -w ${1}|awk '{print $2}'|grep -v "^$"|sort -u|head -n1` + [ -f "/var/dhcp.leases" ] && [ -z "$tmp_mac" ] && local tmp_mac=`cat /var/dhcp.leases|grep -w ${1}|awk '{print $2}'|grep -v "^$"|sort -u|head -n1` + [ -z "$tmp_mac" ] && local tmp_mac=`cat /proc/net/arp|grep "0x2\|0x6"|grep -w ${1}|awk '{print $4}'|grep -v "^$"|sort -u|head -n1` + [ -z "$tmp_mac" ] && local tmp_mac="unknown" + echo "$tmp_mac" +} + +# 查询主机名 +function getname(){ + [ -z "$tmp_name" ] && local tmp_name=`echo "$device_aliases"|grep -i $2|awk '{print $2}'|grep -v "^$"|sort -u|head -n1` + [ -f "${dir}ipAddress" ] && [ -z "$tmp_name" ] && local tmp_name=`cat ${dir}ipAddress|grep -w ${1}|awk '{print $3}'|grep -v "^$"|sort -u|head -n1` + [ -f "${dir}tmp_downlist" ] && [ -z "$tmp_name" ] && local tmp_name=`cat ${dir}tmp_downlist|grep -w ${1}|awk '{print $3}'|grep -v "^$"|sort -u|head -n1` + ( ! echo "$tmp_name"|grep -q -w "unknown\|*" ) && [ ! -z "$tmp_name" ] && echo "$tmp_name" && return || unset tmp_name # 为unknown时重新读取 + [ -f "/var/dhcp.leases" ] && [ -z "$tmp_name" ] && local tmp_name=`cat /var/dhcp.leases|grep -w ${1}|awk '{print $4}'|grep -v "^$"|sort -u|head -n1` + ( ! echo "$tmp_name"|grep -q -w "unknown\|*" ) && [ ! -z "$tmp_name" ] && echo "$tmp_name" && return || unset tmp_name # 为unknown时重新读取 + [ -z "$dhcp_config" ] && dhcp_config=`uci show dhcp|grep "ip\|mac\|name"` + for dhcp_config_str in "host" "domain"; do + local dhcp_ip_n=`echo "$dhcp_config"|grep -w ^dhcp.@${dhcp_config_str}.*ip=.${1}|sed -nr 's#^dhcp.(.*).ip.*#\1#gp'` 2>/dev/null + [ ! -z "$dhcp_ip_n" ] && [ -z "$tmp_name" ] && local tmp_name=`uci get dhcp.${dhcp_ip_n}.name` 2>/dev/null + local dhcp_mac_n=`echo "$dhcp_config"|grep -i ^dhcp.@${dhcp_config_str}.*mac=.${2}|sed -nr 's#^dhcp.(.*).mac.*#\1#gp'` 2>/dev/null + [ ! -z "$dhcp_mac_n" ] && [ -z "$tmp_name" ] && local tmp_name=`uci get dhcp.${dhcp_ip_n}.name` 2>/dev/null + [ ! -z "$tmp_name" ] && break + done + ( ! echo "$tmp_name"|grep -q -w "unknown\|*" ) && [ ! -z "$tmp_name" ] && echo "$tmp_name" && return || unset tmp_name # 为unknown时重新读取 + [ -f "$oui_base" ] && local tmp_name=$(cat $oui_base|grep -i $(echo "$2"|cut -c 1,2,4,5,7,8)|sed -nr 's#^.*16)..(.*)#\1#gp'|sed 's/ /_/g') + [ ! -z "$oui_data" ] && [ "$oui_data" -eq "4" ] && local tmp_name=$(curl -sS "https://standards-oui.ieee.org/oui/oui.txt"|grep -i $(echo "$2"|cut -c 1,2,4,5,7,8)|sed -nr 's#^.*16)..(.*)#\1#gp'|sed 's/ /_/g') + [ -z "$tmp_name" ] && local tmp_name="unknown" + echo "$tmp_name" +} + +# 查询设备接口 +function getinterface(){ + [ -f "${dir}ipAddress" ] && local ip_interface=`cat ${dir}ipAddress|grep -w ${1}|awk '{print $5}'|grep -v "^$"|sort -u|head -n1` + [ -f "${dir}tmp_downlist" ] && [ -z "$ip_interface" ] && local ip_interface=`cat ${dir}tmp_downlist|grep -w ${1}|awk '{print $5}'|grep -v "^$"|sort -u|head -n1` + if [ -z "$ip_interface" ] && [ ! -z "$wlan_interface" ]; then + for interface in $wlan_interface; do + local ip_interface=`iw dev $interface station dump 2>/dev/null|grep Station|grep -i -w ${1}|sed -nr 's#^.*on (.*))#\1#gp'` >/dev/null 2>&1 + [ ! -z "$ip_interface" ] && echo "$ip_interface" && return + done + fi + [ -z "$ip_interface" ] && local ip_interface=`cat /proc/net/arp|grep "0x2\|0x6"|grep -i -w ${1}|awk '{print $6}'|grep -v "^$"|sort -u|head -n1` + echo "$ip_interface" +} + +# ping +function getping(){ + [ "$iw_version" ] && local wlan_online=`iw dev ${ip_interface} station dump|grep -i -w ${ip_mac}|grep Station` >/dev/null 2>&1 + [ "$wlan_online" ] && return 0 + for i in `seq 1 ${3}`; do + ( ! echo "$ip_ms"|grep -q "ms" ) && local ip_ms=$( arping -I `cat /proc/net/arp|grep -w ${1}|awk '{print $6}'|grep -v "^$"|sort -u|head -n1` -c 20 -f -w ${2} $1 ) 2>/dev/null + ( ! echo "$ip_ms"|grep -q "ms" ) && local ip_ms=`ping -c 5 -w ${2} ${1}|grep -v '100% packet loss'` 2>/dev/null + ( ! echo "$ip_ms"|grep -q "ms" ) && sleep 1 + done + ( echo "$ip_ms"|grep -q "ms" ) +} + +# CPU 占用率 +function getcpu(){ + local AT=$(cat /proc/stat|grep "^cpu "|awk '{print $2+$3+$4+$5+$6+$7+$8 " " $2+$3+$4+$7+$8}') + sleep 3 + local BT=$(cat /proc/stat|grep "^cpu "|awk '{print $2+$3+$4+$5+$6+$7+$8 " " $2+$3+$4+$7+$8}') + printf "%.01f%%" $(echo ${AT} ${BT}|awk '{print (($4-$2)/($3-$1))*100}') +} + +# 获取SOC温度 (取所有传感器温度最大值) +function soc_temp(){ + [ -z "$soc_code" ] && local soctemp=`sensors 2>/dev/null|grep °C|sed -nr 's#^.*:.*\+(.*)°C .*#\1#gp'|sort -nr|head -n1` + [ -z "$soc_code" ] && [ -z "$soctemp" ] && local soctemp=`cat /sys/class/thermal/thermal_zone*/temp 2>/dev/null|sort -nr|head -n1|cut -c-2` + [ "$soc_code" == "pve" ] && [ ! -z "$pve_host" ] && local soctemp=`ssh -i ~/.ssh/id_rsa root@${pve_host} -p ${pve_port} sensors 2>/dev/null|grep °C|sed -nr 's#^.*:.*\+(.*)°C .*#\1#gp'|sort -nr|head -n1` + [ ! -z "$soctemp" ] && echo "$soctemp" && return + [ ! -z "$soc_code" ] && eval `echo "$soc_code"` 2>/dev/null +} + +# 流量数据 +function usage(){ + [ ! -f "/usr/sbin/wrtbwmon" ] || [ ! "$1" ] && return + if [ $1 == "update" ] ;then + function version_le() { test "$(echo "$@"|tr " " "\n"|sort -n|head -n 1)" == "$1"; } + function version_ge() { test "$(echo "$@"|tr " " "\n"|sort -r|head -n 1)" == "$1"; } + [ ! -z "$wr_version" ] && ( version_ge "${wr_version}" "1.2.0" ) && wrtbwmon -f ${dir}usage.db 2>/dev/null && return + [ ! -z "$wr_version" ] && ( version_le "${wr_version}" "1.0.0" ) || [ -z "$wr_version" ] && wrtbwmon update ${dir}usage.db 2>/dev/null && return + elif [ $1 == "get" ] ;then + [ ! -f "${dir}usage.db" ] && [ ! "$3" ] && echo `bytes_for_humans 0` && return + [ ! -f "${dir}usage.db" ] && [ "$3" ] && echo 0 && return + [ -z "$total_n" ] && total_n=`cat ${dir}usage.db|head -n1|grep "total"|sed 's/,/\n/g'|awk '/total/{print NR}'` 2>/dev/null + [ -z "$total_n" ] && total_n="6" + [ "$2" ] && local tmptotal=`cat ${dir}usage.db|sed 's/,,,/,0,0,/g'|sed 's/,,/,0,/g'|sed 's/,/ /g'|grep -i -w ${2}|awk "{print "'$'$total_n"}"|grep -v "^$"|sort -u|head -n1` 2>/dev/null + [ -z "$tmptotal" ] && local tmptotal="0" + [ ! "$3" ] && echo `bytes_for_humans ${tmptotal}` || echo "$tmptotal" + elif [ $1 == "down" ] ;then + [ "$2" ] && sed -i "/,${2},/d" ${dir}usage.db 2>/dev/null + fi +} + +# 流量数据单位换算 +function bytes_for_humans { + [ ! "$1" ] && return + [ "$1" -gt 1073741824 ] && echo "`awk 'BEGIN{printf "%.2f\n",'$1'/'1073741824'}'` G" && return + [ "$1" -gt 1048576 ] && echo "`awk 'BEGIN{printf "%.2f\n",'$1'/'1048576'}'` M" && return + [ "$1" -gt 1024 ] && echo "`awk 'BEGIN{printf "%.2f\n",'$1'/'1024'}'` K" && return + echo "${1} bytes" +} + +# 设备异常流量检测 +function get_client_usage(){ + [ -z "$client_usage" ] && return + [ "$client_usage" -ne "1" ] && return + [ -z "$client_usage_max" ] && return + [ -z "$get_client_usage_time" ] && get_client_usage_time=`date +%s` + ( echo $client_usage_max|sed -r 's/.*(.)$/\1/'|grep -q "K\|k" ) && client_usage_max=`expr ${client_usage_max%?} \* 1024` + ( echo $client_usage_max|sed -r 's/.*(.)$/\1/'|grep -q "M\|m" ) && client_usage_max=`expr ${client_usage_max%?} \* 1048576` + ( echo $client_usage_max|sed -r 's/.*(.)$/\1/'|grep -q "G\|g" ) && client_usage_max=`expr ${client_usage_max%?} \* 1073741824` + [ -z "$client_usage_disturb" ] && client_usage_disturb="0" + [ "$client_usage_disturb" -eq "0" ] && [ -f "${dir}ipAddress" ] && local MACLIST=`cat ${dir}ipAddress|awk '{print $2}'|grep -v "^$"|sort -u` + [ "$client_usage_disturb" -eq "1" ] && [ ! -z "$client_usage_whitelist" ] && local MACLIST=`echo "$client_usage_whitelist"` + [ -z "$MACLIST" ] && return + + if [ "$((`date +%s`-$get_client_usage_time))" -ge "60" ]; then + > ${dir}client_usage_aliases + for mac in $MACLIST; do + ( ! cat ${dir}ipAddress|grep -q -i -w $mac|grep -v "^$"|sort -u|head -n1 ) && continue + echo "$mac" `usage get ${mac} bytes` >> ${dir}client_usage_aliases + [ -f "${dir}old_client_usage_aliases" ] && get_client_usage_bytes=`cat ${dir}old_client_usage_aliases|grep -i -w $mac|awk '{print $2}'|grep -v "^$"|sort -u|head -n1` || continue + [ -z "$get_client_usage_bytes" ] && get_client_usage_bytes="0" + if [ "$((`usage get ${mac} bytes`-$get_client_usage_bytes))" -ge "$client_usage_max" ]; then + local ip=`cat ${dir}ipAddress|grep -i -w $mac|awk '{print $1}'|grep -v "^$"|sort -u|head -n1` + local ip_name=`getname ${ip} ${mac}` + local tmp_usage=$(bytes_for_humans $(expr `usage get ${mac} bytes` - ${get_client_usage_bytes})) + local time_up=`cat ${dir}ipAddress|grep -w ${ip}|awk '{print $4}'|grep -v "^$"|sort -u|head -n1` + local ip_total=`usage get $mac` && [ ! -z "$ip_total" ] && local ip_total="${str_linefeed}${str_tab}总计流量: ${str_space}${str_space}${str_space}${str_space}${ip_total}" + local time1=`date +%s` + local time1=$(time_for_humans `expr ${time1} - ${time_up}`) + if [ -z "$title" ]; then + title="${ip_name} 流量异常" + content="${content}${str_splitline}${str_title_start}${font_red} 设备流量异常${font_end}${str_title_end}${str_linefeed}${str_tab}客户端名:${str_space}${str_space}${str_space}${str_space}${str_space}${ip_name}${str_linefeed}${str_tab}客户端IP: ${str_space}${str_space}${str_space}${str_space}${ip}${str_linefeed}${str_tab}客户端MAC:${str_space}${str_space}${str_space}${str_space}${mac}$ip_total${str_linefeed}${str_tab}一分钟内流量: ${str_space}${str_space}${tmp_usage}${str_linefeed}${str_tab}在线时间: ${str_space}${str_space}${str_space}${str_space}${time1}" + elif ( echo "$title"|grep -q "流量异常" ); then + title="${ip_name} ${title}" + content="${content}${str_splitline}${str_tab}客户端名:${str_space}${str_space}${str_space}${str_space}${str_space}${ip_name}${str_linefeed}${str_tab}客户端IP: ${str_space}${str_space}${str_space}${str_space}${ip}${str_linefeed}${str_tab}客户端MAC:${str_space}${str_space}${str_space}${str_space}${mac}$ip_total${str_linefeed}${str_tab}一分钟内流量: ${str_space}${str_space}${str_space}${tmp_usage}${str_linefeed}${str_tab}在线时间: ${str_space}${str_space}${str_space}${str_space}${time1}" + else + title="设备状态变化" + content="${content}${str_splitline}${str_title_start}${font_red} 设备流量异常${font_end}${str_title_end}${str_linefeed}${str_tab}客户端名:${str_space}${str_space}${str_space}${str_space}${str_space}${ip_name}${str_linefeed}${str_tab}客户端IP: ${str_space}${str_space}${str_space}${str_space}${ip}${str_linefeed}${str_tab}客户端MAC:${str_space}${str_space}${str_space}${str_space}${mac}$ip_total${str_linefeed}${str_tab}一分钟内流量: ${str_space}${str_space}${str_space}${tmp_usage}${str_linefeed}${str_tab}在线时间: ${str_space}${str_space}${str_space}${str_space}${time1}" + fi + fi + done + cat ${dir}client_usage_aliases > ${dir}old_client_usage_aliases + get_client_usage_time=`date +%s` + fi +} + +# 时间单位换算 +function time_for_humans { + [ ! "$1" ] && return + if [ "$1" -lt 60 ]; then + echo "${1} 秒" + elif [ "$1" -lt 3600 ]; then + local usetime_min=`expr $1 / 60` + local usetime_sec=`expr $usetime_min \* 60` + local usetime_sec=`expr $1 - $usetime_sec` + echo "${usetime_min} 分 ${usetime_sec} 秒" + elif [ "$1" -lt 86400 ]; then + local usetime_hour=`expr $1 / 3600` + local usetime_min=`expr $usetime_hour \* 3600` + local usetime_min=`expr $1 - $usetime_min` + local usetime_min=`expr $usetime_min / 60` + echo "${usetime_hour} 小时 ${usetime_min} 分" + else + local usetime_day=`expr $1 / 86400` + local usetime_hour=`expr $usetime_day \* 86400` + local usetime_hour=`expr $1 - $usetime_hour` + local usetime_hour=`expr $usetime_hour / 3600` + echo "${usetime_day} 天 ${usetime_hour} 小时" + fi +} + +# 计算字符真实长度 +function length_str { + [ ! "$1" ] && return + local length_zh=`echo "$1"|awk '{print gensub(/[\u4e00-\u9FA5A-Za-z0-9_]/,"","g",$0)}'|awk -F "" '{print NF}'` + local length_en=`echo "$1"|awk '{print gensub(/[^\u4e00-\u9FA5A-Za-z0-9_]/,"","g",$0)}'|awk -F "" '{print NF}'` + echo `expr $length_zh / 3 \* 2 + $length_en` +} + +# 截取字符,避免中文乱码 +function cut_str { + [ ! "$1" ] && return + [ ! "$2" ] && return + [ `length_str $1` -le "$2" ] && echo "$1" && return + local temp_length=$2 + while [ $(length_str `echo "$1"|cut -c -$temp_length`) -lt "$2" ]; do + temp_length=`expr $temp_length + 1` + done + while [ $(printf "%d" \'`echo "$1"|cut -c $temp_length`) -ge "128" ] && [ $(printf "%d" \'`echo "$1"|cut -c $temp_length`) -lt "224" ]; do + temp_length=`expr $temp_length + 1` + done + temp_length=`expr $temp_length - 1` + echo $(echo "$1"|cut -c -$temp_length)"..." +} + +# 随机数 +function rand(){ + local min=$1 + local max=$(($2- $min + 1)) + local num=$(date +%s%N) + echo $(($num % $max + $min)) +} + +# 在线设备列表 +function pushbot_first(){ + [ -f "${dir}ipAddress" ] && local IPLIST=`cat ${dir}ipAddress|awk '{print $1}'|grep -v "^$"|sort -u` + for ip in $IPLIST; do + read -u 5 + { + down $ip + echo "" >&5 + }& + done + wait + unset ip IPLIST + local IPLIST=`cat /proc/net/arp|grep "0x2\|0x6"|awk '{print $1}'|grep -v "^169.254."|grep -v "^$"|sort -u|grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'` + for ip in $IPLIST; do + read -u 5 + { + up $ip + echo "" >&5 + }& + done + wait +} +# 创建计划任务 +function pushbot_cron(){ + function del_cron(){ + ( echo `crontab -l 2>/dev/null`|grep -q "pushbot" ) && crontab -l > conf && sed -i "/pushbot/d" conf && crontab conf && rm -f conf >/dev/null 2>&1 + } + function re_cron(){ + /etc/init.d/cron stop + /etc/init.d/cron start + } + del_cron + if [ -z "$pushbot_enable" ]; then + re_cron + return + fi + + # 重置流量 + if [ ! -z "$reset_regularly" ] && [ "$reset_regularly" -eq "1" ]; then + crontab -l 2>/dev/null > conf && echo -e "0 0 * * * rm /tmp/pushbot/usage.db >/dev/null 2>&1" >> conf && crontab conf && rm -f conf >/dev/null 2>&1 + crontab -l 2>/dev/null > conf && echo -e "0 0 * * * rm /tmp/pushbot/usage6.db >/dev/null 2>&1" >> conf && crontab conf && rm -f conf >/dev/null 2>&1 + fi + [ ! -z "$regular_time_2" ] && local regular_time_2=",${regular_time_2}" + [ ! -z "$regular_time_3" ] && local regular_time_3=",${regular_time_3}" + # 定时发送 + if [ ! -z "$regular_time" ] || [ ! -z "$regular_time_2" ] || [ ! -z "$regular_time_3" ]; then + crontab -l 2>/dev/null > conf && echo -e "0 $regular_time$regular_time_2$regular_time_3 * * * /usr/bin/pushbot/pushbot send &" >> conf && crontab conf && rm -f conf >/dev/null 2>&1 + # 间隔发送 + elif [ ! -z "$interval_time" ]; then + crontab -l 2>/dev/null > conf && echo -e "0 */$interval_time * * * /usr/bin/pushbot/pushbot send &" >> conf && crontab conf && rm -f conf >/dev/null 2>&1 + fi + re_cron +} + +# 免打扰检测 +function pushbot_disturb(){ + [ -z "$pushbot_sheep" ] || [ -z "$starttime" ] || [ -z "$endtime" ] && return 0 + if [ `date +%H` -ge $endtime -a $starttime -lt $endtime ] || [ `date +%H` -lt $starttime -a $starttime -lt $endtime ] || [ `date +%H` -lt $starttime -a `date +%H` -ge $endtime -a $starttime -gt $endtime ]; then + unset sheep_starttime + rm -f ${dir}sheep_usage ${dir}old_sheep_usage 2>/dev/null + disturb_text=`/usr/bin/jq -r '._api' ${jsonpath}` + return 0 + else + [ -z "$sheep_starttime" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【免打扰】夜深了,该休息了" >> ${logfile} && sheep_starttime=`date +%s` + if [ "$pushbot_sheep" -eq "1" ] ;then + while [ `date +%H` -lt "$endtime" ]; do + enable_detection + sleep $sleeptime + done + elif [ "$pushbot_sheep" -eq "2" ] ;then + disturb_text="【免打扰】" + return 1 + fi + fi +} + +# 文件锁 +function LockFile(){ + if [ $1 = "lock" ] ;then + [ ! -f "${dir}pushbot.lock" ] && > ${dir}pushbot.lock && return + while [ -f "${dir}pushbot.lock" ]; do + enable_detection 1 + done + LockFile lock + fi + [ $1 = "unlock" ] && rm -f ${dir}pushbot.lock >/dev/null 2>&1 + return 0 +} + +# 检测黑白名单 +function blackwhitelist(){ + [ ! "$1" ] && return 1 + [ -z "$pushbot_whitelist" ] && [ -z "$pushbot_blacklist" ] && [ -z "$pushbot_interface" ] && [ -z "$MAC_online_list" ] && [ -z "$MAC_offline_list" ] && return 0 + [ ! -z "$pushbot_whitelist" ] && ( echo "$pushbot_whitelist"|grep -q -i -w $1 ) && return 1 + [ ! -z "$pushbot_blacklist" ] && ( ! echo "$pushbot_blacklist"|grep -q -i -w $1 ) && return 1 + [ ! -z "$pushbot_interface" ] && ( ! echo `getinterface ${1}`|grep -q -i -w $pushbot_interface ) && return 1 + [ ! -z "$MAC_online_list" ] && [ ! -z "$mac_online_status" ] && return 1 + [ ! -z "$MAC_online_list" ] && ( echo "$MAC_online_list"|grep -q -i -w $1 ) && return 1 + [ ! -z "$MAC_offline_list" ] && [ -z "$mac_online_status" ] && return 1 + return 0 +} + +function get_client(){ + if [ -f "${dir}ipAddress" ]; then + while read line; do + local js_str="${js_str}
" + local js_str="${js_str}
<%:`echo "$line"|awk '{print $3}'`%>
" + local tmp_mac=`echo "$line"|awk '{print $2}'` + local js_str="${js_str}
<%:${tmp_mac}%>
" + local js_str="${js_str}
<%:`echo "$line"|awk '{print $1}'`%>
" + local tmp_usage=`usage get ${tmp_mac}` + local js_str="${js_str}
<%:${tmp_usage}%>
" + local tmp_uptime=`echo "$line"|awk '{print $4}'` + local tmp_timenow=`date +%s` + local tmp_uptime=$(time_for_humans `expr ${tmp_timenow} - ${tmp_uptime}`) + local js_str="${js_str}
<%:${tmp_uptime}%>
" + done < ${dir}ipAddress + fi +cat>/usr/lib/lua/luci/view/pushbot/pushbot_client.htm<<%:在线设备列表%>
<%:客户端名%>
<%:MAC%>
<%:IP%>
<%:总计流量%>
<%:在线时间%>
+$js_str +
+EOF +} + +# 重启网络服务 +function network_restart(){ +cat>${dir}network_restart</dev/null 2>&1 & +/etc/init.d/firewall restart >/dev/null 2>&1 & +/etc/init.d/dnsmasq restart >/dev/null 2>&1 & +EOF + chmod 0755 ${dir}network_restart && ${dir}network_restart + rm -f ${dir}network_restart >/dev/null 2>&1 +} + +# 查看无人值守任务设备是否在线 +function geterrdevicealiases(){ + [ -z "$err_device_aliases" ] && return + [ -f ${dir}ipAddress ] && local logrow=$(grep -c "" ${dir}ipAddress) || local logrow="0";[ $logrow -eq "0" ] && return + local MACLIST=`cat ${dir}ipAddress|awk '{print $2}'|grep -v "^$"|sort -u` + for mac in $MACLIST; do + [ -z "$err_mac" ] && [ ! -z "$mac" ] && local err_mac=`echo "$err_device_aliases"|grep -i $mac|grep -v "^$"|sort -u|head -n1` + done + # 进入免打扰时间已经超过一小时 + if [ ! -z "$sheep_starttime" ] && [ "$((`date +%s`-$sheep_starttime))" -ge "3600" ]; then + > ${dir}sheep_usage + local MACLIST=`echo "$err_device_aliases"|grep -v "^$"|sort -u` + for mac in $MACLIST; do + [ ! -z "$mac" ] && local tmptotal=`usage get ${mac} bytes` + [ ! -z "$tmptotal" ] && awk 'BEGIN{printf "%.0f\n",'$tmptotal'/'204800'}' 2>/dev/null >> ${dir}sheep_usage + done + old_sheep_usage=`cat ${dir}old_sheep_usage` 2>/dev/null + sheep_usage=`cat ${dir}sheep_usage` 2>/dev/null + [ "$old_sheep_usage" == "$sheep_usage" ] && [ -z "$sheep_nousage_starttime" ] && sheep_nousage_starttime=`date +%s` + [ "$old_sheep_usage" != "$sheep_usage" ] && unset sheep_nousage_starttime && cat ${dir}sheep_usage 2>/dev/null > ${dir}old_sheep_usage + [ ! -z "$sheep_nousage_starttime" ] && [ "$((`date +%s`-$sheep_nousage_starttime))" -ge "300" ] && unset err_mac + fi + [ -z "$err_mac" ] +} + +# 无人值守任务 +function unattended(){ + [ -z "$err_enable" ] || [ "$err_enable" -ne "1" ] && return + [ ! -z "$err_sheep_enable" ] && [ "$err_sheep_enable" -eq "1" ] && [ -z "$sheep_starttime" ] && return + geterrdevicealiases;[ $? -eq "1" ] && return + + if [ ! -z "$system_time_event" ]; then + local interfaceuptime=`getinterfaceuptime` + if [ ! -z "$autoreboot_time" ] && [ `cat /proc/uptime|awk -F. '{run_hour=$1/3600;printf("%d",run_hour)}'` -ge "$autoreboot_time" ] && [ "$system_time_event" -eq "1" ]; then + echo "`date "+%Y-%m-%d %H:%M:%S"` 【无人值守任务】重启路由器咯" >> ${logfile} + cat ${logfile} > /usr/bin/pushbot/errlog + sleep 2 && reboot && exit + elif [ ! -z "$network_restart_time" ] && [ ! -z "$interfaceuptime" ] && [ `echo "$interfaceuptime"|awk -F. '{run_hour=$1/3600;printf("%d",run_hour)}'` -ge "$network_restart_time" ] && [ "$system_time_event" -eq "2" ]; then + echo "`date "+%Y-%m-%d %H:%M:%S"` 【无人值守任务】重新拨号咯" >> ${logfile} + ifup wan >/dev/null 2>&1 + sleep 60 + fi + fi + + [ -z "$public_ip_today" ] && public_ip_today=`date +"%d"` + [ -z "$public_ip_count" ] && public_ip_count="0" + [ $public_ip_today -ne `date +"%d"` ] && public_ip_today=`date +"%d"` && public_ip_count=1 + if [ ! -z "$public_ip_event" ] && [ ! -z "$public_ip_retry_count" ] && [ "$public_ip_count" -le "$public_ip_retry_count" ]; then + public_ip_count=`expr $public_ip_count + 1` + local wanIP=`getip wanipv4` + local hostIP=`getip hostipv4` + if [ ! -z "$wanIP" ] && [ ! -z "$hostIP" ] && ( ! echo "$wanIP"|grep -q -w ${hostIP} );then + echo "`date "+%Y-%m-%d %H:%M:%S"` 【无人值守任务】重拨尝试获取公网 ip,当前第 $public_ip_count 次 " >> ${logfile} + ifup wan >/dev/null 2>&1 + sleep 60 + local wanIP=`getip wanipv4` && local hostIP=`getip hostipv4` + [ ! -z "$pushbot_ipv4" ] && [ "$pushbot_ipv4" -eq "1" ] && local IPv4=${wanIP} + [ ! -z "$pushbot_ipv4" ] && [ "$pushbot_ipv4" -eq "2" ] && local IPv4=${hostIP} + [ ! -z "$pushbot_ipv6" ] && [ "$pushbot_ipv6" -eq "1" ] && local IPv6=`getip wanipv6` + [ ! -z "$pushbot_ipv6" ] && [ "$pushbot_ipv6" -eq "2" ] && local IPv6=`getip hostipv6` + [ ! -z "$wanIP" ] && [ ! -z "$hostIP" ] && ( ! echo "$wanIP"|grep -q -w ${hostIP} ) && echo IPv4 $IPv4 > ${dir}ip && echo -e IPv6 $last_IPv6 >> ${dir}ip + fi + fi +} + +# 检测网络状态 +function rand_geturl(){ + function getcheck(){ + local urllist="https://www.163.com https://www.qq.com https://www.baidu.com https://www.qidian.com https://www.douban.com" + local url_number=`expr $(echo "$urllist"|grep -o ' '|wc -l) + 1` + local url_str=`echo "$urllist"|awk -v i=$(rand 1 $url_number) '{print $i}'` + echo `curl -k -s -w "%{http_code}" -m 5 ${url_str} -A "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36" -o /dev/null` + } + local check=`getcheck` + while [ -z "$check" ] || [ "$check" -ne "200" ]; do + local check=`getcheck` + if [ ! -z "$check" ] && [ "$check" -eq "200" ]; then + [ ! -z "$network_enable" ] && [ "$network_enable" -eq "404" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【网络状态】网络恢复正常.." >> ${logfile} + local network_enable="200" + else + [ -z "$network_enable" ] || [ "$network_enable" -eq "200" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!!】当前网络不通!停止检测! " >> ${logfile} + local network_enable="404" + [ -z "$network_err_time" ] && network_err_time=`date +%s` + if [ ! -z "$network_err_event" ] && [ "$((`date +%s`-$network_err_time))" -ge "600" ]; then + > ${dir}send_enable.lock && pushbot_first && deltemp + geterrdevicealiases + if [ "$?" -eq "0" ]; then + [ -f /usr/bin/pushbot/autoreboot_count ] && retry_count=`cat /usr/bin/pushbot/autoreboot_count` && rm -f /usr/bin/pushbot/autoreboot_count >/dev/null 2>&1 + [ ! -z ${retry_count} ] && retry_count=0;retry_count=`expr $retry_count + 1` + if [ "$network_err_event" -eq "1" ] ;then + if [ "$retry_count" -lt "3" ] ;then + echo "$retry_count" > /usr/bin/pushbot/autoreboot_count + echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!!】正在尝试重启路由,当前第 $retry_count 次 " >> ${logfile} + cat ${logfile} > /usr/bin/pushbot/errlog + sleep 2 && reboot && exit + fi + [ "$retry_count" -eq "3" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!!】已经重启路由2次,修复失败,请主人自行修复哦" >> ${logfile} + elif [ "$network_err_event" -eq "2" ] ;then + [ "$retry_count" -lt "3" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!!】正在尝试重启网络,当前第 $retry_count 次 " >> ${logfile} && ifup wan >/dev/null 2>&1 + [ "$retry_count" -eq "3" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!!】已经重启网络2次,修复失败,请主人自行修复哦 " >> ${logfile} + elif [ "$network_err_event" -eq "3" ] ;then + if [ "$retry_count" -eq "1" ] ;then + echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!!】正在尝试修复网络,当前第 1 次,重启网络服务中 " >> ${logfile} && network_restart + elif [ "$retry_count" -eq "2" ] ;then + echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!!】正在尝试修复网络,当前第 2 次,关闭可能造成网络断开的软件" >> ${logfile} + [ `uci get koolproxy.@global[0].enabled 2>/dev/null` -eq "1" ] && [ `uci get koolproxy.@global[0].koolproxy_mode 2>/dev/null` -eq "1" ] && /etc/init.d/koolproxy stop >/dev/null 2>&1 + [ `uci get adbyby.@adbyby[0].enable 2>/dev/null` -eq "1" ] && [ `uci get adbyby.@adbyby[0].wan_mode 2>/dev/null` -eq "0" ] && /etc/init.d/adbyby stop >/dev/null 2>&1 + [ `uci get passwall.@global[0].enabled 2>/dev/null` -eq "1" ] && [ `uci get passwall.@global[0].proxy_mode 2>/dev/null|grep global` ] && /etc/init.d/koolproxy stop >/dev/null 2>&1 + local shadowsocksr_enabled=`uci get shadowsocksr.@global[0].global_server 2>/dev/null|grep nil` + local shadowsocksr_run_mode=`uci get shadowsocksr.@global[0].run_mode 2>/dev/null|grep all` + [ -z "$shadowsocksr_enabled" ] && [ ! -z "$shadowsocksr_run_mode" ] && /etc/init.d/shadowsocksr stop >/dev/null 2>&1 + sleep 60 && network_restart + elif [ "$retry_count" -eq "3" ] ;then + echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!!】正在尝试修复网络,当前第 3 次,备份设置项,并修改相关设置" >> ${logfile} + mkdir -p /usr/bin/pushbot/configbak + cp -p -f /etc/config/network /usr/bin/pushbot/configbak/network + cp -p -f /etc/config/dhcp /usr/bin/pushbot/configbak/dhcp + cp -p -f /etc/config/firewall /usr/bin/pushbot/configbak/firewall + cp -p -f /etc/firewall.user /usr/bin/pushbot/configbak/firewall.user + uci set network.wan.peerdns='0' + uci delete network.wan.dns + uci add_list network.wan.dns='223.5.5.5' + uci add_list network.wan.dns='119.29.29.29' + uci delete network.wan.mtu + uci commit network + uci set dhcp.@dnsmasq[0].port='53' + uci set dhcp.@dnsmasq[0].resolvfile='/tmp/resolv.conf.auto' + uci delete dhcp.@dnsmasq[0].server + uci delete dhcp.@dnsmasq[0].noresolv + uci commit dhcp + uci delete firewall.redirect + >/etc/firewall.user + uci commit firewall + sleep 60 && network_restart + elif [ "$retry_count" -eq "4" ] ;then + echo "$retry_count" > /usr/bin/pushbot/autoreboot_count + cat ${logfile} > /usr/bin/pushbot/errlog + sleep 2 && reboot && exit + elif [ "$retry_count" -eq "5" ] ;then + echo "$retry_count" > /usr/bin/pushbot/autoreboot_count + echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!!】修复失败,还原设置中,请自行检查网络设置" >> ${logfile} + cp -p -f /usr/bin/pushbot/configbak/network /etc/config/network + cp -p -f /usr/bin/pushbot/configbak/dhcp /etc/config/dhcp + cp -p -f /usr/bin/pushbot/configbak/firewall /etc/config/firewall + cp -p -f /usr/bin/pushbot/configbak/firewall.user /etc/firewall.user + cat ${logfile} > /usr/bin/pushbot/errlog + sleep 2 && reboot && exit + fi + fi + fi + elif [ -f /usr/bin/pushbot/autoreboot_count ]; then + network_err_time=`expr $network_err_time - 600` && sleep 60 + fi + enable_detection + sleep $sleeptime + fi + continue + done + rm -f /usr/bin/pushbot/autoreboot_count >/dev/null 2>&1 +} + +# 检测 ip 状况 +function ip_changes(){ + [ ! -z "$pushbot_ipv4" ] && [ "$pushbot_ipv4" -eq "1" ] && local IPv4=`getip wanipv4` + [ ! -z "$pushbot_ipv4" ] && [ "$pushbot_ipv4" -eq "2" ] && local IPv4=`getip hostipv4` + [ ! -z "$pushbot_ipv6" ] && [ "$pushbot_ipv6" -eq "1" ] && local IPv6=`getip wanipv6` + [ ! -z "$pushbot_ipv6" ] && [ "$pushbot_ipv6" -eq "2" ] && local IPv6=`getip hostipv6` + + if [ -f ${dir}ip ]; then + local last_IPv4=$(cat "${dir}ip"|grep IPv4|awk '{print $2}'|grep -v "^$"|sort -u|head -n1) + local last_IPv6=$(cat "${dir}ip"|grep IPv6|awk '{print $2}'|grep -v "^$"|sort -u|head -n1) + if [ ! -z "$pushbot_ipv4" ] && [ "$pushbot_ipv4" -ne "0" ] && [ ! -z "$IPv4" ] && ( ! echo ${IPv4}|grep -w -q ${last_IPv4} ); then + echo "`date "+%Y-%m-%d %H:%M:%S"` ${disturb_text}当前IP:${IPv4}" >> ${logfile} + echo IPv4 $IPv4 > ${dir}ip && echo -e IPv6 $last_IPv6 >> ${dir}ip + title="IP 地址变化" + content="${content}${str_splitline}${str_title_start}${font_green} IP 地址变化${font_end}${str_title_end}${str_linefeed}${str_tab}当前 IP:${IPv4}" + elif [ ! -z "$pushbot_ipv4" ] && [ "$pushbot_ipv4" -ne "0" ] && [ -z "$IPv4" ]; then + echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】获取 IPv4 地址失败" >> ${logfile} + fi + + if [ ! -z "$pushbot_ipv6" ] && [ "$pushbot_ipv6" -ne "0" ] && [ ! -z "$IPv6" ] && ( ! echo "$IPv6"|grep -w -q ${last_IPv6} ); then + echo "`date "+%Y-%m-%d %H:%M:%S"` ${disturb_text}当前IPv6:${IPv6}" >> ${logfile} + echo IPv4 $IPv4 > ${dir}ip && echo -e IPv6 $IPv6 >> ${dir}ip + [ -z "$title" ] && title="IPv6 地址变化" + [ ! -z "$title" ] && title="IP 地址变化" + content="${content}${str_splitline}${str_title_start}${font_green} IPv6 地址变化${font_end}${str_title_end}${str_linefeed}${str_tab}当前 IPv6:${IPv6}" + elif [ ! -z "$pushbot_ipv6" ] && [ "$pushbot_ipv6" -ne "0" ] && [ -z "$IPv6" ]; then + echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】获取 IPv6 地址失败" >> ${logfile} + fi + + else + echo "`date "+%Y-%m-%d %H:%M:%S"` ${disturb_text}路由器已经重启!" >> ${logfile} + [ ! -z "$pushbot_ipv4" ] && [ "$pushbot_ipv4" -ne "0" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 当前IP: ${IPv4}" >> ${logfile} + [ ! -z "$pushbot_ipv6" ] && [ "$pushbot_ipv6" -ne "0" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 当前IPv6: ${IPv6}" >> ${logfile} + echo IPv4 $IPv4 > ${dir}ip && echo -e IPv6 $IPv6 >> ${dir}ip + title="路由器重新启动" + content="${content}${str_splitline}${str_title_start}${font_green} 路由器重新启动${font_end}${str_title_end}" + [ ! -z "$pushbot_ipv4" ] && [ "$pushbot_ipv4" -ne "0" ] && content="${content}${str_linefeed}${str_tab}当前IP:${IPv4}" + [ ! -z "$pushbot_ipv6" ] && [ "$pushbot_ipv6" -ne "0" ] && content="${content}${str_linefeed}${str_tab}当前IPv6:${IPv6}" + fi + + if [ ! -z "$content" ] ;then + [ -z "$ddns_enabled" ] && ddns_enabled=$(uci show ddns|grep "enabled"|grep "1") + [ -z "$ddns_enabled" ] && ddns_logrow=0 || ddns_logrow=$(echo "$ddns_enabled"|wc -l) + if [ $ddns_logrow -ge 1 ]; then + /etc/init.d/ddns restart >/dev/null 2>&1 + fi + [ -z "$zerotier_enabled" ] && zerotier_enabled=$(uci get zerotier.sample_config.enabled) + if [ ! -z "$zerotier_enabled" ] && [ $zerotier_enabled -eq "1" ] ; then + /etc/init.d/zerotier restart >/dev/null 2>&1 + fi + fi +} + +# 检测设备上线 +function up(){ + [ -f ${dir}ipAddress ] && ( cat ${dir}ipAddress|grep -q -w $1 ) && return + local ip_mac=`getmac $1` + local ip_name=`getname ${1} ${ip_mac}` + local ip_interface=`getinterface ${ip_mac}` + getping ${1} ${up_timeout} "1";local ping_online=$? + if [ "$ping_online" -eq "0" ]; then + LockFile lock + [ ! -z "$pushbot_blacklist" ] && local tmp_mac=`echo "${pushbot_blacklist}"|grep -w -i ${ip_mac}` + [ ! -z "$pushbot_whitelist" ] && local tmp_mac=`echo "${pushbot_whitelist}"|grep -w -i ${ip_mac}` + if [ ! -z "$tmp_mac" ] && ( cat ${dir}ipAddress|grep -q -w -i ${tmp_mac} ); then + usage down $1 + echo "$1 ${ip_mac} ${ip_name} `date +%s` ${ip_interface}" >> ${dir}ipAddress + LockFile unlock && return + elif [ ! -z "$tmp_mac" ] && [ -f "${dir}tmp_downlist" ] && ( cat ${dir}tmp_downip|grep -q -w -i ${tmp_mac} ); then + local tmp_downip=`cat ${dir}tmp_downlist|grep -w -i ${tmp_mac}|awk '{print $1}'|grep -v "^$"|sort -u|head -n1` + usage down $tmp_downip + sed -i "/^${tmp_downip} /d" ${dir}tmp_downlist + LockFile unlock && return + fi + [ -f "${dir}tmp_downlist" ] && local tmp_downip=`cat ${dir}tmp_downlist|grep -w ${1}|grep -v "^$"|sort -u|head -n1` + if [ ! -z "$tmp_downip" ]; then + cat ${dir}tmp_downlist|grep -w ${1}|grep -v "^$"|sort -u|head -n1 >> ${dir}ipAddress + sed -i "/^${1} /d" ${dir}tmp_downlist + else + usage down $1 + echo "$1 ${ip_mac} ${ip_name} `date +%s` ${ip_interface}" >> ${dir}ipAddress + blackwhitelist ${ip_mac};local ip_blackwhite=$? + [ -f "${dir}send_enable.lock" ] || [ -z "$pushbot_up" ] || [ -z "$ip_blackwhite" ] && LockFile unlock && return + [ ! -z "$pushbot_up" ] && [ "$pushbot_up" -ne "1" ] && LockFile unlock && return + [ -z "$ip_blackwhite" ] || [ "$ip_blackwhite" -ne "0" ] && LockFile unlock && return + [ -f "${dir}title" ] && local title=`cat ${dir}title` + [ -f "${dir}content" ] && local content=`cat ${dir}content` + if [ -z "$title" ]; then + local title="$ip_name 连接了你的路由器" + local content="${str_splitline}${str_title_start}${font_green} 新设备连接${font_end}${str_title_end}${str_linefeed}${str_tab}客户端名:${str_space}${str_space}${str_space}${str_space}${str_space}${ip_name}${str_linefeed}${str_tab}客户端IP: ${str_space}${str_space}${str_space}${str_space}${1}${str_linefeed}${str_tab}客户端MAC:${str_space}${str_space}${str_space}${str_space}${ip_mac}${str_linefeed}${str_tab}网络接口:${str_space}${str_space}${str_space}${str_space}${str_space}${ip_interface}" + elif ( echo ${title}|grep -q "连接了你的路由器" ); then + local title="${ip_name} ${title}" + local content="${str_splitline}${str_tab}客户端名:${str_space}${str_space}${str_space}${str_space}${str_space}${ip_name}${str_linefeed}${str_tab}客户端IP: ${str_space}${str_space}${str_space}${str_space}${1}${str_linefeed}${str_tab}客户端MAC:${str_space}${str_space}${str_space}${str_space}${ip_mac}${str_linefeed}${str_tab}网络接口:${str_space}${str_space}${str_space}${str_space}${str_space}${ip_interface}" + else + local title="设备状态变化" + local content="${str_splitline}${str_title_start}${font_green} 新设备连接${font_end}${str_title_end}${str_linefeed}${str_tab}客户端名:${str_space}${str_space}${str_space}${str_space}${str_space}${ip_name}${str_linefeed}${str_tab}客户端IP: ${str_space}${str_space}${str_space}${str_space}${1}${str_linefeed}${str_tab}客户端MAC:${str_space}${str_space}${str_space}${str_space}${ip_mac}${str_linefeed}${str_tab}网络接口:${str_space}${str_space}${str_space}${str_space}${str_space}${ip_interface}" + fi + echo "`date "+%Y-%m-%d %H:%M:%S"` ${disturb_text}新设备 ${ip_name} ${1} 连接了">> ${logfile} + #[ ! -z "$pushbot_blacklist" ] && local title="你偷偷关注的设备上线了" + [ ! -z "$title" ] && echo "$title" >${dir}title + [ ! -z "$content" ] && echo -n "$content" >>${dir}content + fi + fi + LockFile unlock +} + +# 检测设备离线 +function down(){ + local ip_mac=`getmac $1` + local ip_name=`getname ${1} ${ip_mac}` + local ip_interface=`getinterface ${ip_mac}` + getping ${1} ${down_timeout} ${timeout_retry_count};local ping_online=$? + if [ "$ping_online" -eq "1" ]; then + LockFile lock + [ ! -f "${dir}send_enable.lock" ] && cat ${dir}ipAddress|grep -w ${1}|grep -v "^$"|sort -u|head -n1 >> ${dir}tmp_downlist + sed -i "/^${1} /d" ${dir}ipAddress + LockFile unlock + else + local tmp_name=`cat ${dir}ipAddress|grep -w ${1}|awk '{print $3}'|grep -v "^$"|sort -u|head -n1` + if [ "$ip_name" != "$tmp_name" ]; then + LockFile lock + local tmp_str=$(echo "$1 ${ip_mac} ${ip_name} `cat ${dir}ipAddress|grep -w ${1}|awk '{print $4}'|grep -v "^$"|sort -u|head -n1` ${ip_interface}") + sed -i "/^${1} /d" ${dir}ipAddress + echo "$tmp_str" >> ${dir}ipAddress + LockFile unlock + fi + fi +} + +# 设备离线通知 +function down_send(){ + [ ! -f "${dir}tmp_downlist" ] && return + local IPLIST=`cat ${dir}tmp_downlist|awk '{print $1}'` + for ip in $IPLIST; do + local ip_mac=`getmac ${ip}` + blackwhitelist ${ip_mac};local ip_blackwhite=$? + [ -z "$pushbot_down" ] || [ -z "$ip_blackwhite" ] && continue + [ ! -z "$pushbot_down" ] && [ "$pushbot_down" -ne "1" ] && continue + [ -z "$ip_blackwhite" ] || [ "$ip_blackwhite" -ne "0" ] && continue + [ ! -z "$pushbot_blacklist" ] && local tmp_mac=`echo "${pushbot_blacklist}"|grep -w -i ${ip_mac}` + [ ! -z "$pushbot_whitelist" ] && local tmp_mac=`echo "${pushbot_whitelist}"|grep -w -i ${ip_mac}` + [ ! -z "$tmp_mac" ] && ( cat ${dir}ipAddress|grep -q -w -i ${tmp_mac} ) && continue + local ip_name=`getname ${ip} ${ip_mac}` + local time_up=`cat ${dir}tmp_downlist|grep -w ${ip}|awk '{print $4}'|grep -v "^$"|sort -u|head -n1` + local ip_total=`usage get $ip_mac` && [ ! -z "$ip_total" ] && local ip_total="${str_linefeed}${str_tab}总计流量: ${str_space}${str_space}${str_space}${str_space}${ip_total}" + local time1=`date +%s` + local time1=$(time_for_humans `expr ${time1} - ${time_up}`) + if [ -z "$title" ]; then + title="${ip_name} 断开连接" + content="${content}${str_splitline}${str_title_start}${font_red} 设备断开连接${font_end}${str_title_end}${str_linefeed}${str_tab}客户端名:${str_space}${str_space}${str_space}${str_space}${str_space}${ip_name}${str_linefeed}${str_tab}客户端IP: ${str_space}${str_space}${str_space}${str_space}${ip}${str_linefeed}${str_tab}客户端MAC:${str_space}${str_space}${str_space}${str_space}${ip_mac}$ip_total${str_linefeed}${str_tab}在线时间: ${str_space}${str_space}${str_space}${str_space}${time1}" + elif ( echo "$title"|grep -q "断开连接" ); then + title="${ip_name} ${title}" + content="${content}${str_splitline}${str_tab}客户端名:${str_space}${str_space}${str_space}${str_space}${str_space}${ip_name}${str_linefeed}${str_tab}客户端IP: ${str_space}${str_space}${str_space}${str_space}${ip}${str_linefeed}${str_tab}客户端MAC:${str_space}${str_space}${str_space}${str_space}${ip_mac}$ip_total${str_linefeed}${str_tab}在线时间: ${str_space}${str_space}${str_space}${str_space}${time1}" + else + title="设备状态变化" + content="${content}${str_splitline}${str_title_start}${font_red} 设备断开连接${font_end}${str_title_end}${str_linefeed}${str_tab}客户端名:${str_space}${str_space}${str_space}${str_space}${str_space}${ip_name}${str_linefeed}${str_tab}客户端IP: ${str_space}${str_space}${str_space}${str_space}${ip}${str_linefeed}${str_tab}客户端MAC:${str_space}${str_space}${str_space}${str_space}${ip_mac}$ip_total${str_linefeed}${str_tab}在线时间: ${str_space}${str_space}${str_space}${str_space}${time1}" + fi + echo "`date "+%Y-%m-%d %H:%M:%S"` ${disturb_text}设备 ${ip_name} ${ip} 断开连接 " >> ${logfile} + done + rm -f ${dir}tmp_downlist >/dev/null 2>&1 +} + +# 当前设备列表 +function current_device(){ + ( echo "$lite_enable"|grep -q "content" ) || ( echo "$lite_enable"|grep -q "device" ) && return + [ -f ${dir}ipAddress ] && local logrow=$(grep -c "" ${dir}ipAddress) || local logrow="0";[ $logrow -eq "0" ] && return + [ -f ${dir}usage.db ] && local ip_total_db="总计流量${str_space}${str_space}${str_space}${str_space}" + content="${content}${str_splitline}${str_title_start}${font_blue} 现有在线设备 ${logrow} 台,具体如下${font_end}${str_title_end}${str_linefeed}${str_tab}IP 地址${str_space}${str_space}${str_space}${str_space}${str_space}${str_space}${str_space}${str_space}${str_space}${ip_total_db}${boldstar}客户端名${boldstar}" + local IPLIST=`cat ${dir}ipAddress|awk '{print $1}'` + for ip in $IPLIST; do + local ip_mac=`getmac ${ip}` + local ip_total=`usage get ${ip_mac}` + local ip_name=`getname ${ip} ${ip_mac}` + local ip_name=`cut_str $ip_name 15` + if [ "${#ip}" -lt "15" ]; then + local n=`expr 15 - ${#ip}` + for i in `seq 1 $n`; do + local ip="${ip}${str_space}" + done + unset i n + fi + if [ ! -z "$ip_total" ]; then + local n=`expr 11 - ${#ip_total}` + for i in `seq 1 $n`; do + local ip_total="${ip_total}${str_space}" + done + fi + content="${content}${str_linefeed}${str_tab}${ip}${ip_total}${boldstar}${font_green2}${ip_name}${font_end2}${boldstar}" + unset i n ip_total ip_mac ip_name + done +} + +# 检测 cpu 状态 +function cpu_load(){ + if [ ! -z "$temperature_enable" ] && [ "$temperature_enable" -eq "1" ] && [ ! -z "$temperature" ]; then + [ -z "$temperature_time" ] && temperature_time=`date +%s` + local cpu_wendu=`soc_temp`; + [ -z "$cpu_wendu" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】无法读取设备温度,请检查命令" >> ${logfile} + + if [ `expr $cpu_wendu \> $temperature` -eq "1" ]; then + echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!警报!!】 CPU 温度过高: ${cpu_wendu}" >> ${logfile} + else + temperature_time=`date +%s` + fi + + if [ "$((`date +%s`-$temperature_time))" -ge "300" ] && [ -z "$temperaturecd_time" ]; then + title="CPU 温度过高!" + temperaturecd_time=`date +%s` + echo "`date "+%Y-%m-%d %H:%M:%S"` ${disturb_text} CPU 温度过高: ${cpu_wendu}" >> ${logfile} + content="${content}${str_splitline}${str_title_start}${font_red} CPU 温度过高${font_end}${str_title_end}${str_linefeed}${str_tab}CPU 温度已连续五分钟超过预设${str_linefeed}${str_tab}接下来一小时不再提示${str_linefeed}${str_tab}当前温度:${cpu_wendu}℃" + elif [ ! -z "$temperaturecd_time" ] && [ "$((`date +%s`-$temperaturecd_time))" -ge "3300" ] ;then + unset temperaturecd_time + fi + fi + + if [ ! -z "$cpuload_enable" ] && [ "$cpuload_enable" -eq "1" ] && [ ! -z "$cpuload" ]; then + [ -z "$cpuload_time" ] && cpuload_time=`date +%s` + local cpu_fuzai=`cat /proc/loadavg|awk '{print $1}'` 2>/dev/null + [ -z "$cpu_fuzai" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】无法读取设备负载,请检查命令" >> ${logfile} + + if [ `expr $cpu_fuzai \> $cpuload` -eq "1" ]; then + echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!警报!!】 CPU 负载过高: ${cpu_fuzai}" >> ${logfile} + cputop log + else + cpuload_time=`date +%s` + fi + + if [ "$((`date +%s`-$cpuload_time))" -ge "300" ] && [ -z "$cpucd_time" ]; then + unset getlogtop + if [ ! -z "$title" ] && ( echo "$title"|grep -q "过高" ); then + title="设备报警!" + else + title="CPU 负载过高!" + fi + cpucd_time=`date +%s` + echo "`date "+%Y-%m-%d %H:%M:%S"` ${disturb_text} CPU 负 载过高: ${cpu_fuzai}" >> ${logfile} + content="${content}${str_splitline}${font_red}CPU 负载过高${font_end}${str_linefeed}${str_tab}CPU 负载已连续五分钟超过预设${str_linefeed}${str_tab}接下来一小时不再提示${str_linefeed}${str_tab}当前负载:${cpu_fuzai}" + cputop + elif [ ! -z "$cpucd_time" ] && [ "$((`date +%s`-$cpucd_time))" -ge "3300" ] ;then + unset cpucd_time + fi + fi +} + +function cputop(){ + [ -z "$1" ] && content="${content}${str_splitline}${str_title_start} 当前 CPU 占用前三的进程${str_title_end}" + local gettop=`top -bn 1|grep -v "top -bn 1"` + for i in `seq 5 7`; do + local top_name=`echo "${gettop}"|awk 'NR=='${i}|awk '{print ($8 ~ /\/bin\/sh|\/bin\/bash/) ? $9 : $8}'` + local top_load=`echo "${gettop}"|awk 'NR=='${i}|awk '{print $7}'` + local temp_top="${top_name} ${top_load}" + [ ! -z "$1" ] && local logtop="$logtop $temp_top" + [ -z "$1" ] && content="${content}${str_linefeed}${str_tab}${temp_top}" + done + unset i + [ ! -z "$1" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!警报!!】 CPU 占用前三: ${logtop}" >> ${logfile} +} + +# 生成日志监控文件,避免后台影响 wait 语句 +function get_syslog(){ + kill -9 `pgrep -f "logread -f -p notice"` 2>/dev/null + [ -z "$web_logged" ] && [ -z "$ssh_logged" ] && [ -z "$web_login_failed" ] && [ -z "$ssh_login_failed" ] && return + rm -f ${dir}login_monitor >/dev/null 2>&1 + +cat>${dir}get_syslog<> ${dir}login_monitor & +EOF + chmod 0755 ${dir}get_syslog && ${dir}get_syslog + rm -f ${dir}get_syslog >/dev/null 2>&1 +} + +# 登录提醒通知 +function login_send(){ + [ -z "$web_logged" ] && [ -z "$ssh_logged" ] && [ -z "$web_login_failed" ] && [ -z "$ssh_login_failed" ] && return + [ ! -f ${dir}login_monitor ] && return + cat ${dir}login_monitor|grep -i "accepted login"|awk '{print $4" "$NF}' >> ${dir}web_login + cat ${dir}login_monitor|grep -i "Password auth succeeded\|Pubkey auth succeeded"|grep -Eo "[0-9]{2}:[0-9]{2}:[0-9]{2}.*[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"|awk '{print $1" "$NF" "$5}' >> ${dir}ssh_login + cat ${dir}login_monitor|grep -i "failed login"|grep -Eo "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" >> ${dir}web_failed + cat ${dir}login_monitor|grep -i "Bad password attempt\|Login attempt for nonexistent user from"|grep -Eo "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" >> ${dir}ssh_failed + echo "" > ${dir}login_monitor + add_ip_black + + local login_ip_list=`cat ${dir}web_login|awk '{print $2}'|grep -v "^$"|sort -u|head -n1` + for login_ip in $login_ip_list; do + [ -z "$login_ip" ] && continue + echo "$ip_white_list"|grep -w -q "$login_ip" && continue + local web_login_time=`cat ${dir}web_login|grep -w ${login_ip}|awk '{print $1}'|grep -v "^$"|sort -u|head -n1` + local web_login_mode=`cat ${dir}web_login|grep -w ${login_ip}|awk '{print $3}'|grep -v "^$"|sort -u|head -n1` + if [ ! -z "$web_logged" ] && [ "$web_logged" -eq "1" ]; then + if [ -z "$title" ]; then + title="${login_ip} 通过 Web 登录了路由器" + content="${content}${str_splitline}${str_title_start}${font_green} 登录信息${font_end}${str_title_end}${str_linefeed}${str_tab}时间:${str_space}${str_space}${str_space}${str_space}${str_space}${web_login_time}${str_linefeed}${str_tab}设备 IP: ${str_space}${str_space}${str_space}${str_space}${login_ip}${content_mode}" + elif ( echo "$title"|grep -q "登录了路由器" ); then + title="${login_ip} ${title}" + content="${content}${str_splitline}${str_tab}时间:${str_space}${str_space}${str_space}${str_space}${str_space}${web_login_time}${str_linefeed}${str_tab}设备 IP: ${str_space}${str_space}${str_space}${str_space}${login_ip}${content_mode}" + else + title="设备状态变化" + content="${content}${str_splitline}${str_title_start}${font_green} 登录成功来源${font_end}${str_title_end}${str_linefeed}${str_tab}时间:${str_space}${str_space}${str_space}${str_space}${str_space}${web_login_time}${str_linefeed}${str_tab}设备 IP: ${str_space}${str_space}${str_space}${str_space}${login_ip}${content_mode}" + fi + fi + echo "`date "+%Y-%m-%d %H:%M:%S"` ${disturb_text}设备 ${login_ip} 通过 web ${web_login_mode} 登录了路由器 " >> ${logfile} + done + echo "" > ${dir}web_login + unset login_ip login_ip_list + + local login_ip_list=`cat ${dir}ssh_login|awk '{print $2}'|grep -v "^$"|sort -u|head -n1` + for login_ip in $login_ip_list; do + [ -z "$login_ip" ] && continue + echo "$ip_white_list"|grep -w -q "$login_ip" && continue + local ssh_login_time=`cat ${dir}ssh_login|grep -w ${login_ip}|awk '{print $1}'|grep -v "^$"|sort -u|head -n1` + local ssh_login_mode=`cat ${dir}ssh_login|grep -w ${login_ip}|awk '{print $3}'|grep -v "^$"|sort -u|head -n1` + [ ! -z "$ssh_login_mode" ] && local content_mode="${str_linefeed}${str_tab}登录方式: ${str_space}${str_space}${str_space}${str_space}${ssh_login_mode}" + if [ ! -z "$ssh_logged" ] && [ "$ssh_logged" -eq "1" ]; then + if [ -z "$title" ]; then + title="${login_ip} 通过 SSH 登录了路由器" + content="${content}${str_splitline}${str_title_start}${font_green} 登录成功来源${font_end}${str_title_end}${str_linefeed}${str_tab}时间:${str_space}${str_space}${str_space}${str_space}${str_space}${ssh_login_time}${str_linefeed}${str_tab}设备 IP: ${str_space}${str_space}${str_space}${str_space}${login_ip}${content_mode}" + elif ( echo "$title"|grep -q "登录了路由器" ); then + title="${login_ip} ${title}" + content="${content}${str_splitline}${str_tab}时间:${str_space}${str_space}${str_space}${str_space}${str_space}${ssh_login_time}${str_linefeed}${str_tab}设备 IP: ${str_space}${str_space}${str_space}${str_space}${login_ip}${content_mode}" + else + title="设备状态变化" + content="${content}${str_splitline}${str_title_start}${font_green} 登录成功来源${str_title_end}${str_linefeed}${str_tab}时间:${str_space}${str_space}${str_space}${str_space}${str_space}${ssh_login_time}${str_linefeed}${str_tab}设备 IP: ${str_space}${str_space}${str_space}${str_space}${login_ip}${content_mode}" + fi + fi + echo "`date "+%Y-%m-%d %H:%M:%S"` 【info】设备 ${login_ip} 通过 SSH ${ssh_login_mode} 登录了路由器 " >> ${logfile} + done + echo "" > ${dir}ssh_login + unset login_ip login_ip_list + + local login_ip_list=`cat ${dir}web_failed|awk '{print $1}'|grep -v "^$"|sort -u|head -n1` + for login_ip in $login_ip_list; do + [ -z "$login_ip" ] && continue + echo "$ip_white_list"|grep -w -q "$login_ip" && continue + local web_login_sum=`cat ${dir}web_failed|grep -w "${login_ip}"|wc -l` + if [ "$web_login_sum" -ge "$login_max_num" ] ;then + if [ ! -z "$web_login_failed" ] && [ "$web_login_failed" -eq "1" ]; then + if [ -z "$title" ]; then + title="${login_ip} 通过 Web 频繁尝试登录" + content="${content}${str_splitline}${str_title_start}${font_red} 登录失败来源${font_end}${str_title_end}${str_linefeed}${str_tab}设备 IP: ${str_space}${str_space}${str_space}${str_space}${login_ip}" + elif ( echo "$title"|grep -q "频繁尝试登录" ); then + title="${login_ip} ${title}" + content="${content}${str_splitline}${str_tab}设备 IP: ${str_space}${str_space}${str_space}${str_space}${login_ip}" + else + title="设备状态变化" + content="${content}${str_splitline}${str_title_start}${font_red} 登录失败来源${font_end}${str_title_end}${str_linefeed}${str_tab}设备 IP: ${str_space}${str_space}${str_space}${str_space}${login_ip}" + fi + fi + sed -i "/^${login_ip}$/d" ${dir}web_failed + echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】设备 ${login_ip} 通过 Web 频繁尝试登录" >> ${logfile} + add_ip_black $login_ip + fi + done + unset login_ip + + local login_ip_list=`cat ${dir}ssh_failed|awk '{print $1}'|grep -v "^$"|sort -u|head -n1` + for login_ip in $login_ip_list; do + [ -z "$login_ip" ] && continue + echo "$ip_white_list"|grep -w -q "$login_ip" && continue + local ssh_login_sum=`cat ${dir}ssh_failed|grep -w "${login_ip}"|wc -l` + if [ "$ssh_login_sum" -ge "$login_max_num" ] ;then + if [ ! -z "$ssh_login_failed" ] && [ "$ssh_login_failed" -eq "1" ]; then + if [ -z "$title" ]; then + title="${login_ip} 通过 SSH 频繁尝试登录" + content="${content}${str_splitline}${str_title_start}${font_red} 登录失败来源${font_end}${str_title_end}${str_linefeed}${str_tab}设备 IP: ${str_space}${str_space}${str_space}${str_space}${login_ip}" + elif ( echo "$title"|grep -q "频繁尝试登录" ); then + title="${login_ip} ${title}" + content="${content}${str_splitline}${str_tab}设备 IP: ${str_space}${str_space}${str_space}${str_space}${login_ip}" + else + title="设备状态变化" + content="${content}${str_splitline}${str_title_start}${font_red} 登录失败来源${font_end}${str_title_end}${str_linefeed}${str_tab}设备 IP: ${str_space}${str_space}${str_space}${str_space}${login_ip}" + fi + fi + sed -i "/^${login_ip}$/d" ${dir}ssh_failed + echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】设备 ${login_ip} 通过 SSH 频繁尝试登录" >> ${logfile} + add_ip_black $login_ip + fi + done + unset login_ip + +} + +# 添加黑名单 +function add_ip_black(){ + [ -f "${ip_blacklist_path}" ] && local logrow=$(grep -c "" ${ip_blacklist_path}) || local logrow="0" + [ ! -f "${ip_blacklist_path}" ] && local logrow="0" + [ ! -z "$web_login_black" ] && [ "$web_login_black" -eq "0" ] || [ -z "$web_login_black" ] && local logrow="0" + ipset flush ip_blacklist >/dev/null 2>&1 + + if [ $logrow -le "0" ]; then + iptables -D INPUT -m set --match-set ip_blacklist src -j DROP >/dev/null 2>&1 + ipset destroy ip_blacklist >/dev/null 2>&1 + return + fi + + ipset list ip_blacklist >/dev/null 2>&1 || ipset create ip_blacklist hash:ip timeout ${ip_black_timeout} >/dev/null 2>&1 + iptables -C INPUT -m set --match-set ip_blacklist src -j DROP >/dev/null 2>&1 || iptables -I INPUT -m set --match-set ip_blacklist src -j DROP >/dev/null 2>&1 + echo "$1" >> ${ip_blacklist_path} + for ip_black in `cat ${ip_blacklist_path}`; do + ip_black=`echo "$ip_black"|grep -Eo "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"` + ipset -! add ip_blacklist $ip_black >/dev/null 2>&1 + done + ipset list ip_blacklist|grep -Eo "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" > ${ip_blacklist_path} +} + +# 发送定时数据 +function send(){ + echo "`date "+%Y-%m-%d %H:%M:%S"` 【定时数据】创建定时任务" >> ${logfile} + pushbot_disturb;local send_disturb=$? + get_config "send_title" "router_status" "router_temp" "router_wan" "client_list" "google_check_timeout" + + [ -z "$send_title" ] && local send_title="路由状态:" + [ -z "$google_check_timeout" ] && local google_check_timeout="10" + [ ! -z "$1" ] && local send_title="发送测试:" && local send_content="${str_splitline}${str_title_start}内容1${str_title_end}${str_linefeed}${str_tab}设备1${str_linefeed}${str_tab}设备2${str_splitline}${str_title_start}内容2${str_title_end}${str_linefeed}${str_tab}设备3${str_linefeed}${str_tab}设备4" + [ -z "$1" ] && [ ! -z "$client_list" ] && [ "$client_list" -eq "1" ] && > ${dir}send_enable.lock && pushbot_first & + + if [ -z "$1" ] && [ ! -z "$router_status" ] && [ "$router_status" -eq "1" ]; then + local systemload=`cat /proc/loadavg|awk '{print $1" "$2" "$3}'` + local cpuload=`getcpu` + local ramload=`free -m|sed -n '2p'|awk '{printf "%.2f%%\n",($3/$2)*100}'` + local Qwai=`curl -o /dev/null --connect-timeout ${google_check_timeout} -s -w %{http_code} www.google.com` + if [[ "$Qwai" -eq "200" ]] || [[ "$Qwai" -eq "301" ]] || [[ "$Qwai" -eq "302" ]]; then + local Qwai_status="已连通!" + else + local Qwai_status="已断开!" + fi + local systemstatustime=`cat /proc/uptime|awk -F. '{run_days=$1 / 86400;run_hour=($1 % 86400)/3600;run_minute=($1 % 3600)/60;run_second=$1 % 60;printf("运行时间:%d天%d时%d分%d秒",run_days,run_hour,run_minute,run_second)}'`;unset run_days run_hour run_minute run_second + local send_content="${send_content}${str_splitline}${str_title_start}${font_blue} 系统运行状态${font_end}${str_title_end}" + local send_content="${send_content}${str_linefeed}${str_tab}平均负载:${systemload}" + local send_content="${send_content}${str_linefeed}${str_tab}CPU占用:${cpuload}${percentsym}" + local send_content="${send_content}${str_linefeed}${str_tab}内存占用:${ramload}${percentsym}" + local send_content="${send_content}${str_linefeed}${str_tab}全球互联:${Qwai_status}" + local send_content="${send_content}${str_linefeed}${str_tab}${systemstatustime}" + fi + + if [ -z "$1" ] && [ ! -z "$router_temp" ] && [ "$router_temp" -eq "1" ]; then + local cputemp=`soc_temp` + [ ! -z "$cputemp" ] && local send_content="${send_content}${str_splitline}${str_title_start}${font_blue} 设备温度${font_end}${str_title_end}${str_linefeed}${str_tab}CPU:${cputemp}℃" + [ -z "$cputemp" ] && local send_content="${send_content}${str_splitline}${str_title_start}${font_red} 设备温度${font_end}${str_title_end}${str_linefeed}${str_tab}无法获取设备温度" + fi + + if [ -z "$1" ] && [ ! -z "$router_wan" ] && [ "$router_wan" -eq "1" ]; then + local send_wanIP=`getip wanipv4`;local send_hostIP=`getip hostipv4` + local send_content="${send_content}${str_splitline}${str_title_start}${font_blue} WAN 口信息${font_end}${str_title_end}${str_linefeed}${str_tab}接口ip:${send_wanIP}" + local send_content="${send_content}${str_linefeed}${str_tab}外网ip:${send_hostIP}" + if [ ! -z "$pushbot_ipv6" ] && [ "$pushbot_ipv6" -ne "0" ]; then + local send_wanIPv6=`getip wanipv6`;local send_hostIPv6=`getip hostipv6` + local send_content="${send_content}${str_linefeed}${str_tab}ipv6 :${send_wanIPv6}" + local send_content="${send_content}${str_linefeed}${str_tab}外网v6:${send_hostIPv6}" + fi + ( ! echo "$send_wanIP"|grep -q -w ${send_hostIP} ) && local send_content="${send_content}${str_linefeed}${str_tab}外网 ip 与接口 ip 不一致,你的 ip 不是公网 ip" + local interfaceuptime=`getinterfaceuptime` + [ ! -z "$interfaceuptime" ] && local wanstatustime=`getinterfaceuptime|awk -F. '{run_days=$1 / 86400;run_hour=($1 % 86400)/3600;run_minute=($1 % 3600)/60;run_second=$1 % 60;printf("在线时间:%d天%d时%d分%d秒",run_days,run_hour,run_minute,run_second)}'` && unset run_days run_hour run_minute run_second + local send_content="${send_content}${str_linefeed}${str_tab}${wanstatustime}" + fi + + if [ -z "$1" ] && [ ! -z "$client_list" ] && [ "$client_list" -eq "1" ]; then + wait + local IPLIST=`cat ${dir}ipAddress 2>/dev/null|awk '{print $1}'` + [ -f ${dir}ipAddress ] && local logrow=$(grep -c "" ${dir}ipAddress) || local logrow="0" + [ "$logrow" -eq "0" ] && local send_content="${send_content}${str_splitline}${str_title_start}${font_red} 当前无在线设备${font_end}${str_title_end}" || local send_content="${send_content}${str_splitline}${str_title_start}${font_blue} 现有在线设备 ${logrow} 台${font_end}${str_title_end}" + for ip in $IPLIST; do + local time_up=`cat ${dir}ipAddress|grep -w ${ip}|awk '{print $4}'|grep -v "^$"|sort -u|head -n1` + local time1=`date +%s` + local time1=$(time_for_humans `expr ${time1} - ${time_up}`) + local ip_mac=`getmac ${ip}` + local ip_name=`getname ${ip} ${ip_mac}` + local ip_total=`usage get ${ip_mac}`;[ ! -z "$ip_total" ] && local ip_total="总计流量:${ip_total} " + local ip_name=`cut_str $ip_name 18` + local send_content="${send_content}${str_linefeed}${str_tab}${font_green2}【${ip_name}】${font_end2} ${ip}${str_linefeed}${str_tab}${ip_total}在线 ${time1}" + unset ip_total time_down time_up time1 ip_mac ip_name + done + fi + + [ ! -z "$device_name" ] && local send_title="【$device_name】${send_title}" + [ -z "$send_content" ] && local send_content="${str_splitline}${str_title_start} 我遇到了一个难题${str_title_end}${str_linefeed}${str_tab}定时发送选项错误,你没有选择需要发送的项目,该怎么办呢${str_splitline}" + [ "$send_disturb" -eq "0" ] && diy_send "${send_title}" "${send_content}" "${jsonpath}" >/dev/null 2>&1 + [ $? -eq 1 ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】定时推送失败,请检查网络或设置信息" >> ${logfile} || echo "`date "+%Y-%m-%d %H:%M:%S"` ${disturb_text}定时推送任务完成" >> ${logfile} + deltemp +} + +# 初始化 +read_config +deltemp +pushbot_cron + +# 限制并发进程 +[ -z "$thread_num" ] || [ "$thread_num" -eq "0" ] && thread_num=5 +[ -e ${dir}fd1 ] || mkfifo ${dir}fd1 +exec 5<>${dir}fd1 +rm -f ${dir}fd1 >/dev/null 2>&1 +for i in `seq 1 $thread_num`; do + echo >&5 +done +unset i + +# 启动参数 +if [ "$1" ] ;then + [ $1 == "send" ] && send + [ $1 == "soc" ] && echo `soc_temp` > ${dir}soc_tmp + [ $1 == "client" ] && get_client + [ $1 == "test" ] && send test + exit +fi + +# 载入在线设备 +pushbot_init;[ $? -eq 1 ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】读取设置出错,请检查设置项 " >> ${logfile} && exit +echo "`date "+%Y-%m-%d %H:%M:%S"` 【初始化】载入在线设备" >> ${logfile} +> ${dir}send_enable.lock && pushbot_first && deltemp +echo "`date "+%Y-%m-%d %H:%M:%S"` 【初始化】初始化完成" >> ${logfile} + +# 循环 +while [ "$pushbot_enable" -eq "1" ]; do + deltemp + usage update + pushbot_disturb;disturb=$? + + # 外网IP变化检测 + [ -f ${dir}ipAddress ] && ipAddress_logrow=$(grep -c "" ${dir}ipAddress) || ipAddress_logrow="0"; + if [ $ipAddress_logrow -ne "0" ]; then + online_list=`cat ${dir}ipAddress|awk '{print $2}'|grep -v "^$"|sort -u` + for online_mac in $online_list; do + [ ! -z "$online_mac" ] && mac_online_status="`echo "$mark_mac_list"|grep -i $online_mac|grep -v "^$"|sort -u|head -n1`${mac_online_status}" + done + fi + + if [ "$pushbot_ipv4" -ne "0" ] || [ "$pushbot_ipv6" -ne "0" ]; then + rand_geturl + ip_changes + fi + + # 设备列表 + if [ ! -f "${dir}send_enable.lock" ]; then + [ ! -z "$title" ] && echo "$title" > ${dir}title + [ ! -z "$content" ] && echo "$content" > ${dir}content + pushbot_first + [ -f "${dir}title" ] && title=`cat ${dir}title` && rm -f ${dir}title >/dev/null 2>&1 + [ -f "${dir}content" ] && content=`cat ${dir}content` && rm -f ${dir}content >/dev/null 2>&1 + fi + + # 离线缓存区推送 + [ ! -f "${dir}send_enable.lock" ] && down_send + + # 当前设备列表 + [ ! -z "$content" ] && [ ! -f "${dir}send_enable.lock" ] && current_device + + # 无人值守任务 + [ ! -f "${dir}send_enable.lock" ] && unattended + + # CPU 检测 + [ ! -f "${dir}send_enable.lock" ] && cpu_load + + # 异常流量检测 + [ ! -f "${dir}send_enable.lock" ] && get_client_usage + + # 登录提醒通知 + [ ! -f "${dir}send_enable.lock" ] && login_send + + # 通知 + if [ ! -f "${dir}send_enable.lock" ] && [ ! -z "$title" ] && [ ! -z "$content" ]; then + [ ! -z "$device_name" ] && title="【$device_name】$title" + ( echo "$lite_enable"|grep -q "content" ) && content="$title" + [ "$disturb" -eq "0" ] && diy_send "${title}" "${content}" "${jsonpath}" >/dev/null 2>&1 + [ $? -eq 1 ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】推送失败,请检查网络或设置信息 " >> ${logfile} + fi + + while [ -f "${dir}send_enable.lock" ]; do + sleep $sleeptime + done + sleep $sleeptime +done diff --git a/luci-app-pushbot/root/usr/share/rpcd/acl.d/luci-app-pushbot.json b/luci-app-pushbot/root/usr/share/rpcd/acl.d/luci-app-pushbot.json new file mode 100644 index 00000000..473cdcd1 --- /dev/null +++ b/luci-app-pushbot/root/usr/share/rpcd/acl.d/luci-app-pushbot.json @@ -0,0 +1,11 @@ +{ + "luci-app-pushbot": { + "description": "Grant UCI access for luci-app-pushbot", + "read": { + "uci": [ "pushbot" ] + }, + "write": { + "uci": [ "pushbot" ] + } + } +} diff --git a/luci-app-rebootschedule b/luci-app-rebootschedule deleted file mode 160000 index 0fc3fef5..00000000 --- a/luci-app-rebootschedule +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 0fc3fef5006ea0843d0a7c77201833584de62b29 diff --git a/luci-app-rebootschedule/Makefile b/luci-app-rebootschedule/Makefile new file mode 100644 index 00000000..87500882 --- /dev/null +++ b/luci-app-rebootschedule/Makefile @@ -0,0 +1,46 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=luci-app-rebootschedule +PKG_VERSION:=1.0 +PKG_RELEASE:=20210522 + +include $(INCLUDE_DIR)/package.mk + +define Package/$(PKG_NAME) + SECTION:=luci + CATEGORY:=LuCI + SUBMENU:=3. Applications + TITLE:=LuCI support for rebootschedule + PKGARCH:=all +endef + +define Package/$(PKG_NAME)/description + LuCI support for rebootschedule +endef + +define Build/Compile +endef + + +define Package/$(PKG_NAME)/postinst +#!/bin/sh +rm -f /tmp/luci-indexcache /tmp/luci-modulecache +endef + +define Package/$(PKG_NAME)/conffiles +/etc/config/rebootschedule +endef + +define Package/$(PKG_NAME)/install + $(INSTALL_DIR) $(1)/usr/bin $(1)/etc/init.d $(1)/etc/config $(1)/usr/lib/lua/luci + $(CP) ./luasrc/* $(1)/usr/lib/lua/luci + $(INSTALL_CONF) ./root/etc/config/* $(1)/etc/config + $(INSTALL_BIN) ./root/etc/init.d/* $(1)/etc/init.d + $(INSTALL_BIN) ./file/* $(1)/usr/bin + +endef + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature + diff --git a/luci-app-rebootschedule/README.md b/luci-app-rebootschedule/README.md new file mode 100644 index 00000000..be35f7f4 --- /dev/null +++ b/luci-app-rebootschedule/README.md @@ -0,0 +1 @@ +# luci-app-rebootschedule diff --git a/luci-app-rebootschedule/file/sysfree.sh b/luci-app-rebootschedule/file/sysfree.sh new file mode 100644 index 00000000..1c7cd2a3 --- /dev/null +++ b/luci-app-rebootschedule/file/sysfree.sh @@ -0,0 +1,19 @@ +#!/bin/sh + +cd /overlay +rm -rf `ls | egrep -v '(upper|.fs_state)'` +cd /overlay/upper +rm -rf `ls | egrep -v '(etc|usr)'` +cd /overlay/upper/usr +rm -rf `ls | egrep -v '(share)'` +cd /overlay/upper/usr/share +rm -rf `ls | egrep -v '(unblockneteasemusic|passwall)'` +cd /overlay/upper/etc +rm -rf `ls | egrep -v '(config|smartdns|ssrplus|bench.log|shadow|openclash|rebootschedule)'` +cd /overlay/upper/etc/config +rm -rf `ls | egrep -v '(timecontrol|arpbind|ksmbd|access_control|netspeedtest|rebootschedule|wrtbwmon|ddns|wolplus|advanced|firewall|jd-dailybonus|network|oled|openclash|passwall|serverchan|shadowsocksr|sqm|unblockneteasemusic|weburl|zerotier|vssr|zero|dhcp)'` +rm -f /tmp/luci* +rm -f /tmp/cache/* +sync && echo 3 > /proc/sys/vm/drop_caches + + \ No newline at end of file diff --git a/luci-app-rebootschedule/luasrc/controller/rebootschedule.lua b/luci-app-rebootschedule/luasrc/controller/rebootschedule.lua new file mode 100644 index 00000000..7f76d74f --- /dev/null +++ b/luci-app-rebootschedule/luasrc/controller/rebootschedule.lua @@ -0,0 +1,12 @@ +module("luci.controller.rebootschedule", package.seeall) +function index() + if not nixio.fs.access("/etc/config/rebootschedule") then + return + end + + + entry({"admin", "system", "rebootschedule"}, cbi("rebootschedule"), _("定时任务"), 20).dependent = true +end + + + diff --git a/luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua b/luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua new file mode 100644 index 00000000..84cac6e9 --- /dev/null +++ b/luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua @@ -0,0 +1,67 @@ +m=Map("rebootschedule",translate("定时任务设置"), +translate("让计划任务更加易用的插件,可以使用-表示连续的时间范围,使用,表示不连续的多个时间点,使用*/表示循环执行。可以使用“添加”来添加多条计划任务命令。可使用“--自定义--”来自行添加其它参数。
") .. +translate("*所有时间参数都是指该自然单位中的时间点,而非累积计数,比如星期只能是0~6,小时只能是0~23,分钟只能是0~59,不能使用48小时、80分钟这种累积计数表示法。
") .. +translate("* 所有数值可使用 - 连接表示连续范围,比如星期:1-5 表示星期一至星期五;使用,表示不连续的点,比如星期:1,3,5 表示仅仅星期一、三、五。") .. +translate("   ") +) + +s=m:section(TypedSection,"crontab","") +s.anonymous = true +s.addremove = true +s.sortable = false +s.template = "cbi/tblsection" +s.rmempty = false + +p=s:option(Flag,"enable",translate("启用")) +p.rmempty = false +p.default=0 + + +week=s:option(Value,"week",translate("星期 (数值范围0~6)"), +translate("和日期是逻辑“与”关系
n1-n5连续,n1,n3,n5不连续
")) +week.rmempty = true +week:value('*',translate("每天")) +week:value(0,translate("Sunday")) +week:value(1,translate("Monday")) +week:value(2,translate("Tuesday")) +week:value(3,translate("Wednesday")) +week:value(4,translate("Thursday")) +week:value(5,translate("Friday")) +week:value(6,translate("Saturday")) +week.default='*' + + +hour=s:option(Value,"hour",translate("时 (数值范围0~23)"), +translate("*表示每小时,*/n表示每n小时
n1-n5连续,n1,n3,n5不连续
")) +hour.rmempty = false +hour.default = '5' + +minute=s:option(Value,"minute",translate("分 (数值范围0~59)"), +translate("*表示每分钟,*/n表示每n分钟
n1-n5连续,n1,n3,n5不连续
")) +minute.rmempty = false +minute.default = '0' + +command=s:option(Value,"command",translate("执行命令 (多条用 && 连接)"), +translate("按“--自定义--”可进行修改
(亦可添加后到计划任务中修改)
")) +command:value('sync && echo 3 > /proc/sys/vm/drop_caches', translate("A.释放内存")) +command:value('sysfree.sh',translate("B.清理垃圾")) +command:value('sleep 5 && touch /etc/banner && reboot',translate("C.重启系统")) +command:value('poweroff',translate("D.关闭电源")) +command:value('/etc/init.d/ksmdb restart &&/etc/init.d/samba restart',translate("E.重启共享")) +command:value('/etc/init.d/network restart',translate("F.重启网络")) +command:value('ifdown wan && ifup wan',translate("G.重启WAN")) +command:value('killall -q pppd && sleep 5 && pppd file /tmp/ppp/options.wan', translate("H.重新拨号")) +command:value('ifdown wan',translate("I.关闭联网")) +command:value('ifup wan',translate("J.打开联网")) +command:value('wifi down',translate("K.关闭WIFI")) +command:value('wifi up',translate("L.打开WIFI")) +command.default='sleep 5 && touch /etc/banner && reboot' + +local e=luci.http.formvalue("cbi.apply") +if e then + io.popen("/etc/init.d/rebootschedule restart") +end + +return m diff --git a/luci-app-rebootschedule/po/en/rebootschedule.mo b/luci-app-rebootschedule/po/en/rebootschedule.mo new file mode 100644 index 00000000..0ccffe1b Binary files /dev/null and b/luci-app-rebootschedule/po/en/rebootschedule.mo differ diff --git a/luci-app-rebootschedule/po/en/rebootschedule.po b/luci-app-rebootschedule/po/en/rebootschedule.po new file mode 100644 index 00000000..6c7eb9fd --- /dev/null +++ b/luci-app-rebootschedule/po/en/rebootschedule.po @@ -0,0 +1,195 @@ +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.0\n" +"Last-Translator: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Language: en\n" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:5 +msgid "" +"   " +msgstr "" +"*All time parameters refer to the time point in the natural unit, not the " +"cumulative count. For example, the week can only be 0-6, the hour can only " +"be 0-23, the minute can only be 0-59, and 48 hours cannot be used. This " +"cumulative count representation of 80 minutes.
" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:42 +msgid "" +"*表示每分钟,*/n表示每n分钟
n1-n5连续,n1,n3,n5不连" +"续
" +msgstr "" +"* means every minute, */n means every n minutes
n1-" +"n5 are continuous, n1, n3, n5 are not continuous
" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:37 +msgid "" +"*表示每小时,*/n表示每n小时
n1-n5连续,n1,n3,n5不连" +"续
" +msgstr "" +"* means every hour, */n means every n hours
n1-n5 " +"are continuous, n1, n3, n5 are not continuous
" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:23 +msgid "" +"和日期是逻辑“与”关系
n1-n5连续,n1,n3,n5不连续" +msgstr "" +"and date have a logical AND relationship
n1-n5 are " +"continuous, n1, n3, n5 are not continuous
" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:47 +msgid "" +"按“--自定义--”可进行修改
(亦可添加后到计划任务中修" +"改)
" +msgstr "" +"Press \"--Custom--\" to modify it
(it can also be " +"added and modified in the scheduled task)
" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:2 +msgid "" +"让计划任务更加易用的插件,可以使用-表示连续的时间范" +"围,使用,表示不连续的多个时间点,使用*/表示循环执行。可以使用“添加”来添加多" +"条计划任务命令。可使用“--自定义--”来自行添加其它参数。
" +msgstr "" +"A plug-in that makes scheduled tasks easier to use. " +"You can use-to indicate a continuous time range, use to indicate multiple " +"discrete time points, and use */ to indicate cyclic execution. You can use " +"\"Add\" to add multiple scheduled task commands. You can use \"--Custom--\" " +"to add other parameters yourself.
" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:48 +msgid "A.释放内存" +msgstr "A. Release memory" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:49 +msgid "B.清理垃圾" +msgstr "B. Clean up rubbish" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:50 +msgid "C.重启系统" +msgstr "C. Restart the system" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:51 +msgid "D.关闭电源" +msgstr "D. Turn off the power" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:52 +msgid "E.重启共享" +msgstr "E. Restart sharing" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:53 +msgid "F.重启网络" +msgstr "F. Restart the network" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:31 +msgid "Friday" +msgstr "Friday" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:54 +msgid "G.重启WAN" +msgstr "G. Restart WAN" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:55 +msgid "H.重新拨号" +msgstr "H. Redial" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:56 +msgid "I.关闭联网" +msgstr "I. Turn off the Internet" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:57 +msgid "J.打开联网" +msgstr "J. Turn on networking" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:58 +msgid "K.关闭WIFI" +msgstr "K. Turn off WIFI" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:59 +msgid "L.打开WIFI" +msgstr "L. Turn on WIFI" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:27 +msgid "Monday" +msgstr "Monday" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:32 +msgid "Saturday" +msgstr "Saturday" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:26 +msgid "Sunday" +msgstr "Sunday" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:30 +msgid "Thursday" +msgstr "Thursday" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:28 +msgid "Tuesday" +msgstr "Tuesday" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:29 +msgid "Wednesday" +msgstr "Wednesday" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:41 +msgid "分 (数值范围0~59)" +msgstr "Minutes (value range 0~59)" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:17 +msgid "启用" +msgstr "Enable" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:1 +msgid "定时任务设置" +msgstr "Scheduled task settings" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:46 +msgid "执行命令 (多条用 && 连接)" +msgstr "" +"Execute the command (multiple items connected with " +"&&)" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:36 +msgid "时 (数值范围0~23)" +msgstr "When (numerical range 0~23)" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:22 +msgid "星期 (数值范围0~6)" +msgstr "Day of the week (value range 0~6)" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:6 +msgid "查看/验证" +msgstr "View/Verify" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:25 +msgid "每天" +msgstr "every day" diff --git a/luci-app-rebootschedule/po/en/rebootschedule.pot b/luci-app-rebootschedule/po/en/rebootschedule.pot new file mode 100644 index 00000000..ecb15bbd --- /dev/null +++ b/luci-app-rebootschedule/po/en/rebootschedule.pot @@ -0,0 +1,160 @@ +msgid "" +msgstr "Content-Type: text/plain; charset=UTF-8" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:5 +msgid "" +"   " +msgstr "" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:42 +msgid "" +"*表示每分钟,*/n表示每n分钟
n1-n5连续,n1,n3,n5不连" +"续
" +msgstr "" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:37 +msgid "" +"*表示每小时,*/n表示每n小时
n1-n5连续,n1,n3,n5不连" +"续
" +msgstr "" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:23 +msgid "" +"和日期是逻辑“与”关系
n1-n5连续,n1,n3,n5不连续" +msgstr "" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:47 +msgid "" +"按“--自定义--”可进行修改
(亦可添加后到计划任务中修" +"改)
" +msgstr "" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:2 +msgid "" +"让计划任务更加易用的插件,可以使用-表示连续的时间范" +"围,使用,表示不连续的多个时间点,使用*/表示循环执行。可以使用“添加”来添加多条" +"计划任务命令。可使用“--自定义--”来自行添加其它参数。
" +msgstr "" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:48 +msgid "A.释放内存" +msgstr "" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:49 +msgid "B.清理垃圾" +msgstr "" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:50 +msgid "C.重启系统" +msgstr "" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:51 +msgid "D.关闭电源" +msgstr "" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:52 +msgid "E.重启共享" +msgstr "" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:53 +msgid "F.重启网络" +msgstr "" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:31 +msgid "Friday" +msgstr "" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:54 +msgid "G.重启WAN" +msgstr "" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:55 +msgid "H.重新拨号" +msgstr "" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:56 +msgid "I.关闭联网" +msgstr "" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:57 +msgid "J.打开联网" +msgstr "" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:58 +msgid "K.关闭WIFI" +msgstr "" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:59 +msgid "L.打开WIFI" +msgstr "" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:27 +msgid "Monday" +msgstr "" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:32 +msgid "Saturday" +msgstr "" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:26 +msgid "Sunday" +msgstr "" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:30 +msgid "Thursday" +msgstr "" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:28 +msgid "Tuesday" +msgstr "" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:29 +msgid "Wednesday" +msgstr "" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:41 +msgid "分 (数值范围0~59)" +msgstr "" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:17 +msgid "启用" +msgstr "" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:1 +msgid "定时任务设置" +msgstr "" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:46 +msgid "执行命令 (多条用 && 连接)" +msgstr "" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:36 +msgid "时 (数值范围0~23)" +msgstr "" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:22 +msgid "星期 (数值范围0~6)" +msgstr "" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:6 +msgid "查看/验证" +msgstr "" + +#: luci-app-rebootschedule/luasrc/model/cbi/rebootschedule.lua:25 +msgid "每天" +msgstr "" diff --git a/luci-app-rebootschedule/root/etc/config/rebootschedule b/luci-app-rebootschedule/root/etc/config/rebootschedule new file mode 100644 index 00000000..70462623 --- /dev/null +++ b/luci-app-rebootschedule/root/etc/config/rebootschedule @@ -0,0 +1,66 @@ +config crontab + option week '*' + option hour '*/4' + option day '*' + option month '*' + option minute '0' + option command 'sync && echo 3 > /proc/sys/vm/drop_caches' + option enable '1' + +config crontab + option month '*' + option day '*' + option hour '5' + option minute '0' + option week '1,3,5' + option command 'sleep 5 && touch /etc/banner && reboot' + option enable '0' + +config crontab + option enable '0' + option week '*' + option hour '23' + option minute '59' + option command 'poweroff' + +config crontab + option month '*' + option day '*' + option week '*' + option command '/etc/init.d/network restart' + option enable '0' + option hour '*/12' + option minute '30' + +config crontab + option month '*' + option day '*' + option week '1-5' + option hour '7' + option minute '50' + option command 'wifi up' + option enable '0' + +config crontab + option month '*' + option day '*' + option minute '0' + option week '1-5' + option hour '18' + option command 'wifi down' + option enable '0' + +config crontab + option minute '0' + option week '*' + option hour '5' + option enable '0' + option command '/etc/init.d/ksmdb restart &&/etc/init.d/samba restart' + +config crontab + option minute '0' + option week '2' + option hour '5' + option command 'sysfree.sh' + option enable '0' + diff --git a/luci-app-rebootschedule/root/etc/init.d/rebootschedule b/luci-app-rebootschedule/root/etc/init.d/rebootschedule new file mode 100644 index 00000000..c2427690 --- /dev/null +++ b/luci-app-rebootschedule/root/etc/init.d/rebootschedule @@ -0,0 +1,48 @@ +#!/bin/sh /etc/rc.common +# Author=wulishui , 20200908-0915 ; +# 20210514 by sirpdboy + +START=55 + + +up_cron() { +if [ "`grep 'option enable .1.' /etc/config/rebootschedule 2>/dev/null`" ]; then + [ -s /etc/crontabs/root ] || mcronrst=1 + del_cron + sum=$(grep -c 'config crontab' /etc/config/rebootschedule 2>/dev/null) + for i in $(seq 0 $((sum-1))); do + enable=`uci get rebootschedule.@crontab[$i].enable 2>/dev/null` + if [ $enable -eq 1 ]; then + month=`uci get rebootschedule.@crontab[$i].month 2>/dev/null` || month="*" + day=`uci get rebootschedule.@crontab[$i].day 2>/dev/null` || day="*" + week=`uci get rebootschedule.@crontab[$i].week 2>/dev/null` || week="*" + #[ ! "$day" = "*" ] && week="*" + hour=`uci get rebootschedule.@crontab[$i].hour 2>/dev/null` || hour="*"; [ "$hour" = "0" ] && hour="00" + minute=`uci get rebootschedule.@crontab[$i].minute 2>/dev/null` || minute="00"; [ "$minute" = "0" ] && minute="00" + command=`uci get rebootschedule.@crontab[$i].command 2>/dev/null` || command="echo "Reboot schedule tested."" + echo "$minute $hour $day $month $week $command #rebootschedule" >> /etc/crontabs/root + fi + done + [ $mcronrst ] && /etc/init.d/cron restart +fi +} + +del_cron() { + sed -i '/rebootschedule/d' /etc/crontabs/root 2>/dev/nul +} + + +start() +{ + + if [ ! -e /etc/config/rebootschedule ]; then + logger -p daemon.error -t 'rebootschedule' "missing config /etc/config/rebootschedule!" + exit 1 + fi + up_cron +} + +stop() +{ + del_cron +} diff --git a/luci-app-rebootschedule/root/etc/uci-defaults/luci-app-rebootschedule b/luci-app-rebootschedule/root/etc/uci-defaults/luci-app-rebootschedule new file mode 100644 index 00000000..0a4afce8 --- /dev/null +++ b/luci-app-rebootschedule/root/etc/uci-defaults/luci-app-rebootschedule @@ -0,0 +1,11 @@ +#!/bin/sh + +uci -q batch <<-EOF >/dev/null + delete ucitrack.@rebootschedule[-1] + add ucitrack rebootschedule + set ucitrack.@rebootschedule[-1].init=rebootschedule + commit ucitrack +EOF + +rm -f /tmp/luci-* +exit 0 diff --git a/luci-app-rebootschedule/root/usr/share/rpcd/acl.d/luci-app-rebootschedule.json b/luci-app-rebootschedule/root/usr/share/rpcd/acl.d/luci-app-rebootschedule.json new file mode 100644 index 00000000..b80a47af --- /dev/null +++ b/luci-app-rebootschedule/root/usr/share/rpcd/acl.d/luci-app-rebootschedule.json @@ -0,0 +1,11 @@ +{ + "luci-app-rebootschedule": { + "description": "Grant UCI access for luci-app-rebootschedule", + "read": { + "uci": [ "rebootschedule" ] + }, + "write": { + "uci": [ "rebootschedule" ] + } + } +} diff --git a/luci-app-smartdns b/luci-app-smartdns deleted file mode 160000 index af0af5cd..00000000 --- a/luci-app-smartdns +++ /dev/null @@ -1 +0,0 @@ -Subproject commit af0af5cd7c2d09cd25b712a2672785a109e3fd02 diff --git a/luci-app-smartdns/Makefile b/luci-app-smartdns/Makefile new file mode 100644 index 00000000..2c3f9f86 --- /dev/null +++ b/luci-app-smartdns/Makefile @@ -0,0 +1,38 @@ +# +# Copyright (C) 2018-2023 Ruilin Peng (Nick) . +# +# smartdns is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# smartdns is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +include $(TOPDIR)/rules.mk + +PKG_LICENSE:=GPL-3.0-or-later +PKG_MAINTAINER:=Nick Peng +PKG_VERSION:=1.2023.43 +PKG_RELEASE:=1 + +LUCI_TITLE:=LuCI for smartdns +LUCI_DESCRIPTION:=Provides Luci for smartdns +LUCI_DEPENDS:=+smartdns +luci-compat +LUCI_PKGARCH:=all + +define Package/$(PKG_NAME)/config +# shown in make menuconfig +help + $(LUCI_TITLE) + Version: $(PKG_VERSION)-$(PKG_RELEASE) +endef + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/luci-app-smartdns/luasrc/controller/smartdns.lua b/luci-app-smartdns/luasrc/controller/smartdns.lua new file mode 100644 index 00000000..be70065f --- /dev/null +++ b/luci-app-smartdns/luasrc/controller/smartdns.lua @@ -0,0 +1,57 @@ +-- +-- Copyright (C) 2018-2023 Ruilin Peng (Nick) . +-- +-- smartdns is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- smartdns is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . + +module("luci.controller.smartdns", package.seeall) +local smartdns = require "luci.model.smartdns" + +function index() + if not nixio.fs.access("/etc/config/smartdns") then + return + end + + local page + page = entry({"admin", "services", "smartdns"}, cbi("smartdns/smartdns"), _("SmartDNS"), 60) + page.dependent = true + page = entry({"admin", "services", "smartdns", "status"}, call("act_status")) + page.leaf = true + page = entry({"admin", "services", "smartdns", "upstream"}, cbi("smartdns/upstream"), nil) + page.leaf = true +end + +local function is_running() + return luci.sys.call("pidof smartdns >/dev/null") == 0 +end + +function act_status() + local e={} + local ipv6_server; + local dnsmasq_server = smartdns.get_config_option("dhcp", "dnsmasq", "server", {nil})[1] + local auto_set_dnsmasq = smartdns.get_config_option("smartdns", "smartdns", "auto_set_dnsmasq", nil); + + e.auto_set_dnsmasq = auto_set_dnsmasq + e.dnsmasq_server = dnsmasq_server + e.local_port = smartdns.get_config_option("smartdns", "smartdns", "port", nil); + if e.local_port ~= nil and e.local_port ~= "53" and auto_set_dnsmasq ~= nil and auto_set_dnsmasq == "1" then + local str; + str = "127.0.0.1#" .. e.local_port + if dnsmasq_server ~= str then + e.dnsmasq_redirect_failure = 1 + end + end + e.running = is_running() + luci.http.prepare_content("application/json") + luci.http.write_json(e) +end diff --git a/luci-app-smartdns/luasrc/model/cbi/smartdns/smartdns.lua b/luci-app-smartdns/luasrc/model/cbi/smartdns/smartdns.lua new file mode 100644 index 00000000..6ab6a8d0 --- /dev/null +++ b/luci-app-smartdns/luasrc/model/cbi/smartdns/smartdns.lua @@ -0,0 +1,787 @@ +-- +-- Copyright (C) 2018-2023 Ruilin Peng (Nick) . +-- +-- smartdns is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- smartdns is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . + +require ("nixio.fs") +require ("luci.http") +require ("luci.dispatcher") +require ("nixio.fs") + +local uci = require "luci.model.uci".cursor() + +m = Map("smartdns") +m.title = translate("SmartDNS Server") +m.description = translate("SmartDNS is a local high-performance DNS server, supports finding fastest IP, supports ad filtering, and supports avoiding DNS poisoning.") + +m:section(SimpleSection).template = "smartdns/smartdns_status" + +-- Basic +s = m:section(TypedSection, "smartdns", translate("Settings"), translate("General Settings")) +s.anonymous = true + +s:tab("settings", translate("General Settings")) +s:tab("advanced", translate('Advanced Settings')) +s:tab("seconddns", translate("Second Server Settings")) +s:tab("dns64", translate("DNS64 Server Settings")) +s:tab("proxy", translate("Proxy Server Settings")) +s:tab("custom", translate("Custom Settings")) + +---- Eanble +o = s:taboption("settings", Flag, "enabled", translate("Enable"), translate("Enable or disable smartdns server")) +o.default = o.disabled +o.rempty = false + +---- server name +o = s:taboption("settings", Value, "server_name", translate("Server Name"), translate("Smartdns server name")) +o.default = "smartdns" +o.datatype = "hostname" +o.rempty = false + +---- Port +o = s:taboption("settings", Value, "port", translate("Local Port"), + translate("Smartdns local server port, smartdns will be automatically set as main dns when the port is 53.")) +o.placeholder = 53 +o.default = 53 +o.datatype = "port" +o.rempty = false + +-- Automatically Set Dnsmasq +o = s:taboption("settings", Flag, "auto_set_dnsmasq", translate("Automatically Set Dnsmasq"), translate("Automatically set as upstream of dnsmasq when port changes.")) +o.rmempty = false +o.default = o.enabled +o.cfgvalue = function(...) + return Flag.cfgvalue(...) or "0" +end + +---- Speed check mode; +o = s:taboption("advanced", Value, "speed_check_mode", translate("Speed Check Mode"), translate("Smartdns speed check mode.")); +o.rmempty = true; +o.placeholder = "default"; +o.default = o.enabled; +o:value("", translate("default")) +o:value("ping,tcp:80,tcp:443"); +o:value("ping,tcp:443,tcp:80"); +o:value("tcp:80,tcp:443,ping"); +o:value("tcp:443,tcp:80,ping"); +o:value("none", translate("None")); +function o.validate (section_id, value) + if value == "" then + return value + end + + if value == nil then + return nil, translate("Speed check mode is invalid.") + end + + if value == "none" then + return value + end + + local mode = value:split(","); + for _, v in ipairs(mode) do repeat + if v == "ping" then + break + end + + if v == nil then + return nil, translate("Speed check mode is invalid.") + end + + local port = v:split(":"); + if "tcp" == port[1] then + if tonumber(port[2]) then + break + end + end + + return nil, translate("Speed check mode is invalid.") + until true end + + return value +end + +---- response mode; +o = s:taboption("advanced", ListValue, "response_mode", translate("Response Mode"), + translate("Smartdns response mode, First Ping: return the first ping IP, Fastest IP: return the fastest IP, Fastest Response: return the fastest DNS response.")) +o.rmempty = true +o.placeholder = "default" +o:value("", translate("default")) +o:value("first-ping", translate("First Ping")) +o:value("fastest-ip", translate("Fastest IP")) +o:value("fastest-response", translate("Fastest Response")) + +---- Enable TCP server +o = s:taboption("advanced", Flag, "tcp_server", translate("TCP Server"), translate("Enable TCP DNS Server")) +o.rmempty = false +o.default = o.enabled +o.cfgvalue = function(...) + return Flag.cfgvalue(...) or "1" +end + +---- Support IPV6 +o = s:taboption("advanced", Flag, "ipv6_server", translate("IPV6 Server"), translate("Enable IPV6 DNS Server")) +o.rmempty = false +o.default = o.enabled +o.cfgvalue = function(...) + return Flag.cfgvalue(...) or "1" +end + +---- bind to device; +o = s:taboption("advanced", Flag, "bind_device", translate("Bind Device"), translate("Listen only on the specified interfaces.")) +o.rmempty = false +o.default = o.enabled +o.cfgvalue = function(...) + return Flag.cfgvalue(...) or "1" +end + +---- bind device name; +o = s:taboption("advanced", Value, "bind_device_name", translate("Bind Device Name"), translate("Name of device name listen on.")) +o.placeholder = "default" +o.rempty = true +o.datatype = "string" + +---- Support DualStack ip selection +o = s:taboption("advanced", Flag, "dualstack_ip_selection", translate("Dual-stack IP Selection"), translate("Enable IP selection between IPV4 and IPV6")) +o.rmempty = false +o.default = o.enabled +o.cfgvalue = function(...) + return Flag.cfgvalue(...) or "0" +end + +---- Domain prefetch load +o = s:taboption("advanced", Flag, "prefetch_domain", translate("Domain prefetch"), translate("Enable domain prefetch, accelerate domain response speed.")) +o.rmempty = true +o.default = o.disabled +o.cfgvalue = function(...) + return Flag.cfgvalue(...) or "0" +end + +---- Domain Serve expired +o = s:taboption("advanced", Flag, "serve_expired", translate("Serve expired"), + translate("Attempts to serve old responses from cache with a TTL of 0 in the response without waiting for the actual resolution to finish.")) +o.rmempty = false +o.default = o.enabled +o.cfgvalue = function(...) + return Flag.cfgvalue(...) or "0" +end + +---- cache-size +o = s:taboption("advanced", Value, "cache_size", translate("Cache Size"), translate("DNS domain result cache size")) +o.rempty = true + +---- cache-persist; +o = s:taboption("advanced", Flag, "cache_persist", translate("Cache Persist"), translate("Write cache to disk on exit and load on startup.")) +o.rmempty = false +o.default = o.enabled +o.cfgvalue = function(...) + return Flag.cfgvalue(...) or "1" +end + +-- cache-size +o = s:taboption("advanced", Flag, "resolve_local_hostnames", translate("Resolve Local Hostnames"), translate("Resolve local hostnames by reading Dnsmasq lease file.")) +o.rmempty = false +o.default = o.enabled +o.cfgvalue = function(...) + return Flag.cfgvalue(...) or "1" +end + +-- Force AAAA SOA +o = s:taboption("advanced", Flag, "force_aaaa_soa", translate("Force AAAA SOA"), translate("Force AAAA SOA.")) +o.rmempty = true +o.default = o.disabled +o.cfgvalue = function(...) + return Flag.cfgvalue(...) or "0" +end + +-- Force HTTPS SOA +o = s:taboption("advanced", Flag, "force_https_soa", translate("Force HTTPS SOA"), translate("Force HTTPS SOA.")) +o.rmempty = false +o.default = o.enabled +o.cfgvalue = function(...) + return Flag.cfgvalue(...) or "1" +end + +---- Ipset no speed. +o = s:taboption("advanced", Value, "ipset_no_speed", translate("No Speed IPset Name"), + translate("Ipset name, Add domain result to ipset when speed check fails.")); +o.rmempty = true; +o.datatype = "hostname"; +o.rempty = true; + +---- NFTset no speed. +o = s:taboption("advanced", Value, "nftset_no_speed", translate("No Speed NFTset Name"), + translate("Nftset name, Add domain result to nftset when speed check fails, format: [#[4|6]:[family#table#set]]")); +o.rmempty = true; +o.datatype = "string"; +o.rempty = true; +function o.validate(self, value) + if (value == "") then + return value + end + + if (value:match("#[4|6]:[a-zA-Z0-9%-_]+#[a-zA-Z0-9%-_]+#[a-zA-Z0-9%-_]+$")) then + return value + end + + return nil, translate("NFTset name format error, format: [#[4|6]:[family#table#set]]") +end + +---- rr-ttl +o = s:taboption("advanced", Value, "rr_ttl", translate("Domain TTL"), translate("TTL for all domain result.")) +o.rempty = true + +---- rr-ttl-min +o = s:taboption("advanced", Value, "rr_ttl_min", translate("Domain TTL Min"), translate("Minimum TTL for all domain result.")) +o.rempty = true +o.placeholder = "600" +o.default = 600 +o.optional = true + +---- rr-ttl-max +o = s:taboption("advanced", Value, "rr_ttl_max", translate("Domain TTL Max"), translate("Maximum TTL for all domain result.")) +o.rempty = true + +---- rr-ttl-reply-max +o = s:taboption("advanced", Value, "rr_ttl_reply_max", translate("Reply Domain TTL Max"), translate("Reply maximum TTL for all domain result.")) +o.rempty = true + +o = s:taboption("advanced", DynamicList, "conf_files", translate("Include Config Files
/etc/smartdns/conf.d"), + translate("Include other config files from /etc/smartdns/conf.d or custom path, can be downloaded from the download page.")); +uci:foreach("smartdns", "download-file", function(section) + local filetype = section.type + if (filetype ~= 'config') then + return + end + + o:value(section.name); +end) + +---- other args +o = s:taboption("advanced", Value, "server_flags", translate("Additional Server Args"), translate("Additional server args, refer to the help description of the bind option.")) +o.default = "" +o.rempty = true +o.optional = true + +---- second dns server +---- Eanble +o = s:taboption("seconddns", Flag, "seconddns_enabled", translate("Enable"), translate("Enable or disable second DNS server.")) +o.default = o.disabled +o.rempty = false + +---- Port +o = s:taboption("seconddns", Value, "seconddns_port", translate("Local Port"), translate("Smartdns local server port")) +o.placeholder = 6553 +o.default = 6553 +o.datatype = "port" +o.rempty = false + +---- Enable TCP server +o = s:taboption("seconddns", Flag, "seconddns_tcp_server", translate("TCP Server"), translate("Enable TCP DNS Server")) +o.rmempty = false +o.default = o.enabled +o.cfgvalue = function(...) + return Flag.cfgvalue(...) or "1" +end + +---- dns server group +o = s:taboption("seconddns", Value, "seconddns_server_group", translate("Server Group"), translate("Query DNS through specific dns server group, such as office, home.")) +o.rmempty = true +o.placeholder = "default" +o.datatype = "hostname" +o.rempty = true + +o = s:taboption("seconddns", Flag, "seconddns_no_speed_check", translate("Skip Speed Check"), translate("Do not check speed.")) +o.rmempty = true +o.default = o.disabled +o.cfgvalue = function(...) + return Flag.cfgvalue(...) or "0" +end + +---- skip address rules +o = s:taboption("seconddns", Flag, "seconddns_no_rule_addr", translate("Skip Address Rules"), translate("Skip address rules.")) +o.rmempty = true +o.default = o.disabled +o.cfgvalue = function(...) + return Flag.cfgvalue(...) or "0" +end + +---- skip name server rules +o = s:taboption("seconddns", Flag, "seconddns_no_rule_nameserver", translate("Skip Nameserver Rule"), translate("Skip nameserver rules.")) +o.rmempty = true +o.default = o.disabled +o.cfgvalue = function(...) + return Flag.cfgvalue(...) or "0" +end + +---- skip ipset rules +o = s:taboption("seconddns", Flag, "seconddns_no_rule_ipset", translate("Skip Ipset Rule"), translate("Skip ipset rules.")) +o.rmempty = true +o.default = o.disabled +o.cfgvalue = function(...) + return Flag.cfgvalue(...) or "0" +end + +---- skip soa address rule +o = s:taboption("seconddns", Flag, "seconddns_no_rule_soa", translate("Skip SOA Address Rule"), translate("Skip SOA address rules.")) +o.rmempty = true +o.default = o.disabled +o.cfgvalue = function(...) + return Flag.cfgvalue(...) or "0" +end + +o = s:taboption("seconddns", Flag, "seconddns_no_dualstack_selection", translate("Skip Dualstack Selection"), translate("Skip Dualstack Selection.")) +o.rmempty = true +o.default = o.disabled +o.cfgvalue = function(...) + return Flag.cfgvalue(...) or "0" +end + +---- skip cache +o = s:taboption("seconddns", Flag, "seconddns_no_cache", translate("Skip Cache"), translate("Skip Cache.")) +o.rmempty = true +o.default = o.disabled +o.cfgvalue = function(...) + return Flag.cfgvalue(...) or "0" +end + +---- Force AAAA SOA +o = s:taboption("seconddns", Flag, "seconddns_force_aaaa_soa", translate("Force AAAA SOA"), translate("Force AAAA SOA.")) +o.rmempty = true +o.default = o.disabled +o.cfgvalue = function(...) + return Flag.cfgvalue(...) or "0" +end + +o = s:taboption("seconddns", Value, "seconddns_ipset_name", translate("IPset Name"), translate("IPset name.")) +o.rmempty = true +o.datatype = "hostname" +o.rempty = true + +o = s:taboption("seconddns", Value, "seconddns_nftset_name", translate("NFTset Name"), translate("NFTset name, format: [#[4|6]:[family#table#set]]")) +o.rmempty = true +o.datatype = "string" +o.rempty = true +function o.validate(self, value) + if (value == "") then + return value + end + + if (value:match("#[4|6]:[a-zA-Z0-9%-_]+#[a-zA-Z0-9%-_]+#[a-zA-Z0-9%-_]+$")) then + return value + end + + return nil, translate("NFTset name format error, format: [#[4|6]:[family#table#set]]") +end + +---- other args +o = s:taboption("seconddns", Value, "seconddns_server_flags", translate("Additional Server Args"), translate("Additional server args, refer to the help description of the bind option.")) +o.default = "" +o.rempty = true +o.optional = true + +----- Proxy server settings +o = s:taboption("proxy", Value, "proxy_server", translate("Proxy Server"), translate("Proxy Server URL, format: [socks5|http]://user:pass@ip:port.")); +o.datatype = 'string'; +function o.validate(self, value) + if (value == "") then + return true + end + + if (not value:match("^http://") and not value:match("^socks5://")) then + return nil, translate("Proxy server URL format error, format: [socks5|http]://user:pass@ip:port.") + end + + return value +end + +----- dns64 server settings +o = s:taboption("dns64", Value, "dns64", translate("DNS64")); +o.placeholder = "64:ff9b::/96" +o.datatype = 'ip6addr' +o.rmempty = true + +----- custom settings +custom = s:taboption("custom", Value, "Custom Settings", + translate(""), + translate("smartdns custom settings")) + +custom.template = "cbi/tvalue" +custom.rows = 20 + +function custom.cfgvalue(self, section) + return nixio.fs.readfile("/etc/smartdns/custom.conf") +end + +function custom.write(self, section, value) + value = value:gsub("\r\n?", "\n") + nixio.fs.writefile("/etc/smartdns/custom.conf", value) +end + +o = s:taboption("custom", Flag, "coredump", translate("Generate Coredump"), translate("Generate Coredump file when smartdns crash, coredump file is located at /tmp/smartdns.xxx.core.")) +o.rmempty = true +o.default = o.disabled +o.cfgvalue = function(...) + return Flag.cfgvalue(...) or "0" +end + +o = s:taboption("custom", Value, "log_size", translate("Log Size")) +o.rmempty = true +o.placeholder = "default" + +o = s:taboption("custom", ListValue, "log_level", translate("Log Level")) +o.rmempty = true +o.placeholder = "default" +o:value("", translate("default")) +o:value("debug") +o:value("info") +o:value("notice") +o:value("warn") +o:value("error") +o:value("fatal") +o:value("off") + +o = s:taboption("custom", Value, "log_num", translate("Log Number")) +o.rmempty = true +o.placeholder = "default" + +o = s:taboption("custom", Value, "log_file", translate("Log File")) +o.rmempty = true +o.placeholder = "/var/log/smartdns/smartdns.log" + +-- Upstream servers +s = m:section(TypedSection, "server", translate("Upstream Servers"), translate("Upstream Servers, support UDP, TCP protocol. " .. + "Please configure multiple DNS servers, including multiple foreign DNS servers.")) + +s.anonymous = true +s.addremove = true +s.template = "cbi/tblsection" +s.extedit = luci.dispatcher.build_url("admin/services/smartdns/upstream/%s") + +---- enable flag +o = s:option(Flag, "enabled", translate("Enable"), translate("Enable")) +o.rmempty = false +o.default = o.enabled +o.cfgvalue = function(...) + return Flag.cfgvalue(...) or "1" +end + +---- name +s:option(Value, "name", translate("DNS Server Name"), translate("DNS Server Name")) + +---- IP address +o = s:option(Value, "ip", translate("ip"), translate("DNS Server ip")) +o.datatype = "or(ipaddr, string)" +o.rmempty = false +---- port +o = s:option(Value, "port", translate("port"), translate("DNS Server port")) +o.placeholder = "default" +o.datatype = "port" +o.rempty = true +o:depends("type", "udp") +o:depends("type", "tcp") +o:depends("type", "tls") + +---- type +o = s:option(ListValue, "type", translate("type"), translate("DNS Server type")) +o.placeholder = "udp" +o:value("udp", translate("udp")) +o:value("tcp", translate("tcp")) +o:value("tls", translate("tls")) +o:value("https", translate("https")) +o.default = "udp" +o.rempty = false + +---- domain rules; +s = m:section(TypedSection, "domain-rule", translate("Domain Rules"), translate("Domain Rules Settings")) +s.anonymous = true +s.nodescriptions = true + +s:tab("forwarding", translate('DNS Forwarding Setting')) +s:tab("block", translate("DNS Block Setting")) +s:tab("domain-address", translate("Domain Address"), translate("Set Specific domain ip address.")) +s:tab("blackip-list", translate("IP Blacklist"), translate("Set Specific ip blacklist.")) + +---- domain forwarding; +o = s:taboption("forwarding", Value, "server_group", translate("Server Group"), translate("DNS Server group belongs to, such as office, home.")) +o.rmempty = true +o.placeholder = "default" +o.datatype = "hostname" +o.rempty = true +uci:foreach("smartdns", "server", function(section) + local server_group = section.server_group + if server_group == nil then + return + end + o:value(server_group); +end) + +function o.validate (section_id, value) + if value == "" then + return value + end + + if value == nil then + return nil, translate('Server Group not exists') + end + + local exists = false + uci:foreach("smartdns", "server", function(section) + local server_group = section.server_group + if (exists == true) then + return + end + + if (value == server_group) then + exists = true + end + end) + + if exists == false then + return nil, translate('Server Group not exists') + end + + return value; + +end + +o = s:taboption("forwarding", Flag, "no_speed_check", translate("Skip Speed Check"), + translate("Do not check speed.")) +o.rmempty = true +o.default = o.disabled + +o = s:taboption("forwarding", Flag, "force_aaaa_soa", translate("Force AAAA SOA"), translate("Force AAAA SOA.")) +o.rmempty = true +o.default = o.disabled + +o = s:taboption("forwarding", Value, "ipset_name", translate("IPset Name"), translate("IPset name.")) +o.rmempty = true +o.datatype = "hostname" +o.rempty = true + +o = s:taboption("forwarding", Value, "nftset_name", translate("NFTset Name"), translate("NFTset name, format: [#[4|6]:[family#table#set]]")) +o.rmempty = true +o.datatype = "string" +o.rempty = true +function o.validate(self, value) + if (value == "") then + return value + end + + if (value:match("#[4|6]:[a-zA-Z0-9%-_]+#[a-zA-Z0-9%-_]+#[a-zA-Z0-9%-_]+$")) then + return value + end + + return nil, translate("NFTset name format error, format: [#[4|6]:[family#table#set]]") +end + +---- other args +o = s:taboption("forwarding", Value, "addition_flag", translate("Additional Rule Flag"), translate("Additional Flags for rules, read help on domain-rule for more information.")) +o.default = "" +o.rempty = true +o.modalonly = true; + +o = s:taboption("forwarding", FileUpload, "forwarding_domain_set_file", translate("Domain List File"), + translate("Upload domain list file, or configure auto download from Download File Setting page.")) +o.rmempty = true +o.datatype = "file" +o.rempty = true +o.editable = true +o.root_directory = "/etc/smartdns/domain-set" + +o = s:taboption("forwarding", TextValue, "domain_forwarding_list", + translate("Domain List"), translate("Configure forwarding domain name list.")) +o.rows = 10 +o.cols = 64 +o.monospace = true +function o.cfgvalue(self, section) + return nixio.fs.readfile("/etc/smartdns/domain-forwarding.list") +end +function o.write(self, section, value) + value = value:gsub("\r\n?", "\n") + nixio.fs.writefile("/etc/smartdns/domain-forwarding.list", value) +end + +---- domain block; +o = s:taboption("block", FileUpload, "block_domain_set_file", translate("Domain List File"), translate("Upload domain list file.")) +o.rmempty = true +o.datatype = "file" +o.rempty = true +o.editable = true +o.root_directory = "/etc/smartdns/domain-set" + +o = s:taboption("block", TextValue, "domain_block_list", + translate("Domain List"), translate("Configure block domain list.")) +o.rows = 10 +o.cols = 64 +function o.cfgvalue(self, section) + return nixio.fs.readfile("/etc/smartdns/domain-block.list") +end +function o.write(self, section, value) + value = value:gsub("\r\n?", "\n") + nixio.fs.writefile("/etc/smartdns/domain-block.list", value) +end + +-- Doman addresss +addr = s:taboption("domain-address", Value, "address", + translate(""), + translate("Specify an IP address to return for any host in the given domains, Queries in the domains are never forwarded and always replied to with the specified IP address which may be IPv4 or IPv6.")) + +addr.template = "cbi/tvalue" +addr.rows = 20 + +function addr.cfgvalue(self, section) + return nixio.fs.readfile("/etc/smartdns/address.conf") +end + +function addr.write(self, section, value) + value = value:gsub("\r\n?", "\n") + nixio.fs.writefile("/etc/smartdns/address.conf", value) +end + +-- IP Blacklist +addr = s:taboption("blackip-list", Value, "blacklist_ip", + translate(""), + translate("Configure IP blacklists that will be filtered from the results of specific DNS server.")) + +addr.template = "cbi/tvalue" +addr.rows = 20 + +function addr.cfgvalue(self, section) + return nixio.fs.readfile("/etc/smartdns/blacklist-ip.conf") +end + +function addr.write(self, section, value) + value = value:gsub("\r\n?", "\n") + nixio.fs.writefile("/etc/smartdns/blacklist-ip.conf", value) +end + +s = m:section(TypedSection, "smartdns", translate("Download Files Setting"), translate("Download domain list files for domain-rule and include config files, please refresh the page after download to take effect.")) +s.anonymous = true + +---- download Files Settings +o = s:option(Flag, "enable_auto_update", translate("Enable Auto Update"), translate("Enable daily auto update.")) +o.rmempty = true +o.default = o.disabled +o.rempty = true + +o = s:option(ListValue, "auto_update_day_time", translate("Update time (every day)")) +for i = 0, 23 do o:value(i, i .. ":00") end +o.default = 5 + +o = s:option(FileUpload, "upload_conf_file", translate("Upload Config File"), + translate("Upload smartdns config file to /etc/smartdns/conf.d")) +o.rmempty = true +o.datatype = "file" +o.rempty = true +o.editable = true +o.root_directory = "/etc/smartdns/conf.d" + +o = s:option(FileUpload, "upload_list_file", translate("Upload Domain List File"), + translate("Upload domain list file to /etc/smartdns/domain-set")) +o.rmempty = true +o.datatype = "file" +o.rempty = true +o.editable = true +o.root_directory = "/etc/smartdns/domain-set" + +o = s:option(Button, "_updateate") +o.title = translate("Update Files") +o.inputtitle = translate("Update Files") +o.inputstyle = "apply" +o.write = function() + luci.sys.call("/etc/init.d/smartdns updatefiles >/dev/null 2>&1") +end + +s = m:section(TypedSection, "download-file", translate("Download Files"), translate("List of files to download.")) +s.anonymous = true +s.addremove = true +s.template = "cbi/tblsection" + +o = s:option(Value, 'name', translate('File Name'), translate('File Name')) +o.rmempty = true +o.datatype = 'string' + +o = s:option(Value, 'url', translate('URL'), translate('URL')) +o.rmempty = true +o.datatype = 'string' +function o.validate(self, value, section) + if value == "" then + return nil, translate("URL format error, format: http:// or https://") + end + + if value == nil then + return nil, translate("URL format error, format: http:// or https://") + end + + if value.find(value, "http://") then + return value + end + + if value.find(value, "https://") then + return value + end + + return nil, translate("URL format error, format: http:// or https://") +end + +o = s:option(ListValue, "type", translate("type"), translate("File Type")) +o:value("list", translate("domain list (/etc/smartdns/domain-set)")) +o:value("config", translate("smartdns config (/etc/smartdns/conf.d)")) +o.default = "list" +o.rempty = false + +o = s:option(Value, 'desc', translate('Description'), translate('Description')) +o.rmempty = true +o.datatype = 'string' + +-- Technical Support +s = m:section(TypedSection, "smartdns", translate("Technical Support"), + translate("If you like this software, please buy me a cup of coffee.")) +s.anonymous = true + +o = s:option(Button, "web") +o.title = translate("SmartDNS official website") +o.inputtitle = translate("open website") +o.inputstyle = "apply" +o.write = function() + luci.http.redirect("https://pymumu.github.io/smartdns") +end + +o = s:option(Button, "report") +o.title = translate("Report bugs") +o.inputtitle = translate("Report bugs") +o.inputstyle = "apply" +o.write = function() + luci.http.redirect("https://github.com/pymumu/smartdns/issues") +end + +o = s:option(Button, "Donate") +o.title = translate("Donate to smartdns") +o.inputtitle = translate("Donate") +o.inputstyle = "apply" +o.write = function() + luci.http.redirect("https://pymumu.github.io/smartdns/#donate") +end + +o = s:option(Button, "Restart") +o.title = translate("Restart Service") +o.inputtitle = translate("Restart") +o.inputstyle = "apply" +o.write = function() + luci.sys.call("/etc/init.d/smartdns restart >/dev/null 2>&1") +end + +return m + diff --git a/luci-app-smartdns/luasrc/model/cbi/smartdns/upstream.lua b/luci-app-smartdns/luasrc/model/cbi/smartdns/upstream.lua new file mode 100644 index 00000000..02b7a5f4 --- /dev/null +++ b/luci-app-smartdns/luasrc/model/cbi/smartdns/upstream.lua @@ -0,0 +1,158 @@ +-- +-- Copyright (C) 2018-2023 Ruilin Peng (Nick) . +-- +-- smartdns is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- smartdns is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . + +local sid = arg[1] + +m = Map("smartdns", "%s - %s" %{translate("SmartDNS Server"), translate("Upstream DNS Server Configuration")}) +m.redirect = luci.dispatcher.build_url("admin/services/smartdns") + +if m.uci:get("smartdns", sid) ~= "server" then + luci.http.redirect(m.redirect) + return +end + +-- [[ Edit Server ]]-- +s = m:section(NamedSection, sid, "server") +s.anonymous = true +s.addremove = false + +---- name +s:option(Value, "name", translate("DNS Server Name"), translate("DNS Server Name")) + +---- IP address +o = s:option(Value, "ip", translate("ip"), translate("DNS Server ip")) +o.datatype = "or(host, string)" +o.rmempty = false +---- port +o = s:option(Value, "port", translate("port"), translate("DNS Server port")) +o.placeholder = "default" +o.datatype = "port" +o.rempty = true +o:depends("type", "udp") +o:depends("type", "tcp") +o:depends("type", "tls") + +---- type +o = s:option(ListValue, "type", translate("type"), translate("DNS Server type")) +o.placeholder = "udp" +o:value("udp", translate("udp")) +o:value("tcp", translate("tcp")) +o:value("tls", translate("tls")) +o:value("https", translate("https")) +o.default = "udp" +o.rempty = false + +---- server group +o = s:option(Value, "server_group", translate("Server Group"), translate("DNS Server group belongs to, such as office, home.")) +o.rmempty = true +o.placeholder = "default" +o.datatype = "hostname" +o.rempty = true + +---- exclude default group +o = s:option(Flag, "exclude_default_group", translate("Exclude Default Group"), translate("Exclude DNS Server from default group.")) +o.rmempty = true +o.default = o.disabled +o.editable = true +o.modalonly = true + +---- blacklist_ip +o = s:option(Flag, "blacklist_ip", translate("IP Blacklist Filtering"), translate("Filtering IP with blacklist")) +o.rmempty = true +o.default = o.disabled +o.cfgvalue = function(...) + return Flag.cfgvalue(...) or "0" +end + +---- TLS host verify +o = s:option(Value, "tls_host_verify", translate("TLS Hostname Verify"), translate("Set TLS hostname to verify.")) +o.default = "" +o.datatype = "string" +o.rempty = true +o:depends("type", "tls") +o:depends("type", "https") + +---- certificate verify +o = s:option(Flag, "no_check_certificate", translate("No check certificate"), translate("Do not check certificate.")) +o.rmempty = true +o.default = o.disabled +o.cfgvalue = function(...) + return Flag.cfgvalue(...) or "0" +end +o:depends("type", "tls") +o:depends("type", "https") + +---- SNI host name +o = s:option(Value, "host_name", translate("TLS SNI name"), translate("Sets the server name indication for query.")) +o.default = "" +o.datatype = "hostname" +o.rempty = true +o:depends("type", "tls") +o:depends("type", "https") + +---- http host +o = s:option(Value, "http_host", translate("HTTP Host"), translate("Set the HTTP host used for the query. Use this parameter when the host of the URL address is an IP address.")) +o.default = "" +o.datatype = "hostname" +o.rempty = true +o:depends("type", "https") + +---- anti-Answer-Forgery +-- o = s:option(Flag, "check_edns", translate("Anti Answer Forgery"), translate("Anti answer forgery, if DNS does not work properly after enabling, please turn off this feature")) +-- o.rmempty = false +-- o.default = o.disabled +-- o:depends("type", "udp") +-- o.cfgvalue = function(...) +-- return Flag.cfgvalue(...) or "0" +-- end + +---- SPKI pin +o = s:option(Value, "spki_pin", translate("TLS SPKI Pinning"), translate("Used to verify the validity of the TLS server, The value is Base64 encoded SPKI fingerprint, leaving blank to indicate that the validity of TLS is not verified.")) +o.default = "" +o.datatype = "string" +o.rempty = true +o:depends("type", "tls") +o:depends("type", "https") + +---- mark +o = s:option(Value, "set_mark", translate("Marking Packets"), translate("Set mark on packets.")) +o.default = "" +o.rempty = true +o.datatype = "uinteger" + +---- use proxy +o = s:option(Flag, "use_proxy", translate("Use Proxy"), translate("Use proxy to connect to upstream DNS server.")) +o.rmempty = true +o.default = o.disabled +o.cfgvalue = function(...) + return Flag.cfgvalue(...) or "0" +end +function o.validate(self, value, section) + if value == "1" then + local proxy = m.uci:get_first("smartdns", "smartdns", "proxy_server") + if proxy == nil or proxy == "" then + return nil, translate("Please set proxy server first.") + end + end + return value +end + +---- other args +o = s:option(Value, "addition_arg", translate("Additional Server Args"), translate("Additional Args for upstream dns servers")) +o.default = "" +o.rempty = true + +return m \ No newline at end of file diff --git a/luci-app-smartdns/luasrc/model/smartdns.lua b/luci-app-smartdns/luasrc/model/smartdns.lua new file mode 100644 index 00000000..d71742b7 --- /dev/null +++ b/luci-app-smartdns/luasrc/model/smartdns.lua @@ -0,0 +1,31 @@ +-- +-- Copyright (C) 2018-2023 Ruilin Peng (Nick) . +-- +-- smartdns is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- smartdns is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . + +require ("nixio.fs") +require ("luci.http") +require ("luci.dispatcher") +require ("nixio.fs") + +local uci = require "luci.model.uci".cursor() + +module("luci.model.smartdns", package.seeall) + +function get_config_option(module, section, option, default) + return uci:get_first(module, section, option) or default +end + +return m + diff --git a/luci-app-smartdns/luasrc/view/smartdns/smartdns_status.htm b/luci-app-smartdns/luasrc/view/smartdns/smartdns_status.htm new file mode 100644 index 00000000..c75fb663 --- /dev/null +++ b/luci-app-smartdns/luasrc/view/smartdns/smartdns_status.htm @@ -0,0 +1,28 @@ + + +
+

+ <%:Collecting data...%> +

+
+ \ No newline at end of file diff --git a/luci-app-smartdns/po/zh-cn/smartdns.po b/luci-app-smartdns/po/zh-cn/smartdns.po new file mode 100644 index 00000000..15421fc0 --- /dev/null +++ b/luci-app-smartdns/po/zh-cn/smartdns.po @@ -0,0 +1,654 @@ + +msgid "Additional Args for upstream dns servers" +msgstr "额外的上游 DNS 服务器参数" + +msgid "" +"Additional Flags for rules, read help on domain-rule for more information." +msgstr "额外的规则标识,具体参考domain-rule的帮助说明。" + +msgid "Additional Rule Flag" +msgstr "额外规则标识" + +msgid "Additional Server Args" +msgstr "额外的服务器参数" + +msgid "Additional server args, refer to the help description of the bind option." +msgstr "额外的服务器参数,参考bind选项的帮助说明。" + +msgid "Advanced Settings" +msgstr "高级设置" + +msgid "" +"Attempts to serve old responses from cache with a TTL of 0 in the response " +"without waiting for the actual resolution to finish." +msgstr "查询性能优化,有请求时尝试回应TTL为0的过期记录,以避免查询等待。" + +msgid "Automatically Set Dnsmasq" +msgstr "自动设置Dnsmasq" + +msgid "Automatically set as upstream of dnsmasq when port changes." +msgstr "端口更改时自动设为 dnsmasq 的上游。" + +msgid "Bind Device" +msgstr "绑定到设备" + +msgid "Bind Device Name" +msgstr "绑定的设备名称" + +msgid "Block domain" +msgstr "屏蔽域名" + +msgid "Block domain." +msgstr "屏蔽域名。" + +msgid "Cache Persist" +msgstr "持久化缓存" + +msgid "Cache Size" +msgstr "缓存大小" + +msgid "Collecting data ..." +msgstr "正在收集数据..." + +msgid "" +"Configure IP blacklists that will be filtered from the results of specific " +"DNS server." +msgstr "配置需要从指定域名服务器结果过滤的IP黑名单。" + +msgid "Configure block domain list." +msgstr "配置屏蔽域名列表" + +msgid "Configure domain rule list." +msgstr "配置域名规则列表" + +msgid "Configure forwarding domain name list." +msgstr "配置分流域名列表" + +msgid "Custom Settings" +msgstr "自定义设置" + +msgid "DNS Block Setting" +msgstr "域名屏蔽设置" + +msgid "DNS Forwarding Setting" +msgstr "域名分流设置" + +msgid "DNS Server Name" +msgstr "DNS服务器名称" + +msgid "DNS Server group" +msgstr "服务器组" + +msgid "DNS Server group belongs to, such as office, home." +msgstr "设置服务器组,例如office,home" + +msgid "DNS Server ip" +msgstr "DNS服务器IP" + +msgid "DNS Server port" +msgstr "DNS服务器端口" + +msgid "DNS Server type" +msgstr "协议类型" + +msgid "DNS domain result cache size" +msgstr "缓存DNS的结果,缓存大小,配置零则不缓存。" + +msgid "DNS64" +msgstr "DNS64" + +msgid "DNS64 Server Settings" +msgstr "DNS64服务器配置" + +msgid "default" +msgstr "默认" + +msgid "Description" +msgstr "描述" + +msgid "Dnsmasq Forwarded To Smartdns Failure" +msgstr "重定向dnsmasq到smartdns失败" + +msgid "Do not check certificate." +msgstr "不校验证书的合法性。" + +msgid "Do not check speed." +msgstr "禁用测速。" + +msgid "Domain Address" +msgstr "域名地址" + +msgid "Domain List" +msgstr "域名列表" + +msgid "Domain List File" +msgstr "域名列表文件" + +msgid "Domain Rule List" +msgstr "域名规则列表" + +msgid "Domain Rule Name" +msgstr "域名规则名称" + +msgid "Domain Rules" +msgstr "域名规则" + +msgid "Domain Rules Settings" +msgstr "域名规则设置" + +msgid "Domain TTL" +msgstr "域名TTL" + +msgid "Domain TTL Max" +msgstr "域名TTL最大值" + +msgid "Domain TTL Min" +msgstr "域名TTL最小值" + +msgid "Domain prefetch" +msgstr "域名预加载" + +msgid "Donate" +msgstr "捐助" + +msgid "Donate to smartdns" +msgstr "捐助smartdns项目" + +msgid "Download Files" +msgstr "下载文件" + +msgid "Download Files Setting" +msgstr "下载文件设置" + +msgid "" +"Download domain list files for domain-rule and include config files, please " +"refresh the page after download to take effect." +msgstr "" +"下载域名规则所需要的域名列表文件和smartdns配置文件,下载完成后刷新页面。" + +msgid "Dual-stack IP Selection" +msgstr "双栈IP优选" + +msgid "Enable" +msgstr "启用" + +msgid "Enable Auto Update" +msgstr "启用自动更新" + +msgid "Enable IP selection between IPV4 and IPV6" +msgstr "启用 IPV4 和 IPV6 间的 IP 优选策略。" + +msgid "Enable IPV6 DNS Server" +msgstr "启用IPV6服务器。" + +msgid "Enable TCP DNS Server" +msgstr "启用TCP服务器。" + +msgid "Enable daily auto update." +msgstr "启用每日自动更新" + +msgid "Update time (every day)" +msgstr "更新时间(每天)" + +msgid "Enable domain prefetch, accelerate domain response speed." +msgstr "启用域名预加载,加速域名响应速度。" + +msgid "Enable or disable second DNS server." +msgstr "是否启用第二DNS服务器。" + +msgid "Enable or disable smartdns server" +msgstr "启用或禁用SmartDNS服务" + +msgid "Exclude DNS Server from default group." +msgstr "从default默认服务器组中排除。" + +msgid "Exclude Default Group" +msgstr "从默认组中排除" + +msgid "Fastest IP" +msgstr "最快IP" + +msgid "Fastest Response" +msgstr "最快响应" + +msgid "File Name" +msgstr "文件名" + +msgid "File Type" +msgstr "文件类型" + +msgid "Filtering IP with blacklist" +msgstr "使用IP黑名单过滤" + +msgid "First Ping" +msgstr "最快PING" + +msgid "Force AAAA SOA" +msgstr "停用IPV6地址解析" + +msgid "Force AAAA SOA." +msgstr "停用IPV6地址解析。" + +msgid "Force HTTPS SOA" +msgstr "停用HTTPS地址解析" + +msgid "Force HTTPS SOA." +msgstr "停用HTTPS地址解析。" + +msgid "General Settings" +msgstr "常规设置" + +msgid "Generate Coredump" +msgstr "生成coredump" + +msgid "" +"Generate Coredump file when smartdns crash, coredump file is located at /tmp/" +"smartdns.xxx.core." +msgstr "" +"当smartdns异常时生成coredump文件,coredump文件在/tmp/smartdns.xxx.core." + +msgid "Grant access to LuCI app smartdns" +msgstr "授予访问 LuCI 应用 smartdns 的权限" + +msgid "HTTP Host" +msgstr "HTTP主机" + +msgid "IP Blacklist" +msgstr "IP黑名单" + +msgid "IP Blacklist Filtering" +msgstr "IP黑名单过滤" + +msgid "IPV6 Server" +msgstr "IPV6服务器" + +msgid "IPset Name" +msgstr "IPset名称" + +msgid "IPset name." +msgstr "IPset名称。" + +msgid "If you like this software, please buy me a cup of coffee." +msgstr "如果本软件对你有帮助,请给作者加个蛋。" + +msgid "Include Config Files
/etc/smartdns/conf.d" +msgstr "包含配置文件
/etc/smartdns/conf.d" + +msgid "" +"Include other config files from /etc/smartdns/conf.d or custom path, can be " +"downloaded from the download page." +msgstr "" +"包含配置文件,路径为/etc/smartdns/conf.d,或自定义配置文件路径,可以从下载页" +"配置自动下载。面配置自动下载。" + +msgid "Ipset name, Add domain result to ipset when speed check fails." +msgstr "IPset名称,当测速失败时,将查询到的结果添加到对应的IPSet集合中。" + +msgid "List of files to download." +msgstr "下载文件列表。" + +msgid "Listen only on the specified interfaces." +msgstr "监听在指定的设备上,避免非本地网络的DNS查询请求。" + +msgid "Local Port" +msgstr "本地端口" + +msgid "Log Size" +msgstr "日志大小" + +msgid "Log Level" +msgstr "日志级别" + +msgid "Log Number" +msgstr "日志数量" + +msgid "Log File" +msgstr "日志文件路径" + +msgid "Marking Packets" +msgstr "数据包标记" + +msgid "Maximum TTL for all domain result." +msgstr "所有域名的最大 TTL 值。" + +msgid "Minimum TTL for all domain result." +msgstr "所有域名的最小 TTL 值。" + +msgid "NFTset Name" +msgstr "NFTSet名称" + +msgid "NFTset name format error, format: [#[4|6]:[family#table#set]]" +msgstr "NFTSet名称格式错误,格式:[#[4|6]:[family#table#set]]" + +msgid "NFTset name, format: [#[4|6]:[family#table#set]]" +msgstr "NFTSet名称,格式:[#[4|6]:[family#table#set]]" + +msgid "NOT RUNNING" +msgstr "未运行" + +msgid "Name of device name listen on." +msgstr "绑定的设备名称。" + +msgid "" +"Nftset name, Add domain result to nftset when speed check fails, format: " +"[#[4|6]:[family#table#set]]" +msgstr "NFTset名称,当测速失败时,将查询到的结果添加到对应的NFTSet集合中。" + +msgid "No" +msgstr "否" + +msgid "No Speed IPset Name" +msgstr "无速度时IPSet名称" + +msgid "No Speed NFTset Name" +msgstr "无速度时NFTSet名称" + +msgid "No check certificate" +msgstr "停用证书校验" + +msgid "None" +msgstr "无" + +msgid "Only socks5 proxy support udp server." +msgstr "仅SOCKS5代理支持UDP服务器。" + +msgid "Please set proxy server first." +msgstr "请先设置代理服务器。" + +msgid "Proxy Server" +msgstr "代理服务器" + +msgid "Proxy Server Settings" +msgstr "代理服务器设置" + +msgid "Proxy Server URL, format: [socks5|http]://user:pass@ip:port." +msgstr "代理服务器地址,格式:[socks5|http]://user:pass@ip:port。" + +msgid "" +"Proxy server URL format error, format: [socks5|http]://user:pass@ip:port." +msgstr "代理服务器地址格式错误,格式:[socks5|http]://user:pass@ip:port。" + +msgid "Query DNS through specific dns server group, such as office, home." +msgstr "使用指定服务器组查询,比如office, home。" + +msgid "RUNNING" +msgstr "运行中" + +msgid "Reply Domain TTL Max" +msgstr "回应的域名TTL最大值" + +msgid "Reply maximum TTL for all domain result." +msgstr "设置返回给客户端的域名TTL最大值。" + +msgid "Report bugs" +msgstr "报告BUG" + +msgid "Resolve Local Hostnames" +msgstr "解析本地主机名" + +msgid "Resolve local hostnames by reading Dnsmasq lease file." +msgstr "读取Dnsmasq的租约文件解析本地主机名。" + +msgid "Response Mode" +msgstr "响应模式" + +msgid "Restart" +msgstr "重启" + +msgid "Restart Service" +msgstr "重启服务" + +msgid "Second Server Settings" +msgstr "第二DNS服务器" + +msgid "Serve expired" +msgstr "缓存过期服务" + +msgid "Server Group" +msgstr "服务器组" + +msgid "Server Group %s not exists" +msgstr "服务器组%s不存在" + +msgid "Server Name" +msgstr "服务器名称" + +msgid "Set Specific domain ip address." +msgstr "设置指定域名的IP地址。" + +msgid "Set Specific domain rule list." +msgstr "设置指定域名的规则列表。" + +msgid "Set Specific ip blacklist." +msgstr "设置指定的 IP 黑名单列表。" + +msgid "Set TLS hostname to verify." +msgstr "设置校验TLS主机名。" + +msgid "Set mark on packets." +msgstr "设置数据包标记。" + +msgid "" +"Set the HTTP host used for the query. Use this parameter when the host of " +"the URL address is an IP address." +msgstr "设置查询时使用的HTTP主机,当URL地址的host是IP地址时,使用此参数。" + +msgid "Sets the server name indication for query. '-' for disable SNI name." +msgstr "设置服务器SNI名称,‘-’表示禁用SNI名称。" + +msgid "Settings" +msgstr "设置" + +msgid "Skip Address Rules" +msgstr "跳过address规则" + +msgid "Skip Cache" +msgstr "跳过cache" + +msgid "Skip Cache." +msgstr "跳过cache。" + +msgid "Skip Dualstack Selection" +msgstr "跳过双栈优选" + +msgid "Skip Dualstack Selection." +msgstr "跳过双栈优选。" + +msgid "Skip Ipset Rule" +msgstr "跳过ipset规则" + +msgid "Skip Nameserver Rule" +msgstr "跳过Nameserver规则" + +msgid "Skip SOA Address Rule" +msgstr "跳过address SOA(#)规则" + +msgid "Skip SOA address rules." +msgstr "跳过address SOA(#)规则。" + +msgid "Skip Speed Check" +msgstr "跳过测速" + +msgid "Skip address rules." +msgstr "跳过address规则。" + +msgid "Skip ipset rules." +msgstr "跳过ipset规则。" + +msgid "Skip nameserver rules." +msgstr "跳过Nameserver规则。" + +msgid "SmartDNS" +msgstr "SmartDNS" + +msgid "SmartDNS Server" +msgstr "SmartDNS 服务器" + +msgid "" +"SmartDNS is a local high-performance DNS server, supports finding fastest " +"IP, supports ad filtering, and supports avoiding DNS poisoning." +msgstr "SmartDNS是一个本地高性能DNS服务器,支持返回最快IP,支持广告过滤。" + +msgid "SmartDNS official website" +msgstr "SmartDNS官方网站" + +msgid "Smartdns local server port" +msgstr "SmartDNS本地服务端口" + +msgid "" +"Smartdns local server port, smartdns will be automatically set as main dns " +"when the port is 53." +msgstr "" +"SmartDNS本地服务端口,当端口号设置为53时,smartdns将会自动配置为主dns。" + +msgid "" +"Smartdns response mode, First Ping: return the first ping IP, Fastest IP: " +"return the fastest IP, Fastest Response: return the fastest DNS response." +msgstr "" +"SmartDNS响应模式,最快PING: 返回最早有ping结果的IP,速度适中;最快IP: 返回" +"最快IP,查询请求可能延长; 最快响应:返回最快响应的结果,查询请求时间短。" + +msgid "Smartdns server name" +msgstr "SmartDNS的服务器名称,默认为smartdns,留空为主机名" + +msgid "Smartdns speed check mode." +msgstr "SmartDNS测速模式。" + +msgid "" +"Specify an IP address to return for any host in the given domains, Queries " +"in the domains are never forwarded and always replied to with the specified " +"IP address which may be IPv4 or IPv6." +msgstr "" +"配置特定域名返回特定的IP地址,域名查询将不到上游服务器请求,直接返回配置的IP" +"地址,可用于广告屏蔽。" + +msgid "Speed Check Mode" +msgstr "测速模式" + +msgid "Speed check mode is invalid." +msgstr "测速模式无效。" + +msgid "TCP Server" +msgstr "TCP服务器" + +msgid "TCP port is empty" +msgstr "TCP端口号为空" + +msgid "TLS Hostname Verify" +msgstr "校验TLS主机名" + +msgid "TLS SNI name" +msgstr "TLS SNI名称" + +msgid "TLS SPKI Pinning" +msgstr "TLS SPKI 指纹" + +msgid "TTL for all domain result." +msgstr "设置所有域名的 TTL 值。" + +msgid "Technical Support" +msgstr "技术支持" + +msgid "URL" +msgstr "URL" + +msgid "URL format error, format: http:// or https://" +msgstr "URL格式错误,格式:http://或https://" + +msgid "Update" +msgstr "更新" + +msgid "Update Files" +msgstr "更新文件" + +msgid "Upload Config File" +msgstr "上传配置文件" + +msgid "Upload Domain List File" +msgstr "上传域名列表文件" + +msgid "Upload domain list file to /etc/smartdns/domain-set" +msgstr "上传域名列表文件到/etc/smartdns/domain-set" + +msgid "" +"Upload domain list file, or configure auto download from Download File " +"Setting page." +msgstr "上传域名列表文件,或在下载文件设置页面设置自动下载。" + +msgid "Upload domain list file." +msgstr "上传域名列表文件" + +msgid "Upload smartdns config file to /etc/smartdns/conf.d" +msgstr "上传配置文件到/etc/smartdns/conf.d" + +msgid "Upstream DNS Server Configuration" +msgstr "上游DNS服务器配置" + +msgid "Upstream Servers" +msgstr "上游服务器" + +msgid "" +"Upstream Servers, support UDP, TCP protocol. Please configure multiple DNS " +"servers, including multiple foreign DNS servers." +msgstr "" +"上游 DNS 服务器,支持 UDP,TCP 协议。请配置多个上游 DNS 服务器,包括多个国内" +"外服务器。" + +msgid "Use Proxy" +msgstr "使用代理" + +msgid "Use proxy to connect to upstream DNS server." +msgstr "使用代理连接上游DNS服务器。" + +msgid "" +"Used to verify the validity of the TLS server, The value is Base64 encoded " +"SPKI fingerprint, leaving blank to indicate that the validity of TLS is not " +"verified." +msgstr "" +"用于校验 TLS 服务器的有效性,数值为 Base64 编码的 SPKI 指纹,留空表示不验证 " +"TLS 的合法性。" + +msgid "Write cache to disk on exit and load on startup." +msgstr "退出时保存cache到磁盘,启动时加载。" + +msgid "Yes" +msgstr "是" + +msgid "default" +msgstr "默认" + +msgid "domain list (/etc/smartdns/domain-set)" +msgstr "域名列表(/etc/smartdns/domain-set)" + +msgid "https" +msgstr "https" + +msgid "ip" +msgstr "ip" + +msgid "ipset name format error, format: [#[4|6]:]ipsetname" +msgstr "IPset名称格式错误,格式:[#[4|6]:]ipsetname" + +msgid "open website" +msgstr "打开网站" + +msgid "port" +msgstr "端口" + +msgid "smartdns config (/etc/smartdns/conf.d)" +msgstr "smartdns 配置文件(/etc/smartdns/conf.d)" + +msgid "smartdns custom settings" +msgstr "smartdns 自定义设置,具体配置参数参考指导" + +msgid "tcp" +msgstr "tcp" + +msgid "tls" +msgstr "tls" + +msgid "type" +msgstr "类型" + +msgid "udp" +msgstr "udp" diff --git a/luci-app-smartdns/po/zh_Hans b/luci-app-smartdns/po/zh_Hans new file mode 120000 index 00000000..41451e4a --- /dev/null +++ b/luci-app-smartdns/po/zh_Hans @@ -0,0 +1 @@ +zh-cn \ No newline at end of file diff --git a/luci-app-smartdns/root/etc/uci-defaults/50_luci-smartdns b/luci-app-smartdns/root/etc/uci-defaults/50_luci-smartdns new file mode 100644 index 00000000..88efcacb --- /dev/null +++ b/luci-app-smartdns/root/etc/uci-defaults/50_luci-smartdns @@ -0,0 +1,26 @@ +#!/bin/sh +# +# Copyright (C) 2018-2023 Ruilin Peng (Nick) . +# +# smartdns is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# smartdns is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +uci -q batch <<-EOF >/dev/null + delete ucitrack.@smartdns[-1] + add ucitrack smartdns + set ucitrack.@smartdns[-1].init=smartdns + commit ucitrack +EOF + +rm -f /tmp/luci-indexcache +exit 0 diff --git a/luci-app-ssr-plus/Makefile b/luci-app-ssr-plus/Makefile new file mode 100644 index 00000000..461f5539 --- /dev/null +++ b/luci-app-ssr-plus/Makefile @@ -0,0 +1,192 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=luci-app-ssr-plus +PKG_VERSION:=188 +PKG_RELEASE:=3 + +PKG_CONFIG_DEPENDS:= \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_NONE_V2RAY \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_V2ray \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Xray \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_ChinaDNS_NG \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_MosDNS \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Hysteria \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Tuic_Client \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadow_TLS \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_IPT2Socks \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Kcptun \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_NaiveProxy \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Redsocks2 \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_NONE_Client \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Libev_Client \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Client \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_NONE_Server \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Libev_Server \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Server \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Simple_Obfs \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_V2ray_Plugin \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Libev_Client \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Libev_Server \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Trojan + +LUCI_TITLE:=SS/SSR/V2Ray/Trojan/NaiveProxy/Tuic/ShadowTLS/Hysteria/Socks5/Tun LuCI interface +LUCI_PKGARCH:=all +LUCI_DEPENDS:= \ + @(PACKAGE_libustream-mbedtls||PACKAGE_libustream-openssl||PACKAGE_libustream-wolfssl) \ + +coreutils +coreutils-base64 +dns2socks +dns2tcp +dnsmasq-full +@PACKAGE_dnsmasq_full_ipset +ipset +kmod-ipt-nat \ + +ip-full +iptables +iptables-mod-tproxy +lua +lua-neturl +libuci-lua +microsocks \ + +tcping +resolveip +shadowsocksr-libev-ssr-check +uclient-fetch \ + +PACKAGE_$(PKG_NAME)_INCLUDE_V2ray:curl \ + +PACKAGE_$(PKG_NAME)_INCLUDE_V2ray:v2ray-core \ + +PACKAGE_$(PKG_NAME)_INCLUDE_Xray:curl \ + +PACKAGE_$(PKG_NAME)_INCLUDE_Xray:xray-core \ + +PACKAGE_$(PKG_NAME)_INCLUDE_ChinaDNS_NG:chinadns-ng \ + +PACKAGE_$(PKG_NAME)_INCLUDE_MosDNS:mosdns \ + +PACKAGE_$(PKG_NAME)_INCLUDE_Hysteria:hysteria \ + +PACKAGE_$(PKG_NAME)_INCLUDE_Tuic_Client:tuic-client \ + +PACKAGE_$(PKG_NAME)_INCLUDE_Shadow_TLS:shadow-tls \ + +PACKAGE_$(PKG_NAME)_INCLUDE_IPT2Socks:ipt2socks \ + +PACKAGE_$(PKG_NAME)_INCLUDE_Kcptun:kcptun-client \ + +PACKAGE_$(PKG_NAME)_INCLUDE_NaiveProxy:naiveproxy \ + +PACKAGE_$(PKG_NAME)_INCLUDE_Redsocks2:redsocks2 \ + +PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Libev_Client:shadowsocks-libev-ss-local \ + +PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Libev_Client:shadowsocks-libev-ss-redir \ + +PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Libev_Server:shadowsocks-libev-ss-server \ + +PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Client:shadowsocks-rust-sslocal \ + +PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Server:shadowsocks-rust-ssserver \ + +PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Simple_Obfs:simple-obfs \ + +PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_V2ray_Plugin:v2ray-plugin \ + +PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Libev_Client:shadowsocksr-libev-ssr-local \ + +PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Libev_Client:shadowsocksr-libev-ssr-redir \ + +PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Libev_Server:shadowsocksr-libev-ssr-server \ + +PACKAGE_$(PKG_NAME)_INCLUDE_Trojan:trojan + +define Package/$(PKG_NAME)/config +select PACKAGE_luci-lib-ipkg if PACKAGE_$(PKG_NAME) + +choice + prompt "Shadowsocks Client Selection" + default PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Client if aarch64 || x86_64 + default PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Libev_Client + + config PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_NONE_Client + bool "None" + + config PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Libev_Client + bool "Shadowsocks-libev" + + config PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Client + bool "Shadowsocks-rust" + depends on aarch64||arm||i386||mips||mipsel||x86_64 + depends on !(TARGET_x86_geode||TARGET_x86_legacy) +endchoice + +choice + prompt "Shadowsocks Server Selection" + default PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Server if aarch64 + default PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Libev_Server if i386||x86_64||arm + default PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_NONE_Server + + config PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_NONE_Server + bool "None" + + config PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Libev_Server + bool "Shadowsocks-libev" + + config PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Server + bool "Shadowsocks-rust" + depends on aarch64||arm||i386||mips||mipsel||x86_64 + depends on !(TARGET_x86_geode||TARGET_x86_legacy) +endchoice + +choice + prompt "V2ray-core Selection" + default PACKAGE_$(PKG_NAME)_INCLUDE_Xray if aarch64||arm||i386||x86_64 + default PACKAGE_$(PKG_NAME)_INCLUDE_NONE_V2RAY + + config PACKAGE_$(PKG_NAME)_INCLUDE_NONE_V2RAY + bool "None" + + config PACKAGE_$(PKG_NAME)_INCLUDE_V2ray + bool "V2ray-core" + + config PACKAGE_$(PKG_NAME)_INCLUDE_Xray + bool "Xray-core" +endchoice + +config PACKAGE_$(PKG_NAME)_INCLUDE_ChinaDNS_NG + bool "Include ChinaDNS-NG" + default y + +config PACKAGE_$(PKG_NAME)_INCLUDE_MosDNS + bool "Include MosDNS" + default y if i386||x86_64||arm + +config PACKAGE_$(PKG_NAME)_INCLUDE_Hysteria + bool "Include Hysteria" + select PACKAGE_$(PKG_NAME)_INCLUDE_ChinaDNS_NG + default n + +config PACKAGE_$(PKG_NAME)_INCLUDE_Tuic_Client + bool "Include Tuic-Client" + select PACKAGE_$(PKG_NAME)_INCLUDE_ChinaDNS_NG + select PACKAGE_$(PKG_NAME)_INCLUDE_IPT2Socks + depends on aarch64||arm||i386||x86_64 + depends on !(TARGET_x86_geode||TARGET_x86_legacy) + default n + +config PACKAGE_$(PKG_NAME)_INCLUDE_Shadow_TLS + bool "Include Shadow-TLS" + select PACKAGE_$(PKG_NAME)_INCLUDE_ChinaDNS_NG + select PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Client + depends on aarch64||arm||x86_64 + depends on !(TARGET_x86_geode||TARGET_x86_legacy) + default n + +config PACKAGE_$(PKG_NAME)_INCLUDE_IPT2Socks + bool "Include IPT2Socks" + default n + +config PACKAGE_$(PKG_NAME)_INCLUDE_Kcptun + bool "Include Kcptun" + default n + +config PACKAGE_$(PKG_NAME)_INCLUDE_NaiveProxy + bool "Include NaiveProxy" + depends on !(arc||armeb||mips||mips64||powerpc||TARGET_gemini) + default n + +config PACKAGE_$(PKG_NAME)_INCLUDE_Redsocks2 + bool "Include Redsocks2" + default n + +config PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Simple_Obfs + bool "Include Shadowsocks Simple Obfs Plugin" + default y + +config PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_V2ray_Plugin + bool "Include Shadowsocks V2ray Plugin" + default n + +config PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Libev_Client + bool "Include ShadowsocksR Libev Client" + default y + +config PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Libev_Server + bool "Include ShadowsocksR Libev Server" + default y if i386||x86_64||arm + +config PACKAGE_$(PKG_NAME)_INCLUDE_Trojan + bool "Include Trojan" + select PACKAGE_$(PKG_NAME)_INCLUDE_IPT2Socks + default n +endef + +define Package/$(PKG_NAME)/conffiles +/etc/config/shadowsocksr +/etc/ssrplus/ +endef + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua b/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua new file mode 100644 index 00000000..8ceaba7b --- /dev/null +++ b/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua @@ -0,0 +1,135 @@ +-- Copyright (C) 2017 yushi studio +-- Licensed to the public under the GNU General Public License v3. +module("luci.controller.shadowsocksr", package.seeall) + +function index() + if not nixio.fs.access("/etc/config/shadowsocksr") then + call("act_reset") + end + local page + page = entry({"admin", "services", "shadowsocksr"}, alias("admin", "services", "shadowsocksr", "client"), _("ShadowSocksR Plus+"), 10) + page.dependent = true + page.acl_depends = { "luci-app-ssr-plus" } + entry({"admin", "services", "shadowsocksr", "client"}, cbi("shadowsocksr/client"), _("SSR Client"), 10).leaf = true + entry({"admin", "services", "shadowsocksr", "servers"}, arcombine(cbi("shadowsocksr/servers", {autoapply = true}), cbi("shadowsocksr/client-config")), _("Servers Nodes"), 20).leaf = true + entry({"admin", "services", "shadowsocksr", "control"}, cbi("shadowsocksr/control"), _("Access Control"), 30).leaf = true + entry({"admin", "services", "shadowsocksr", "advanced"}, cbi("shadowsocksr/advanced"), _("Advanced Settings"), 50).leaf = true + entry({"admin", "services", "shadowsocksr", "server"}, arcombine(cbi("shadowsocksr/server"), cbi("shadowsocksr/server-config")), _("SSR Server"), 60).leaf = true + entry({"admin", "services", "shadowsocksr", "status"}, form("shadowsocksr/status"), _("Status"), 70).leaf = true + entry({"admin", "services", "shadowsocksr", "check"}, call("check_status")) + entry({"admin", "services", "shadowsocksr", "refresh"}, call("refresh_data")) + entry({"admin", "services", "shadowsocksr", "subscribe"}, call("subscribe")) + entry({"admin", "services", "shadowsocksr", "checkport"}, call("check_port")) + entry({"admin", "services", "shadowsocksr", "log"}, form("shadowsocksr/log"), _("Log"), 80).leaf = true + entry({"admin", "services", "shadowsocksr", "run"}, call("act_status")) + entry({"admin", "services", "shadowsocksr", "ping"}, call("act_ping")) + entry({"admin", "services", "shadowsocksr", "reset"}, call("act_reset")) + entry({"admin", "services", "shadowsocksr", "restart"}, call("act_restart")) + entry({"admin", "services", "shadowsocksr", "delete"}, call("act_delete")) +end + +function subscribe() + luci.sys.call("/usr/bin/lua /usr/share/shadowsocksr/subscribe.lua >>/var/log/ssrplus.log") + luci.http.prepare_content("application/json") + luci.http.write_json({ret = 1}) +end + +function act_status() + local e = {} + e.running = luci.sys.call("busybox ps -w | grep ssr-retcp | grep -v grep >/dev/null") == 0 + luci.http.prepare_content("application/json") + luci.http.write_json(e) +end + +function act_ping() + local e = {} + local domain = luci.http.formvalue("domain") + local port = luci.http.formvalue("port") + local transport = luci.http.formvalue("transport") + local wsPath = luci.http.formvalue("wsPath") + local tls = luci.http.formvalue("tls") + e.index = luci.http.formvalue("index") + local iret = luci.sys.call("ipset add ss_spec_wan_ac " .. domain .. " 2>/dev/null") + if transport == "ws" then + local prefix = tls=='1' and "https://" or "http://" + local address = prefix..domain..':'..port..wsPath + local result = luci.sys.exec("curl --http1.1 -m 2 -ksN -o /dev/null -w 'time_connect=%{time_connect}\nhttp_code=%{http_code}' -H 'Connection: Upgrade' -H 'Upgrade: websocket' -H 'Sec-WebSocket-Key: SGVsbG8sIHdvcmxkIQ==' -H 'Sec-WebSocket-Version: 13' "..address) + e.socket = string.match(result,"http_code=(%d+)")=="101" + e.ping = tonumber(string.match(result, "time_connect=(%d+.%d%d%d)"))*1000 + else + local socket = nixio.socket("inet", "stream") + socket:setopt("socket", "rcvtimeo", 3) + socket:setopt("socket", "sndtimeo", 3) + e.socket = socket:connect(domain, port) + socket:close() + -- e.ping = luci.sys.exec("ping -c 1 -W 1 %q 2>&1 | grep -o 'time=[0-9]*.[0-9]' | awk -F '=' '{print$2}'" % domain) + -- if (e.ping == "") then + e.ping = luci.sys.exec(string.format("echo -n $(tcping -q -c 1 -i 1 -t 2 -p %s %s 2>&1 | grep -o 'time=[0-9]*' | awk -F '=' '{print $2}') 2>/dev/null", port, domain)) + -- end + end + if (iret == 0) then + luci.sys.call(" ipset del ss_spec_wan_ac " .. domain) + end + luci.http.prepare_content("application/json") + luci.http.write_json(e) +end + +function check_status() + local e = {} + e.ret = luci.sys.call("/usr/bin/ssr-check www." .. luci.http.formvalue("set") .. ".com 80 3 1") + luci.http.prepare_content("application/json") + luci.http.write_json(e) +end + +function refresh_data() + local set = luci.http.formvalue("set") + local retstring = loadstring("return " .. luci.sys.exec("/usr/bin/lua /usr/share/shadowsocksr/update.lua " .. set))() + luci.http.prepare_content("application/json") + luci.http.write_json(retstring) +end + +function check_port() + local retstring = "

" + local s + local server_name = "" + local uci = luci.model.uci.cursor() + local iret = 1 + uci:foreach("shadowsocksr", "servers", function(s) + if s.alias then + server_name = s.alias + elseif s.server and s.server_port then + server_name = "%s:%s" % {s.server, s.server_port} + end + iret = luci.sys.call("ipset add ss_spec_wan_ac " .. s.server .. " 2>/dev/null") + socket = nixio.socket("inet", "stream") + socket:setopt("socket", "rcvtimeo", 3) + socket:setopt("socket", "sndtimeo", 3) + ret = socket:connect(s.server, s.server_port) + if tostring(ret) == "true" then + socket:close() + retstring = retstring .. "[" .. server_name .. "] OK.
" + else + retstring = retstring .. "[" .. server_name .. "] Error.
" + end + if iret == 0 then + luci.sys.call("ipset del ss_spec_wan_ac " .. s.server) + end + end) + luci.http.prepare_content("application/json") + luci.http.write_json({ret = retstring}) +end + +function act_reset() + luci.sys.call("/etc/init.d/shadowsocksr reset &") + luci.http.redirect(luci.dispatcher.build_url("admin", "services", "shadowsocksr")) +end + +function act_restart() + luci.sys.call("/etc/init.d/shadowsocksr restart &") + luci.http.redirect(luci.dispatcher.build_url("admin", "services", "shadowsocksr")) +end + +function act_delete() + luci.sys.call("/etc/init.d/shadowsocksr restart &") + luci.http.redirect(luci.dispatcher.build_url("admin", "services", "shadowsocksr", "servers")) +end diff --git a/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua b/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua new file mode 100644 index 00000000..ea08f58b --- /dev/null +++ b/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua @@ -0,0 +1,140 @@ +local uci = luci.model.uci.cursor() +local server_table = {} + +uci:foreach("shadowsocksr", "servers", function(s) + if s.alias then + server_table[s[".name"]] = "[%s]:%s" % {string.upper(s.v2ray_protocol or s.type), s.alias} + elseif s.server and s.server_port then + server_table[s[".name"]] = "[%s]:%s:%s" % {string.upper(s.v2ray_protocol or s.type), s.server, s.server_port} + end +end) + +local key_table = {} +for key, _ in pairs(server_table) do + table.insert(key_table, key) +end + +table.sort(key_table) + +m = Map("shadowsocksr") +-- [[ global ]]-- +s = m:section(TypedSection, "global", translate("Server failsafe auto swith and custom update settings")) +s.anonymous = true + +-- o = s:option(Flag, "monitor_enable", translate("Enable Process Deamon")) +-- o.rmempty = false +-- o.default = "1" + +o = s:option(Flag, "enable_switch", translate("Enable Auto Switch")) +o.rmempty = false +o.default = "1" + +o = s:option(Value, "switch_time", translate("Switch check cycly(second)")) +o.datatype = "uinteger" +o:depends("enable_switch", "1") +o.default = 667 + +o = s:option(Value, "switch_timeout", translate("Check timout(second)")) +o.datatype = "uinteger" +o:depends("enable_switch", "1") +o.default = 5 + +o = s:option(Value, "switch_try_count", translate("Check Try Count")) +o.datatype = "uinteger" +o:depends("enable_switch", "1") +o.default = 3 + +o = s:option(Value, "gfwlist_url", translate("gfwlist Update url")) +o:value("https://fastly.jsdelivr.net/gh/YW5vbnltb3Vz/domain-list-community@release/gfwlist.txt", translate("v2fly/domain-list-community")) +o:value("https://fastly.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/gfw.txt", translate("Loyalsoldier/v2ray-rules-dat")) +o:value("https://fastly.jsdelivr.net/gh/Loukky/gfwlist-by-loukky/gfwlist.txt", translate("Loukky/gfwlist-by-loukky")) +o:value("https://fastly.jsdelivr.net/gh/gfwlist/gfwlist/gfwlist.txt", translate("gfwlist/gfwlist")) +o.default = "https://fastly.jsdelivr.net/gh/YW5vbnltb3Vz/domain-list-community@release/gfwlist.txt" + +o = s:option(Value, "chnroute_url", translate("Chnroute Update url")) +o:value("https://ispip.clang.cn/all_cn.txt", translate("Clang.CN")) +o:value("https://ispip.clang.cn/all_cn_cidr.txt", translate("Clang.CN.CIDR")) +o:value("https://fastly.jsdelivr.net/gh/gaoyifan/china-operator-ip@ip-lists/china.txt", translate("china-operator-ip")) +o.default = "https://ispip.clang.cn/all_cn.txt" + +o = s:option(Flag, "netflix_enable", translate("Enable Netflix Mode")) +o.rmempty = false + +o = s:option(Value, "nfip_url", translate("nfip_url")) +o:value("https://fastly.jsdelivr.net/gh/QiuSimons/Netflix_IP/NF_only.txt", translate("Netflix IP Only")) +o:value("https://fastly.jsdelivr.net/gh/QiuSimons/Netflix_IP/getflix.txt", translate("Netflix and AWS")) +o.default = "https://fastly.jsdelivr.net/gh/QiuSimons/Netflix_IP/NF_only.txt" +o.description = translate("Customize Netflix IP Url") +o:depends("netflix_enable", "1") + +o = s:option(ListValue, "shunt_dns_mode", translate("DNS Query Mode For Shunt Mode")) +o:value("1", translate("Use DNS2SOCKS query and cache")) +o:value("2", translate("Use MOSDNS query")) +o:depends("netflix_enable", "1") +o.default = 1 + +o = s:option(Value, "shunt_dnsserver", translate("Anti-pollution DNS Server For Shunt Mode")) +o:value("8.8.4.4:53", translate("Google Public DNS (8.8.4.4)")) +o:value("8.8.8.8:53", translate("Google Public DNS (8.8.8.8)")) +o:value("208.67.222.222:53", translate("OpenDNS (208.67.222.222)")) +o:value("208.67.220.220:53", translate("OpenDNS (208.67.220.220)")) +o:value("209.244.0.3:53", translate("Level 3 Public DNS (209.244.0.3)")) +o:value("209.244.0.4:53", translate("Level 3 Public DNS (209.244.0.4)")) +o:value("4.2.2.1:53", translate("Level 3 Public DNS (4.2.2.1)")) +o:value("4.2.2.2:53", translate("Level 3 Public DNS (4.2.2.2)")) +o:value("4.2.2.3:53", translate("Level 3 Public DNS (4.2.2.3)")) +o:value("4.2.2.4:53", translate("Level 3 Public DNS (4.2.2.4)")) +o:value("1.1.1.1:53", translate("Cloudflare DNS (1.1.1.1)")) +o:depends("shunt_dns_mode", "1") +o.description = translate("Custom DNS Server format as IP:PORT (default: 8.8.4.4:53)") +o.datatype = "ip4addrport" + +o = s:option(ListValue, "shunt_mosdns_dnsserver", translate("Anti-pollution DNS Server")) +o:value("tcp://8.8.4.4:53,tcp://8.8.8.8:53", translate("Google Public DNS")) +o:value("tcp://208.67.222.222:53,tcp://208.67.220.220:53", translate("OpenDNS")) +o:value("tcp://209.244.0.3:53,tcp://209.244.0.4:53", translate("Level 3 Public DNS-1 (209.244.0.3-4)")) +o:value("tcp://4.2.2.1:53,tcp://4.2.2.2:53", translate("Level 3 Public DNS-2 (4.2.2.1-2)")) +o:value("tcp://4.2.2.3:53,tcp://4.2.2.4:53", translate("Level 3 Public DNS-3 (4.2.2.3-4)")) +o:value("tcp://1.1.1.1:53,tcp://1.0.0.1:53", translate("Cloudflare DNS")) +o:depends("shunt_dns_mode", "2") +o.description = translate("Custom DNS Server for mosdns") + +o = s:option(Flag, "shunt_mosdns_ipv6", translate("Disable IPv6 In MOSDNS Query Mode (Shunt Mode)")) +o:depends("shunt_dns_mode", "2") +o.rmempty = false +o.default = "0" + +o = s:option(Flag, "adblock", translate("Enable adblock")) +o.rmempty = false + +o = s:option(Value, "adblock_url", translate("adblock_url")) +o:value("https://raw.githubusercontent.com/neodevpro/neodevhost/master/lite_dnsmasq.conf", translate("NEO DEV HOST Lite")) +o:value("https://raw.githubusercontent.com/neodevpro/neodevhost/master/dnsmasq.conf", translate("NEO DEV HOST Full")) +o:value("https://anti-ad.net/anti-ad-for-dnsmasq.conf", translate("anti-AD")) +o.default = "https://raw.githubusercontent.com/neodevpro/neodevhost/master/lite_dnsmasq.conf" +o:depends("adblock", "1") +o.description = translate("Support AdGuardHome and DNSMASQ format list") + +o = s:option(Button, "reset", translate("Reset to defaults")) +o.rawhtml = true +o.template = "shadowsocksr/reset" + +-- [[ SOCKS5 Proxy ]]-- +s = m:section(TypedSection, "socks5_proxy", translate("Global SOCKS5 Proxy Server")) +s.anonymous = true + +o = s:option(ListValue, "server", translate("Server")) +o:value("nil", translate("Disable")) +o:value("same", translate("Same as Global Server")) +for _, key in pairs(key_table) do + o:value(key, server_table[key]) +end +o.default = "nil" +o.rmempty = false + +o = s:option(Value, "local_port", translate("Local Port")) +o.datatype = "port" +o.default = 1080 +o.rmempty = false + +return m diff --git a/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua b/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua new file mode 100644 index 00000000..fa81be4a --- /dev/null +++ b/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua @@ -0,0 +1,1029 @@ +-- Copyright (C) 2017 yushi studio github.com/ywb94 +-- Licensed to the public under the GNU General Public License v3. + +require "nixio.fs" +require "luci.sys" +require "luci.http" +require "luci.model.ipkg" + +local m, s, o +local sid = arg[1] +local uuid = luci.sys.exec("cat /proc/sys/kernel/random/uuid") + +local function is_finded(e) + return luci.sys.exec('type -t -p "%s"' % e) ~= "" and true or false +end + +local function is_installed(e) + return luci.model.ipkg.installed(e) +end + +local server_table = {} +local encrypt_methods = { + -- ssr + "none", + "table", + "rc4", + "rc4-md5-6", + "rc4-md5", + "aes-128-cfb", + "aes-192-cfb", + "aes-256-cfb", + "aes-128-ctr", + "aes-192-ctr", + "aes-256-ctr", + "bf-cfb", + "camellia-128-cfb", + "camellia-192-cfb", + "camellia-256-cfb", + "cast5-cfb", + "des-cfb", + "idea-cfb", + "rc2-cfb", + "seed-cfb", + "salsa20", + "chacha20", + "chacha20-ietf" +} + +local encrypt_methods_ss = { + -- plain + "none", + "plain", + -- aead + "aes-128-gcm", + "aes-192-gcm", + "aes-256-gcm", + "chacha20-ietf-poly1305", + "xchacha20-ietf-poly1305", + -- aead 2022 + "2022-blake3-aes-128-gcm", + "2022-blake3-aes-256-gcm", + "2022-blake3-chacha20-poly1305" + --[[ stream + "none", + "plain", + "table", + "rc4", + "rc4-md5", + "aes-128-cfb", + "aes-192-cfb", + "aes-256-cfb", + "aes-128-ctr", + "aes-192-ctr", + "aes-256-ctr", + "bf-cfb", + "camellia-128-cfb", + "camellia-192-cfb", + "camellia-256-cfb", + "salsa20", + "chacha20", + "chacha20-ietf" ]] +} + +local protocol = { + -- ssr + "origin", + "verify_deflate", + "auth_sha1_v4", + "auth_aes128_sha1", + "auth_aes128_md5", + "auth_chain_a", + "auth_chain_b", + "auth_chain_c", + "auth_chain_d", + "auth_chain_e", + "auth_chain_f" +} + +local obfs = { + -- ssr + "plain", + "http_simple", + "http_post", + "random_head", + "tls1.2_ticket_auth" +} + +local securitys = { + -- vmess + "auto", + "none", + "zero", + "aes-128-gcm", + "chacha20-poly1305" +} + +local tls_flows = { + -- tls + "xtls-rprx-vision", + "xtls-rprx-vision-udp443" +} + +m = Map("shadowsocksr", translate("Edit ShadowSocksR Server")) +m.redirect = luci.dispatcher.build_url("admin/services/shadowsocksr/servers") +if m.uci:get("shadowsocksr", sid) ~= "servers" then + luci.http.redirect(m.redirect) + return +end + +-- [[ Servers Setting ]]-- +s = m:section(NamedSection, sid, "servers") +s.anonymous = true +s.addremove = false + +o = s:option(DummyValue, "ssr_url", "SS/SSR/V2RAY/TROJAN URL") +o.rawhtml = true +o.template = "shadowsocksr/ssrurl" +o.value = sid + +o = s:option(ListValue, "type", translate("Server Node Type")) +if is_finded("xray") or is_finded("v2ray") then + o:value("v2ray", translate("V2Ray/XRay")) +end +if is_finded("ssr-redir") then + o:value("ssr", translate("ShadowsocksR")) +end +if is_finded("ss-local") or is_finded("ss-redir") then + o:value("ss", translate("Shadowsocks-libev Version")) +end +if is_finded("sslocal") or is_finded("ssmanager") then + o:value("ss", translate("Shadowsocks-rust Version")) +end +if is_finded("trojan") then + o:value("trojan", translate("Trojan")) +end +if is_finded("naive") then + o:value("naiveproxy", translate("NaiveProxy")) +end +if is_finded("hysteria") then + o:value("hysteria", translate("Hysteria")) +end +if is_finded("tuic-client") then + o:value("tuic", translate("TUIC")) +end +if is_finded("shadow-tls") and is_finded("sslocal") then + o:value("shadowtls", translate("Shadow-TLS")) +end +if is_finded("ipt2socks") then + o:value("socks5", translate("Socks5")) +end +if is_finded("redsocks2") then + o:value("tun", translate("Network Tunnel")) +end + +o.description = translate("Using incorrect encryption mothod may causes service fail to start") + +o = s:option(Value, "alias", translate("Alias(optional)")) + +o = s:option(ListValue, "iface", translate("Network interface to use")) +for _, e in ipairs(luci.sys.net.devices()) do + if e ~= "lo" then + o:value(e) + end +end +o:depends("type", "tun") +o.description = translate("Redirect traffic to this network interface") + +o = s:option(ListValue, "v2ray_protocol", translate("V2Ray/XRay protocol")) +o:value("vless", translate("VLESS")) +o:value("vmess", translate("VMess")) +o:value("trojan", translate("Trojan")) +o:value("shadowsocks", translate("Shadowsocks")) +if is_finded("xray") then + o:value("wireguard", translate("WireGuard")) +end +o:value("socks", translate("Socks")) +o:value("http", translate("HTTP")) +o:depends("type", "v2ray") + +o = s:option(Value, "server", translate("Server Address")) +o.datatype = "host" +o.rmempty = false +o:depends("type", "ssr") +o:depends("type", "ss") +o:depends("type", "v2ray") +o:depends("type", "trojan") +o:depends("type", "naiveproxy") +o:depends("type", "hysteria") +o:depends("type", "tuic") +o:depends("type", "shadowtls") +o:depends("type", "socks5") + +o = s:option(Value, "server_port", translate("Server Port")) +o.datatype = "port" +o.rmempty = true +o:depends("type", "ssr") +o:depends("type", "ss") +o:depends("type", "v2ray") +o:depends("type", "trojan") +o:depends("type", "naiveproxy") +o:depends({type = "hysteria",port_hopping = false}) +o:depends("type", "tuic") +o:depends("type", "shadowtls") +o:depends("type", "socks5") + +o = s:option(Flag, "auth_enable", translate("Enable Authentication")) +o.rmempty = false +o.default = "0" +o:depends("type", "socks5") +o:depends({type = "v2ray", v2ray_protocol = "http"}) +o:depends({type = "v2ray", v2ray_protocol = "socks"}) + +o = s:option(Value, "username", translate("Username")) +o.rmempty = true +o:depends("type", "naiveproxy") +o:depends({type = "socks5", auth_enable = true}) +o:depends({type = "v2ray", v2ray_protocol = "http", auth_enable = true}) +o:depends({type = "v2ray", v2ray_protocol = "socks", auth_enable = true}) + +o = s:option(Value, "password", translate("Password")) +o.password = true +o.rmempty = true +o:depends("type", "ssr") +o:depends("type", "ss") +o:depends("type", "trojan") +o:depends("type", "naiveproxy") +o:depends("type", "shadowtls") +o:depends({type = "socks5", auth_enable = true}) +o:depends({type = "v2ray", v2ray_protocol = "http", auth_enable = true}) +o:depends({type = "v2ray", v2ray_protocol = "socks", socks_ver = "5", auth_enable = true}) +o:depends({type = "v2ray", v2ray_protocol = "shadowsocks"}) +o:depends({type = "v2ray", v2ray_protocol = "trojan"}) + +o = s:option(ListValue, "encrypt_method", translate("Encrypt Method")) +for _, v in ipairs(encrypt_methods) do + o:value(v) +end +o.rmempty = true +o:depends("type", "ssr") + +o = s:option(ListValue, "encrypt_method_ss", translate("Encrypt Method")) +for _, v in ipairs(encrypt_methods_ss) do + o:value(v) +end +o.rmempty = true +o:depends("type", "ss") +o:depends({type = "v2ray", v2ray_protocol = "shadowsocks"}) + +o = s:option(Flag, "uot", translate("UDP over TCP")) +o.description = translate("Enable the SUoT protocol, requires server support.") +o.rmempty = true +o:depends({type = "v2ray", v2ray_protocol = "shadowsocks"}) +o.default = "0" + +o = s:option(Flag, "ivCheck", translate("Bloom Filter")) +o.rmempty = true +o:depends({type = "v2ray", v2ray_protocol = "shadowsocks"}) +o.default = "1" + +-- Shadowsocks Plugin +o = s:option(Value, "plugin", translate("Obfs")) +o:value("none", translate("None")) +if is_finded("obfs-local") then + o:value("obfs-local", translate("obfs-local")) +end +if is_finded("v2ray-plugin") then + o:value("v2ray-plugin", translate("v2ray-plugin")) +end +if is_finded("xray-plugin") then + o:value("xray-plugin", translate("xray-plugin")) +end +o.rmempty = true +o:depends("type", "ss") + +o = s:option(Value, "plugin_opts", translate("Plugin Opts")) +o.rmempty = true +o:depends("type", "ss") + +o = s:option(ListValue, "protocol", translate("Protocol")) +for _, v in ipairs(protocol) do + o:value(v) +end +o.rmempty = true +o:depends("type", "ssr") + +o = s:option(Value, "protocol_param", translate("Protocol param (optional)")) +o:depends("type", "ssr") + +o = s:option(ListValue, "obfs", translate("Obfs")) +for _, v in ipairs(obfs) do + o:value(v) +end +o.rmempty = true +o:depends("type", "ssr") + +o = s:option(Value, "obfs_param", translate("Obfs param (optional)")) +o:depends("type", "ssr") + + +-- [[ Hysteria2 ]]-- +o = s:option(Value, "hy2_auth", translate("Users Authentication")) +o:depends("type", "hysteria") +o.rmempty = false + +o = s:option(ListValue, "transport_protocol", translate("Protocol")) +o:depends("type", "hysteria") +o:value("udp", translate("udp")) +o.default = "udp" +o.rmempty = true + +o = s:option(Flag, "port_hopping", translate("Enable Port Hopping")) +o:depends("type", "hysteria") +o.rmempty = true +o.default = "0" + +o = s:option(Value, "hopinterval", translate("Port Hopping Interval(Unit:Second)")) +o:depends({type = "hysteria", port_hopping = true}) +o.datatype = "uinteger" +o.rmempty = true +o.default = "30" + +o = s:option(Value, "port_range", translate("Port Range")) +o:depends({type = "hysteria", port_hopping = true}) +o.rmempty = false + +o = s:option(Flag, "lazy_mode", translate("Enable Lazy Mode")) +o:depends("type", "hysteria") +o.rmempty = true +o.default = "0" + +o = s:option(Flag, "flag_obfs", translate("Enable Obfuscation")) +o:depends("type", "hysteria") +o.rmempty = true +o.default = "0" + +o = s:option(Value, "obfs_type", translate("Obfuscation Type")) +o:depends({type = "hysteria", flag_obfs = "1"}) +o.rmempty = true +o.default = "salamander" + +o = s:option(Value, "salamander", translate("Obfuscation Password")) +o:depends({type = "hysteria", flag_obfs = "1"}) +o.rmempty = true +o.default = "cry_me_a_r1ver" + +o = s:option(Flag, "flag_quicparam", translate("Hysterir QUIC parameters")) +o:depends("type", "hysteria") +o.rmempty = true +o.default = "0" + +--[[Hysteria2 QUIC parameters setting]] +o = s:option(Value, "initstreamreceivewindow", translate("QUIC initStreamReceiveWindow")) +o:depends({type = "hysteria", flag_quicparam = "1"}) +o.datatype = "uinteger" +o.rmempty = true +o.default = "8388608" + +o = s:option(Value, "maxstreamseceivewindow", translate("QUIC maxStreamReceiveWindow")) +o:depends({type = "hysteria", flag_quicparam = "1"}) +o.datatype = "uinteger" +o.rmempty = true +o.default = "8388608" + +o = s:option(Value, "initconnreceivewindow", translate("QUIC initConnReceiveWindow")) +o:depends({type = "hysteria", flag_quicparam = "1"}) +o.datatype = "uinteger" +o.rmempty = true +o.default = "20971520" + +o = s:option(Value, "maxconnreceivewindow", translate("QUIC maxConnReceiveWindow")) +o:depends({type = "hysteria", flag_quicparam = "1"}) +o.datatype = "uinteger" +o.rmempty = true +o.default = "20971520" + +o = s:option(Value, "maxidletimeout", translate("QUIC maxIdleTimeout(Unit:second)")) +o:depends({type = "hysteria", flag_quicparam = "1"}) +o.rmempty = true +o.datatype = "uinteger" +o.default = "30" + +o = s:option(Value, "keepaliveperiod", translate("The keep-alive period.(Unit:second)")) +o:depends({type = "hysteria", flag_quicparam = "1"}) +o.rmempty = true +o.datatype = "uinteger" +o.default = "10" + +o = s:option(Flag, "disablepathmtudiscovery", translate("Disable Path MTU discovery")) +o:depends({type = "hysteria", flag_quicparam = "1"}) +o.rmempty = true +o.default = false + + +--[[ Shadow-TLS Options ]] +o = s:option(ListValue, "shadowtls_protocol", translate("shadowTLS protocol Version")) +o:depends("type", "shadowtls") +o:value("v3", translate("Enable V3 protocol.")) +o:value("v2", translate("Enable V2 protocol.")) +o.default = "v3" +o.rmempty = true + +o = s:option(Flag, "strict", translate("TLS 1.3 Strict mode")) +o:depends("type", "shadowtls") +o.default = "1" +o.rmempty = false + +o = s:option(Flag, "fastopen", translate("TCP Fast Open")) +o:depends("type", "shadowtls") +o.default = "0" +o.rmempty = false + +o = s:option(Flag, "disable_nodelay", translate("Disable TCP No_delay")) +o:depends("type", "shadowtls") +o.default = "0" +o.rmempty = true + +o = s:option(Value, "shadowtls_sni", translate("shadow-TLS SNI")) +o:depends("type", "shadowtls") +o.datatype = "host" +o.rmempty = true +o.default = "" + +--[[ add a ListValue for Choose chain type,sslocal or vmess ]] +o = s:option(ListValue, "chain_type", translate("Shadow-TLS ChainPoxy type")) +o:depends("type", "shadowtls") +if is_finded("sslocal") then + o:value("sslocal", translate("Shadowsocks-rust Version")) +end +if is_finded("xray") or is_finded("v2ray") then + o:value("vmess", translate("Vmess Protocol")) +end +o.default = "sslocal" +o.rmempty = false + +o = s:option(Value, "sslocal_password",translate("Shadowsocks password")) +o:depends({type = "shadowtls", chain_type = "sslocal"}) +o.rmempty = true + +o = s:option(ListValue, "sslocal_method", translate("Encrypt Method")) +o:depends({type = "shadowtls", chain_type = "sslocal"}) +for _, v in ipairs(encrypt_methods_ss) do + o:value(v) +end + +o = s:option(Value, "vmess_uuid", translate("Vmess UUID")) +o:depends({type = "shadowtls", chain_type = "vmess"}) +o.rmempty = false +o.default = uuid + +o = s:option(ListValue, "vmess_method", translate("Encrypt Method")) +o:depends({type = "shadowtls", chain_type = "vmess"}) +for _, v in ipairs(securitys) do + o:value(v, v:lower()) +end +o.rmempty = true +o.default="auto" + +-- [[ TUIC ]] +-- TuicNameId +o = s:option(Value, "tuic_uuid", translate("TUIC User UUID")) +o.rmempty = true +o.default = uuid +o:depends("type", "tuic") + +--Tuic IP +o = s:option(Value, "tuic_ip", translate("TUIC Server IP Address")) +o.rmempty = true +o.datatype = "ip4addr" +o.default = "" +o:depends("type", "tuic") + +-- Tuic Password +o = s:option(Value, "tuic_passwd", translate("TUIC User Password")) +o.rmempty = true +o.default = "" +o:depends("type", "tuic") + + +o = s:option(ListValue, "udp_relay_mode", translate("UDP relay mode")) +o:depends("type", "tuic") +o:value("native", translate("native UDP characteristics")) +o:value("quic", translate("lossless UDP relay using QUIC streams")) +o.default = "native" +o.rmempty = true + +o = s:option(ListValue, "congestion_control", translate("Congestion control algorithm")) +o:depends("type", "tuic") +o:value("bbr", translate("BBR")) +o:value("cubic", translate("CUBIC")) +o:value("new_reno", translate("New Reno")) +o.default = "cubic" +o.rmempty = true + +o = s:option(Value, "heartbeat", translate("Heartbeat interval(second)")) +o:depends("type", "tuic") +o.datatype = "uinteger" +o.default = "3" +o.rmempty = true + +o = s:option(Value, "timeout", translate("Timeout for establishing a connection to server(second)")) +o:depends("type", "tuic") +o.datatype = "uinteger" +o.default = "8" +o.rmempty = true + +o = s:option(Value, "gc_interval", translate("Garbage collection interval(second)")) +o:depends("type", "tuic") +o.datatype = "uinteger" +o.default = "3" +o.rmempty = true + +o = s:option(Value, "gc_lifetime", translate("Garbage collection lifetime(second)")) +o:depends("type", "tuic") +o.datatype = "uinteger" +o.default = "15" +o.rmempty = true + +o = s:option(Value, "send_window", translate("TUIC send window")) +o:depends("type", "tuic") +o.datatype = "uinteger" +o.default = 20971520 +o.rmempty = true + +o = s:option(Value, "receive_window", translate("TUIC receive window")) +o:depends("type", "tuic") +o.datatype = "uinteger" +o.default = 10485760 +o.rmempty = true + +o = s:option(Flag, "disable_sni", translate("Disable SNI")) +o:depends("type", "tuic") +o.default = "0" +o.rmempty = true + +o = s:option(Flag, "zero_rtt_handshake", translate("Enable 0-RTT QUIC handshake")) +o:depends("type", "tuic") +o.default = "0" +o.rmempty = true + +-- Tuic settings for the local inbound socks5 server +o = s:option(Flag, "tuic_dual_stack", translate("Dual-stack Listening Socket")) +o:depends("type", "tuic") +o.default = "0" +o.rmempty = true + +o = s:option(Value, "tuic_max_package_size", translate("Maximum packet size the socks5 server can receive from external")) +o:depends("type", "tuic") +o.datatype = "uinteger" +o.default = 1500 +o.rmempty = true + +-- AlterId +o = s:option(Value, "alter_id", translate("AlterId")) +o.datatype = "port" +o.default = 16 +o.rmempty = true +o:depends({type = "v2ray", v2ray_protocol = "vmess"}) + +-- VmessId +o = s:option(Value, "vmess_id", translate("Vmess/VLESS ID (UUID)")) +o.rmempty = true +o.default = uuid +o:depends({type = "v2ray", v2ray_protocol = "vmess"}) +o:depends({type = "v2ray", v2ray_protocol = "vless"}) + +-- VLESS Encryption +o = s:option(Value, "vless_encryption", translate("VLESS Encryption")) +o.rmempty = true +o.default = "none" +o:depends({type = "v2ray", v2ray_protocol = "vless"}) + +-- 加密方式 +o = s:option(ListValue, "security", translate("Encrypt Method")) +for _, v in ipairs(securitys) do + o:value(v, v:upper()) +end +o.rmempty = true +o:depends({type = "v2ray", v2ray_protocol = "vmess"}) + +-- SOCKS Version +o = s:option(ListValue, "socks_ver", translate("Socks Version")) +o:value("4", "Socks4") +o:value("4a", "Socks4A") +o:value("5", "Socks5") +o.rmempty = true +o.default = "5" +o:depends({type = "v2ray", v2ray_protocol = "socks"}) + +-- 传输协议 +o = s:option(ListValue, "transport", translate("Transport")) +o:value("tcp", "TCP") +o:value("kcp", "mKCP") +o:value("ws", "WebSocket") +o:value("h2", "HTTP/2") +o:value("quic", "QUIC") +o:value("grpc", "gRPC") +o.rmempty = true +o:depends({type = "v2ray", v2ray_protocol = "vless"}) +o:depends({type = "v2ray", v2ray_protocol = "vmess"}) +o:depends({type = "v2ray", v2ray_protocol = "trojan"}) +o:depends({type = "v2ray", v2ray_protocol = "shadowsocks"}) +o:depends({type = "v2ray", v2ray_protocol = "socks"}) +o:depends({type = "v2ray", v2ray_protocol = "http"}) + +-- [[ TCP部分 ]]-- +-- TCP伪装 +o = s:option(ListValue, "tcp_guise", translate("Camouflage Type")) +o:depends("transport", "tcp") +o:value("none", translate("None")) +o:value("http", "HTTP") +o.rmempty = true + +-- HTTP域名 +o = s:option(Value, "http_host", translate("HTTP Host")) +o:depends("tcp_guise", "http") +o.rmempty = true + +-- HTTP路径 +o = s:option(Value, "http_path", translate("HTTP Path")) +o:depends("tcp_guise", "http") +o.rmempty = true + +-- [[ WS部分 ]]-- +-- WS域名 +o = s:option(Value, "ws_host", translate("WebSocket Host")) +o:depends({transport = "ws", tls = false}) +o.datatype = "hostname" +o.rmempty = true + +-- WS路径 +o = s:option(Value, "ws_path", translate("WebSocket Path")) +o:depends("transport", "ws") +o.rmempty = true + +if is_finded("v2ray") then + -- WS前置数据 + o = s:option(Value, "ws_ed", translate("Max Early Data")) + o:depends("ws_ed_enable", true) + o.datatype = "uinteger" + o:value("2048") + o.rmempty = true + + -- WS前置数据标头 + o = s:option(Value, "ws_ed_header", translate("Early Data Header Name")) + o:depends("ws_ed_enable", true) + o:value("Sec-WebSocket-Protocol") + o.rmempty = true +end + +-- [[ H2部分 ]]-- + +-- H2域名 +o = s:option(Value, "h2_host", translate("HTTP/2 Host")) +o:depends("transport", "h2") +o.rmempty = true + +-- H2路径 +o = s:option(Value, "h2_path", translate("HTTP/2 Path")) +o:depends("transport", "h2") +o.rmempty = true + +-- gRPC +o = s:option(Value, "serviceName", translate("gRPC Service Name")) +o:depends("transport", "grpc") +o.rmempty = true + +if is_finded("xray") then + -- gPRC模式 + o = s:option(ListValue, "grpc_mode", translate("gRPC Mode")) + o:depends("transport", "grpc") + o:value("gun", translate("Gun")) + o:value("multi", translate("Multi")) + o.rmempty = true +end + +if is_finded("xray") then + -- gRPC初始窗口 + o = s:option(Value, "initial_windows_size", translate("Initial Windows Size")) + o.datatype = "uinteger" + o:depends("transport", "grpc") + o.default = 0 + o.rmempty = true + + -- H2/gRPC健康检查 + o = s:option(Flag, "health_check", translate("H2/gRPC Health Check")) + o:depends("transport", "h2") + o:depends("transport", "grpc") + o.rmempty = true + + o = s:option(Value, "read_idle_timeout", translate("H2 Read Idle Timeout")) + o.datatype = "uinteger" + o:depends({health_check = true, transport = "h2"}) + o.default = 60 + o.rmempty = true + + o = s:option(Value, "idle_timeout", translate("gRPC Idle Timeout")) + o.datatype = "uinteger" + o:depends({health_check = true, transport = "grpc"}) + o.default = 60 + o.rmempty = true + + o = s:option(Value, "health_check_timeout", translate("Health Check Timeout")) + o.datatype = "uinteger" + o:depends("health_check", 1) + o.default = 20 + o.rmempty = true + + o = s:option(Flag, "permit_without_stream", translate("Permit Without Stream")) + o:depends({health_check = true, transport = "grpc"}) + o.rmempty = true +end + +-- [[ QUIC部分 ]]-- +o = s:option(ListValue, "quic_security", translate("QUIC Security")) +o:depends("transport", "quic") +o:value("none", translate("None")) +o:value("aes-128-gcm", translate("aes-128-gcm")) +o:value("chacha20-poly1305", translate("chacha20-poly1305")) +o.rmempty = true + +o = s:option(Value, "quic_key", translate("QUIC Key")) +o:depends("transport", "quic") +o.rmempty = true + +o = s:option(ListValue, "quic_guise", translate("Header")) +o:depends("transport", "quic") +o.rmempty = true +o:value("none", translate("None")) +o:value("srtp", translate("VideoCall (SRTP)")) +o:value("utp", translate("BitTorrent (uTP)")) +o:value("wechat-video", translate("WechatVideo")) +o:value("dtls", translate("DTLS 1.2")) +o:value("wireguard", translate("WireGuard")) + +-- [[ mKCP部分 ]]-- +o = s:option(ListValue, "kcp_guise", translate("Camouflage Type")) +o:depends("transport", "kcp") +o:value("none", translate("None")) +o:value("srtp", translate("VideoCall (SRTP)")) +o:value("utp", translate("BitTorrent (uTP)")) +o:value("wechat-video", translate("WechatVideo")) +o:value("dtls", translate("DTLS 1.2")) +o:value("wireguard", translate("WireGuard")) +o.rmempty = true + +o = s:option(Value, "mtu", translate("MTU")) +o.datatype = "uinteger" +o:depends("transport", "kcp") +o:depends({type = "v2ray", v2ray_protocol = "wireguard"}) +-- o.default = 1350 +o.rmempty = true + +o = s:option(Value, "tti", translate("TTI")) +o.datatype = "uinteger" +o:depends("transport", "kcp") +o.default = 50 +o.rmempty = true + +o = s:option(Value, "uplink_capacity", translate("Uplink Capacity(Default:Mbps)")) +o.datatype = "uinteger" +o:depends("transport", "kcp") +o:depends("type", "hysteria") +o.default = 5 +o.rmempty = true + +o = s:option(Value, "downlink_capacity", translate("Downlink Capacity(Default:Mbps)")) +o.datatype = "uinteger" +o:depends("transport", "kcp") +o:depends("type", "hysteria") +o.default = 20 +o.rmempty = true + +o = s:option(Value, "read_buffer_size", translate("Read Buffer Size")) +o.datatype = "uinteger" +o:depends("transport", "kcp") +o.default = 2 +o.rmempty = true + +o = s:option(Value, "write_buffer_size", translate("Write Buffer Size")) +o.datatype = "uinteger" +o:depends("transport", "kcp") +o.default = 2 +o.rmempty = true + +o = s:option(Value, "seed", translate("Obfuscate password (optional)")) +o:depends("transport", "kcp") +o.rmempty = true + +o = s:option(Flag, "congestion", translate("Congestion")) +o:depends("transport", "kcp") +o.rmempty = true + +-- [[ WireGuard 部分 ]]-- +o = s:option(DynamicList, "local_addresses", translate("Local addresses")) +o.datatype = "cidr" +o:depends({type = "v2ray", v2ray_protocol = "wireguard"}) +o.rmempty = true + +o = s:option(Value, "private_key", translate("Private key")) +o:depends({type = "v2ray", v2ray_protocol = "wireguard"}) +o.password = true +o.rmempty = true + +o = s:option(Value, "peer_pubkey", translate("Peer public key")) +o:depends({type = "v2ray", v2ray_protocol = "wireguard"}) +o.rmempty = true + +o = s:option(Value, "preshared_key", translate("Pre-shared key")) +o:depends({type = "v2ray", v2ray_protocol = "wireguard"}) +o.password = true +o.rmempty = true + +-- [[ TLS ]]-- +o = s:option(Flag, "tls", translate("TLS")) +o.rmempty = true +o.default = "0" +o:depends({type = "v2ray", v2ray_protocol = "vless", reality = false}) +o:depends({type = "v2ray", v2ray_protocol = "vmess", reality = false}) +o:depends({type = "v2ray", v2ray_protocol = "trojan", reality = false}) +o:depends({type = "v2ray", v2ray_protocol = "shadowsocks", reality = false}) +o:depends({type = "v2ray", v2ray_protocol = "socks", socks_ver = "5", reality = false}) +o:depends({type = "v2ray", v2ray_protocol = "http", reality = false}) +o:depends("type", "trojan") +o:depends("type", "hysteria") + +-- [[ TLS部分 ]] -- +o = s:option(Flag, "tls_sessionTicket", translate("Session Ticket")) +o:depends({type = "trojan", tls = true}) +o.default = "0" + +if is_finded("xray") then + -- [[ REALITY ]] + o = s:option(Flag, "reality", translate("REALITY")) + o.rmempty = true + o.default = "0" + o:depends({type = "v2ray", v2ray_protocol = "vless", tls = false}) + + o = s:option(Value, "reality_publickey", translate("Public key")) + o.rmempty = true + o:depends({type = "v2ray", v2ray_protocol = "vless", reality = true}) + + o = s:option(Value, "reality_shortid", translate("Short ID")) + o.rmempty = true + o:depends({type = "v2ray", v2ray_protocol = "vless", reality = true}) + + o = s:option(Value, "reality_spiderx", translate("spiderX")) + o.rmempty = true + o:depends({type = "v2ray", v2ray_protocol = "vless", reality = true}) + + -- [[ XTLS ]]-- + o = s:option(Value, "tls_flow", translate("Flow")) + for _, v in ipairs(tls_flows) do + o:value(v, translate(v)) + end + o.rmempty = true + o:depends({type = "v2ray", v2ray_protocol = "vless", transport = "tcp", tls = true}) + o:depends({type = "v2ray", v2ray_protocol = "vless", transport = "tcp", reality = true}) + + -- [[ uTLS ]]-- + o = s:option(Value, "fingerprint", translate("Finger Print")) + o:value("", translate("disable")) + o:value("chrome", translate("chrome")) + o:value("firefox", translate("firefox")) + o:value("safari", translate("safari")) + o:value("ios", translate("ios")) + o:value("android", translate("android")) + o:value("edge", translate("edge")) + o:value("360", translate("360")) + o:value("qq", translate("qq")) + o:value("random", translate("random")) + o:value("randomized", translate("randomized")) + o:depends({type = "v2ray", tls = true}) + o:depends({type = "v2ray", reality = true}) +end + +o = s:option(Value, "tls_host", translate("TLS Host")) +o.datatype = "hostname" +o:depends("tls", true) +o:depends("reality", true) +o.rmempty = true + +o = s:option(DynamicList, "tls_alpn", translate("TLS ALPN")) +o:depends("tls", true) +o:depends("type", "tuic") +o:depends("type", "hysteria") +o.rmempty = true + +-- [[ allowInsecure ]]-- +o = s:option(Flag, "insecure", translate("allowInsecure")) +o.rmempty = false +o:depends("tls", true) +o:depends("type", "hysteria") +o.description = translate("If true, allowss insecure connection at TLS client, e.g., TLS server uses unverifiable certificates.") + +-- [[ Hysteria2 TLS pinSHA256 ]] -- +o = s:option(Value, "pinsha256", translate("Certificate fingerprint")) +o:depends({type = "hysteria", insecure = true }) +o.rmempty = true + +-- [[ Mux ]]-- +o = s:option(Flag, "mux", translate("Mux")) +o.rmempty = false +o:depends({type = "v2ray", v2ray_protocol = "vless"}) +o:depends({type = "v2ray", v2ray_protocol = "vmess"}) +o:depends({type = "v2ray", v2ray_protocol = "trojan"}) +o:depends({type = "v2ray", v2ray_protocol = "shadowsocks"}) +o:depends({type = "v2ray", v2ray_protocol = "socks"}) +o:depends({type = "v2ray", v2ray_protocol = "http"}) + +o = s:option(Value, "concurrency", translate("Concurrency")) +o.datatype = "uinteger" +o.rmempty = true +o.default = "4" +o:depends("mux", "1") +o:depends("type", "naiveproxy") + +-- [[ Cert ]]-- +o = s:option(Flag, "certificate", translate("Self-signed Certificate")) +o.rmempty = true +o.default = "0" +o:depends("type", "tuic") +o:depends({type = "hysteria", insecure = false}) +o:depends({type = "trojan", tls = true, insecure = false}) +o:depends({type = "v2ray", v2ray_protocol = "vmess", tls = true, insecure = false}) +o:depends({type = "v2ray", v2ray_protocol = "vless", tls = true, insecure = false}) +o.description = translate("If you have a self-signed certificate,please check the box") + +o = s:option(DummyValue, "upload", translate("Upload")) +o.template = "shadowsocksr/certupload" +o:depends("certificate", 1) + +cert_dir = "/etc/ssl/private/" +local path + +luci.http.setfilehandler(function(meta, chunk, eof) + if not fd then + if (not meta) or (not meta.name) or (not meta.file) then + return + end + fd = nixio.open(cert_dir .. meta.file, "w") + if not fd then + path = translate("Create upload file error.") + return + end + end + if chunk and fd then + fd:write(chunk) + end + if eof and fd then + fd:close() + fd = nil + path = '/etc/ssl/private/' .. meta.file .. '' + end +end) +if luci.http.formvalue("upload") then + local f = luci.http.formvalue("ulfile") + if #f <= 0 then + path = translate("No specify upload file.") + end +end + +o = s:option(Value, "certpath", translate("Current Certificate Path")) +o:depends("certificate", 1) +o:value("/etc/ssl/private/ca.pem") +o.description = translate("Please confirm the current certificate path") +o.default = "/etc/ssl/private/ca.pem" + +o = s:option(Flag, "fast_open", translate("TCP Fast Open")) +o.rmempty = true +o.default = "0" +o:depends("type", "ssr") +o:depends("type", "ss") +o:depends("type", "trojan") +o:depends("type", "hysteria") + +o = s:option(Flag, "switch_enable", translate("Enable Auto Switch")) +o.rmempty = false +o.default = "1" + +o = s:option(Value, "local_port", translate("Local Port")) +o.datatype = "port" +o.default = 1234 +o.rmempty = false + +if is_finded("kcptun-client") then + o = s:option(Flag, "kcp_enable", translate("KcpTun Enable")) + o.rmempty = true + o.default = "0" + o:depends("type", "ssr") + o:depends("type", "ss") + + o = s:option(Value, "kcp_port", translate("KcpTun Port")) + o.datatype = "port" + o.default = 4000 + o:depends("type", "ssr") + o:depends("type", "ss") + + o = s:option(Value, "kcp_password", translate("KcpTun Password")) + o.password = true + o:depends("type", "ssr") + o:depends("type", "ss") + + o = s:option(Value, "kcp_param", translate("KcpTun Param")) + o.default = "--nocomp" + o:depends("type", "ssr") + o:depends("type", "ss") +end + +return m diff --git a/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua b/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua new file mode 100644 index 00000000..8864d0be --- /dev/null +++ b/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua @@ -0,0 +1,168 @@ +-- Copyright (C) 2017 yushi studio github.com/ywb94 +-- Copyright (C) 2018 lean github.com/coolsnowwolf +-- Licensed to the public under the GNU General Public License v3. + +local m, s, sec, o +local uci = luci.model.uci.cursor() + +local validation = require "luci.cbi.datatypes" +local function is_finded(e) + return luci.sys.exec('type -t -p "%s"' % e) ~= "" and true or false +end + +m = Map("shadowsocksr", translate("ShadowSocksR Plus+ Settings"), translate("

Support SS/SSR/V2RAY/XRAY/TROJAN/NAIVEPROXY/SOCKS5/TUN etc.

")) +m:section(SimpleSection).template = "shadowsocksr/status" + +local server_table = {} +uci:foreach("shadowsocksr", "servers", function(s) + if s.alias then + server_table[s[".name"]] = "[%s]:%s" % {string.upper(s.v2ray_protocol or s.type), s.alias} + elseif s.server and s.server_port then + server_table[s[".name"]] = "[%s]:%s:%s" % {string.upper(s.v2ray_protocol or s.type), s.server, s.server_port} + end +end) + +local key_table = {} +for key, _ in pairs(server_table) do + table.insert(key_table, key) +end + +table.sort(key_table) + +-- [[ Global Setting ]]-- +s = m:section(TypedSection, "global") +s.anonymous = true + +o = s:option(ListValue, "global_server", translate("Main Server")) +o:value("nil", translate("Disable")) +for _, key in pairs(key_table) do + o:value(key, server_table[key]) +end +o.default = "nil" +o.rmempty = false + +o = s:option(ListValue, "udp_relay_server", translate("Game Mode UDP Server")) +o:value("", translate("Disable")) +o:value("same", translate("Same as Global Server")) +for _, key in pairs(key_table) do + o:value(key, server_table[key]) +end + +if uci:get_first("shadowsocksr", 'global', 'netflix_enable', '0') == '1' then +o = s:option(ListValue, "netflix_server", translate("Netflix Node")) +o:value("nil", translate("Disable")) +o:value("same", translate("Same as Global Server")) +for _, key in pairs(key_table) do + o:value(key, server_table[key]) +end +o.default = "nil" +o.rmempty = false + +o = s:option(Flag, "netflix_proxy", translate("External Proxy Mode")) +o.rmempty = false +o.description = translate("Forward Netflix Proxy through Main Proxy") +o.default = "0" +end + +o = s:option(ListValue, "threads", translate("Multi Threads Option")) +o:value("0", translate("Auto Threads")) +o:value("1", translate("1 Thread")) +o:value("2", translate("2 Threads")) +o:value("4", translate("4 Threads")) +o:value("8", translate("8 Threads")) +o:value("16", translate("16 Threads")) +o:value("32", translate("32 Threads")) +o:value("64", translate("64 Threads")) +o:value("128", translate("128 Threads")) +o.default = "0" +o.rmempty = false + +o = s:option(ListValue, "run_mode", translate("Running Mode")) +o:value("gfw", translate("GFW List Mode")) +o:value("router", translate("IP Route Mode")) +o:value("all", translate("Global Mode")) +o:value("oversea", translate("Oversea Mode")) +o.default = gfw + +o = s:option(ListValue, "dports", translate("Proxy Ports")) +o:value("1", translate("All Ports")) +o:value("2", translate("Only Common Ports")) +o.default = 1 + +o = s:option(ListValue, "pdnsd_enable", translate("Resolve Dns Mode")) +o:value("1", translate("Use DNS2TCP query")) +o:value("2", translate("Use DNS2SOCKS query and cache")) +if is_finded("mosdns") then +o:value("3", translate("Use MOSDNS query (Not Support Oversea Mode)")) +end +o:value("0", translate("Use Local DNS Service listen port 5335")) +o.default = 1 + +o = s:option(Value, "tunnel_forward", translate("Anti-pollution DNS Server")) +o:value("8.8.4.4:53", translate("Google Public DNS (8.8.4.4)")) +o:value("8.8.8.8:53", translate("Google Public DNS (8.8.8.8)")) +o:value("208.67.222.222:53", translate("OpenDNS (208.67.222.222)")) +o:value("208.67.220.220:53", translate("OpenDNS (208.67.220.220)")) +o:value("209.244.0.3:53", translate("Level 3 Public DNS (209.244.0.3)")) +o:value("209.244.0.4:53", translate("Level 3 Public DNS (209.244.0.4)")) +o:value("4.2.2.1:53", translate("Level 3 Public DNS (4.2.2.1)")) +o:value("4.2.2.2:53", translate("Level 3 Public DNS (4.2.2.2)")) +o:value("4.2.2.3:53", translate("Level 3 Public DNS (4.2.2.3)")) +o:value("4.2.2.4:53", translate("Level 3 Public DNS (4.2.2.4)")) +o:value("1.1.1.1:53", translate("Cloudflare DNS (1.1.1.1)")) +o:value("114.114.114.114:53", translate("Oversea Mode DNS-1 (114.114.114.114)")) +o:value("114.114.115.115:53", translate("Oversea Mode DNS-2 (114.114.115.115)")) +o:depends("pdnsd_enable", "1") +o:depends("pdnsd_enable", "2") +o.description = translate("Custom DNS Server format as IP:PORT (default: 8.8.4.4:53)") +o.datatype = "ip4addrport" + +o = s:option(ListValue, "tunnel_forward_mosdns", translate("Anti-pollution DNS Server")) +o:value("tcp://8.8.4.4:53,tcp://8.8.8.8:53", translate("Google Public DNS")) +o:value("tcp://208.67.222.222:53,tcp://208.67.220.220:53", translate("OpenDNS")) +o:value("tcp://209.244.0.3:53,tcp://209.244.0.4:53", translate("Level 3 Public DNS-1 (209.244.0.3-4)")) +o:value("tcp://4.2.2.1:53,tcp://4.2.2.2:53", translate("Level 3 Public DNS-2 (4.2.2.1-2)")) +o:value("tcp://4.2.2.3:53,tcp://4.2.2.4:53", translate("Level 3 Public DNS-3 (4.2.2.3-4)")) +o:value("tcp://1.1.1.1:53,tcp://1.0.0.1:53", translate("Cloudflare DNS")) +o:depends("pdnsd_enable", "3") +o.description = translate("Custom DNS Server for mosdns") + +o = s:option(Flag, "mosdns_ipv6", translate("Disable IPv6 in MOSDNS query mode")) +o:depends("pdnsd_enable", "3") +o.rmempty = false +o.default = "0" + +if is_finded("chinadns-ng") then + o = s:option(Value, "chinadns_forward", translate("Domestic DNS Server")) + o:value("", translate("Disable ChinaDNS-NG")) + o:value("wan", translate("Use DNS from WAN")) + o:value("wan_114", translate("Use DNS from WAN and 114DNS")) + o:value("114.114.114.114:53", translate("Nanjing Xinfeng 114DNS (114.114.114.114)")) + o:value("119.29.29.29:53", translate("DNSPod Public DNS (119.29.29.29)")) + o:value("223.5.5.5:53", translate("AliYun Public DNS (223.5.5.5)")) + o:value("180.76.76.76:53", translate("Baidu Public DNS (180.76.76.76)")) + o:value("101.226.4.6:53", translate("360 Security DNS (China Telecom) (101.226.4.6)")) + o:value("123.125.81.6:53", translate("360 Security DNS (China Unicom) (123.125.81.6)")) + o:value("1.2.4.8:53", translate("CNNIC SDNS (1.2.4.8)")) + o:depends({pdnsd_enable = "1", run_mode = "router"}) + o:depends({pdnsd_enable = "2", run_mode = "router"}) + o.description = translate("Custom DNS Server format as IP:PORT (default: disabled)") + o.validate = function(self, value, section) + if (section and value) then + if value == "wan" or value == "wan_114" then + return value + end + + if validation.ip4addrport(value) then + return value + end + + return nil, translate("Expecting: %s"):format(translate("valid address:port")) + end + + return value + end +end + +return m + diff --git a/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua b/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua new file mode 100644 index 00000000..070fb5b9 --- /dev/null +++ b/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua @@ -0,0 +1,143 @@ +require "luci.ip" +require "nixio.fs" +local m, s, o + +m = Map("shadowsocksr") + +s = m:section(TypedSection, "access_control") +s.anonymous = true + +-- Interface control +s:tab("Interface", translate("Interface control")) +o = s:taboption("Interface", DynamicList, "Interface", translate("Interface")) +o.template = "cbi/network_netlist" +o.widget = "checkbox" +o.nocreate = true +o.unspecified = true +o.description = translate("Listen only on the given interface or, if unspecified, on all") + +-- Part of WAN +s:tab("wan_ac", translate("WAN IP AC")) + +o = s:taboption("wan_ac", DynamicList, "wan_bp_ips", translate("WAN White List IP")) +o.datatype = "ip4addr" + +o = s:taboption("wan_ac", DynamicList, "wan_fw_ips", translate("WAN Force Proxy IP")) +o.datatype = "ip4addr" + +-- Part of LAN +s:tab("lan_ac", translate("LAN IP AC")) + +o = s:taboption("lan_ac", ListValue, "lan_ac_mode", translate("LAN Access Control")) +o:value("0", translate("Disable")) +o:value("w", translate("Allow listed only")) +o:value("b", translate("Allow all except listed")) +o.rmempty = false + +o = s:taboption("lan_ac", DynamicList, "lan_ac_ips", translate("LAN Host List")) +o.datatype = "ipaddr" +luci.ip.neighbors({family = 4}, function(entry) + if entry.reachable then + o:value(entry.dest:string()) + end +end) +o:depends("lan_ac_mode", "w") +o:depends("lan_ac_mode", "b") + +o = s:taboption("lan_ac", DynamicList, "lan_bp_ips", translate("LAN Bypassed Host List")) +o.datatype = "ipaddr" +luci.ip.neighbors({family = 4}, function(entry) + if entry.reachable then + o:value(entry.dest:string()) + end +end) + +o = s:taboption("lan_ac", DynamicList, "lan_fp_ips", translate("LAN Force Proxy Host List")) +o.datatype = "ipaddr" +luci.ip.neighbors({family = 4}, function(entry) + if entry.reachable then + o:value(entry.dest:string()) + end +end) + +o = s:taboption("lan_ac", DynamicList, "lan_gm_ips", translate("Game Mode Host List")) +o.datatype = "ipaddr" +luci.ip.neighbors({family = 4}, function(entry) + if entry.reachable then + o:value(entry.dest:string()) + end +end) + +-- Part of Self +-- s:tab("self_ac", translate("Router Self AC")) +-- o = s:taboption("self_ac",ListValue, "router_proxy", translate("Router Self Proxy")) +-- o:value("1", translatef("Normal Proxy")) +-- o:value("0", translatef("Bypassed Proxy")) +-- o:value("2", translatef("Forwarded Proxy")) +-- o.rmempty = false + +s:tab("esc", translate("Bypass Domain List")) +local escconf = "/etc/ssrplus/white.list" +o = s:taboption("esc", TextValue, "escconf") +o.rows = 13 +o.wrap = "off" +o.rmempty = true +o.cfgvalue = function(self, section) + return nixio.fs.readfile(escconf) or "" +end +o.write = function(self, section, value) + nixio.fs.writefile(escconf, value:gsub("\r\n", "\n")) +end +o.remove = function(self, section, value) + nixio.fs.writefile(escconf, "") +end + +s:tab("block", translate("Black Domain List")) +local blockconf = "/etc/ssrplus/black.list" +o = s:taboption("block", TextValue, "blockconf") +o.rows = 13 +o.wrap = "off" +o.rmempty = true +o.cfgvalue = function(self, section) + return nixio.fs.readfile(blockconf) or " " +end +o.write = function(self, section, value) + nixio.fs.writefile(blockconf, value:gsub("\r\n", "\n")) +end +o.remove = function(self, section, value) + nixio.fs.writefile(blockconf, "") +end + +s:tab("denydomain", translate("Deny Domain List")) +local denydomainconf = "/etc/ssrplus/deny.list" +o = s:taboption("denydomain", TextValue, "denydomainconf") +o.rows = 13 +o.wrap = "off" +o.rmempty = true +o.cfgvalue = function(self, section) + return nixio.fs.readfile(denydomainconf) or " " +end +o.write = function(self, section, value) + nixio.fs.writefile(denydomainconf, value:gsub("\r\n", "\n")) +end +o.remove = function(self, section, value) + nixio.fs.writefile(denydomainconf, "") +end + +s:tab("netflix", translate("Netflix Domain List")) +local netflixconf = "/etc/ssrplus/netflix.list" +o = s:taboption("netflix", TextValue, "netflixconf") +o.rows = 13 +o.wrap = "off" +o.rmempty = true +o.cfgvalue = function(self, section) + return nixio.fs.readfile(netflixconf) or " " +end +o.write = function(self, section, value) + nixio.fs.writefile(netflixconf, value:gsub("\r\n", "\n")) +end +o.remove = function(self, section, value) + nixio.fs.writefile(netflixconf, "") +end + +return m diff --git a/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/log.lua b/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/log.lua new file mode 100644 index 00000000..fdf9e59f --- /dev/null +++ b/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/log.lua @@ -0,0 +1,20 @@ +require "luci.util" +require "nixio.fs" +f = SimpleForm("logview") +f.reset = false +f.submit = false +t = f:field(TextValue, "conf") +t.rmempty = true +t.rows = 20 +function t.cfgvalue() + if nixio.fs.access("/var/log/ssrplus.log") then + local logs = luci.util.execi("cat /var/log/ssrplus.log") + local s = "" + for line in logs do + s = line .. "\n" .. s + end + return s + end +end +t.readonly = "readonly" +return f diff --git a/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua b/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua new file mode 100644 index 00000000..f9ac268e --- /dev/null +++ b/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua @@ -0,0 +1,154 @@ +-- Copyright (C) 2017 yushi studio +-- Licensed to the public under the GNU General Public License v3. +require "luci.http" +require "luci.dispatcher" +require "nixio.fs" + +local m, s, o +local sid = arg[1] + +local encrypt_methods = { + "rc4-md5", + "rc4-md5-6", + "rc4", + "table", + "aes-128-cfb", + "aes-192-cfb", + "aes-256-cfb", + "aes-128-ctr", + "aes-192-ctr", + "aes-256-ctr", + "bf-cfb", + "camellia-128-cfb", + "camellia-192-cfb", + "camellia-256-cfb", + "cast5-cfb", + "des-cfb", + "idea-cfb", + "rc2-cfb", + "seed-cfb", + "salsa20", + "chacha20", + "chacha20-ietf" +} + +local encrypt_methods_ss = { + -- aead + "aes-128-gcm", + "aes-192-gcm", + "aes-256-gcm", + "chacha20-ietf-poly1305", + "xchacha20-ietf-poly1305", + -- aead 2022 + "2022-blake3-aes-128-gcm", + "2022-blake3-aes-256-gcm", + "2022-blake3-chacha20-poly1305" + --[[ stream + "table", + "rc4", + "rc4-md5", + "aes-128-cfb", + "aes-192-cfb", + "aes-256-cfb", + "aes-128-ctr", + "aes-192-ctr", + "aes-256-ctr", + "bf-cfb", + "camellia-128-cfb", + "camellia-192-cfb", + "camellia-256-cfb", + "salsa20", + "chacha20", + "chacha20-ietf" ]] +} + +local protocol = {"origin"} + +obfs = {"plain", "http_simple", "http_post"} + +m = Map("shadowsocksr", translate("Edit ShadowSocksR Server")) + +m.redirect = luci.dispatcher.build_url("admin/services/shadowsocksr/server") +if m.uci:get("shadowsocksr", sid) ~= "server_config" then + luci.http.redirect(m.redirect) + return +end + +-- [[ Server Setting ]]-- +s = m:section(NamedSection, sid, "server_config") +s.anonymous = true +s.addremove = false + +o = s:option(Flag, "enable", translate("Enable")) +o.default = 1 +o.rmempty = false + +o = s:option(ListValue, "type", translate("Server Type")) +o:value("socks5", translate("Socks5")) +if nixio.fs.access("/usr/bin/ssserver") or nixio.fs.access("/usr/bin/ss-server") then + o:value("ss", translate("Shadowsocks")) +end +if nixio.fs.access("/usr/bin/ssr-server") then + o:value("ssr", translate("ShadowsocksR")) +end +o.default = "socks5" + +o = s:option(Value, "server_port", translate("Server Port")) +o.datatype = "port" +math.randomseed(tostring(os.time()):reverse():sub(1, 7)) +o.default = math.random(10240, 20480) +o.rmempty = false +o.description = translate("warning! Please do not reuse the port!") + +o = s:option(Value, "timeout", translate("Connection Timeout")) +o.datatype = "uinteger" +o.default = 60 +o.rmempty = false +o:depends("type", "ss") +o:depends("type", "ssr") + +o = s:option(Value, "username", translate("Username")) +o.rmempty = false +o:depends("type", "socks5") + +o = s:option(Value, "password", translate("Password")) +o.password = true +o.rmempty = false + +o = s:option(ListValue, "encrypt_method", translate("Encrypt Method")) +for _, v in ipairs(encrypt_methods) do + o:value(v) +end +o.rmempty = false +o:depends("type", "ssr") + +o = s:option(ListValue, "encrypt_method_ss", translate("Encrypt Method")) +for _, v in ipairs(encrypt_methods_ss) do + o:value(v) +end +o.rmempty = false +o:depends("type", "ss") + +o = s:option(ListValue, "protocol", translate("Protocol")) +for _, v in ipairs(protocol) do + o:value(v) +end +o.rmempty = false +o:depends("type", "ssr") + +o = s:option(ListValue, "obfs", translate("Obfs")) +for _, v in ipairs(obfs) do + o:value(v) +end +o.rmempty = false +o:depends("type", "ssr") + +o = s:option(Value, "obfs_param", translate("Obfs param(optional)")) +o:depends("type", "ssr") + +o = s:option(Flag, "fast_open", translate("TCP Fast Open")) +o.rmempty = false +o:depends("type", "ss") +o:depends("type", "ssr") + +return m diff --git a/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua b/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua new file mode 100644 index 00000000..6ef44c08 --- /dev/null +++ b/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua @@ -0,0 +1,144 @@ +-- Copyright (C) 2017 yushi studio +-- Licensed to the public under the GNU General Public License v3. +require "luci.http" +require "luci.dispatcher" +local m, sec, o +local encrypt_methods = { + "table", + "rc4", + "rc4-md5", + "rc4-md5-6", + "aes-128-cfb", + "aes-192-cfb", + "aes-256-cfb", + "aes-128-ctr", + "aes-192-ctr", + "aes-256-ctr", + "bf-cfb", + "camellia-128-cfb", + "camellia-192-cfb", + "camellia-256-cfb", + "cast5-cfb", + "des-cfb", + "idea-cfb", + "rc2-cfb", + "seed-cfb", + "salsa20", + "chacha20", + "chacha20-ietf" +} + +local encrypt_methods_ss = { + -- aead + "aes-128-gcm", + "aes-192-gcm", + "aes-256-gcm", + "chacha20-ietf-poly1305", + "xchacha20-ietf-poly1305", + -- aead 2022 + "2022-blake3-aes-128-gcm", + "2022-blake3-aes-256-gcm", + "2022-blake3-chacha20-poly1305" + --[[ stream + "table", + "rc4", + "rc4-md5", + "aes-128-cfb", + "aes-192-cfb", + "aes-256-cfb", + "aes-128-ctr", + "aes-192-ctr", + "aes-256-ctr", + "bf-cfb", + "camellia-128-cfb", + "camellia-192-cfb", + "camellia-256-cfb", + "salsa20", + "chacha20", + "chacha20-ietf" ]] +} + +local protocol = { + "origin", + "verify_deflate", + "auth_sha1_v4", + "auth_aes128_sha1", + "auth_aes128_md5", + "auth_chain_a" +} + +obfs = { + "plain", + "http_simple", + "http_post", + "random_head", + "tls1.2_ticket_auth", + "tls1.2_ticket_fastauth" +} + +m = Map("shadowsocksr") +-- [[ Global Setting ]]-- +sec = m:section(TypedSection, "server_global", translate("Global Setting")) +sec.anonymous = true + +o = sec:option(Flag, "enable_server", translate("Enable Server")) +o.rmempty = false + +-- [[ Server Setting ]]-- +sec = m:section(TypedSection, "server_config", translate("Server Setting")) +sec.anonymous = true +sec.addremove = true +sec.template = "cbi/tblsection" +sec.extedit = luci.dispatcher.build_url("admin/services/shadowsocksr/server/%s") +function sec.create(...) + local sid = TypedSection.create(...) + if sid then + luci.http.redirect(sec.extedit % sid) + return + end +end + +o = sec:option(Flag, "enable", translate("Enable")) +function o.cfgvalue(...) + return Value.cfgvalue(...) or translate("0") +end +o.rmempty = false + +o = sec:option(DummyValue, "type", translate("Server Type")) +function o.cfgvalue(...) + return Value.cfgvalue(...) or "ss" +end + +o = sec:option(DummyValue, "server_port", translate("Server Port")) +function o.cfgvalue(...) + return Value.cfgvalue(...) or "-" +end + +o = sec:option(DummyValue, "username", translate("Username")) +function o.cfgvalue(...) + return Value.cfgvalue(...) or "-" +end + +o = sec:option(DummyValue, "encrypt_method", translate("Encrypt Method")) +function o.cfgvalue(...) + local v = Value.cfgvalue(...) + return v and v:upper() or "-" +end + +o = sec:option(DummyValue, "encrypt_method_ss", translate("Encrypt Method")) +function o.cfgvalue(...) + local v = Value.cfgvalue(...) + return v and v:upper() or "-" +end + +o = sec:option(DummyValue, "protocol", translate("Protocol")) +function o.cfgvalue(...) + return Value.cfgvalue(...) or "-" +end + +o = sec:option(DummyValue, "obfs", translate("Obfs")) +function o.cfgvalue(...) + return Value.cfgvalue(...) or "-" +end + +return m diff --git a/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua b/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua new file mode 100644 index 00000000..b2cb81bd --- /dev/null +++ b/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua @@ -0,0 +1,151 @@ +-- Licensed to the public under the GNU General Public License v3. +require "luci.http" +require "luci.dispatcher" +require "luci.model.uci" +local m, s, o +local uci = luci.model.uci.cursor() +local server_count = 0 +uci:foreach("shadowsocksr", "servers", function(s) + server_count = server_count + 1 +end) + +m = Map("shadowsocksr", translate("Servers subscription and manage")) + +-- Server Subscribe +s = m:section(TypedSection, "server_subscribe") +s.anonymous = true + +o = s:option(Flag, "auto_update", translate("Auto Update")) +o.rmempty = false +o.description = translate("Auto Update Server subscription, GFW list and CHN route") + +o = s:option(ListValue, "auto_update_time", translate("Update time (every day)")) +for t = 0, 23 do + o:value(t, t .. ":00") +end +o.default = 2 +o.rmempty = false + +o = s:option(DynamicList, "subscribe_url", translate("Subscribe URL")) +o.rmempty = true + +o = s:option(Value, "filter_words", translate("Subscribe Filter Words")) +o.rmempty = true +o.description = translate("Filter Words splited by /") + +o = s:option(Value, "save_words", translate("Subscribe Save Words")) +o.rmempty = true +o.description = translate("Save Words splited by /") + +o = s:option(Button, "update_Sub", translate("Update Subscribe List")) +o.inputstyle = "reload" +o.description = translate("Update subscribe url list first") +o.write = function() + uci:commit("shadowsocksr") + luci.http.redirect(luci.dispatcher.build_url("admin", "services", "shadowsocksr", "servers")) +end + +o = s:option(Flag, "switch", translate("Subscribe Default Auto-Switch")) +o.rmempty = false +o.description = translate("Subscribe new add server default Auto-Switch on") +o.default = "1" + +o = s:option(Flag, "proxy", translate("Through proxy update")) +o.rmempty = false +o.description = translate("Through proxy update list, Not Recommended ") + +o = s:option(Button, "subscribe", translate("Update All Subscribe Servers")) +o.rawhtml = true +o.template = "shadowsocksr/subscribe" + +o = s:option(Button, "delete", translate("Delete All Subscribe Servers")) +o.inputstyle = "reset" +o.description = string.format(translate("Server Count") .. ": %d", server_count) +o.write = function() + uci:delete_all("shadowsocksr", "servers", function(s) + if s.hashkey or s.isSubscribe then + return true + else + return false + end + end) + uci:save("shadowsocksr") + uci:commit("shadowsocksr") + luci.http.redirect(luci.dispatcher.build_url("admin", "services", "shadowsocksr", "delete")) + return +end + +-- [[ Servers Manage ]]-- +s = m:section(TypedSection, "servers") +s.anonymous = true +s.addremove = true +s.template = "cbi/tblsection" +s.sortable = true +s.extedit = luci.dispatcher.build_url("admin", "services", "shadowsocksr", "servers", "%s") +function s.create(...) + local sid = TypedSection.create(...) + if sid then + luci.http.redirect(s.extedit % sid) + return + end +end + +o = s:option(DummyValue, "type", translate("Type")) +function o.cfgvalue(self, section) + return m:get(section, "v2ray_protocol") or Value.cfgvalue(self, section) or translate("None") +end + +o = s:option(DummyValue, "alias", translate("Alias")) +function o.cfgvalue(...) + return Value.cfgvalue(...) or translate("None") +end + +o = s:option(DummyValue, "server_port", translate("Server Port")) +function o.cfgvalue(...) + return Value.cfgvalue(...) or "N/A" +end + +o = s:option(DummyValue, "server_port", translate("Socket Connected")) +o.template = "shadowsocksr/socket" +o.width = "10%" +o.render = function(self, section, scope) + self.transport = s:cfgvalue(section).transport + if self.transport == 'ws' then + self.ws_path = s:cfgvalue(section).ws_path + self.tls = s:cfgvalue(section).tls + end + DummyValue.render(self, section, scope) +end + +o = s:option(DummyValue, "server", translate("Ping Latency")) +o.template = "shadowsocksr/ping" +o.width = "10%" + +local global_server = uci:get_first('shadowsocksr', 'global', 'global_server') + +node = s:option(Button, "apply_node", translate("Apply")) +node.inputstyle = "apply" +node.render = function(self, section, scope) + if section == global_server then + self.title = translate("Reapply") + else + self.title = translate("Apply") + end + Button.render(self, section, scope) +end +node.write = function(self, section) + uci:set("shadowsocksr", '@global[0]', 'global_server', section) + uci:save("shadowsocksr") + uci:commit("shadowsocksr") + luci.http.redirect(luci.dispatcher.build_url("admin", "services", "shadowsocksr", "restart")) +end + +o = s:option(Flag, "switch_enable", translate("Auto Switch")) +o.rmempty = false +function o.cfgvalue(...) + return Value.cfgvalue(...) or 1 +end + +m:append(Template("shadowsocksr/server_list")) + +return m diff --git a/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua b/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua new file mode 100644 index 00000000..a095d44e --- /dev/null +++ b/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua @@ -0,0 +1,190 @@ +-- Copyright (C) 2017 yushi studio +-- Licensed to the public under the GNU General Public License v3. +require "nixio.fs" +require "luci.sys" +require "luci.model.uci" +local m, s, o +local redir_run = 0 +local reudp_run = 0 +local sock5_run = 0 +local server_run = 0 +local kcptun_run = 0 +local tunnel_run = 0 +local gfw_count = 0 +local ad_count = 0 +local ip_count = 0 +local nfip_count = 0 +local Process_list = luci.sys.exec("busybox ps -w") +local uci = luci.model.uci.cursor() +-- html constants +font_blue = [[]] +style_blue = [[]] +font_off = [[]] +bold_on = [[]] +bold_off = [[]] +local kcptun_version = translate("Unknown") +local kcp_file = "/usr/bin/kcptun-client" +if not nixio.fs.access(kcp_file) then + kcptun_version = translate("Not exist") +else + if not nixio.fs.access(kcp_file, "rwx", "rx", "rx") then + nixio.fs.chmod(kcp_file, 755) + end + kcptun_version = "" ..luci.sys.exec(kcp_file .. " -v | awk '{printf $3}'") .. "" + if not kcptun_version or kcptun_version == "" then + kcptun_version = translate("Unknown") + end +end + +if nixio.fs.access("/etc/ssrplus/gfw_list.conf") then + gfw_count = tonumber(luci.sys.exec("cat /etc/ssrplus/gfw_list.conf | wc -l")) / 2 +end + +if nixio.fs.access("/etc/ssrplus/ad.conf") then + ad_count = tonumber(luci.sys.exec("cat /etc/ssrplus/ad.conf | wc -l")) +end + +if nixio.fs.access("/etc/ssrplus/china_ssr.txt") then + ip_count = tonumber(luci.sys.exec("cat /etc/ssrplus/china_ssr.txt | wc -l")) +end + +if nixio.fs.access("/etc/ssrplus/netflixip.list") then + nfip_count = tonumber(luci.sys.exec("cat /etc/ssrplus/netflixip.list | wc -l")) +end + +if Process_list:find("udp.only.ssr.reudp") then + reudp_run = 1 +end + +if Process_list:find("tcp.only.ssr.retcp") then + redir_run = 1 +end + +if Process_list:find("tcp.udp.ssr.local") then + sock5_run = 1 +end + +if Process_list:find("tcp.udp.ssr.retcp") then + redir_run = 1 + reudp_run = 1 +end + +if Process_list:find("local.ssr.retcp") then + redir_run = 1 + sock5_run = 1 +end + +if Process_list:find("local.udp.ssr.retcp") then + reudp_run = 1 + redir_run = 1 + sock5_run = 1 +end + +if Process_list:find("kcptun.client") then + kcptun_run = 1 +end + +if Process_list:find("ssr.server") then + server_run = 1 +end + +if Process_list:find("ssrplus/bin/dns2tcp") or Process_list:find("ssrplus/bin/mosdns") or (Process_list:find("ssrplus.dns") and Process_list:find("dns2socks.127.0.0.1.*127.0.0.1.5335")) then + pdnsd_run = 1 +end + +m = SimpleForm("Version") +m.reset = false +m.submit = false + +s = m:field(DummyValue, "redir_run", translate("Global Client")) +s.rawhtml = true +if redir_run == 1 then + s.value = font_blue .. bold_on .. translate("Running") .. bold_off .. font_off +else + s.value = style_blue .. bold_on .. translate("Not Running") .. bold_off .. font_off +end + +s = m:field(DummyValue, "reudp_run", translate("Game Mode UDP Relay")) +s.rawhtml = true +if reudp_run == 1 then + s.value = font_blue .. bold_on .. translate("Running") .. bold_off .. font_off +else + s.value = style_blue .. bold_on .. translate("Not Running") .. bold_off .. font_off +end + +if uci:get_first("shadowsocksr", 'global', 'pdnsd_enable', '0') ~= '0' then + s = m:field(DummyValue, "pdnsd_run", translate("DNS Anti-pollution")) + s.rawhtml = true + if pdnsd_run == 1 then + s.value = font_blue .. bold_on .. translate("Running") .. bold_off .. font_off + else + s.value = style_blue .. bold_on .. translate("Not Running") .. bold_off .. font_off + end +end + +s = m:field(DummyValue, "sock5_run", translate("Global SOCKS5 Proxy Server")) +s.rawhtml = true +if sock5_run == 1 then + s.value = font_blue .. bold_on .. translate("Running") .. bold_off .. font_off +else + s.value = style_blue .. bold_on .. translate("Not Running") .. bold_off .. font_off +end + +s = m:field(DummyValue, "server_run", translate("Local Servers")) +s.rawhtml = true +if server_run == 1 then + s.value = font_blue .. bold_on .. translate("Running") .. bold_off .. font_off +else + s.value = style_blue .. bold_on .. translate("Not Running") .. bold_off .. font_off +end + +if nixio.fs.access("/usr/bin/kcptun-client") then + s = m:field(DummyValue, "kcp_version", translate("KcpTun Version")) + s.rawhtml = true + s.value = kcptun_version + s = m:field(DummyValue, "kcptun_run", translate("KcpTun")) + s.rawhtml = true + if kcptun_run == 1 then + s.value = font_blue .. bold_on .. translate("Running") .. bold_off .. font_off + else + s.value = style_blue .. bold_on .. translate("Not Running") .. bold_off .. font_off + end +end + +s = m:field(DummyValue, "google", translate("Google Connectivity")) +s.value = translate("No Check") +s.template = "shadowsocksr/check" + +s = m:field(DummyValue, "baidu", translate("Baidu Connectivity")) +s.value = translate("No Check") +s.template = "shadowsocksr/check" + +s = m:field(DummyValue, "gfw_data", translate("GFW List Data")) +s.rawhtml = true +s.template = "shadowsocksr/refresh" +s.value = gfw_count .. " " .. translate("Records") + +s = m:field(DummyValue, "ip_data", translate("China IP Data")) +s.rawhtml = true +s.template = "shadowsocksr/refresh" +s.value = ip_count .. " " .. translate("Records") + +if uci:get_first("shadowsocksr", 'global', 'netflix_enable', '0') ~= '0' then +s = m:field(DummyValue, "nfip_data", translate("Netflix IP Data")) +s.rawhtml = true +s.template = "shadowsocksr/refresh" +s.value = nfip_count .. " " .. translate("Records") +end + +if uci:get_first("shadowsocksr", 'global', 'adblock', '0') == '1' then + s = m:field(DummyValue, "ad_data", translate("Advertising Data")) + s.rawhtml = true + s.template = "shadowsocksr/refresh" + s.value = ad_count .. " " .. translate("Records") +end + +s = m:field(DummyValue, "check_port", translate("Check Server Port")) +s.template = "shadowsocksr/checkport" +s.value = translate("No Check") + +return m diff --git a/luci-app-ssr-plus/luasrc/view/shadowsocksr/certupload.htm b/luci-app-ssr-plus/luasrc/view/shadowsocksr/certupload.htm new file mode 100644 index 00000000..f34f04d7 --- /dev/null +++ b/luci-app-ssr-plus/luasrc/view/shadowsocksr/certupload.htm @@ -0,0 +1,4 @@ +<%+cbi/valueheader%> + + +<%+cbi/valuefooter%> diff --git a/luci-app-ssr-plus/luasrc/view/shadowsocksr/check.htm b/luci-app-ssr-plus/luasrc/view/shadowsocksr/check.htm new file mode 100644 index 00000000..5f6a673a --- /dev/null +++ b/luci-app-ssr-plus/luasrc/view/shadowsocksr/check.htm @@ -0,0 +1,29 @@ +<%+cbi/valueheader%> + + +<%=self.value%> +<%+cbi/valuefooter%> diff --git a/luci-app-ssr-plus/luasrc/view/shadowsocksr/checkport.htm b/luci-app-ssr-plus/luasrc/view/shadowsocksr/checkport.htm new file mode 100644 index 00000000..56ee0ab2 --- /dev/null +++ b/luci-app-ssr-plus/luasrc/view/shadowsocksr/checkport.htm @@ -0,0 +1,25 @@ +<%+cbi/valueheader%> + + +<%=self.value%> +<%+cbi/valuefooter%> diff --git a/luci-app-ssr-plus/luasrc/view/shadowsocksr/ping.htm b/luci-app-ssr-plus/luasrc/view/shadowsocksr/ping.htm new file mode 100644 index 00000000..5b396f7c --- /dev/null +++ b/luci-app-ssr-plus/luasrc/view/shadowsocksr/ping.htm @@ -0,0 +1,3 @@ +<%+cbi/valueheader%> +-- ms +<%+cbi/valuefooter%> diff --git a/luci-app-ssr-plus/luasrc/view/shadowsocksr/refresh.htm b/luci-app-ssr-plus/luasrc/view/shadowsocksr/refresh.htm new file mode 100644 index 00000000..da89fd53 --- /dev/null +++ b/luci-app-ssr-plus/luasrc/view/shadowsocksr/refresh.htm @@ -0,0 +1,37 @@ +<%+cbi/valueheader%> + + +<%=self.value%> +<%+cbi/valuefooter%> diff --git a/luci-app-ssr-plus/luasrc/view/shadowsocksr/reset.htm b/luci-app-ssr-plus/luasrc/view/shadowsocksr/reset.htm new file mode 100644 index 00000000..1882ac56 --- /dev/null +++ b/luci-app-ssr-plus/luasrc/view/shadowsocksr/reset.htm @@ -0,0 +1,25 @@ +<%+cbi/valueheader%> + + + +<%+cbi/valuefooter%> diff --git a/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm b/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm new file mode 100644 index 00000000..259cb7ff --- /dev/null +++ b/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm @@ -0,0 +1,145 @@ +<%# + Copyright 2018-2019 Lienol + Licensed to the public under the Apache License 2.0. +-%> + diff --git a/luci-app-ssr-plus/luasrc/view/shadowsocksr/socket.htm b/luci-app-ssr-plus/luasrc/view/shadowsocksr/socket.htm new file mode 100644 index 00000000..7b7b691f --- /dev/null +++ b/luci-app-ssr-plus/luasrc/view/shadowsocksr/socket.htm @@ -0,0 +1,6 @@ +<%+cbi/valueheader%> +wait + + + +<%+cbi/valuefooter%> diff --git a/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm b/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm new file mode 100644 index 00000000..5eecbee6 --- /dev/null +++ b/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm @@ -0,0 +1,371 @@ +<%+cbi/valueheader%> + + + +<%+cbi/valuefooter%> diff --git a/luci-app-ssr-plus/luasrc/view/shadowsocksr/status.htm b/luci-app-ssr-plus/luasrc/view/shadowsocksr/status.htm new file mode 100644 index 00000000..58bf67f2 --- /dev/null +++ b/luci-app-ssr-plus/luasrc/view/shadowsocksr/status.htm @@ -0,0 +1,22 @@ + + +
+

+ <%:Collecting data...%> +

+
diff --git a/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe.htm b/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe.htm new file mode 100644 index 00000000..90e86dd3 --- /dev/null +++ b/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe.htm @@ -0,0 +1,18 @@ +<%+cbi/valueheader%> + + + +<%+cbi/valuefooter%> diff --git a/luci-app-ssr-plus/po/zh-cn/ssr-plus.po b/luci-app-ssr-plus/po/zh-cn/ssr-plus.po new file mode 100644 index 00000000..f498ed9b --- /dev/null +++ b/luci-app-ssr-plus/po/zh-cn/ssr-plus.po @@ -0,0 +1,1003 @@ +msgid "" +msgstr "Content-Type: text/plain; charset=UTF-8\n" + +msgid "ShadowSocksR Client" +msgstr "ShadowSocksR 客户端" + +msgid "Enable" +msgstr "启用" + +msgid "Disable" +msgstr "停用" + +msgid "Log" +msgstr "日志" + +msgid "ShadowSocksR is running" +msgstr "ShadowSocksR 客户端运行中" + +msgid "ShadowSocksR is not running" +msgstr "ShadowSocksR 客户端未运行" + +msgid "Global Setting" +msgstr "全局设置" + +msgid "Global Server" +msgstr "全局服务器" + +msgid "ShadowSocksR SOCK5 Proxy is running" +msgstr "ShadowSocksR SOCK5 代理运行中" + +msgid "UDP Relay Server" +msgstr "UDP 中继服务器" + +msgid "Same as Global Server" +msgstr "与全局服务器相同" + +msgid "Servers Setting" +msgstr "服务器配置" + +msgid "Alias(optional)" +msgstr "别名(可选)" + +msgid "Onetime Authentication" +msgstr "一次验证" + +msgid "Server Address" +msgstr "服务器地址" + +msgid "Server Port" +msgstr "端口" + +msgid "Local Port" +msgstr "本地端口" + +msgid "Connection Timeout" +msgstr "连接超时" + +msgid "Password" +msgstr "密码" + +msgid "Encrypt Method" +msgstr "加密方式" + +msgid "Enable the SUoT protocol, requires server support." +msgstr "启用 SUoT 协议,需要服务端支持。" + +msgid "Bloom Filter" +msgstr "布隆过滤器" + +msgid "VLESS Encryption" +msgstr "VLESS 加密" + +msgid "Socks Version" +msgstr "Socks 版本" + +msgid "Flow" +msgstr "流控(Flow)" + +msgid "Transport" +msgstr "传输协议" + +msgid "Protocol" +msgstr "传输协议" + +msgid "TLS Host" +msgstr "TLS 主机名" + +msgid "allowInsecure" +msgstr "允许不安全连接" + +msgid "Concurrency" +msgstr "最大并发连接数" + +msgid "If true, allowss insecure connection at TLS client, e.g., TLS server uses unverifiable certificates." +msgstr "是否允许不安全连接。当选择时,将不会检查远端主机所提供的 TLS 证书的有效性。" + +msgid "Protocol param (optional)" +msgstr "传输协议参数(可选)" + +msgid "Obfs" +msgstr "混淆插件" + +msgid "Obfs param (optional)" +msgstr "混淆参数(可选)" + +msgid "Authentication type" +msgstr "验证类型" + +msgid "Users Authentication" +msgstr "用户验证" + +msgid "NOTE: If the server uses the userpass authentication, the format must be username:password." +msgstr "注意: 如果服务器使用 userpass 验证,格式必须是 username:password。" + +msgid "Enable Port Hopping" +msgstr "启用端口跃迁" + +msgid "Port Range" +msgstr "端口范围值" + +msgid "Port Hopping Interval(Unit:Second)" +msgstr "端口跃迁间隔(单位:秒)" + +msgid "Enable Lazy Mode" +msgstr "启用懒狗模式" + +msgid "Enable Obfuscation" +msgstr "启用混淆功能" + +msgid "Obfuscation Type" +msgstr "混淆类型" + +msgid "Obfuscation Password" +msgstr "混淆密码" + +msgid "Hysterir QUIC parameters" +msgstr "QUIC参数" + +msgid "QUIC initStreamReceiveWindow" +msgstr "QUIC初始流接收窗口大小。" + +msgid "QUIC maxStreamReceiveWindow" +msgstr "QUIC最大的流接收窗口大小" + +msgid "QUIC initConnReceiveWindow" +msgstr "QUIC初始的连接接收窗口大小" + +msgid "QUIC maxConnReceiveWindow" +msgstr "QUIC最大的连接接收窗口大小" + +msgid "QUIC maxIdleTimeout(Unit:second)" +msgstr "QUIC最长空闲超时时间(单位:秒)" + +msgid "The keep-alive period.(Unit:second)" +msgstr "心跳包发送间隔(单位:秒)" + + +msgid "Certificate fingerprint" +msgstr "证书指纹" + +msgid "shadowTLS protocol Version" +msgstr "ShadowTLS协议版本" + +msgid "TLS 1.3 Strict mode" +msgstr "TLS 1.3 限定模式" + +msgid "Disable TCP No_delay" +msgstr "禁用TCP无延迟" + +msgid "shadow-TLS SNI" +msgstr "服务器名称指示" + +msgid "Shadow-TLS ChainPoxy type" +msgstr "代理链类型" + +msgid "Shadowsocks-rust Version" +msgstr "shadowsocks rust版本" + +msgid "Vmess Protocol" +msgstr "VMESS协议" + +msgid "Shadowsocks password" +msgstr "shadowsocks密码" + +msgid "QUIC connection receive window" +msgstr "QUIC 连接接收窗口" + +msgid "QUIC stream receive window" +msgstr "QUIC 流接收窗口" + + +msgid "Lazy Start" +msgstr "延迟启动" + +msgid "Disable Path MTU discovery" +msgstr "禁用 MTU 探测" + +msgid "Enable Tunnel(DNS)" +msgstr "启用隧道(DNS)转发" + +msgid "Tunnel Port" +msgstr "隧道(DNS)本地端口" + +msgid "Forwarding Tunnel" +msgstr "隧道(DNS)转发地址" + +msgid "Access Control" +msgstr "访问控制" + +msgid "Interfaces - WAN" +msgstr "接口 - WAN" + +msgid "Bypassed IP List" +msgstr "被忽略 IP 列表" + +msgid "NULL - As Global Proxy" +msgstr "留空 - 作为全局代理" + +msgid "Bypassed IP" +msgstr "额外被忽略 IP" + +msgid "Forwarded IP" +msgstr "强制走代理 IP" + +msgid "Interfaces - LAN" +msgstr "接口 - LAN" + +msgid "LAN Access Control" +msgstr "内网客户端分流代理控制" + +msgid "Allow listed only" +msgstr "仅允许列表内主机" + +msgid "Allow all except listed" +msgstr "除列表外主机皆允许" + +msgid "LAN Host List" +msgstr "内网主机列表" + +msgid "SSR Client" +msgstr "客户端" + +msgid "SSR Server" +msgstr "服务端" + +msgid "ShadowSocksR Server" +msgstr "ShadowSocksR 服务端" + +msgid "ShadowSocksR Server is running" +msgstr "ShadowSocksR 服务端运行中" + +msgid "ShadowSocksR Server is not running" +msgstr "ShadowSocksR 服务端未运行" + +msgid "Enable Server" +msgstr "启动服务端" + +msgid "Server Setting" +msgstr "服务端配置" + +msgid "KcpTun Enable" +msgstr "KcpTun 启用" + +msgid "KcpTun Port" +msgstr "KcpTun 端口" + +msgid "KcpTun Param" +msgstr "KcpTun 参数" + +msgid "KcpTun Password" +msgstr "KcpTun 密码" + +msgid "Enable Process Monitor" +msgstr "启用进程监控" + +msgid "Edit ShadowSocksR Server" +msgstr "编辑服务器配置" + +msgid "Alias" +msgstr "别名" + +msgid "Server" +msgstr "服务器" + +msgid "TCP Fast Open" +msgstr "TCP 快速打开" + +msgid "Status" +msgstr "状态" + +msgid "Unknown" +msgstr "未知" + +msgid "Running Status" +msgstr "运行状态" + +msgid "Global Client" +msgstr "TCP 透明代理" + +msgid "Global SSR Server" +msgstr "SSR 服务端" + +msgid "DNS Tunnel" +msgstr "DNS 隧道" + +msgid "IPK Version" +msgstr "IPK 版本号" + +msgid "KcpTun Version" +msgstr "KcpTun 版本号" + +msgid "Not exist" +msgstr "未安装可执行文件" + +msgid "IPK Installation Time" +msgstr "IPK 安装时间" + +msgid "Project" +msgstr "项目地址" + +msgid "Not Running" +msgstr "未运行" + +msgid "Running" +msgstr "运行中" + +msgid "Enable GFW mode" +msgstr "启用 GFW 模式" + +msgid "Running Mode" +msgstr "运行模式" + +msgid "IP Route Mode" +msgstr "绕过中国大陆 IP 模式" + +msgid "GFW List Mode" +msgstr "GFW 列表模式" + +msgid "Global Mode" +msgstr "全局模式" + +msgid "Oversea Mode" +msgstr "海外用户回国模式" + +msgid "Router Proxy" +msgstr "路由器访问控制" + +msgid "Normal Proxy" +msgstr "正常代理" + +msgid "Bypassed Proxy" +msgstr "不走代理" + +msgid "Forwarded Proxy" +msgstr "强制走代理" + +msgid "UDP Relay" +msgstr "UDP 中继" + +msgid "Google Connectivity" +msgstr "【谷歌】连通性检查" + +msgid "Baidu Connectivity" +msgstr "【百度】连通性检查" + +msgid "No Check" +msgstr "未检查" + +msgid "Check" +msgstr "检查" + +msgid "Connect OK" +msgstr "连接正常" + +msgid "Connect Error" +msgstr "连接错误" + +msgid "Check..." +msgstr "正在检查..." + +msgid "Proxy Check" +msgstr "代理检查" + +msgid "GFW List Data" +msgstr "【GFW 列表】数据库" + +msgid "China IP Data" +msgstr "【中国大陆 IP 段】数据库" + +msgid "Netflix IP Data" +msgstr "【Netflix IP 段】数据库" + +msgid "Advertising Data" +msgstr "【广告屏蔽】数据库" + +msgid "Records" +msgstr "条记录" + +msgid "Refresh Data" +msgstr "更新数据库" + +msgid "Refresh..." +msgstr "正在更新,请稍候..." + +msgid "Refresh OK!" +msgstr "更新成功!" + +msgid "Refresh Error!" +msgstr "更新失败!" + +msgid "No new data!" +msgstr "你已经是最新数据,无需更新!" + +msgid "Total Records:" +msgstr "新的总纪录数:" + +msgid "Check Server Port" +msgstr "【服务器端口】检查" + +msgid "Check Connect" +msgstr "检查连通性" + +msgid "Check Server" +msgstr "检查服务器" + +msgid "Auto Switch" +msgstr "自动切换" + +msgid "Enable Auto Switch" +msgstr "启用自动切换" + +msgid "Switch check cycly(second)" +msgstr "自动切换检查周期(秒)" + +msgid "Check timout(second)" +msgstr "切换检查超时时间(秒)" + +msgid "Check Try Count" +msgstr "切换检查重试次数" + +msgid "Enable adblock" +msgstr "启用广告屏蔽" + +msgid "adblock_url" +msgstr "广告屏蔽更新 URL" + +msgid "gfwlist Update url" +msgstr "GFW 列表更新 URL" + +msgid "Chnroute Update url" +msgstr "中国大陆 IP 段更新 URL" + +msgid "nfip_url" +msgstr "Netflix IP 段更新 URL" + +msgid "Customize Netflix IP Url" +msgstr "自定义 Netflix IP 段更新 URL(默认项目地址:https://github.com/QiuSimons/Netflix_IP)" + +msgid "Enable Process Deamon" +msgstr "启用进程自动守护" + +msgid "DNS Server IP and Port" +msgstr "DNS 服务器地址和端口" + +msgid "Resolve Dns Mode" +msgstr "DNS 解析方式" + +msgid "Use SSR DNS Tunnel" +msgstr "使用 SSR DNS 隧道" + +msgid "DNS Anti-pollution" +msgstr "DNS 防污染服务" + +msgid "Use Other DNS Tunnel(Need to install)" +msgstr "使用其他 DNS 转发(需要自己安装)" + +msgid "Import" +msgstr "导入配置信息" + +msgid "Export SSR" +msgstr "导出 SSR 配置信息" + +msgid "Import configuration information successfully." +msgstr "导入配置信息成功。" + +msgid "Invalid format." +msgstr "无效的格式。" + +msgid "User cancelled." +msgstr "用户已取消。" + +msgid "Paste sharing link here" +msgstr "在此处粘贴分享链接" + +msgid "Unable to copy SSR to clipboard." +msgstr "无法复制 SSR 网址到剪贴板。" + +msgid "Copy SSR to clipboard successfully." +msgstr "成功复制 SSR 网址到剪贴板。" + +msgid "Servers Manage" +msgstr "服务器管理" + +msgid "Auto Update" +msgstr "自动更新" + +msgid "Through proxy update" +msgstr "通过代理更新" + +msgid "GFW List" +msgstr "GFW 列表" + +msgid "ShadowSocksR Plus+ Settings" +msgstr "ShadowSocksR Plus+ 设置" + +msgid "

Support SS/SSR/V2RAY/XRAY/TROJAN/NAIVEPROXY/SOCKS5/TUN etc.

" +msgstr "

支持 SS/SSR/V2RAY/XRAY/TROJAN/NAIVEPROXY/SOCKS5/TUN 等协议。

" + +msgid "Main Server" +msgstr "主服务器" + +msgid "Anti-pollution DNS Server" +msgstr "访问国外域名 DNS 服务器" + +msgid "Custom DNS Server format as IP:PORT (default: 8.8.4.4:53)" +msgstr "格式为 IP:Port(默认:8.8.4.4:53)" + +msgid "Use DNS2TCP query" +msgstr "使用 DNS2TCP 查询" + +msgid "Use DNS2SOCKS query and cache" +msgstr "使用 DNS2SOCKS 查询并缓存" + +msgid "Use MOSDNS query (Not Support Oversea Mode)" +msgstr "使用 MOSDNS 查询 (不支持海外用户回国模式)" + +msgid "Disable IPv6 in MOSDNS query mode" +msgstr "禁止 MOSDNS 返回 IPv6 记录" + +msgid "DNS Query Mode For Shunt Mode" +msgstr "分流模式下的 DNS 查询模式" + +msgid "Anti-pollution DNS Server For Shunt Mode" +msgstr "分流模式下的访问国外域名 DNS 服务器" + +msgid "Use MOSDNS query" +msgstr "使用 MOSDNS 查询" + +msgid "Custom DNS Server for mosdns" +msgstr "MOSDNS 自定义 DNS 服务器" + +msgid "Disable IPv6 In MOSDNS Query Mode (Shunt Mode)" +msgstr "禁止 MOSDNS 返回 IPv6 记录 (分流模式)" + +msgid "DNS Server IP:Port" +msgstr "DNS 服务器 IP:Port" + +msgid "Domestic DNS Server" +msgstr "国内 DNS 服务器" + +msgid "Use DNS from WAN" +msgstr "使用 WAN 下发的 DNS" + +msgid "Use DNS from WAN and 114DNS" +msgstr "使用 WAN 下发的 DNS 和 114DNS" + +msgid "Custom DNS Server format as IP:PORT (default: disabled)" +msgstr "格式为 IP:PORT(默认:禁用)" + +msgid "Update time (every day)" +msgstr "更新时间(每天)" + +msgid "Auto Update Server subscription, GFW list and CHN route" +msgstr "自动更新服务器订阅、GFW 列表和中国大陆 IP 段" + +msgid "Subscribe URL" +msgstr "SS/SSR/V2/TROJAN 订阅 URL" + +msgid "Subscribe Filter Words" +msgstr "订阅节点关键字过滤" + +msgid "Subscribe Save Words" +msgstr "订阅节点关键字保留检查" + +msgid "Filter Words splited by /" +msgstr "命中关键字的节点将被丢弃。多个关键字用 / 分隔" + +msgid "Save Words splited by /" +msgstr "命中关键字的节点将被保留。多个关键字用 / 分隔。此项为空则不启用保留匹配" + +msgid "Update" +msgstr "更新" + +msgid "Server Count" +msgstr "服务器节点数量" + +msgid "Interface control" +msgstr "接口控制" + +msgid "WAN IP AC" +msgstr "WAN IP 访问控制" + +msgid "WAN White List IP" +msgstr "不走代理的 WAN IP" + +msgid "WAN Force Proxy IP" +msgstr "强制走代理的 WAN IP" + +msgid "LAN Bypassed Host List" +msgstr "不走代理的局域网 LAN IP" + +msgid "LAN Force Proxy Host List" +msgstr "全局代理的 LAN IP" + +msgid "Router Self AC" +msgstr "路由器自身代理设置" + +msgid "Router Self Proxy" +msgstr "路由器自身代理方式" + +msgid "Normal Proxy" +msgstr "跟随全局设置" + +msgid "Bypassed Proxy" +msgstr "不走代理" + +msgid "Forwarded Proxy" +msgstr "全局代理" + +msgid "GFW Custom List" +msgstr "GFW 用户自定义列表" + +msgid "Please refer to the following writing" +msgstr "每行一个域名,无需写前面的 http(s)://,提交后即时生效" + +msgid "Servers subscription and manage" +msgstr "服务器节点订阅与管理" + +msgid "Through proxy update list, Not Recommended" +msgstr "通过路由器自身代理更新订阅" + +msgid "LAN IP AC" +msgstr "LAN IP 访问控制" + +msgid "Game Mode UDP Server" +msgstr "游戏模式 UDP 中继服务器" + +msgid "Game Mode UDP Relay" +msgstr "游戏模式 UDP 中继" + +msgid "Server failsafe auto swith and custom update settings" +msgstr "服务器节点故障自动切换/广告屏蔽/中国大陆 IP 段数据库更新设置" + +msgid "Support AdGuardHome and DNSMASQ format list" +msgstr "同时支持 AdGuard Home 和 DNSMASQ 格式的过滤列表" + +msgid "Delete All Subscribe Servers" +msgstr "删除所有订阅服务器节点" + +msgid "Servers Nodes" +msgstr "服务器节点" + +msgid "Use Local DNS Service listen port 5335" +msgstr "使用本机端口为 5335 的 DNS 服务" + +msgid "Server Node Type" +msgstr "服务器节点类型" + +msgid "Using incorrect encryption mothod may causes service fail to start" +msgstr "输入不正确的参数组合可能会导致服务无法启动" + +msgid "Game Mode Host List" +msgstr "增强游戏模式客户端 LAN IP" + +msgid "Multi Threads Option" +msgstr "多线程并发转发" + +msgid "Auto Threads" +msgstr "自动(CPU 线程数)" + +msgid "1 Thread" +msgstr "单线程" + +msgid "2 Threads" +msgstr "2 线程" + +msgid "4 Threads" +msgstr "4 线程" + +msgid "8 Threads" +msgstr "8 线程" + +msgid "16 Threads" +msgstr "16 线程" + +msgid "32 Threads" +msgstr "32 线程" + +msgid "64 Threads" +msgstr "64 线程" + +msgid "128 Threads" +msgstr "128 线程" + +msgid "Proxy Ports" +msgstr "需要代理的端口" + +msgid "All Ports" +msgstr "所有端口(默认)" + +msgid "Only Common Ports" +msgstr "仅常用端口(不走 P2P 流量到代理)" + +msgid "Socket Connected" +msgstr "连接测试" + +msgid "Ping Latency" +msgstr "Ping 延迟" + +msgid "Bypass Domain List" +msgstr "不走代理的域名" + +msgid "Black Domain List" +msgstr "强制走代理的域名" + +msgid "Update Subscribe List" +msgstr "更新订阅 URL 列表" + +msgid "Update subscribe url list first" +msgstr "修改订阅 URL 和节点关键字后,请先点击更新" + +msgid "Update All Subscribe Servers" +msgstr "更新所有订阅服务器节点" + +msgid "Plugin" +msgstr "插件" + +msgid "Plugin Opts" +msgstr "插件参数" + +msgid "Self-signed Certificate" +msgstr "自签证书" + +msgid "If you have a self-signed certificate,please check the box" +msgstr "如果你使用自签证书,请选择" + +msgid "upload" +msgstr "上传" + +msgid "Upload" +msgstr "上传" + +msgid "No specify upload file." +msgstr "没有上传证书。" + +msgid "Current Certificate Path" +msgstr "当前证书路径" + +msgid "Please confirm the current certificate path" +msgstr "请选择确认所传证书,证书不正确将无法运行" + +msgid "Subscribe Default Auto-Switch" +msgstr "订阅新节点自动切换设置" + +msgid "Subscribe new add server default Auto-Switch on" +msgstr "订阅加入的新节点默认开启自动切换" + +msgid "SOCKS5 Proxy Server Settings" +msgstr "SOCKS5 代理服务端设置" + +msgid "SOCKS5 Proxy Server" +msgstr "SOCKS5 代理服务端" + +msgid "Enable SOCKS5 Proxy Server" +msgstr "启用 SOCKS5 代理服务" + +msgid "Enable Authentication" +msgstr "启用用户名/密码认证" + +msgid "Enable SOCKS5 Proxy Server" +msgstr "启用 SOCKS5 代理服务" + +msgid "Enable WAN Access" +msgstr "允许从 WAN 访问" + +msgid "Redirect traffic to this network interface" +msgstr "分流到这个网络接口" + +msgid "Netflix Node" +msgstr "Netflix 分流服务器" + +msgid "Netflix Domain List" +msgstr "Netflix 分流域名列表" + +msgid "Netflix IP List" +msgstr "Netflix 分流IP列表" + +msgid "External Proxy Mode" +msgstr "分流服务器(前置)代理" + +msgid "Forward Netflix Proxy through Main Proxy" +msgstr "分流服务器流量通过主服务节点中转代理转发" + +msgid "Server Type" +msgstr "服务端类型" + +msgid "Local Servers" +msgstr "本机服务端" + +msgid "Global SOCKS5 Proxy Server" +msgstr "SOCKS5 代理服务端(全局)" + +msgid "warning! Please do not reuse the port!" +msgstr "警告!请不要重复使用端口!" + +msgid "Deny Domain List" +msgstr "禁止连接的域名" + +msgid "Obfuscate password (optional)" +msgstr "混淆密码(可选)" + +msgid "V2Ray/XRay protocol" +msgstr "V2Ray/XRay 协议" + +msgid "Camouflage Type" +msgstr "伪装类型" + +msgid "HTTP Host" +msgstr "HTTP 主机名" + +msgid "HTTP Path" +msgstr "HTTP 路径" + +msgid "WebSocket Host" +msgstr "WebSocket 主机名" + +msgid "WebSocket Path" +msgstr "WebSocket 路径" + +msgid "Max Early Data" +msgstr "最大前置数据" + +msgid "Early Data Header Name" +msgstr "前置数据标头" + +msgid "HTTP/2 Host" +msgstr "HTTP/2 主机名" + +msgid "HTTP/2 Path" +msgstr "HTTP/2 路径" + +msgid "gRPC Service Name" +msgstr "gRPC 服务名称" + +msgid "gRPC Mode" +msgstr "gRPC 模式" + +msgid "Initial Windows Size" +msgstr "初始窗口大小" + +msgid "H2/gRPC Health Check" +msgstr "H2/gRPC 健康检查" + +msgid "H2 Read Idle Timeout" +msgstr "H2 读取空闲超时" + +msgid "gRPC Idle Timeout" +msgstr "gPRC 空闲超时" + +msgid "Health Check Timeout" +msgstr "健康检查超时" + +msgid "QUIC Security" +msgstr "QUIC 加密方式" + +msgid "QUIC Key" +msgstr "QUIC 密钥" + +msgid "VideoCall (SRTP)" +msgstr "视频通话(SRTP)" + +msgid "BitTorrent (uTP)" +msgstr "BT 下载(uTP)" + +msgid "WechatVideo" +msgstr "微信视频通话" + +msgid "DTLS 1.2" +msgstr "DTLS 1.2 数据包" + +msgid "MTU" +msgstr "最大传输单元" + +msgid "TTI" +msgstr "传输时间间隔" + +msgid "Uplink Capacity(Default:Mbps)" +msgstr "上行链路容量(默认:Mbps)" + +msgid "Downlink Capacity(Default:Mbps)" +msgstr "下行链路容量(默认:Mbps)" + +msgid "Read Buffer Size" +msgstr "读取缓冲区大小" + +msgid "Write Buffer Size" +msgstr "写入缓冲区大小" + +msgid "Congestion" +msgstr "拥塞控制" + +msgid "Local addresses" +msgstr "本地地址" + +msgid "Private key" +msgstr "私钥" + +msgid "Peer public key" +msgstr "节点公钥" + +msgid "Pre-shared key" +msgstr "预共享密钥" + +msgid "Network interface to use" +msgstr "使用的网络接口" + +msgid "Please fill in reset" +msgstr "请填写 reset" + +msgid "The content entered is incorrect!" +msgstr "输入的内容不正确!" + +msgid "Reset complete" +msgstr "重置完成" + +msgid "Reset Error" +msgstr "重置错误" + +msgid "Finger Print" +msgstr "指纹伪造" + +msgid "Reapply" +msgstr "重新应用" + +msgid "Apply" +msgstr "应用" + +msgid "Enable Netflix Mode" +msgstr "启用 Netflix 分流模式" + +msgid "TUIC User UUID" +msgstr "TUIC用户uuid" + +msgid "TUIC Server IP Address" +msgstr "TUIC 服务器IP地址" + +msgid "TUIC User Password" +msgstr "TUIC用户密钥" + +msgid "UDP relay mode" +msgstr "UDP中继模式" + +msgid "native UDP characteristics" +msgstr "原生UDP特性" + +msgid "lossless UDP relay using QUIC streams" +msgstr "使用 QUIC 流的无损 UDP 中继" + +msgid "Congestion control algorithm" +msgstr "拥塞控制算法" + +msgid "Heartbeat interval(second)" +msgstr "保活心跳包发送间隔(单位:秒)" + +msgid "Timeout for establishing a connection to server(second)" +msgstr "连接超时时间(单位:秒)" + +msgid "Garbage collection interval(second)" +msgstr "UDP数据包片残片清理间隔(单位:秒)" + +msgid "Garbage collection lifetime(second)" +msgstr "UDP数据包残片在服务器的保留时间(单位:秒)" + +msgid "Disable SNI" +msgstr "关闭SNI服务器名称指示" + +msgid "Enable 0-RTT QUIC handshake" +msgstr "客户端启用 0-RTT QUIC 连接握手" + +msgid "TUIC send window" +msgstr "发送窗口(无需确认即可发送的最大字节数:默认8Mb*2)" + +msgid "TUIC receive window" +msgstr "接收窗口(无需确认即可接收的最大字节数:默认8Mb)" + +msgid "Dual-stack Listening Socket" +msgstr "双栈Socket监听" + +msgid "Maximum packet size the socks5 server can receive from external" +msgstr "socks5服务器可以从外部接收的最大数据包大小(单位:字节)" + +msgid "Disable ChinaDNS-NG" +msgstr "直通模式(禁用ChinaDNS-NG)" diff --git a/luci-app-ssr-plus/po/zh_Hans b/luci-app-ssr-plus/po/zh_Hans new file mode 120000 index 00000000..41451e4a --- /dev/null +++ b/luci-app-ssr-plus/po/zh_Hans @@ -0,0 +1 @@ +zh-cn \ No newline at end of file diff --git a/luci-app-ssr-plus/root/etc/config/shadowsocksr b/luci-app-ssr-plus/root/etc/config/shadowsocksr new file mode 100644 index 00000000..e69de29b diff --git a/luci-app-ssr-plus/root/etc/init.d/shadowsocksr b/luci-app-ssr-plus/root/etc/init.d/shadowsocksr new file mode 100755 index 00000000..2415b624 --- /dev/null +++ b/luci-app-ssr-plus/root/etc/init.d/shadowsocksr @@ -0,0 +1,1180 @@ +#!/bin/sh /etc/rc.common +# +# Copyright (C) 2017 openwrt-ssr +# Copyright (C) 2017 yushi studio +# Copyright (C) 2018 lean +# Copyright (C) 2020 Mattraks +# +# This is free software, licensed under the GNU General Public License v3. +# See /LICENSE for more information. +# + +START=95 +STOP=15 +SERVICE_DAEMONIZE=1 +NAME=shadowsocksr +LOCK_FILE=/var/lock/ssrplus.lock +LOG_FILE=/var/log/ssrplus.log +TMP_PATH=/var/etc/ssrplus +TMP_BIN_PATH=$TMP_PATH/bin +TMP_DNSMASQ_PATH=/tmp/dnsmasq.d/dnsmasq-ssrplus.d + +chain_config_file= #generate shadowtls chain proxy config file +tcp_config_file= +udp_config_file= +shunt_config_file= +local_config_file= +shunt_dns_config_file= +tmp_local_port= + +ARG_UDP= + +dns_port="5335" #dns port +china_dns_port="5333" #china_dns_port +tmp_dns_port="300" #dns2socks temporary port +tmp_udp_port="301" #udp temporary port +tmp_udp_local_port="302" #udp socks temporary port +tmp_shunt_port="303" #shunt temporary port +tmp_shunt_local_port="304" #shunt socks temporary port +tmp_shunt_dns_port="305" #shunt dns2socks temporary port +tmp_tcp_local_port="306" #tcp socks temporary port + +server_count=0 +redir_tcp=0 +redir_udp=0 +local_enable=0 +kcp_enable_flag=0 +pdnsd_enable_flag=0 +switch_server=$1 +CRON_FILE=/etc/crontabs/root +EXTRA_COMMANDS='reset' +EXTRA_HELP=" reset Reset to default settings" +#extra_command "reset" "Reset to default settings" +PS="/bin/busybox ps" + +uci_get_by_name() { + local ret=$(uci get $NAME.$1.$2 2>/dev/null) + echo ${ret:=$3} +} + +uci_get_by_type() { + local ret=$(uci get $NAME.@$1[0].$2 2>/dev/null) + echo ${ret:=$3} +} + +uci_set_by_name() { + uci set $NAME.$1.$2=$3 2>/dev/null + uci commit $NAME +} + +uci_set_by_type() { + uci set $NAME.@$1[0].$2=$3 2>/dev/null + uci commit $NAME +} + +uci_get_by_cfgid() { + local ret=$(uci show $NAME.@$1[0].$2 | awk -F '.' '{print $2}' 2>/dev/null) + echo ${ret:=$3} +} + +get_host_ip() { + local host=$(uci_get_by_name $1 server) + local ip=$host + if [ -z "$(echo $host | grep -E "([0-9]{1,3}[\.]){3}[0-9]{1,3}")" ]; then + if [ "$host" == "${host#*:[0-9a-fA-F]}" ]; then + ip=$(resolveip -4 -t 3 $host | awk 'NR==1{print}') + [ -z "$ip" ] && ip=$(wget -q -O- http://119.29.29.29/d?dn=$host | awk -F ';' '{print $1}') + fi + fi + [ -z "$ip" ] || uci_set_by_name $1 ip $ip + [ -n "$ip" ] || ip="$(uci_get_by_name $1 ip "ERROR")" + + local chinadns="$(uci_get_by_type global chinadns_forward)" + if [ -n "$chinadns" ] && [ "$ip" != "$host" ]; then + grep -q "$host" "$TMP_DNSMASQ_PATH/chinadns_fixed_server.conf" 2>"/dev/null" || \ + echo -e "address=/$host/$ip" >> "$TMP_DNSMASQ_PATH/chinadns_fixed_server.conf" + fi + + echo $ip +} + +clean_log() { + local logsnum=$(cat $LOG_FILE 2>/dev/null | wc -l) + [ "$logsnum" -gt 1000 ] && { + echo "$(date "+%Y-%m-%d %H:%M:%S") 日志文件过长,清空处理!" >$LOG_FILE + } +} + +echolog() { + local d="$(date "+%Y-%m-%d %H:%M:%S")" + echo -e "$d: $*" >>$LOG_FILE +} + +add_cron() { + touch $CRON_FILE + sed -i '/ssrplus.log/d' $CRON_FILE + [ $(uci_get_by_type server_subscribe auto_update 0) -eq 1 ] && echo "0 $(uci_get_by_type server_subscribe auto_update_time) * * * /usr/share/shadowsocksr/ssrplusupdate.sh >$LOG_FILE" >>$CRON_FILE + crontab $CRON_FILE +} + +del_cron() { + touch $CRON_FILE + sed -i '/ssrplus.log/d' $CRON_FILE + crontab $CRON_FILE + clean_log +} + +set_lock() { + exec 1000>"$LOCK_FILE" + flock -xn 1000 +} + +unset_lock() { + flock -u 1000 + rm -rf "$LOCK_FILE" +} + +unlock() { + failcount=1 + while [ "$failcount" -le 10 ]; do + if [ -f "$LOCK_FILE" ]; then + let "failcount++" + sleep 1s + [ "$failcount" -ge 10 ] && unset_lock + else + break + fi + done +} + +_exit() { + local rc=$1 + unset_lock + exit ${rc} +} + +first_type() { + type -t -p "/bin/${1}" -p "${TMP_BIN_PATH}/${1}" -p "${1}" "$@" | head -n1 +} + +ln_start_bin() { + local file_func=${1} + local ln_name=${2} + shift 2 + if [ "${file_func%%/*}" != "${file_func}" ]; then + [ ! -L "${file_func}" ] && { + ln -s "${file_func}" "${TMP_BIN_PATH}/${ln_name}" >/dev/null 2>&1 + file_func="${TMP_BIN_PATH}/${ln_name}" + } + [ -x "${file_func}" ] || echolog "$(readlink ${file_func}) 没有执行权限,无法启动:${file_func} $*" + fi + #echo "${file_func} $*" >&2 + [ -x "${file_func}" ] || { + echolog "找不到 ${file_func},无法启动..." + echolog "-----------end------------" + _exit 2 + } + ulimit -n 1000000 + ${file_func:-echolog " - ${ln_name}"} "$@" >/dev/null 2>&1 & +} + +add_dns_into_ipset() { + case "$1" in + gfw) ipset add gfwlist ${2%:*} 2>/dev/null ;; + oversea) ipset add oversea ${2%:*} 2>/dev/null ;; + *) ipset add ss_spec_wan_ac ${2%:*} nomatch 2>/dev/null ;; + esac +} + +start_dns() { + local ssrplus_dns="$(uci_get_by_type global pdnsd_enable 0)" + local dnsserver="$(uci_get_by_type global tunnel_forward 8.8.4.4:53)" + local run_mode="$(uci_get_by_type global run_mode)" + + if [ "$ssrplus_dns" != "0" ]; then + if [ -n "$dnsserver" ]; then + add_dns_into_ipset $run_mode $dnsserver + fi + case "$ssrplus_dns" in + 1) + ln_start_bin $(first_type dns2tcp) dns2tcp -L 127.0.0.1#$dns_port -R ${dnsserver/:/#} + pdnsd_enable_flag=1 + ;; + 2) + ln_start_bin $(first_type microsocks) microsocks -i 127.0.0.1 -p $tmp_dns_port ssrplus-dns + ln_start_bin $(first_type dns2socks) dns2socks 127.0.0.1:$tmp_dns_port $dnsserver 127.0.0.1:$dns_port -q + pdnsd_enable_flag=2 + ;; + 3) + local mosdns_ipv6="$(uci_get_by_type global mosdns_ipv6)" + local mosdns_dnsserver="$(uci_get_by_type global tunnel_forward_mosdns)" + output=$(for i in $(echo $mosdns_dnsserver | sed "s/,/ /g"); do + dnsserver=${i%:*} + dnsserver=${i##*/} + add_dns_into_ipset $run_mode $dnsserver + echo " - addr: $i" + echo " enable_pipeline: true" + done) + + awk -v line=14 -v text="$output" 'NR == line+1 {print text} 1' /etc/ssrplus/mosdns-config.yaml | sed "s/DNS_PORT/$dns_port/g" > $TMP_PATH/mosdns-config.yaml + if [ "$mosdns_ipv6" == "0" ]; then + sed -i "s/DNS_MODE/main_sequence_with_IPv6/g" $TMP_PATH/mosdns-config.yaml + else + sed -i "s/DNS_MODE/main_sequence_disable_IPv6/g" $TMP_PATH/mosdns-config.yaml + fi + ln_start_bin $(first_type mosdns) mosdns start -c $TMP_PATH/mosdns-config.yaml + pdnsd_enable_flag=3 + ;; + esac + + if [ "$run_mode" = "router" ]; then + local chinadns="$(uci_get_by_type global chinadns_forward)" + if [ -n "$chinadns" ]; then + local wandns="$(ifstatus wan | jsonfilter -e '@["dns-server"][0]' || echo "119.29.29.29")" + case "$chinadns" in + "wan") chinadns="$wandns" ;; + "wan_114") chinadns="$wandns,114.114.114.114" ;; + esac + + ln_start_bin $(first_type chinadns-ng) chinadns-ng -l $china_dns_port -4 china -p 3 -c ${chinadns/:/#} -t 127.0.0.1#$dns_port -N -f -r + + cat <<-EOF >> "$TMP_DNSMASQ_PATH/chinadns_fixed_server.conf" + no-poll + no-resolv + server=127.0.0.1#$china_dns_port + EOF + fi + fi + fi +} + +gen_service_file() { #1-server.type 2-cfgname 3-file_path + local fastopen + if [ $(uci_get_by_name $2 fast_open) == "1" ]; then + fastopen="true" + else + fastopen="false" + fi + case $1 in + ssr) + cat <<-EOF >$3 + { + "server": "0.0.0.0", + "server_ipv6": "::", + "server_port": $(uci_get_by_name $2 server_port), + "mode": "tcp_and_udp", + "password": "$(uci_get_by_name $2 password)", + "timeout": $(uci_get_by_name $2 timeout 60), + "method": "$(uci_get_by_name $2 encrypt_method)", + "protocol": "$(uci_get_by_name $2 protocol)", + "protocol_param": "$(uci_get_by_name $2 protocol_param)", + "obfs": "$(uci_get_by_name $2 obfs)", + "obfs_param": "$(uci_get_by_name $2 obfs_param)", + "fast_open": $fastopen + } + EOF + ;; + ss) + cat <<-EOF >$3 + { + "server": "0.0.0.0", + "server_ipv6": "::", + "server_port": $(uci_get_by_name $2 server_port), + "mode": "tcp_and_udp", + "password": "$(uci_get_by_name $2 password)", + "timeout": $(uci_get_by_name $2 timeout 60), + "method": "$(uci_get_by_name $2 encrypt_method_ss)", + "protocol": "socks", + "fast_open": $fastopen + } + EOF + ;; + esac +} + +get_name() { + case "$1" in + ss) echo "Shadowsocks" ;; + ssr) echo "ShadowsocksR" ;; + esac +} + +gen_config_file() { #server1 type2 code3 local_port4 socks_port5 chain6 threads5 + case "$3" in + 1) + config_file=$tcp_config_file + chain_config_file=$(echo ${config_file}|sed 's/ssrplus\//ssrplus\/chain-/') + ;; + 2) + config_file=$udp_config_file + chain_config_file=$(echo ${config_file}|sed 's/ssrplus\//ssrplus\/chain-/') + ;; + 3) + if [ -n "$tmp_local_port" ]; then + local tmp_port=$tmp_local_port + else + local tmp_port=$tmp_shunt_local_port + fi + config_file=$shunt_config_file + chain_config_file=$(echo ${config_file}|sed 's/ssrplus\//ssrplus\/chain-/') + ;; + 4) + local ss_protocol="socks" + config_file=$local_config_file + chain_config_file=$(echo ${config_file}|sed 's/ssrplus\//ssrplus\/chain-/') + ;; + esac + case "$2" in + ss | ssr) + lua /usr/share/shadowsocksr/gen_config.lua $1 $mode $4 ${ss_protocol:-redir} >$config_file + if [ "$3" == "3" ]; then + lua /usr/share/shadowsocksr/gen_config.lua $1 $mode $tmp_port socks >$shunt_dns_config_file + fi + ;; + v2ray) + lua /usr/share/shadowsocksr/gen_config.lua $1 $mode $4 $5 >$config_file + ;; + trojan) + case "$3" in + 1) + lua /usr/share/shadowsocksr/gen_config.lua $1 nat $4 >$config_file + ;; + 2) + lua /usr/share/shadowsocksr/gen_config.lua $1 client $4 >$config_file + ;; + 3) + lua /usr/share/shadowsocksr/gen_config.lua $1 nat $4 >$config_file + lua /usr/share/shadowsocksr/gen_config.lua $1 client $tmp_port >$shunt_dns_config_file + ;; + 4) + lua /usr/share/shadowsocksr/gen_config.lua $1 client $4 >$config_file + ;; + esac + ;; + naiveproxy) + case "$3" in + 1) + lua /usr/share/shadowsocksr/gen_config.lua $1 redir $4 >$config_file + ;; + 3) + lua /usr/share/shadowsocksr/gen_config.lua $1 redir $4 >$config_file + lua /usr/share/shadowsocksr/gen_config.lua $1 socks $tmp_port >$shunt_dns_config_file + ;; + 4) + lua /usr/share/shadowsocksr/gen_config.lua $1 socks $4 >$config_file + ;; + esac + ;; + hysteria) + lua /usr/share/shadowsocksr/gen_config.lua $1 $mode $4 $5 >$config_file + ;; + tuic) + case "$3" in + 1|2|4) + lua /usr/share/shadowsocksr/gen_config.lua $1 $mode $4 >$config_file + ;; + 3) + [ -z "$6" ] && lua /usr/share/shadowsocksr/gen_config.lua $1 $mode $4 >$shunt_dns_config_file || lua /usr/share/shadowsocksr/gen_config.lua $1 $mode $4 >$config_file + ;; + esac + ;; + shadowtls) + case "$3" in + 1|2|4) + [ -z "$6" ] && lua /usr/share/shadowsocksr/gen_config.lua $1 $type $4 >$chain_config_file || lua /usr/share/shadowsocksr/gen_config.lua $1 $mode $4 $5 $6 >$config_file + ;; + 3) + lua /usr/share/shadowsocksr/gen_config.lua $1 $type $4 >$chain_config_file + lua /usr/share/shadowsocksr/gen_config.lua $1 $mode $4 $5 $6 >$config_file + ;; + esac + ;; + socks5) + /usr/share/shadowsocksr/genred2config.sh $config_file $2 $mode $4 \ + "$(uci_get_by_name $1 server)" \ + "$(uci_get_by_name $1 server_port)" \ + "$(uci_get_by_name $1 auth_enable 0)" \ + "$(uci_get_by_name $1 username)" \ + "$(uci_get_by_name $1 password)" + ;; + tun) + /usr/share/shadowsocksr/genred2config.sh $config_file $2 $(uci_get_by_name $1 iface "br-lan") $4 + ;; + esac + sed -i 's/\\//g' $TMP_PATH/*-ssr-*.json #>/dev/null > 2>&1 +} + +start_udp() { + local type=$(uci_get_by_name $UDP_RELAY_SERVER type) + redir_udp=1 + case "$type" in + ss | ssr) + gen_config_file $UDP_RELAY_SERVER $type 2 $tmp_udp_port + ss_program="$(first_type ${type}local ${type}-redir)" + ln_start_bin $ss_program ${type}-redir -c $udp_config_file + echolog "UDP TPROXY Relay:$(get_name $type) Started!" + ;; + v2ray) + gen_config_file $UDP_RELAY_SERVER $type 2 $tmp_udp_port + ln_start_bin $(first_type xray v2ray) v2ray run -config $udp_config_file + echolog "UDP TPROXY Relay:$($(first_type "xray" "v2ray") version | head -1) Started!" + ;; + trojan) #client + gen_config_file $UDP_RELAY_SERVER $type 2 $tmp_udp_local_port + ln_start_bin $(first_type trojan) $type --config $udp_config_file + ln_start_bin $(first_type ipt2socks) ipt2socks -U -b 0.0.0.0 -4 -s 127.0.0.1 -p $tmp_udp_local_port -l $tmp_udp_port + echolog "UDP TPROXY Relay:$($(first_type trojan) --version 2>&1 | head -1) Started!" + ;; + naiveproxy) + echolog "NaïveProxy UDP TPROXY Relay not supported!" + redir_udp=0 + ARG_UDP="" + ;; + hysteria) + gen_config_file $UDP_RELAY_SERVER $type 2 $tmp_udp_port + ln_start_bin $(first_type hysteria) hysteria client --config $udp_config_file + echolog "UDP TPROXY Relay:$($(first_type "hysteria") version | awk '{print $1,$3}') Started!" + ;; + tuic) + # FIXME: ipt2socks cannot handle udp reply from tuic + # 20230726 uncomment following 4 lines + gen_config_file $UDP_RELAY_SERVER $type 2 $tmp_udp_local_port + ln_start_bin $(first_type tuic-client) tuic-client --config $udp_config_file + ln_start_bin $(first_type ipt2socks) ipt2socks -U -b 0.0.0.0 -4 -s 127.0.0.1 -p $tmp_udp_local_port -l $tmp_udp_port + echolog "UDP TPROXY Relay:tuic-client $($(first_type tuic-client) --version) Started!" + echolog "TUIC UDP TPROXY Relay not supported!" + #redir_udp=0 + #ARG_UDP="" + ;; + shadowtls) + gen_config_file $UDP_RELAY_SERVER $type 2 ${tmp_udp_local_port} + gen_config_file $UDP_RELAY_SERVER $type 2 ${tmp_udp_local_port} 0 chain + ln_start_bin $(first_type shadow-tls) shadow-tls config --config $chain_config_file + local chain_type=$(uci_get_by_name $UDP_RELAY_SERVER chain_type) + case ${chain_type} in + vmess) + ln_start_bin $(first_type xray v2ray) v2ray run -c $udp_config_file + echolog "UDP TPROXY Relay:shadow-tls chain-to $($(first_type xray) --version) Started!" + ;; + sslocal) + ln_start_bin $(first_type sslocal) sslocal -c $udp_config_file + echolog "UDP TPROXY Relay:shadow-tls chain-to $($(first_type sslocal) --version) Started!" + ;; + esac + ;; + socks5) + # if [ "$(uci_get_by_name $UDP_RELAY_SERVER auth_enable 0)" == "1" ]; then + # local auth="-a $(uci_get_by_name $UDP_RELAY_SERVER username) -k $(uci_get_by_name $UDP_RELAY_SERVER password)" + # fi + # ln_start_bin $(first_type ipt2socks) ipt2socks $udp_config_file -U -4 -s $(uci_get_by_name $UDP_RELAY_SERVER server) -p $(uci_get_by_name $UDP_RELAY_SERVER server_port) -l $tmp_udp_port $auth + gen_config_file $UDP_RELAY_SERVER $type 2 $tmp_udp_port + ln_start_bin $(first_type redsocks2) redsocks2 -c $udp_config_file + echolog "UDP TPROXY Relay:Socks5 REDIRECT/TPROXY Started!" + ;; + tun) + echolog "Network Tunnel UDP TPROXY Relay not supported!" + redir_udp=0 + ARG_UDP="" + ;; + esac +} + +shunt_dns_command() { + local shunt_dns_mode="$(uci_get_by_type global shunt_dns_mode)" + local shunt_dnsserver="$(uci_get_by_type global shunt_dnsserver)" + case "$shunt_dns_mode" in + 1) + ln_start_bin $(first_type dns2socks) dns2socks 127.0.0.1:$tmp_port $shunt_dnsserver 127.0.0.1:$tmp_shunt_dns_port -q + ;; + 2) + local shunt_mosdns_ipv6="$(uci_get_by_type global shunt_mosdns_ipv6)" + local shunt_mosdns_dnsserver="$(uci_get_by_type global shunt_mosdns_dnsserver)" + output=$(for i in $(echo $shunt_mosdns_dnsserver | sed "s/,/ /g"); do + echo " - addr: $i" + echo " socks5: \"127.0.0.1:$tmp_port\"" + echo " enable_pipeline: true" + done) + awk -v line=14 -v text="$output" 'NR == line+1 {print text} 1' /etc/ssrplus/mosdns-config.yaml | sed "s/DNS_PORT/$tmp_shunt_dns_port/g" > $TMP_PATH/mosdns-config-shunt.yaml + + if [ "$shunt_mosdns_ipv6" == "0" ]; then + sed -i "s/DNS_MODE/main_sequence_with_IPv6/g" $TMP_PATH/mosdns-config-shunt.yaml + else + sed -i "s/DNS_MODE/main_sequence_disable_IPv6/g" $TMP_PATH/mosdns-config-shunt.yaml + fi + ln_start_bin $(first_type mosdns) mosdns start -c $TMP_PATH/mosdns-config-shunt.yaml + ;; + esac +} + +start_shunt() { + local type=$(uci_get_by_name $SHUNT_SERVER type) + case "$type" in + ss | ssr) + gen_config_file $SHUNT_SERVER $type 3 $tmp_shunt_port + ss_program="$(first_type ${type}local ${type}-redir)" + ln_start_bin $ss_program ${type}-redir -c $shunt_config_file + if [ -n "$tmp_local_port" ]; then + local tmp_port=$tmp_local_port + else + local tmp_port=$tmp_shunt_local_port + ln_start_bin $(first_type ${type}local ${type}-local) ${type}-local -c $shunt_dns_config_file + fi + shunt_dns_command + echolog "shunt:$(get_name $type) Started!" + ;; + v2ray) + local tmp_port=${tmp_local_port:-$tmp_shunt_local_port} + gen_config_file $SHUNT_SERVER $type 3 $tmp_shunt_port $tmp_port + ln_start_bin $(first_type xray v2ray) v2ray run -config $shunt_config_file + shunt_dns_command + echolog "shunt:$($(first_type xray v2ray) version | head -1) Started!" + ;; + trojan) + gen_config_file $SHUNT_SERVER $type 3 $tmp_shunt_port + ln_start_bin $(first_type trojan) $type --config $shunt_config_file + if [ -n "$tmp_local_port" ]; then + local tmp_port=$tmp_local_port + else + local tmp_port=$tmp_shunt_local_port + ln_start_bin $(first_type trojan) $type --config $shunt_dns_config_file + fi + shunt_dns_command + echolog "shunt:$($(first_type trojan) --version 2>&1 | head -1) Started!" + ;; + naiveproxy) + gen_config_file $SHUNT_SERVER $type 3 $tmp_shunt_port + ln_start_bin $(first_type naive) naive --config $shunt_config_file + if [ -n "$tmp_local_port" ]; then + local tmp_port=$tmp_local_port + else + local tmp_port=$tmp_shunt_local_port + ln_start_bin $(first_type naive) naive --config $shunt_dns_config_file + fi + shunt_dns_command + echolog "shunt:$($(first_type "naive") --version 2>&1 | head -1) Started!" + redir_udp=0 + ;; + hysteria) + if [ -n "$tmp_local_port" ]; then + local tmp_port=$tmp_local_port + gen_config_file $SHUNT_SERVER $type 3 $tmp_shunt_port + else + local tmp_port=$tmp_shunt_local_port + gen_config_file $SHUNT_SERVER $type 3 $tmp_shunt_port $tmp_port + fi + ln_start_bin $(first_type hysteria) hysteria client --config $shunt_config_file + shunt_dns_command + echolog "shunt:$($(first_type hysteria) version | awk '{print $1,$3}') Started!" + ;; + tuic) + local chain_shunt_port="30${tmp_shunt_port}" + gen_config_file $SHUNT_SERVER $type 3 $chain_shunt_port 0 chain #make a tuic socks:30303, make a ipt2socks redir:303 + ln_start_bin $(first_type tuic-client) tuic-client --config $shunt_config_file + ln_start_bin $(first_type ipt2socks) ipt2socks -R -b 0.0.0.0 -4 -s 127.0.0.1 -p $chain_shunt_port -l $tmp_shunt_port + + [ -n "$tmp_local_port" ] && tmp_port=$tmp_local_port || tmp_port=$tmp_shunt_local_port + gen_config_file $SHUNT_SERVER $type 3 $tmp_port # make a tuic socks :304 + ln_start_bin $(first_type tuic-client) tuic-client --config $shunt_dns_config_file + shunt_dns_command + echolog "Netflix Separated Shunt Server:tuic-client $($(first_type tuic-client) --version) Started!" + # FIXME: ipt2socks cannot handle udp reply from tuic + #redir_udp=0 + ;; + shadowtls) + [ -n "$tmp_local_port" ] && tmp_port=$tmp_local_port || tmp_port=$tmp_shunt_local_port + gen_config_file $SHUNT_SERVER $type 3 "10${tmp_shunt_port}" $tmp_port chain/$tmp_shunt_port #make a redir:303 and a socks:304 + #echo "debug \$tmp_port=$tmp_port, \$tmp_shunt_port=${tmp_shunt_port}, \$tmp_shunt_local_port=$tmp_shunt_local_port" + ln_start_bin $(first_type shadow-tls) shadow-tls config --config $chain_config_file + shunt_dns_command + local chain_type=$(uci_get_by_name $SHUNT_SERVER chain_type) + case ${chain_type} in + vmess) + ln_start_bin $(first_type xray v2ray) v2ray run -c $shunt_config_file + echolog "Netflix Separated Shunt Server:shadow-tls chain-to$($(first_type xray) --version) Started!" + ;; + sslocal) + ln_start_bin $(first_type sslocal) sslocal -c $shunt_config_file + echolog "Netflix Separated Shunt Server:shadow-tls chain-to$($(first_type sslocal) --version) Started!" + ;; + esac + ;; + # socks5) + # if [ "$(uci_get_by_name $SHUNT_SERVER auth_enable 0)" == "1" ]; then + # local auth="-a $(uci_get_by_name $SHUNT_SERVER username) -k $(uci_get_by_name $SHUNT_SERVER password)" + # fi + # ln_start_bin $(first_type ipt2socks) ipt2socks $shunt_config_file -R -4 -s $(uci_get_by_name $SHUNT_SERVER server) -p $(uci_get_by_name $SHUNT_SERVER server_port) -l $tmp_shunt_port $auth + # #gen_config_file $SHUNT_SERVER $type 3 $tmp_shunt_port + # #ln_start_bin $(first_type redsocks2) redsocks2 -c $shunt_config_file + # if [ -n "$tmp_local_port" ]; then + # local tmp_port=$tmp_local_port + # else + # local tmp_port=$tmp_shunt_local_port + # ln_start_bin $(first_type microsocks) microsocks -i 127.0.0.1 -p $tmp_port shunt-dns-ssr-plus + # fi + # shunt_dns_command + # echolog "shunt:$type REDIRECT/TPROXY Started!" + # ;; + *) + gen_config_file $SHUNT_SERVER $type 3 $tmp_shunt_port + ln_start_bin $(first_type redsocks2) redsocks2 -c $shunt_config_file + if [ -n "$tmp_local_port" ]; then + local tmp_port=$tmp_local_port + else + local tmp_port=$tmp_shunt_local_port + ln_start_bin $(first_type microsocks) microsocks -i 127.0.0.1 -p $tmp_port shunt-dns-ssr-plus + fi + shunt_dns_command + echolog "shunt:$type REDIRECT/TPROXY Started!" + ;; + esac + return 0 +} + +start_local() { + [ "$LOCAL_SERVER" = "nil" ] && return 1 + local local_port=$(uci_get_by_type socks5_proxy local_port) + [ "$LOCAL_SERVER" == "$SHUNT_SERVER" ] && tmp_local_port=$local_port + local type=$(uci_get_by_name $LOCAL_SERVER type) + case "$type" in + ss | ssr) + gen_config_file $LOCAL_SERVER $type 4 $local_port + ss_program="$(first_type ${type}local ${type}-local)" + ln_start_bin $ss_program ${type}-local -c $local_config_file + echolog "Global_Socks5:$(get_name $type) Started!" + ;; + v2ray) + if [ "$_local" == "2" ]; then + gen_config_file $LOCAL_SERVER $type 4 0 $local_port + ln_start_bin $(first_type xray v2ray) v2ray run -config $local_config_file + fi + echolog "Global_Socks5:$($(first_type "xray" "v2ray") version | head -1) Started!" + ;; + trojan) #client + gen_config_file $LOCAL_SERVER $type 4 $local_port + ln_start_bin $(first_type trojan) $type --config $local_config_file + echolog "Global_Socks5:$($(first_type trojan) --version 2>&1 | head -1) Started!" + ;; + naiveproxy) + gen_config_file $LOCAL_SERVER $type 4 $local_port + ln_start_bin $(first_type naive) naive --config $local_config_file + echolog "Global_Socks5:$($(first_type naive) --version | head -1) Started!" + ;; + hysteria) + if [ "$_local" == "2" ]; then + gen_config_file $LOCAL_SERVER $type 4 0 $local_port + ln_start_bin $(first_type hysteria) hysteria client --config $local_config_file + echolog "Global_Socks5:$($(first_type hysteria) version | awk '{print $1,$3}') Started!" + fi + ;; + tuic) + if [ "$_local" == "2" ]; then + gen_config_file $LOCAL_SERVER $type 4 $local_port + ln_start_bin $(first_type tuic-client) tuic-client --config $local_config_file + echolog "Global Socks5:tuic-client $($(first_type tuic-client) --version) Started!" + fi + ;; + shadowtls) + #respective config for global socks and main node + if [ "$_local" == "2" ]; then + gen_config_file $LOCAL_SERVER $type 4 "10${tmp_tcp_local_port}" + gen_config_file $LOCAL_SERVER $type 4 0 $local_port chain/"10${tmp_tcp_local_port}" + ln_start_bin $(first_type shadow-tls) shadow-tls config --config $chain_local_config_file + local chain_type=$(uci_get_by_name $LOCAL_SERVER chain_type) + case ${chain_type} in + vmess) + ln_start_bin $(first_type xray v2ray) v2ray run -c $local_config_file + echolog "Global Socks5 Proxy:shadow-tls chain-to$($(first_type xray) --version) Started!" + ;; + sslocal) + ln_start_bin $(first_type sslocal) sslocal -c $local_config_file + echolog "Global Socks5 Proxy:shadow-tls chain-to$($(first_type sslocal) --version) Started!" + ;; + esac + fi + ;; + *) + [ -e /proc/sys/net/ipv6 ] && local listenip='-i ::' + ln_start_bin $(first_type microsocks) microsocks $listenip -p $local_port tcp-udp-ssr-local + echolog "Global_Socks5:$type Started!" + ;; + esac + local_enable=1 + return 0 +} + +Start_Run() { + if [ "$(uci_get_by_type global threads 0)" == "0" ]; then + local threads=$(cat /proc/cpuinfo | grep 'processor' | wc -l) + else + local threads=$(uci_get_by_type global threads) + fi + if [ "$(uci_get_by_name $GLOBAL_SERVER kcp_enable 0)" == "1" ]; then + [ ! -f "/usr/bin/kcptun-client" ] && return 1 + local kcp_str=$(/usr/bin/kcptun-client -v | grep kcptun | wc -l) + [ "0" == "$kcp_str" ] && return 1 + local kcp_server=$(uci_get_by_name $GLOBAL_SERVER server) + local kcp_port=$(uci_get_by_name $GLOBAL_SERVER kcp_port) + local server_port=$(uci_get_by_name $GLOBAL_SERVER server_port) + local password=$(uci_get_by_name $GLOBAL_SERVER kcp_password) + local kcp_param=$(uci_get_by_name $GLOBAL_SERVER kcp_param) + [ "$password" != "" ] && password="--key "$password + service_start /usr/bin/kcptun-client -r $kcp_server:$kcp_port -l :$server_port $password $kcp_param + kcp_enable_flag=1 + ARG_UDP="" + fi + if [ "$_local" == "1" ]; then + local socks_port=$(uci_get_by_type socks5_proxy local_port) + tcp_config_file=$TMP_PATH/local-ssr-retcp.json + [ "$mode" == "tcp,udp" ] && tcp_config_file=$TMP_PATH/local-udp-ssr-retcp.json + fi + local tcp_port=$(uci_get_by_name $GLOBAL_SERVER local_port) + local type=$(uci_get_by_name $GLOBAL_SERVER type) + case "$type" in + ss | ssr) + gen_config_file $GLOBAL_SERVER $type 1 $tcp_port + ss_program="$(first_type ${type}local ${type}-redir)" + for i in $(seq 1 $threads); do + ln_start_bin "$ss_program" ${type}-redir -c $tcp_config_file + done + echolog "Main node:$(get_name $type) $threads Threads Started!" + ;; + v2ray) + gen_config_file $GLOBAL_SERVER $type 1 $tcp_port $socks_port + ln_start_bin $(first_type xray v2ray) v2ray run -config $tcp_config_file + echolog "Main node:$($(first_type xray v2ray) version | head -1) Started!" + ;; + trojan) + gen_config_file $GLOBAL_SERVER $type 1 $tcp_port + for i in $(seq 1 $threads); do + ln_start_bin $(first_type $type) $type --config $tcp_config_file + done + echolog "Main node:$($(first_type $type) --version 2>&1 | head -1) , $threads Threads Started!" + ;; + naiveproxy) + gen_config_file $GLOBAL_SERVER $type 1 $tcp_port + ln_start_bin $(first_type naive) naive $tcp_config_file + echolog "Main node:$($(first_type naive) --version 2>&1 | head -1) , $threads Threads Started!" + ;; + hysteria) + gen_config_file $GLOBAL_SERVER $type 1 $tcp_port $socks_port + ln_start_bin $(first_type hysteria) hysteria client --config $tcp_config_file + echolog "Main node:$($(first_type hysteria) version | awk '{print $1,$3}') Started!" + ;; + tuic) + local PARAM + [ $mode == "tcp" ] && PARAM="-T" || PARAM="" + gen_config_file $GLOBAL_SERVER $type 1 $tmp_tcp_local_port + ln_start_bin $(first_type tuic-client) tuic-client --config $tcp_config_file + ln_start_bin $(first_type ipt2socks) ipt2socks "$PARAM" -R -b 0.0.0.0 -4 -s 127.0.0.1 -p $tmp_tcp_local_port -l $tcp_port + if [ -n $socks_port ] && [ $GLOBAL_SERVER == $LOCAL_SERVER ]; then #start a new tuic instance + gen_config_file $GLOBAL_SERVER $type 4 $socks_port + ln_start_bin $(first_type tuic-client) tuic-client --config $local_config_file + echolog "Global Socks5:tuic-client $($(first_type tuic-client) --version) Started!" + fi + echolog "Main node:tuic-client $($(first_type tuic-client) --version) Started!" + ;; + shadowtls) + if [ -z "$socks_port" ]; then + gen_config_file $GLOBAL_SERVER $type 1 "10${tmp_tcp_local_port}" + gen_config_file $GLOBAL_SERVER $type 1 "10${tmp_tcp_local_port}" 0 chain + else + gen_config_file $GLOBAL_SERVER $type 1 "10${tmp_tcp_local_port}" + gen_config_file $GLOBAL_SERVER $type 1 "10${tmp_tcp_local_port}" $socks_port chain + fi + local chain_type=$(uci_get_by_name $GLOBAL_SERVER chain_type) + case ${chain_type} in + vmess) + ln_start_bin $(first_type shadow-tls) shadow-tls config --config $chain_config_file + ln_start_bin $(first_type xray v2ray) v2ray run -c $tcp_config_file + echolog "Mian node:shadow-tls chain-to $($(first_type xray) --version) Started!" + ;; + sslocal) + ln_start_bin $(first_type shadow-tls) shadow-tls config --config $chain_config_file + ln_start_bin $(first_type sslocal) sslocal -c $tcp_config_file + echolog "Main node:shadow-tls chain-to $($(first_type sslocal) --version) Started!" + ;; + esac + ;; + socks5) + if [ "$(uci_get_by_name $GLOBAL_SERVER auth_enable 0)" == "1" ]; then + local auth="-a $(uci_get_by_name $GLOBAL_SERVER username) -k $(uci_get_by_name $GLOBAL_SERVER password)" + fi + ln_start_bin $(first_type ipt2socks) ipt2socks $tcp_config_file -R -4 -j $threads -s $(uci_get_by_name $GLOBAL_SERVER server) -p $(uci_get_by_name $GLOBAL_SERVER server_port) -l $tcp_port $auth + #gen_config_file $GLOBAL_SERVER $type 1 $tcp_port + #for i in $(seq 1 $threads); do + # ln_start_bin $(first_type redsocks2) redsocks2 -c $tcp_config_file + #done + echolog "Main node:Socks5 REDIRECT/TPROXY $threads Threads Started!" + ;; + tun) + gen_config_file $GLOBAL_SERVER $type 1 $tcp_port + for i in $(seq 1 $threads); do + ln_start_bin $(first_type redsocks2) redsocks2 -c $tcp_config_file + done + echolog "Main node:Network Tunnel REDIRECT $threads Threads Started!" + ;; + esac + redir_tcp=1 + return 0 +} + +load_config() { + if [ -z "$switch_server" ]; then + GLOBAL_SERVER=$(uci_get_by_type global global_server nil) + else + GLOBAL_SERVER=$switch_server + fi + LOCAL_SERVER=$(uci_get_by_type socks5_proxy server nil) + if [ "$GLOBAL_SERVER" == "nil" ]; then + mode="tcp,udp" + _local="2" + local_config_file=$TMP_PATH/tcp-udp-ssr-local.json + start_local + return 1 + fi + UDP_RELAY_SERVER=$(uci_get_by_type global udp_relay_server nil) + SHUNT_SERVER=$(uci_get_by_type global netflix_server nil) + tcp_config_file=$TMP_PATH/tcp-only-ssr-retcp.json + case "$UDP_RELAY_SERVER" in + nil) + mode="tcp" + ;; + $GLOBAL_SERVER | same) + mode="tcp,udp" + tcp_config_file=$TMP_PATH/tcp-udp-ssr-retcp.json + ARG_UDP="-u" + UDP_RELAY_SERVER=$GLOBAL_SERVER + ;; + *) + mode="udp" + udp_config_file=$TMP_PATH/udp-only-ssr-reudp.json + ARG_UDP="-U" + start_udp + mode="tcp" + ;; + esac + case "$LOCAL_SERVER" in + nil) + _local="0" + ;; + $GLOBAL_SERVER | same) + _local="1" + LOCAL_SERVER=$GLOBAL_SERVER + local_config_file=$TMP_PATH/tcp-udp-ssr-local.json + start_local + local_enable=0 + ;; + $SHUNT_SERVER) + _local="3" + local_config_file=$TMP_PATH/tcp-udp-ssr-local.json + start_local + ;; + *) + _local="2" + local_config_file=$TMP_PATH/tcp-udp-ssr-local.json + start_local + ;; + esac + case "$SHUNT_SERVER" in + nil) + shunt="0" + ;; + $GLOBAL_SERVER | same) + shunt="1" + SHUNT_SERVER=$GLOBAL_SERVER + ;; + $LOCAL_SERVER) + shunt="$tmp_shunt_port" + shunt_config_file=$TMP_PATH/tcp-udp-ssr-local.json + shunt_dns_config_file=$TMP_PATH/shunt-dns-ssr-plus.json + start_shunt + ;; + *) + shunt="$tmp_shunt_port" + shunt_config_file=$TMP_PATH/shunt-ssr-retcp.json + shunt_dns_config_file=$TMP_PATH/shunt-dns-ssr-plus.json + start_shunt + ;; + esac + return 0 +} + +check_server() { + ENABLE_SERVER=$(uci_get_by_type global global_server nil) + if [ "$ENABLE_SERVER" == "nil" ]; then + return 1 + else + local STYPE=$(uci_get_by_name $ENABLE_SERVER type nil) + if [ "$STYPE" == "nil" ]; then + local CFGID=$(uci_get_by_cfgid servers type nil) + if [ "$CFGID" == "nil" ]; then + uci_set_by_type global global_server 'nil' + else + uci_set_by_type global global_server $CFGID + fi + /etc/init.d/shadowsocksr restart + fi + fi +} + +start_server() { + [ "$(uci_get_by_type server_global enable_server 0)" == "0" ] && return 0 + server_service() { + [ "$(uci_get_by_name $1 enable 0)" == "0" ] && return 1 + let server_count=server_count+1 + if [ "$server_count" == "1" ]; then + if ! (iptables-save -t filter | grep SSR-SERVER-RULE >/dev/null); then + iptables -N SSR-SERVER-RULE && iptables -t filter -I INPUT -j SSR-SERVER-RULE + fi + fi + local type=$(uci_get_by_name $1 type) + case "$type" in + ss | ssr) + gen_service_file ${type} $1 $TMP_PATH/ssr-server$server_count.json + ln_start_bin $(first_type ${type}server ${type}-server) ${type}-server -c $TMP_PATH/ssr-server$server_count.json + echolog "Server: $(get_name ${type}) Server$server_count Started!" + ;; + socks5) + [ -e /proc/sys/net/ipv6 ] && local listenip='-i ::' + ln_start_bin $(first_type microsocks) microsocks $listenip -p $(uci_get_by_name $1 server_port) -1 -u $(uci_get_by_name $1 username) -P $(uci_get_by_name $1 password) ssr-server$server_count + echolog "Server:Socks5 Server$server_count Started!" + ;; + esac + iptables -t filter -A SSR-SERVER-RULE -p tcp --dport $(uci_get_by_name $1 server_port) -j ACCEPT + iptables -t filter -A SSR-SERVER-RULE -p udp --dport $(uci_get_by_name $1 server_port) -j ACCEPT + return 0 + } + gen_serv_include() { + local FWI=$(uci get firewall.shadowsocksr.path 2>/dev/null) + [ -n "$FWI" ] || return 0 + if [ ! -f $FWI ]; then + echo '#!/bin/sh' >$FWI + fi + extract_rules() { + echo "*filter" + iptables-save -t filter | grep SSR-SERVER-RULE | sed -e "s/^-A INPUT/-I INPUT/" + echo 'COMMIT' + } + cat <<-EOF >>$FWI + iptables-save -c | grep -v "SSR-SERVER" | iptables-restore -c + iptables-restore -n <<-EOT + $(extract_rules) + EOT + EOF + } + + config_load $NAME + config_foreach server_service server_config + gen_serv_include + return 0 +} + +start_switch() { + if [ "$(uci_get_by_type global enable_switch 0)" == "1" ]; then + if [ -z "$switch_server" ]; then + local switch_time=$(uci_get_by_type global switch_time)s + local switch_timeout=$(uci_get_by_type global switch_timeout) + service_start /usr/bin/ssr-switch start $switch_time $switch_timeout + fi + fi +} + +start_monitor() { + if [ $(uci_get_by_type global monitor_enable 1) == "1" ]; then + let total_count=server_count+redir_tcp+redir_udp+kcp_enable_flag+local_enable+pdnsd_enable_flag + if [ $total_count -gt 0 ]; then + service_start /usr/bin/ssr-monitor $server_count $redir_tcp $redir_udp $kcp_enable_flag $local_enable $pdnsd_enable_flag + fi + fi +} + +start_rules() { + local server=$(get_host_ip $GLOBAL_SERVER) + local local_port=$(uci_get_by_name $GLOBAL_SERVER local_port) + local lan_ac_ips=$(uci_get_by_type access_control lan_ac_ips) + local lan_ac_mode=$(uci_get_by_type access_control lan_ac_mode) + if [ "$kcp_enable_flag" == "0" -a "$redir_udp" == "1" ]; then + local udp_server=$(get_host_ip $UDP_RELAY_SERVER) + local udp_local_port=$tmp_udp_port + fi + if [ "$shunt" != "0" ]; then + local shunt_ip=$(get_host_ip $SHUNT_SERVER) + fi + if [ -n "$lan_ac_ips" ]; then + case "$lan_ac_mode" in + w | W | b | B) local ac_ips="$lan_ac_mode$lan_ac_ips" ;; + esac + fi + gfwmode() { + case "$(uci_get_by_type global run_mode)" in + gfw) echo "-g" ;; + router) echo "-r" ;; + oversea) echo "-c" ;; + all) echo "-z" ;; + esac + } + if [ "$(uci_get_by_type global dports 1)" == "2" ]; then + local proxyport="-m multiport --dports 22,53,587,465,995,993,143,80,443,853,9418" + fi + get_arg_out() { + case "$(uci_get_by_type access_control router_proxy 1)" in + 1) echo "-o" ;; + 2) echo "-O" ;; + esac + } + /usr/share/shadowsocksr/gfw2ipset.sh + /usr/bin/ssr-rules \ + -s "$server" \ + -l "$local_port" \ + -S "$udp_server" \ + -L "$udp_local_port" \ + -a "$ac_ips" \ + -i "/etc/ssrplus/china_ssr.txt" \ + -b "$(uci_get_by_type access_control wan_bp_ips)" \ + -w "$(uci_get_by_type access_control wan_fw_ips)" \ + -B "$(uci_get_by_type access_control lan_bp_ips)" \ + -p "$(uci_get_by_type access_control lan_fp_ips)" \ + -G "$(uci_get_by_type access_control lan_gm_ips)" \ + -m "$(uci_get_by_type access_control Interface)" \ + -D "$proxyport" \ + -F "$shunt" \ + -N "$shunt_ip" \ + -M "$(uci_get_by_type global netflix_proxy 0)" \ + -I "/etc/ssrplus/netflixip.list" \ + $(get_arg_out) $(gfwmode) $ARG_UDP + return $? +} + +start() { + set_lock + echolog "----------start------------" + mkdir -p /var/run /var/lock /var/log /tmp/dnsmasq.d $TMP_BIN_PATH $TMP_DNSMASQ_PATH + echo "conf-dir=${TMP_DNSMASQ_PATH}" >"/tmp/dnsmasq.d/dnsmasq-ssrplus.conf" + if load_config; then + Start_Run + start_rules + start_dns + add_cron + start_switch + else + echolog "未启动主节点,禁止连接的域名正在加载。" + cat /etc/ssrplus/deny.list | sed '/^$/d' | sed '/#/d' | sed "/.*/s/.*/address=\/&\//" >$TMP_DNSMASQ_PATH/denylist.conf + echolog "禁止连接的域名加载完毕。" + if [ "$(uci_get_by_type global adblock 0)" == "1" ]; then + echolog "未启动主节点,广告过滤正在加载。" + cp -f /etc/ssrplus/ad.conf $TMP_DNSMASQ_PATH/ + if [ -f "$TMP_DNSMASQ_PATH/ad.conf" ]; then + for line in $(cat /etc/ssrplus/black.list); do sed -i "/$line/d" $TMP_DNSMASQ_PATH/ad.conf; done + for line in $(cat /etc/ssrplus/white.list); do sed -i "/$line/d" $TMP_DNSMASQ_PATH/ad.conf; done + for line in $(cat /etc/ssrplus/deny.list); do sed -i "/$line/d" $TMP_DNSMASQ_PATH/ad.conf; done + fi + echolog "广告过滤加载完毕。" + fi + fi + /etc/init.d/dnsmasq restart >/dev/null 2>&1 + check_server + start_server + start_monitor + clean_log + echolog "-----------end------------" + unset_lock +} + +boot() { + echolog "boot!" + mkdir -p /var/run /var/lock /var/log /tmp/dnsmasq.d $TMP_BIN_PATH $TMP_DNSMASQ_PATH + start +} + +stop() { + unlock + set_lock + /usr/bin/ssr-rules -f + local srulecount=$(iptables -L | grep SSR-SERVER-RULE | wc -l) + if [ $srulecount -gt 0 ]; then + iptables -F SSR-SERVER-RULE + iptables -t filter -D INPUT -j SSR-SERVER-RULE + iptables -X SSR-SERVER-RULE 2>/dev/null + fi + if [ -z "$switch_server" ]; then + $PS -w | grep -v "grep" | grep ssr-switch | awk '{print $1}' | xargs kill -9 >/dev/null 2>&1 & + rm -f /var/lock/ssr-switch.lock + killall -q -9 kcptun-client + fi + $PS -w | grep -v "grep" | grep ssr-monitor | awk '{print $1}' | xargs kill -9 >/dev/null 2>&1 & + $PS -w | grep -v "grep" | grep "sleep 0000" | awk '{print $1}' | xargs kill -9 >/dev/null 2>&1 & + ( \ + # Graceful kill first, so programs have the chance to stop its subprocesses + $PS -w | grep -v "grep" | grep "$TMP_PATH" | awk '{print $1}' | xargs kill >/dev/null 2>&1 ; \ + sleep 3s; \ + # Force kill hanged programs + $PS -w | grep -v "grep" | grep "$TMP_PATH" | awk '{print $1}' | xargs kill -9 >/dev/null 2>&1 ; \ + ) + killall -q -9 v2ray-plugin obfs-local xray-plugin + rm -f /var/lock/ssr-monitor.lock + if [ "$(uci -q get "dhcp.@dnsmasq[0]._unused_ssrp_changed")" = "1" ]; then + uci -q del "dhcp.@dnsmasq[0].noresolv" + uci -q del_list "dhcp.@dnsmasq[0].server"="127.0.0.1#$china_dns_port" + uci -q rename "dhcp.@dnsmasq[0]._orig_noresolv"="noresolv" + uci -q rename "dhcp.@dnsmasq[0]._orig_server"="server" + uci -q del "dhcp.@dnsmasq[0]._unused_ssrp_changed" + uci -q commit "dhcp" + fi + if [ -f "/tmp/dnsmasq.d/dnsmasq-ssrplus.conf" ]; then + rm -rf /tmp/dnsmasq.d/dnsmasq-ssrplus.conf $TMP_DNSMASQ_PATH $TMP_PATH/*-ssr-*.json $TMP_PATH/ssr-server*.json + /etc/init.d/dnsmasq restart >/dev/null 2>&1 + fi + del_cron + unset_lock +} + +reset() { + stop + set_lock + rm -rf /etc/config/shadowsocksr $LOG_FILE + touch /etc/config/shadowsocksr $LOG_FILE + uci -q batch <<-EOF >/dev/null + add shadowsocksr global + set shadowsocksr.@global[0].global_server='nil' + set shadowsocksr.@global[0].netflix_server='nil' + set shadowsocksr.@global[0].netflix_proxy='0' + set shadowsocksr.@global[0].threads='0' + set shadowsocksr.@global[0].run_mode='router' + set shadowsocksr.@global[0].dports='2' + set shadowsocksr.@global[0].pdnsd_enable='1' + set shadowsocksr.@global[0].tunnel_forward='8.8.4.4:53' + set shadowsocksr.@global[0].monitor_enable='1' + set shadowsocksr.@global[0].enable_switch='1' + set shadowsocksr.@global[0].switch_time='667' + set shadowsocksr.@global[0].switch_timeout='5' + set shadowsocksr.@global[0].switch_try_count='3' +# set shadowsocksr.@global[0].default_packet_encoding='xudp' + set shadowsocksr.@global[0].shunt_dns='1' + set shadowsocksr.@global[0].gfwlist_url='https://fastly.jsdelivr.net/gh/YW5vbnltb3Vz/domain-list-community@release/gfwlist.txt' + set shadowsocksr.@global[0].chnroute_url='https://ispip.clang.cn/all_cn.txt' + set shadowsocksr.@global[0].nfip_url='https://fastly.jsdelivr.net/gh/QiuSimons/Netflix_IP/NF_only.txt' + set shadowsocksr.@global[0].adblock_url='https://anti-ad.net/anti-ad-for-dnsmasq.conf' + add shadowsocksr server_subscribe + set shadowsocksr.@server_subscribe[0].proxy='0' + set shadowsocksr.@server_subscribe[0].auto_update_time='2' + set shadowsocksr.@server_subscribe[0].auto_update='1' + set shadowsocksr.@server_subscribe[0].filter_words='过期时间/剩余流量/QQ群/官网/防失联地址/回国' + set shadowsocksr.@server_subscribe[0].save_words='' + add shadowsocksr access_control + set shadowsocksr.@access_control[0].lan_ac_mode='0' + set shadowsocksr.@access_control[0].router_proxy='1' + add_list shadowsocksr.@access_control[0].wan_fw_ips=149.154.160.0/20 + add_list shadowsocksr.@access_control[0].wan_fw_ips=67.198.55.0/24 + add_list shadowsocksr.@access_control[0].wan_fw_ips=91.108.4.0/22 + add_list shadowsocksr.@access_control[0].wan_fw_ips=91.108.56.0/22 + add_list shadowsocksr.@access_control[0].wan_fw_ips=109.239.140.0/24 + add_list shadowsocksr.@access_control[0].Interface='lan' + add shadowsocksr socks5_proxy + set shadowsocksr.@socks5_proxy[0].server='nil' + set shadowsocksr.@socks5_proxy[0].local_port='1080' + add shadowsocksr server_global + set shadowsocksr.@server_global[0].enable_server='0' + commit shadowsocksr + EOF + unset_lock +} diff --git a/luci-app-ssr-plus/root/etc/ssrplus/ad.conf b/luci-app-ssr-plus/root/etc/ssrplus/ad.conf new file mode 100644 index 00000000..e69de29b diff --git a/luci-app-ssr-plus/root/etc/ssrplus/black.list b/luci-app-ssr-plus/root/etc/ssrplus/black.list new file mode 100644 index 00000000..e69de29b diff --git a/luci-app-ssr-plus/root/etc/ssrplus/china_ssr.txt b/luci-app-ssr-plus/root/etc/ssrplus/china_ssr.txt new file mode 100644 index 00000000..d3548833 --- /dev/null +++ b/luci-app-ssr-plus/root/etc/ssrplus/china_ssr.txt @@ -0,0 +1,8612 @@ +1.0.1.0/24 +1.0.2.0/23 +1.0.8.0/21 +1.0.32.0/19 +1.1.0.0/24 +1.1.2.0/23 +1.1.4.0/22 +1.1.8.0/24 +1.1.9.0/24 +1.1.10.0/23 +1.1.12.0/22 +1.1.16.0/20 +1.1.32.0/19 +1.2.0.0/23 +1.2.2.0/24 +1.2.4.0/24 +1.2.5.0/24 +1.2.6.0/23 +1.2.8.0/24 +1.2.9.0/24 +1.2.10.0/23 +1.2.12.0/22 +1.2.16.0/20 +1.2.32.0/19 +1.2.64.0/18 +1.3.0.0/16 +1.4.1.0/24 +1.4.2.0/23 +1.4.4.0/24 +1.4.5.0/24 +1.4.6.0/23 +1.4.8.0/21 +1.4.16.0/20 +1.4.32.0/19 +1.4.64.0/18 +1.8.0.0/16 +1.10.0.0/21 +1.10.8.0/23 +1.10.11.0/24 +1.10.12.0/22 +1.10.16.0/20 +1.10.32.0/19 +1.10.64.0/18 +1.12.0.0/14 +1.24.0.0/13 +1.45.0.0/16 +1.48.0.0/15 +1.50.0.0/16 +1.51.0.0/16 +1.56.0.0/13 +1.68.0.0/14 +1.80.0.0/13 +1.88.0.0/14 +1.92.0.0/15 +1.94.0.0/15 +1.116.0.0/15 +1.118.0.0/16 +1.119.0.0/17 +1.119.128.0/17 +1.180.0.0/14 +1.184.0.0/15 +1.188.0.0/14 +1.192.0.0/13 +1.202.0.0/15 +1.204.0.0/14 +14.0.0.0/21 +14.0.12.0/22 +14.1.0.0/22 +14.1.24.0/22 +14.1.96.0/22 +14.1.108.0/22 +14.16.0.0/12 +14.102.128.0/22 +14.102.156.0/22 +14.102.180.0/22 +14.103.0.0/16 +14.104.0.0/13 +14.112.0.0/12 +14.130.0.0/15 +14.134.0.0/15 +14.144.0.0/12 +14.192.60.0/22 +14.192.76.0/22 +14.196.0.0/15 +14.204.0.0/15 +14.208.0.0/12 +27.0.128.0/22 +27.0.132.0/22 +27.0.160.0/22 +27.0.164.0/22 +27.0.188.0/22 +27.0.204.0/22 +27.0.208.0/22 +27.0.212.0/22 +27.8.0.0/13 +27.16.0.0/12 +27.34.232.0/21 +27.36.0.0/14 +27.40.0.0/13 +27.50.40.0/21 +27.50.128.0/17 +27.54.72.0/21 +27.54.152.0/21 +27.54.192.0/18 +27.98.208.0/20 +27.98.224.0/19 +27.99.128.0/17 +27.103.0.0/16 +27.106.128.0/18 +27.106.204.0/22 +27.109.32.0/19 +27.109.124.0/22 +27.112.0.0/18 +27.112.80.0/20 +27.112.112.0/22 +27.112.116.0/22 +27.113.128.0/18 +27.115.0.0/17 +27.116.44.0/22 +27.121.72.0/21 +27.121.120.0/21 +27.128.0.0/15 +27.131.220.0/22 +27.144.0.0/16 +27.148.0.0/14 +27.152.0.0/13 +27.184.0.0/13 +27.192.0.0/11 +27.224.0.0/14 +36.0.0.0/22 +36.0.8.0/21 +36.0.16.0/20 +36.0.32.0/19 +36.0.64.0/18 +36.0.128.0/17 +36.1.0.0/16 +36.4.0.0/14 +36.16.0.0/12 +36.32.0.0/14 +36.36.0.0/16 +36.37.0.0/19 +36.37.36.0/23 +36.37.39.0/24 +36.37.40.0/21 +36.37.48.0/20 +36.40.0.0/13 +36.48.0.0/15 +36.51.0.0/16 +36.56.0.0/13 +36.96.0.0/11 +36.128.0.0/10 +36.192.0.0/11 +36.248.0.0/14 +36.254.0.0/16 +36.255.116.0/22 +36.255.128.0/22 +36.255.164.0/22 +36.255.172.0/22 +36.255.176.0/22 +39.0.0.0/24 +39.0.2.0/23 +39.0.4.0/22 +39.0.8.0/21 +39.0.16.0/20 +39.0.32.0/19 +39.0.64.0/18 +39.0.128.0/17 +39.64.0.0/11 +39.96.0.0/13 +39.104.0.0/14 +39.108.0.0/16 +39.128.0.0/10 +40.72.0.0/15 +40.125.128.0/17 +40.126.64.0/18 +42.0.0.0/22 +42.0.8.0/21 +42.0.16.0/21 +42.0.24.0/22 +42.0.32.0/19 +42.0.128.0/17 +42.1.0.0/19 +42.1.32.0/20 +42.1.48.0/21 +42.1.56.0/22 +42.1.128.0/17 +42.4.0.0/14 +42.48.0.0/15 +42.50.0.0/16 +42.51.0.0/16 +42.52.0.0/14 +42.56.0.0/14 +42.62.0.0/17 +42.62.128.0/19 +42.62.160.0/20 +42.62.180.0/22 +42.62.184.0/21 +42.63.0.0/16 +42.80.0.0/15 +42.83.64.0/20 +42.83.80.0/22 +42.83.88.0/21 +42.83.96.0/19 +42.83.128.0/17 +42.84.0.0/14 +42.88.0.0/13 +42.96.64.0/19 +42.96.96.0/21 +42.96.108.0/22 +42.96.112.0/20 +42.96.128.0/17 +42.97.0.0/16 +42.99.0.0/18 +42.99.64.0/19 +42.99.96.0/20 +42.99.112.0/22 +42.99.120.0/21 +42.100.0.0/14 +42.120.0.0/15 +42.122.0.0/16 +42.123.0.0/19 +42.123.36.0/22 +42.123.40.0/21 +42.123.48.0/20 +42.123.64.0/18 +42.123.128.0/17 +42.128.0.0/12 +42.156.0.0/19 +42.156.36.0/22 +42.156.40.0/21 +42.156.48.0/20 +42.156.64.0/18 +42.156.128.0/17 +42.157.0.0/16 +42.158.0.0/16 +42.159.0.0/16 +42.160.0.0/12 +42.176.0.0/13 +42.184.0.0/15 +42.186.0.0/16 +42.187.0.0/18 +42.187.64.0/19 +42.187.96.0/20 +42.187.112.0/21 +42.187.120.0/22 +42.187.128.0/17 +42.192.0.0/15 +42.194.0.0/21 +42.194.8.0/22 +42.194.12.0/22 +42.194.16.0/20 +42.194.32.0/19 +42.194.64.0/18 +42.194.128.0/17 +42.195.0.0/16 +42.196.0.0/14 +42.201.0.0/17 +42.202.0.0/15 +42.204.0.0/14 +42.208.0.0/12 +42.224.0.0/12 +42.240.0.0/17 +42.240.128.0/17 +42.242.0.0/15 +42.244.0.0/14 +42.248.0.0/13 +43.136.0.0/13 +43.144.0.0/13 +43.176.0.0/12 +43.192.0.0/14 +43.196.0.0/15 +43.224.12.0/22 +43.224.24.0/22 +43.224.44.0/22 +43.224.52.0/22 +43.224.56.0/22 +43.224.64.0/22 +43.224.68.0/22 +43.224.72.0/22 +43.224.80.0/22 +43.224.100.0/22 +43.224.144.0/22 +43.224.160.0/22 +43.224.176.0/22 +43.224.184.0/22 +43.224.200.0/22 +43.224.204.0/22 +43.224.208.0/22 +43.224.212.0/22 +43.224.216.0/22 +43.224.240.0/22 +43.225.76.0/22 +43.225.84.0/22 +43.225.120.0/22 +43.225.172.0/22 +43.225.180.0/22 +43.225.208.0/22 +43.225.216.0/22 +43.225.220.0/22 +43.225.224.0/22 +43.225.228.0/22 +43.225.232.0/22 +43.225.236.0/22 +43.225.240.0/22 +43.225.244.0/22 +43.225.252.0/22 +43.226.32.0/22 +43.226.36.0/22 +43.226.40.0/22 +43.226.44.0/22 +43.226.48.0/22 +43.226.52.0/22 +43.226.56.0/22 +43.226.60.0/22 +43.226.64.0/22 +43.226.68.0/22 +43.226.72.0/22 +43.226.76.0/22 +43.226.80.0/22 +43.226.84.0/22 +43.226.88.0/22 +43.226.92.0/22 +43.226.96.0/22 +43.226.100.0/22 +43.226.104.0/22 +43.226.108.0/22 +43.226.112.0/22 +43.226.116.0/22 +43.226.120.0/22 +43.226.128.0/22 +43.226.132.0/22 +43.226.136.0/22 +43.226.140.0/22 +43.226.144.0/22 +43.226.148.0/22 +43.226.152.0/22 +43.226.156.0/22 +43.226.160.0/22 +43.226.164.0/22 +43.226.168.0/22 +43.226.172.0/22 +43.226.176.0/22 +43.226.180.0/22 +43.226.184.0/22 +43.226.188.0/22 +43.226.192.0/22 +43.226.196.0/22 +43.226.200.0/22 +43.226.204.0/22 +43.226.208.0/22 +43.226.212.0/22 +43.226.236.0/22 +43.226.240.0/22 +43.226.244.0/22 +43.226.248.0/22 +43.226.252.0/22 +43.227.0.0/22 +43.227.4.0/22 +43.227.8.0/22 +43.227.32.0/22 +43.227.36.0/22 +43.227.40.0/22 +43.227.44.0/22 +43.227.48.0/22 +43.227.52.0/22 +43.227.56.0/22 +43.227.60.0/22 +43.227.64.0/22 +43.227.68.0/22 +43.227.72.0/22 +43.227.76.0/22 +43.227.80.0/22 +43.227.84.0/22 +43.227.88.0/22 +43.227.92.0/22 +43.227.96.0/22 +43.227.100.0/22 +43.227.104.0/22 +43.227.136.0/22 +43.227.140.0/22 +43.227.144.0/22 +43.227.152.0/22 +43.227.156.0/22 +43.227.160.0/22 +43.227.164.0/22 +43.227.168.0/22 +43.227.172.0/22 +43.227.176.0/22 +43.227.180.0/22 +43.227.188.0/22 +43.227.192.0/22 +43.227.196.0/22 +43.227.200.0/22 +43.227.204.0/22 +43.227.208.0/22 +43.227.212.0/22 +43.227.216.0/22 +43.227.220.0/22 +43.227.232.0/22 +43.227.248.0/22 +43.227.252.0/22 +43.228.0.0/22 +43.228.4.0/22 +43.228.8.0/22 +43.228.12.0/22 +43.228.16.0/22 +43.228.20.0/22 +43.228.24.0/22 +43.228.28.0/22 +43.228.32.0/22 +43.228.36.0/22 +43.228.40.0/22 +43.228.44.0/22 +43.228.48.0/22 +43.228.52.0/22 +43.228.56.0/22 +43.228.60.0/22 +43.228.64.0/22 +43.228.68.0/22 +43.228.76.0/22 +43.228.100.0/22 +43.228.116.0/22 +43.228.120.0/22 +43.228.132.0/22 +43.228.136.0/22 +43.228.148.0/22 +43.228.152.0/22 +43.228.188.0/22 +43.228.204.0/22 +43.228.240.0/22 +43.229.40.0/22 +43.229.48.0/22 +43.229.56.0/22 +43.229.96.0/22 +43.229.136.0/22 +43.229.140.0/22 +43.229.144.0/22 +43.229.168.0/22 +43.229.172.0/22 +43.229.176.0/22 +43.229.180.0/22 +43.229.184.0/22 +43.229.188.0/22 +43.229.192.0/22 +43.229.196.0/22 +43.229.216.0/22 +43.229.220.0/22 +43.229.232.0/22 +43.229.236.0/22 +43.230.20.0/22 +43.230.32.0/22 +43.230.68.0/22 +43.230.72.0/22 +43.230.84.0/22 +43.230.124.0/22 +43.230.136.0/22 +43.230.220.0/22 +43.230.224.0/22 +43.230.228.0/22 +43.230.232.0/22 +43.230.236.0/22 +43.230.240.0/22 +43.230.244.0/22 +43.230.248.0/22 +43.230.252.0/22 +43.231.32.0/22 +43.231.36.0/22 +43.231.40.0/22 +43.231.44.0/22 +43.231.80.0/22 +43.231.84.0/22 +43.231.88.0/22 +43.231.92.0/22 +43.231.96.0/22 +43.231.100.0/22 +43.231.104.0/22 +43.231.108.0/22 +43.231.136.0/22 +43.231.140.0/22 +43.231.144.0/22 +43.231.148.0/22 +43.231.152.0/22 +43.231.156.0/22 +43.231.160.0/22 +43.231.164.0/22 +43.231.168.0/22 +43.231.172.0/22 +43.231.176.0/22 +43.231.180.0/22 +43.236.0.0/22 +43.236.4.0/22 +43.236.8.0/22 +43.236.12.0/22 +43.236.16.0/22 +43.236.20.0/22 +43.236.24.0/22 +43.236.28.0/22 +43.236.32.0/22 +43.236.36.0/22 +43.236.40.0/22 +43.236.44.0/22 +43.236.48.0/22 +43.236.52.0/22 +43.236.56.0/22 +43.236.60.0/22 +43.236.64.0/22 +43.236.68.0/22 +43.236.72.0/22 +43.236.76.0/22 +43.236.80.0/22 +43.236.84.0/22 +43.236.88.0/22 +43.236.92.0/22 +43.236.96.0/22 +43.236.100.0/22 +43.236.104.0/22 +43.236.108.0/22 +43.236.112.0/22 +43.236.116.0/22 +43.236.120.0/22 +43.236.124.0/22 +43.236.128.0/22 +43.236.132.0/22 +43.236.136.0/22 +43.236.140.0/22 +43.236.144.0/22 +43.236.148.0/22 +43.236.152.0/22 +43.236.156.0/22 +43.236.160.0/22 +43.236.164.0/22 +43.236.168.0/22 +43.236.172.0/22 +43.236.176.0/22 +43.236.180.0/22 +43.236.184.0/22 +43.236.188.0/22 +43.236.192.0/22 +43.236.196.0/22 +43.236.200.0/22 +43.236.204.0/22 +43.236.208.0/22 +43.236.212.0/22 +43.236.216.0/22 +43.236.220.0/22 +43.236.224.0/22 +43.236.228.0/22 +43.236.232.0/22 +43.236.236.0/22 +43.236.240.0/22 +43.236.244.0/22 +43.236.248.0/22 +43.236.252.0/22 +43.237.0.0/22 +43.237.4.0/22 +43.237.8.0/22 +43.237.12.0/22 +43.237.16.0/22 +43.237.20.0/22 +43.237.24.0/22 +43.237.28.0/22 +43.237.32.0/22 +43.237.36.0/22 +43.237.40.0/22 +43.237.44.0/22 +43.237.48.0/22 +43.237.52.0/22 +43.237.56.0/22 +43.237.60.0/22 +43.237.64.0/22 +43.237.68.0/22 +43.237.72.0/22 +43.237.76.0/22 +43.237.80.0/22 +43.237.84.0/22 +43.237.88.0/22 +43.237.92.0/22 +43.237.96.0/22 +43.237.100.0/22 +43.237.104.0/22 +43.237.108.0/22 +43.237.112.0/22 +43.237.116.0/22 +43.237.120.0/22 +43.237.124.0/22 +43.237.128.0/22 +43.237.132.0/22 +43.237.136.0/22 +43.237.140.0/22 +43.237.144.0/22 +43.237.148.0/22 +43.237.152.0/22 +43.237.156.0/22 +43.237.160.0/22 +43.237.164.0/22 +43.237.168.0/22 +43.237.172.0/22 +43.237.176.0/22 +43.237.180.0/22 +43.237.184.0/22 +43.237.188.0/22 +43.237.192.0/22 +43.237.200.0/22 +43.237.204.0/22 +43.237.208.0/22 +43.237.212.0/22 +43.237.216.0/22 +43.237.220.0/22 +43.237.224.0/22 +43.237.228.0/22 +43.237.232.0/22 +43.237.236.0/22 +43.237.240.0/22 +43.237.244.0/22 +43.237.248.0/22 +43.237.252.0/22 +43.238.0.0/22 +43.238.4.0/22 +43.238.8.0/22 +43.238.12.0/22 +43.238.16.0/22 +43.238.20.0/22 +43.238.24.0/22 +43.238.28.0/22 +43.238.32.0/22 +43.238.36.0/22 +43.238.40.0/22 +43.238.44.0/22 +43.238.48.0/22 +43.238.52.0/22 +43.238.56.0/22 +43.238.60.0/22 +43.238.64.0/22 +43.238.68.0/22 +43.238.72.0/22 +43.238.76.0/22 +43.238.80.0/22 +43.238.84.0/22 +43.238.88.0/22 +43.238.92.0/22 +43.238.96.0/22 +43.238.100.0/22 +43.238.104.0/22 +43.238.108.0/22 +43.238.112.0/22 +43.238.116.0/22 +43.238.120.0/22 +43.238.124.0/22 +43.238.128.0/22 +43.238.132.0/22 +43.238.136.0/22 +43.238.140.0/22 +43.238.144.0/22 +43.238.148.0/22 +43.238.152.0/22 +43.238.156.0/22 +43.238.160.0/22 +43.238.164.0/22 +43.238.168.0/22 +43.238.172.0/22 +43.238.176.0/22 +43.238.180.0/22 +43.238.184.0/22 +43.238.188.0/22 +43.238.192.0/22 +43.238.196.0/22 +43.238.200.0/22 +43.238.204.0/22 +43.238.208.0/22 +43.238.212.0/22 +43.238.216.0/22 +43.238.220.0/22 +43.238.224.0/22 +43.238.228.0/22 +43.238.232.0/22 +43.238.236.0/22 +43.238.240.0/22 +43.238.244.0/22 +43.238.248.0/22 +43.238.252.0/22 +43.239.0.0/22 +43.239.4.0/22 +43.239.8.0/21 +43.239.16.0/22 +43.239.20.0/22 +43.239.24.0/22 +43.239.28.0/22 +43.239.32.0/22 +43.239.36.0/22 +43.239.40.0/22 +43.239.44.0/22 +43.239.48.0/22 +43.239.116.0/22 +43.239.120.0/22 +43.239.172.0/22 +43.239.176.0/22 +43.240.0.0/22 +43.240.56.0/22 +43.240.60.0/22 +43.240.68.0/22 +43.240.72.0/22 +43.240.76.0/22 +43.240.84.0/22 +43.240.124.0/22 +43.240.128.0/22 +43.240.132.0/22 +43.240.136.0/22 +43.240.144.0/22 +43.240.156.0/22 +43.240.160.0/22 +43.240.164.0/22 +43.240.168.0/22 +43.240.172.0/22 +43.240.176.0/22 +43.240.180.0/22 +43.240.184.0/22 +43.240.188.0/22 +43.240.192.0/22 +43.240.196.0/22 +43.240.200.0/22 +43.240.204.0/22 +43.240.208.0/22 +43.240.212.0/22 +43.240.216.0/22 +43.240.220.0/22 +43.240.240.0/22 +43.240.244.0/22 +43.240.248.0/22 +43.240.252.0/22 +43.241.0.0/22 +43.241.4.0/22 +43.241.8.0/22 +43.241.12.0/22 +43.241.16.0/22 +43.241.20.0/22 +43.241.48.0/22 +43.241.76.0/22 +43.241.80.0/22 +43.241.84.0/22 +43.241.88.0/22 +43.241.92.0/22 +43.241.112.0/22 +43.241.168.0/22 +43.241.172.0/22 +43.241.176.0/22 +43.241.180.0/22 +43.241.184.0/22 +43.241.208.0/22 +43.241.212.0/22 +43.241.216.0/22 +43.241.220.0/22 +43.241.224.0/22 +43.241.228.0/22 +43.241.232.0/22 +43.241.236.0/22 +43.241.240.0/22 +43.241.248.0/22 +43.241.252.0/22 +43.242.8.0/22 +43.242.12.0/22 +43.242.16.0/21 +43.242.24.0/22 +43.242.28.0/22 +43.242.44.0/22 +43.242.48.0/22 +43.242.52.0/22 +43.242.56.0/22 +43.242.60.0/22 +43.242.64.0/22 +43.242.72.0/22 +43.242.76.0/22 +43.242.80.0/22 +43.242.84.0/22 +43.242.88.0/22 +43.242.92.0/22 +43.242.96.0/22 +43.242.144.0/22 +43.242.148.0/22 +43.242.152.0/22 +43.242.156.0/22 +43.242.160.0/22 +43.242.164.0/22 +43.242.168.0/22 +43.242.180.0/22 +43.242.188.0/22 +43.242.192.0/22 +43.242.196.0/22 +43.242.204.0/22 +43.242.216.0/22 +43.242.220.0/22 +43.242.252.0/22 +43.243.4.0/22 +43.243.8.0/22 +43.243.12.0/22 +43.243.16.0/22 +43.243.88.0/22 +43.243.128.0/22 +43.243.136.0/22 +43.243.144.0/22 +43.243.148.0/22 +43.243.156.0/22 +43.243.180.0/22 +43.243.228.0/22 +43.243.232.0/22 +43.243.244.0/22 +43.246.0.0/22 +43.246.4.0/22 +43.246.8.0/22 +43.246.12.0/22 +43.246.16.0/22 +43.246.20.0/22 +43.246.24.0/22 +43.246.28.0/22 +43.246.32.0/22 +43.246.36.0/22 +43.246.40.0/22 +43.246.44.0/22 +43.246.48.0/22 +43.246.52.0/22 +43.246.56.0/22 +43.246.60.0/22 +43.246.64.0/22 +43.246.68.0/22 +43.246.72.0/22 +43.246.76.0/22 +43.246.80.0/22 +43.246.84.0/22 +43.246.88.0/22 +43.246.92.0/22 +43.246.96.0/22 +43.246.112.0/22 +43.246.228.0/22 +43.247.4.0/22 +43.247.8.0/22 +43.247.44.0/22 +43.247.48.0/22 +43.247.68.0/22 +43.247.76.0/22 +43.247.84.0/22 +43.247.88.0/22 +43.247.92.0/22 +43.247.96.0/22 +43.247.100.0/22 +43.247.108.0/22 +43.247.112.0/22 +43.247.148.0/22 +43.247.152.0/22 +43.247.176.0/22 +43.247.180.0/22 +43.247.184.0/22 +43.247.188.0/22 +43.247.196.0/22 +43.247.200.0/22 +43.247.204.0/22 +43.247.208.0/22 +43.247.212.0/22 +43.247.216.0/22 +43.247.220.0/22 +43.247.224.0/22 +43.247.228.0/22 +43.247.232.0/22 +43.247.236.0/22 +43.247.240.0/22 +43.247.244.0/22 +43.247.248.0/22 +43.247.252.0/22 +43.248.0.0/22 +43.248.4.0/22 +43.248.20.0/22 +43.248.28.0/22 +43.248.48.0/22 +43.248.76.0/22 +43.248.80.0/22 +43.248.84.0/22 +43.248.88.0/22 +43.248.92.0/22 +43.248.96.0/22 +43.248.100.0/22 +43.248.104.0/22 +43.248.108.0/22 +43.248.112.0/22 +43.248.116.0/22 +43.248.120.0/22 +43.248.124.0/22 +43.248.128.0/22 +43.248.132.0/22 +43.248.136.0/22 +43.248.140.0/22 +43.248.144.0/22 +43.248.148.0/22 +43.248.176.0/22 +43.248.180.0/22 +43.248.184.0/22 +43.248.188.0/22 +43.248.192.0/22 +43.248.196.0/22 +43.248.200.0/22 +43.248.204.0/22 +43.248.208.0/22 +43.248.228.0/22 +43.248.232.0/22 +43.248.244.0/22 +43.249.4.0/22 +43.249.8.0/22 +43.249.120.0/22 +43.249.132.0/22 +43.249.136.0/22 +43.249.144.0/22 +43.249.148.0/22 +43.249.152.0/22 +43.249.156.0/22 +43.249.160.0/22 +43.249.164.0/22 +43.249.168.0/22 +43.249.192.0/22 +43.249.236.0/22 +43.250.4.0/22 +43.250.12.0/22 +43.250.16.0/22 +43.250.20.0/22 +43.250.28.0/22 +43.250.32.0/22 +43.250.36.0/22 +43.250.72.0/22 +43.250.96.0/22 +43.250.100.0/22 +43.250.104.0/22 +43.250.108.0/22 +43.250.112.0/22 +43.250.116.0/22 +43.250.128.0/22 +43.250.144.0/22 +43.250.148.0/22 +43.250.160.0/22 +43.250.168.0/22 +43.250.172.0/22 +43.250.176.0/22 +43.250.200.0/22 +43.250.212.0/22 +43.250.216.0/22 +43.250.220.0/22 +43.250.236.0/22 +43.250.244.0/22 +43.251.4.0/22 +43.251.8.0/22 +43.251.36.0/22 +43.251.100.0/22 +43.251.116.0/22 +43.251.192.0/22 +43.251.232.0/22 +43.251.236.0/22 +43.251.244.0/22 +43.252.48.0/22 +43.252.56.0/22 +43.254.0.0/22 +43.254.4.0/22 +43.254.8.0/22 +43.254.24.0/22 +43.254.36.0/22 +43.254.44.0/22 +43.254.52.0/22 +43.254.64.0/22 +43.254.72.0/22 +43.254.84.0/22 +43.254.88.0/22 +43.254.92.0/22 +43.254.100.0/22 +43.254.104.0/22 +43.254.112.0/22 +43.254.116.0/22 +43.254.128.0/22 +43.254.136.0/22 +43.254.140.0/22 +43.254.144.0/22 +43.254.148.0/22 +43.254.152.0/22 +43.254.156.0/22 +43.254.168.0/22 +43.254.172.0/22 +43.254.180.0/22 +43.254.184.0/22 +43.254.188.0/22 +43.254.192.0/22 +43.254.196.0/22 +43.254.200.0/22 +43.254.208.0/22 +43.254.220.0/22 +43.254.224.0/22 +43.254.228.0/22 +43.254.232.0/22 +43.254.236.0/22 +43.254.240.0/22 +43.254.248.0/22 +43.254.252.0/22 +43.255.0.0/22 +43.255.4.0/22 +43.255.8.0/22 +43.255.16.0/22 +43.255.48.0/22 +43.255.64.0/22 +43.255.68.0/22 +43.255.72.0/22 +43.255.76.0/22 +43.255.84.0/22 +43.255.96.0/22 +43.255.144.0/22 +43.255.176.0/22 +43.255.184.0/22 +43.255.192.0/22 +43.255.200.0/22 +43.255.204.0/22 +43.255.208.0/22 +43.255.212.0/22 +43.255.224.0/22 +43.255.228.0/22 +43.255.232.0/22 +43.255.244.0/22 +45.40.192.0/18 +45.65.16.0/22 +45.65.20.0/22 +45.65.24.0/22 +45.65.28.0/22 +45.112.132.0/22 +45.112.188.0/22 +45.112.208.0/22 +45.112.212.0/22 +45.112.216.0/22 +45.112.220.0/22 +45.112.228.0/22 +45.112.232.0/22 +45.112.236.0/22 +45.113.12.0/22 +45.113.16.0/22 +45.113.20.0/22 +45.113.24.0/22 +45.113.28.0/22 +45.113.40.0/22 +45.113.52.0/22 +45.113.56.0/22 +45.113.72.0/22 +45.113.144.0/22 +45.113.148.0/22 +45.113.168.0/22 +45.113.176.0/22 +45.113.184.0/22 +45.113.200.0/22 +45.113.204.0/22 +45.113.208.0/22 +45.113.212.0/22 +45.113.216.0/22 +45.113.220.0/22 +45.113.240.0/22 +45.113.252.0/22 +45.114.0.0/22 +45.114.32.0/22 +45.114.40.0/22 +45.114.52.0/22 +45.114.96.0/22 +45.114.124.0/22 +45.114.136.0/22 +45.114.196.0/22 +45.114.200.0/22 +45.114.228.0/22 +45.114.252.0/22 +45.115.44.0/22 +45.115.100.0/22 +45.115.120.0/22 +45.115.132.0/22 +45.115.144.0/22 +45.115.156.0/22 +45.115.164.0/22 +45.115.200.0/22 +45.115.212.0/22 +45.115.228.0/22 +45.115.236.0/22 +45.115.244.0/22 +45.115.248.0/22 +45.116.16.0/22 +45.116.24.0/22 +45.116.32.0/22 +45.116.36.0/22 +45.116.52.0/22 +45.116.96.0/22 +45.116.100.0/22 +45.116.140.0/22 +45.116.152.0/22 +45.116.208.0/22 +45.117.8.0/22 +45.117.20.0/22 +45.117.68.0/22 +45.117.124.0/22 +45.117.252.0/22 +45.119.52.0/22 +45.119.60.0/22 +45.119.64.0/22 +45.119.68.0/22 +45.119.72.0/22 +45.119.104.0/22 +45.119.116.0/22 +45.119.232.0/22 +45.120.100.0/22 +45.120.140.0/22 +45.120.164.0/22 +45.120.240.0/22 +45.121.52.0/22 +45.121.64.0/22 +45.121.68.0/22 +45.121.72.0/22 +45.121.92.0/22 +45.121.96.0/22 +45.121.172.0/22 +45.121.176.0/22 +45.121.212.0/22 +45.121.240.0/22 +45.121.244.0/22 +45.121.248.0/22 +45.121.252.0/22 +45.122.0.0/22 +45.122.4.0/22 +45.122.8.0/22 +45.122.12.0/22 +45.122.16.0/22 +45.122.20.0/22 +45.122.24.0/22 +45.122.28.0/22 +45.122.32.0/22 +45.122.36.0/22 +45.122.40.0/22 +45.122.60.0/22 +45.122.64.0/22 +45.122.68.0/22 +45.122.72.0/22 +45.122.76.0/22 +45.122.80.0/22 +45.122.84.0/22 +45.122.88.0/22 +45.122.92.0/22 +45.122.96.0/21 +45.122.104.0/22 +45.122.108.0/22 +45.122.112.0/22 +45.122.116.0/22 +45.122.160.0/22 +45.122.164.0/22 +45.122.168.0/22 +45.122.172.0/22 +45.122.176.0/22 +45.122.180.0/22 +45.122.184.0/22 +45.122.188.0/22 +45.122.192.0/22 +45.122.196.0/22 +45.122.200.0/22 +45.122.204.0/22 +45.122.208.0/22 +45.122.212.0/22 +45.122.216.0/22 +45.123.28.0/22 +45.123.32.0/22 +45.123.36.0/22 +45.123.44.0/22 +45.123.48.0/22 +45.123.52.0/22 +45.123.56.0/22 +45.123.60.0/22 +45.123.64.0/22 +45.123.68.0/22 +45.123.72.0/22 +45.123.76.0/22 +45.123.80.0/22 +45.123.84.0/22 +45.123.88.0/22 +45.123.120.0/22 +45.123.128.0/22 +45.123.132.0/22 +45.123.136.0/22 +45.123.148.0/22 +45.123.152.0/22 +45.123.156.0/22 +45.123.164.0/22 +45.123.168.0/22 +45.123.172.0/22 +45.123.176.0/22 +45.123.180.0/22 +45.123.184.0/22 +45.123.204.0/22 +45.123.212.0/22 +45.123.224.0/22 +45.123.228.0/22 +45.123.232.0/22 +45.123.236.0/22 +45.123.240.0/22 +45.123.244.0/22 +45.123.248.0/22 +45.123.252.0/22 +45.124.0.0/22 +45.124.20.0/22 +45.124.28.0/22 +45.124.32.0/22 +45.124.36.0/22 +45.124.44.0/22 +45.124.68.0/22 +45.124.76.0/22 +45.124.80.0/22 +45.124.100.0/22 +45.124.124.0/22 +45.124.172.0/22 +45.124.176.0/22 +45.124.208.0/22 +45.124.248.0/22 +45.125.16.0/22 +45.125.24.0/22 +45.125.44.0/22 +45.125.52.0/22 +45.125.56.0/22 +45.125.76.0/22 +45.125.80.0/22 +45.125.84.0/22 +45.125.88.0/22 +45.125.92.0/22 +45.125.96.0/22 +45.125.100.0/22 +45.125.136.0/22 +45.126.48.0/22 +45.126.52.0/22 +45.126.100.0/22 +45.126.108.0/22 +45.126.112.0/22 +45.126.116.0/22 +45.126.120.0/22 +45.126.212.0/22 +45.126.220.0/22 +45.127.8.0/22 +45.127.12.0/22 +45.127.128.0/22 +45.127.144.0/22 +45.127.148.0/22 +45.127.156.0/22 +45.127.216.0/22 +45.248.8.0/22 +45.248.80.0/22 +45.248.84.0/22 +45.248.88.0/22 +45.248.96.0/22 +45.248.100.0/22 +45.248.104.0/22 +45.248.108.0/22 +45.248.128.0/22 +45.248.132.0/22 +45.248.204.0/22 +45.248.208.0/22 +45.248.212.0/22 +45.248.216.0/22 +45.248.220.0/22 +45.248.224.0/22 +45.248.228.0/22 +45.248.232.0/22 +45.248.236.0/22 +45.248.240.0/22 +45.248.244.0/22 +45.248.248.0/22 +45.248.252.0/22 +45.249.0.0/22 +45.249.4.0/22 +45.249.12.0/22 +45.249.16.0/22 +45.249.20.0/22 +45.249.24.0/22 +45.249.28.0/22 +45.249.32.0/22 +45.249.36.0/22 +45.249.112.0/22 +45.249.188.0/22 +45.249.192.0/22 +45.249.196.0/22 +45.249.200.0/22 +45.249.204.0/22 +45.249.208.0/22 +45.249.212.0/22 +45.250.12.0/22 +45.250.16.0/22 +45.250.28.0/22 +45.250.32.0/22 +45.250.36.0/22 +45.250.40.0/22 +45.250.76.0/22 +45.250.80.0/22 +45.250.84.0/22 +45.250.88.0/22 +45.250.92.0/22 +45.250.96.0/22 +45.250.104.0/22 +45.250.108.0/22 +45.250.112.0/22 +45.250.116.0/22 +45.250.120.0/22 +45.250.124.0/22 +45.250.128.0/22 +45.250.132.0/22 +45.250.136.0/22 +45.250.140.0/22 +45.250.144.0/22 +45.250.148.0/22 +45.250.152.0/22 +45.250.164.0/22 +45.250.180.0/22 +45.250.184.0/22 +45.250.188.0/22 +45.250.192.0/22 +45.251.0.0/22 +45.251.8.0/22 +45.251.16.0/22 +45.251.20.0/22 +45.251.52.0/22 +45.251.84.0/22 +45.251.88.0/22 +45.251.92.0/22 +45.251.96.0/22 +45.251.100.0/22 +45.251.120.0/22 +45.251.124.0/22 +45.251.136.0/22 +45.251.140.0/22 +45.251.144.0/22 +45.251.148.0/22 +45.251.152.0/22 +45.251.156.0/22 +45.251.160.0/22 +45.251.164.0/22 +45.251.168.0/22 +45.251.172.0/22 +45.251.176.0/22 +45.251.180.0/22 +45.251.184.0/22 +45.251.188.0/22 +45.251.192.0/22 +45.251.196.0/22 +45.251.200.0/22 +45.251.204.0/22 +45.251.208.0/22 +45.251.212.0/22 +45.251.216.0/22 +45.251.220.0/22 +45.251.224.0/22 +45.251.240.0/22 +45.252.0.0/22 +45.252.4.0/22 +45.252.8.0/22 +45.252.12.0/22 +45.252.16.0/22 +45.252.20.0/22 +45.252.24.0/22 +45.252.28.0/22 +45.252.32.0/22 +45.252.36.0/22 +45.252.40.0/22 +45.252.44.0/22 +45.252.48.0/22 +45.252.84.0/22 +45.252.88.0/22 +45.252.92.0/22 +45.252.96.0/22 +45.252.100.0/22 +45.252.104.0/22 +45.252.108.0/22 +45.252.112.0/22 +45.252.116.0/22 +45.252.120.0/22 +45.252.124.0/22 +45.252.128.0/22 +45.252.132.0/22 +45.252.136.0/22 +45.252.140.0/22 +45.252.144.0/22 +45.252.148.0/22 +45.252.152.0/22 +45.252.156.0/22 +45.252.160.0/22 +45.252.164.0/22 +45.252.168.0/22 +45.252.172.0/22 +45.252.176.0/22 +45.252.192.0/22 +45.252.196.0/22 +45.252.200.0/22 +45.252.204.0/22 +45.252.208.0/22 +45.252.212.0/22 +45.252.216.0/22 +45.252.220.0/22 +45.252.224.0/22 +45.252.228.0/22 +45.252.232.0/22 +45.253.0.0/22 +45.253.4.0/22 +45.253.8.0/22 +45.253.12.0/22 +45.253.16.0/22 +45.253.20.0/22 +45.253.24.0/22 +45.253.28.0/22 +45.253.32.0/22 +45.253.36.0/22 +45.253.40.0/22 +45.253.44.0/22 +45.253.48.0/22 +45.253.52.0/22 +45.253.56.0/22 +45.253.60.0/22 +45.253.64.0/22 +45.253.68.0/22 +45.253.72.0/22 +45.253.76.0/22 +45.253.80.0/22 +45.253.84.0/22 +45.253.92.0/22 +45.253.96.0/22 +45.253.100.0/22 +45.253.104.0/22 +45.253.108.0/22 +45.253.112.0/22 +45.253.116.0/22 +45.253.120.0/22 +45.253.132.0/22 +45.253.136.0/22 +45.253.140.0/22 +45.253.144.0/22 +45.253.148.0/22 +45.253.152.0/22 +45.253.156.0/22 +45.253.160.0/22 +45.253.164.0/22 +45.253.168.0/22 +45.253.172.0/22 +45.253.176.0/22 +45.253.180.0/22 +45.253.184.0/22 +45.253.188.0/22 +45.253.192.0/22 +45.253.196.0/22 +45.253.200.0/22 +45.253.204.0/22 +45.253.208.0/22 +45.253.212.0/22 +45.253.216.0/22 +45.253.220.0/22 +45.253.224.0/22 +45.253.228.0/22 +45.253.232.0/22 +45.253.236.0/22 +45.253.240.0/22 +45.253.244.0/22 +45.254.0.0/22 +45.254.4.0/22 +45.254.8.0/22 +45.254.12.0/22 +45.254.16.0/22 +45.254.20.0/22 +45.254.24.0/22 +45.254.28.0/22 +45.254.40.0/22 +45.254.48.0/22 +45.254.52.0/22 +45.254.56.0/22 +45.254.60.0/22 +45.254.64.0/22 +45.254.68.0/22 +45.254.72.0/22 +45.254.76.0/22 +45.254.80.0/22 +45.254.84.0/22 +45.254.88.0/22 +45.254.92.0/22 +45.254.96.0/22 +45.254.100.0/22 +45.254.104.0/22 +45.254.108.0/22 +45.254.112.0/22 +45.254.116.0/22 +45.254.120.0/22 +45.254.124.0/22 +45.254.128.0/22 +45.254.132.0/22 +45.254.136.0/22 +45.254.140.0/22 +45.254.144.0/22 +45.254.148.0/22 +45.254.152.0/22 +45.254.156.0/22 +45.254.160.0/22 +45.254.164.0/22 +45.254.168.0/22 +45.254.172.0/22 +45.254.176.0/22 +45.254.180.0/22 +45.254.184.0/22 +45.254.188.0/22 +45.254.192.0/22 +45.254.196.0/22 +45.254.200.0/22 +45.254.204.0/22 +45.254.208.0/22 +45.254.212.0/22 +45.254.216.0/22 +45.254.220.0/22 +45.254.224.0/22 +45.254.228.0/22 +45.254.236.0/22 +45.254.240.0/22 +45.254.248.0/22 +45.255.0.0/22 +45.255.4.0/22 +45.255.8.0/22 +45.255.12.0/22 +45.255.16.0/22 +45.255.20.0/22 +45.255.24.0/22 +45.255.28.0/22 +45.255.32.0/22 +45.255.36.0/22 +45.255.40.0/22 +45.255.44.0/22 +45.255.48.0/22 +45.255.52.0/22 +45.255.56.0/22 +45.255.60.0/22 +45.255.64.0/22 +45.255.68.0/22 +45.255.72.0/22 +45.255.76.0/22 +45.255.80.0/22 +45.255.84.0/22 +45.255.88.0/22 +45.255.92.0/22 +45.255.96.0/22 +45.255.100.0/22 +45.255.104.0/22 +45.255.108.0/22 +45.255.112.0/22 +45.255.116.0/22 +45.255.120.0/22 +45.255.124.0/22 +45.255.132.0/22 +45.255.136.0/22 +45.255.140.0/22 +45.255.144.0/22 +45.255.148.0/22 +45.255.152.0/22 +45.255.156.0/22 +45.255.160.0/22 +45.255.164.0/22 +45.255.168.0/22 +45.255.172.0/22 +45.255.176.0/22 +45.255.180.0/22 +45.255.184.0/22 +45.255.188.0/22 +45.255.192.0/22 +45.255.196.0/22 +45.255.200.0/22 +45.255.204.0/22 +45.255.208.0/22 +45.255.212.0/22 +45.255.216.0/22 +45.255.220.0/22 +45.255.224.0/22 +45.255.228.0/22 +45.255.232.0/22 +45.255.236.0/22 +45.255.240.0/22 +45.255.244.0/22 +45.255.248.0/22 +47.92.0.0/14 +47.96.0.0/11 +49.4.0.0/14 +49.51.0.0/16 +49.52.0.0/14 +49.64.0.0/11 +49.112.0.0/13 +49.120.0.0/14 +49.128.0.0/24 +49.128.2.0/23 +49.128.4.0/22 +49.140.0.0/15 +49.152.0.0/14 +49.208.0.0/15 +49.210.0.0/15 +49.220.0.0/14 +49.232.0.0/14 +49.239.0.0/18 +49.239.192.0/18 +49.246.224.0/19 +52.80.0.0/15 +52.82.0.0/15 +52.130.0.0/15 +54.222.0.0/15 +57.176.0.0/15 +58.14.0.0/15 +58.16.0.0/16 +58.17.0.0/17 +58.17.128.0/17 +58.18.0.0/16 +58.19.0.0/16 +58.20.0.0/16 +58.21.0.0/16 +58.22.0.0/15 +58.24.0.0/15 +58.30.0.0/15 +58.32.0.0/13 +58.40.0.0/15 +58.42.0.0/16 +58.43.0.0/16 +58.44.0.0/14 +58.48.0.0/13 +58.56.0.0/15 +58.58.0.0/16 +58.59.0.0/17 +58.59.128.0/17 +58.60.0.0/14 +58.65.232.0/21 +58.66.0.0/15 +58.68.128.0/17 +58.82.0.0/17 +58.83.0.0/17 +58.83.128.0/17 +58.87.64.0/18 +58.99.128.0/17 +58.100.0.0/15 +58.116.0.0/14 +58.128.0.0/13 +58.144.0.0/16 +58.154.0.0/15 +58.192.0.0/15 +58.194.0.0/15 +58.196.0.0/15 +58.198.0.0/15 +58.200.0.0/13 +58.208.0.0/12 +58.240.0.0/15 +58.242.0.0/15 +58.244.0.0/15 +58.246.0.0/15 +58.248.0.0/13 +59.32.0.0/13 +59.40.0.0/15 +59.42.0.0/16 +59.43.0.0/16 +59.44.0.0/14 +59.48.0.0/16 +59.49.0.0/17 +59.49.128.0/17 +59.50.0.0/16 +59.51.0.0/17 +59.51.128.0/17 +59.52.0.0/14 +59.56.0.0/14 +59.60.0.0/15 +59.62.0.0/15 +59.64.0.0/14 +59.68.0.0/14 +59.72.0.0/15 +59.74.0.0/15 +59.76.0.0/16 +59.77.0.0/16 +59.78.0.0/15 +59.80.0.0/15 +59.82.0.0/15 +59.107.0.0/17 +59.107.128.0/17 +59.108.0.0/15 +59.110.0.0/15 +59.151.0.0/17 +59.152.16.0/22 +59.152.20.0/22 +59.152.24.0/22 +59.152.28.0/22 +59.152.32.0/22 +59.152.36.0/22 +59.152.64.0/22 +59.152.68.0/22 +59.152.72.0/22 +59.152.76.0/22 +59.152.112.0/22 +59.152.116.0/22 +59.153.4.0/22 +59.153.32.0/22 +59.153.60.0/22 +59.153.64.0/22 +59.153.68.0/22 +59.153.72.0/22 +59.153.92.0/22 +59.153.116.0/22 +59.153.136.0/22 +59.153.152.0/22 +59.153.164.0/22 +59.153.168.0/22 +59.153.172.0/22 +59.153.176.0/22 +59.153.180.0/22 +59.153.184.0/22 +59.153.188.0/22 +59.153.192.0/22 +59.155.0.0/16 +59.172.0.0/15 +59.174.0.0/15 +59.191.0.0/17 +59.192.0.0/10 +60.0.0.0/13 +60.8.0.0/15 +60.10.0.0/16 +60.11.0.0/16 +60.12.0.0/16 +60.13.0.0/18 +60.13.64.0/18 +60.13.128.0/17 +60.14.0.0/15 +60.16.0.0/13 +60.24.0.0/14 +60.28.0.0/15 +60.30.0.0/16 +60.31.0.0/16 +60.55.0.0/16 +60.63.0.0/16 +60.160.0.0/15 +60.162.0.0/15 +60.164.0.0/15 +60.166.0.0/15 +60.168.0.0/13 +60.176.0.0/12 +60.194.0.0/15 +60.200.0.0/14 +60.204.0.0/16 +60.205.0.0/16 +60.206.0.0/15 +60.208.0.0/13 +60.216.0.0/15 +60.218.0.0/15 +60.220.0.0/14 +60.232.0.0/15 +60.235.0.0/16 +60.245.128.0/17 +60.247.0.0/16 +60.252.0.0/16 +60.253.128.0/17 +60.255.0.0/16 +61.4.80.0/22 +61.4.84.0/22 +61.4.88.0/21 +61.4.176.0/20 +61.8.160.0/20 +61.14.212.0/22 +61.14.216.0/22 +61.14.220.0/22 +61.14.240.0/22 +61.14.244.0/22 +61.28.0.0/20 +61.28.16.0/20 +61.28.32.0/19 +61.28.64.0/18 +61.29.128.0/18 +61.29.192.0/19 +61.29.224.0/20 +61.29.240.0/21 +61.29.248.0/22 +61.29.254.0/23 +61.45.128.0/18 +61.45.224.0/20 +61.47.128.0/18 +61.48.0.0/14 +61.52.0.0/15 +61.54.0.0/16 +61.55.0.0/16 +61.87.192.0/18 +61.128.0.0/15 +61.130.0.0/15 +61.132.0.0/16 +61.133.0.0/17 +61.133.128.0/17 +61.134.0.0/18 +61.134.64.0/19 +61.134.96.0/19 +61.134.128.0/18 +61.134.192.0/18 +61.135.0.0/16 +61.136.0.0/18 +61.136.64.0/18 +61.136.128.0/17 +61.137.0.0/17 +61.137.128.0/17 +61.138.0.0/18 +61.138.64.0/18 +61.138.128.0/18 +61.138.192.0/18 +61.139.0.0/17 +61.139.128.0/18 +61.139.192.0/18 +61.140.0.0/14 +61.144.0.0/14 +61.148.0.0/15 +61.150.0.0/15 +61.152.0.0/16 +61.153.0.0/16 +61.154.0.0/15 +61.156.0.0/16 +61.157.0.0/16 +61.158.0.0/17 +61.158.128.0/17 +61.159.0.0/18 +61.159.64.0/18 +61.159.128.0/17 +61.160.0.0/16 +61.161.0.0/18 +61.161.64.0/18 +61.161.128.0/17 +61.162.0.0/16 +61.163.0.0/16 +61.164.0.0/16 +61.165.0.0/16 +61.166.0.0/16 +61.167.0.0/16 +61.168.0.0/16 +61.169.0.0/16 +61.170.0.0/15 +61.172.0.0/14 +61.176.0.0/16 +61.177.0.0/16 +61.178.0.0/16 +61.179.0.0/16 +61.180.0.0/17 +61.180.128.0/17 +61.181.0.0/16 +61.182.0.0/16 +61.183.0.0/16 +61.184.0.0/14 +61.188.0.0/16 +61.189.0.0/17 +61.189.128.0/17 +61.190.0.0/15 +61.232.0.0/14 +61.236.0.0/15 +61.240.0.0/14 +62.234.0.0/16 +68.79.0.0/18 +69.230.192.0/18 +69.231.128.0/18 +69.234.192.0/18 +69.235.128.0/18 +71.131.192.0/18 +71.132.0.0/18 +71.136.64.0/18 +71.137.0.0/18 +81.68.0.0/14 +82.156.0.0/15 +94.191.0.0/17 +101.0.0.0/22 +101.1.0.0/22 +101.2.172.0/22 +101.4.0.0/14 +101.16.0.0/12 +101.33.128.0/17 +101.34.0.0/15 +101.36.0.0/18 +101.36.64.0/19 +101.36.128.0/17 +101.37.0.0/16 +101.38.0.0/15 +101.40.0.0/15 +101.42.0.0/15 +101.47.0.0/16 +101.48.0.0/15 +101.50.8.0/22 +101.50.12.0/22 +101.50.56.0/22 +101.52.0.0/16 +101.53.100.0/22 +101.54.0.0/16 +101.55.224.0/21 +101.64.0.0/13 +101.72.0.0/14 +101.76.0.0/15 +101.78.0.0/22 +101.78.32.0/19 +101.80.0.0/12 +101.96.0.0/21 +101.96.8.0/22 +101.96.16.0/20 +101.96.128.0/17 +101.99.96.0/19 +101.101.64.0/19 +101.101.100.0/24 +101.101.102.0/23 +101.101.104.0/21 +101.101.112.0/20 +101.102.64.0/19 +101.102.100.0/23 +101.102.102.0/24 +101.102.104.0/21 +101.102.112.0/20 +101.104.0.0/14 +101.110.64.0/19 +101.110.96.0/20 +101.110.116.0/22 +101.110.120.0/21 +101.120.0.0/14 +101.124.0.0/15 +101.126.0.0/16 +101.128.0.0/22 +101.128.8.0/21 +101.128.16.0/20 +101.128.32.0/19 +101.129.0.0/16 +101.130.0.0/15 +101.132.0.0/14 +101.144.0.0/12 +101.192.0.0/14 +101.196.0.0/16 +101.197.0.0/16 +101.198.0.0/15 +101.200.0.0/15 +101.203.128.0/19 +101.203.160.0/21 +101.203.172.0/22 +101.203.176.0/20 +101.204.0.0/14 +101.224.0.0/13 +101.232.0.0/15 +101.234.64.0/21 +101.234.76.0/22 +101.234.80.0/20 +101.234.96.0/19 +101.236.0.0/14 +101.240.0.0/14 +101.244.0.0/16 +101.245.0.0/16 +101.246.0.0/15 +101.248.0.0/15 +101.251.0.0/22 +101.251.8.0/21 +101.251.16.0/20 +101.251.32.0/19 +101.251.64.0/18 +101.251.128.0/17 +101.252.0.0/15 +101.254.0.0/16 +103.1.8.0/22 +103.1.20.0/22 +103.1.24.0/22 +103.1.72.0/22 +103.1.88.0/22 +103.1.168.0/22 +103.2.108.0/22 +103.2.156.0/22 +103.2.164.0/22 +103.2.200.0/22 +103.2.204.0/22 +103.2.208.0/22 +103.2.212.0/22 +103.3.84.0/22 +103.3.88.0/22 +103.3.92.0/22 +103.3.96.0/22 +103.3.100.0/22 +103.3.104.0/22 +103.3.108.0/22 +103.3.112.0/22 +103.3.116.0/22 +103.3.120.0/22 +103.3.124.0/22 +103.3.128.0/22 +103.3.132.0/22 +103.3.136.0/22 +103.3.140.0/22 +103.3.148.0/22 +103.3.152.0/22 +103.3.156.0/22 +103.4.56.0/22 +103.4.168.0/22 +103.4.184.0/22 +103.4.224.0/22 +103.5.36.0/22 +103.5.52.0/22 +103.5.56.0/22 +103.5.152.0/22 +103.5.168.0/22 +103.5.192.0/22 +103.5.252.0/22 +103.6.76.0/22 +103.6.108.0/22 +103.6.220.0/22 +103.6.228.0/22 +103.7.28.0/22 +103.7.140.0/22 +103.7.212.0/22 +103.7.216.0/22 +103.7.220.0/22 +103.8.0.0/22 +103.8.4.0/22 +103.8.8.0/22 +103.8.32.0/22 +103.8.52.0/22 +103.8.68.0/22 +103.8.108.0/22 +103.8.156.0/22 +103.8.200.0/22 +103.8.204.0/22 +103.8.220.0/22 +103.9.8.0/22 +103.9.24.0/22 +103.9.108.0/22 +103.9.152.0/22 +103.9.248.0/22 +103.9.252.0/22 +103.10.0.0/22 +103.10.16.0/22 +103.10.84.0/22 +103.10.140.0/22 +103.11.16.0/22 +103.11.168.0/22 +103.11.180.0/22 +103.12.32.0/22 +103.12.68.0/22 +103.12.92.0/22 +103.12.98.0/23 +103.12.136.0/22 +103.12.184.0/22 +103.12.232.0/22 +103.13.12.0/22 +103.13.124.0/22 +103.13.144.0/22 +103.13.196.0/22 +103.13.220.0/22 +103.13.244.0/22 +103.14.84.0/22 +103.14.100.0/22 +103.14.132.0/22 +103.14.136.0/22 +103.14.156.0/22 +103.14.240.0/22 +103.15.4.0/22 +103.15.8.0/22 +103.15.16.0/22 +103.15.96.0/22 +103.15.200.0/22 +103.16.52.0/22 +103.16.80.0/22 +103.16.84.0/22 +103.16.88.0/22 +103.16.108.0/22 +103.16.124.0/22 +103.17.40.0/22 +103.17.64.0/22 +103.17.120.0/22 +103.17.136.0/22 +103.17.160.0/22 +103.17.204.0/22 +103.17.228.0/22 +103.18.186.0/23 +103.18.192.0/22 +103.18.206.0/23 +103.18.208.0/22 +103.18.212.0/22 +103.18.224.0/22 +103.19.12.0/22 +103.19.40.0/22 +103.19.44.0/22 +103.19.50.0/23 +103.19.64.0/22 +103.19.68.0/22 +103.19.72.0/22 +103.19.232.0/22 +103.20.12.0/22 +103.20.32.0/22 +103.20.44.0/22 +103.20.68.0/22 +103.20.112.0/22 +103.20.128.0/22 +103.20.160.0/22 +103.20.248.0/22 +103.21.112.0/22 +103.21.116.0/22 +103.21.136.0/22 +103.21.140.0/22 +103.21.176.0/22 +103.21.208.0/22 +103.21.240.0/22 +103.22.0.0/22 +103.22.4.0/22 +103.22.8.0/22 +103.22.12.0/22 +103.22.16.0/22 +103.22.20.0/22 +103.22.24.0/22 +103.22.28.0/22 +103.22.32.0/22 +103.22.36.0/22 +103.22.40.0/22 +103.22.44.0/22 +103.22.48.0/22 +103.22.52.0/22 +103.22.56.0/22 +103.22.60.0/22 +103.22.64.0/22 +103.22.68.0/22 +103.22.72.0/22 +103.22.76.0/22 +103.22.80.0/22 +103.22.84.0/22 +103.22.88.0/22 +103.22.92.0/22 +103.22.100.0/22 +103.22.104.0/22 +103.22.108.0/22 +103.22.112.0/22 +103.22.116.0/22 +103.22.120.0/22 +103.22.124.0/22 +103.22.188.0/22 +103.22.228.0/22 +103.22.252.0/22 +103.23.8.0/22 +103.23.56.0/22 +103.23.160.0/22 +103.23.164.0/22 +103.23.176.0/22 +103.23.228.0/22 +103.24.24.0/22 +103.24.116.0/22 +103.24.128.0/22 +103.24.144.0/22 +103.24.176.0/22 +103.24.184.0/22 +103.24.220.0/22 +103.24.228.0/22 +103.24.252.0/22 +103.25.8.0/23 +103.25.20.0/22 +103.25.24.0/22 +103.25.28.0/22 +103.25.32.0/22 +103.25.36.0/22 +103.25.40.0/22 +103.25.48.0/22 +103.25.64.0/22 +103.25.68.0/22 +103.25.148.0/22 +103.25.156.0/22 +103.25.216.0/22 +103.26.0.0/22 +103.26.64.0/22 +103.26.76.0/22 +103.26.132.0/22 +103.26.156.0/22 +103.26.160.0/22 +103.26.228.0/22 +103.26.240.0/22 +103.27.4.0/22 +103.27.12.0/22 +103.27.24.0/22 +103.27.56.0/22 +103.27.96.0/22 +103.27.184.0/22 +103.27.208.0/22 +103.27.212.0/22 +103.27.240.0/22 +103.28.4.0/22 +103.28.8.0/22 +103.28.184.0/22 +103.28.204.0/22 +103.28.212.0/22 +103.29.16.0/22 +103.29.24.0/23 +103.29.29.0/24 +103.29.128.0/22 +103.29.132.0/22 +103.29.136.0/22 +103.29.236.0/23 +103.30.20.0/22 +103.30.96.0/22 +103.30.104.0/23 +103.30.106.0/23 +103.30.148.0/22 +103.30.200.0/22 +103.30.228.0/22 +103.30.236.0/22 +103.31.0.0/22 +103.31.48.0/22 +103.31.52.0/22 +103.31.56.0/22 +103.31.60.0/22 +103.31.64.0/22 +103.31.68.0/22 +103.31.148.0/22 +103.31.160.0/22 +103.31.168.0/22 +103.31.200.0/22 +103.31.236.0/22 +103.31.242.0/23 +103.32.0.0/22 +103.32.4.0/22 +103.32.8.0/22 +103.32.12.0/22 +103.32.16.0/22 +103.32.20.0/22 +103.32.24.0/22 +103.32.28.0/22 +103.32.32.0/22 +103.32.36.0/22 +103.32.40.0/22 +103.32.44.0/22 +103.32.48.0/22 +103.32.52.0/22 +103.32.56.0/22 +103.32.60.0/22 +103.32.64.0/22 +103.32.68.0/22 +103.32.72.0/22 +103.32.76.0/22 +103.32.80.0/22 +103.32.84.0/22 +103.32.88.0/22 +103.32.92.0/22 +103.32.96.0/22 +103.32.100.0/22 +103.32.104.0/22 +103.32.108.0/22 +103.32.112.0/22 +103.32.116.0/22 +103.32.120.0/22 +103.32.124.0/22 +103.32.128.0/22 +103.32.132.0/22 +103.32.136.0/22 +103.32.140.0/22 +103.32.144.0/22 +103.32.148.0/22 +103.32.152.0/22 +103.32.156.0/22 +103.32.160.0/22 +103.32.164.0/22 +103.32.168.0/22 +103.32.172.0/22 +103.32.176.0/22 +103.32.180.0/22 +103.32.184.0/22 +103.32.188.0/22 +103.32.192.0/22 +103.32.196.0/22 +103.32.200.0/22 +103.32.204.0/22 +103.32.208.0/22 +103.32.212.0/22 +103.32.216.0/22 +103.32.220.0/22 +103.32.224.0/22 +103.32.228.0/22 +103.32.232.0/22 +103.32.236.0/22 +103.32.240.0/22 +103.32.244.0/22 +103.32.248.0/22 +103.32.252.0/22 +103.33.0.0/22 +103.33.4.0/22 +103.33.8.0/22 +103.33.12.0/22 +103.33.16.0/22 +103.33.20.0/22 +103.33.24.0/22 +103.33.28.0/22 +103.33.32.0/22 +103.33.36.0/22 +103.33.40.0/22 +103.33.44.0/22 +103.33.48.0/22 +103.33.52.0/22 +103.33.56.0/22 +103.33.60.0/22 +103.33.64.0/22 +103.33.68.0/22 +103.33.72.0/22 +103.33.76.0/22 +103.33.80.0/22 +103.33.84.0/22 +103.33.88.0/22 +103.33.92.0/22 +103.33.96.0/22 +103.33.100.0/22 +103.33.104.0/22 +103.33.108.0/22 +103.33.112.0/22 +103.33.116.0/22 +103.33.120.0/22 +103.33.124.0/22 +103.33.128.0/22 +103.33.132.0/22 +103.33.136.0/22 +103.33.140.0/22 +103.33.144.0/22 +103.33.148.0/22 +103.33.152.0/22 +103.33.156.0/22 +103.33.160.0/22 +103.33.164.0/22 +103.33.168.0/22 +103.33.172.0/22 +103.33.176.0/22 +103.33.180.0/22 +103.33.184.0/22 +103.33.188.0/22 +103.33.192.0/22 +103.33.196.0/22 +103.33.200.0/22 +103.33.204.0/22 +103.33.208.0/22 +103.33.212.0/22 +103.33.216.0/22 +103.33.220.0/22 +103.33.224.0/22 +103.33.228.0/22 +103.33.232.0/22 +103.33.236.0/22 +103.33.240.0/22 +103.33.244.0/22 +103.33.248.0/22 +103.33.252.0/22 +103.34.0.0/22 +103.34.4.0/22 +103.34.8.0/22 +103.34.12.0/22 +103.34.16.0/22 +103.34.20.0/22 +103.34.24.0/22 +103.34.28.0/22 +103.34.32.0/22 +103.34.36.0/22 +103.34.40.0/22 +103.34.44.0/22 +103.34.48.0/22 +103.34.52.0/22 +103.34.56.0/22 +103.34.60.0/22 +103.34.64.0/22 +103.34.68.0/22 +103.34.72.0/22 +103.34.76.0/22 +103.34.80.0/22 +103.34.84.0/22 +103.34.88.0/22 +103.34.92.0/22 +103.34.96.0/22 +103.34.100.0/22 +103.34.104.0/22 +103.34.108.0/22 +103.34.112.0/22 +103.34.116.0/22 +103.34.120.0/22 +103.34.124.0/22 +103.34.128.0/22 +103.34.132.0/22 +103.34.136.0/22 +103.34.140.0/22 +103.34.144.0/22 +103.34.148.0/22 +103.34.152.0/22 +103.34.156.0/22 +103.34.160.0/22 +103.34.164.0/22 +103.34.168.0/22 +103.34.172.0/22 +103.34.176.0/22 +103.34.180.0/22 +103.34.184.0/22 +103.34.188.0/22 +103.34.192.0/22 +103.34.196.0/22 +103.34.200.0/22 +103.34.204.0/22 +103.34.208.0/22 +103.34.212.0/22 +103.34.216.0/22 +103.34.220.0/22 +103.34.224.0/22 +103.34.228.0/22 +103.34.232.0/22 +103.34.236.0/22 +103.34.240.0/22 +103.34.244.0/22 +103.34.248.0/22 +103.34.252.0/22 +103.35.0.0/22 +103.35.4.0/22 +103.35.8.0/22 +103.35.12.0/22 +103.35.16.0/22 +103.35.20.0/22 +103.35.24.0/22 +103.35.28.0/22 +103.35.32.0/22 +103.35.36.0/22 +103.35.40.0/22 +103.35.44.0/22 +103.35.48.0/22 +103.35.104.0/22 +103.35.116.0/22 +103.35.180.0/22 +103.35.220.0/22 +103.36.28.0/22 +103.36.36.0/22 +103.36.56.0/22 +103.36.60.0/22 +103.36.64.0/22 +103.36.72.0/22 +103.36.96.0/22 +103.36.132.0/22 +103.36.136.0/22 +103.36.160.0/22 +103.36.164.0/22 +103.36.168.0/22 +103.36.172.0/22 +103.36.176.0/22 +103.36.180.0/22 +103.36.184.0/22 +103.36.188.0/22 +103.36.192.0/22 +103.36.196.0/22 +103.36.200.0/22 +103.36.204.0/22 +103.36.208.0/22 +103.36.212.0/22 +103.36.216.0/22 +103.36.220.0/22 +103.36.224.0/22 +103.36.228.0/22 +103.36.232.0/22 +103.36.236.0/22 +103.36.240.0/22 +103.36.244.0/22 +103.37.12.0/22 +103.37.16.0/22 +103.37.24.0/22 +103.37.44.0/22 +103.37.52.0/22 +103.37.56.0/22 +103.37.72.0/22 +103.37.100.0/22 +103.37.104.0/22 +103.37.136.0/22 +103.37.140.0/22 +103.37.144.0/22 +103.37.148.0/22 +103.37.152.0/22 +103.37.156.0/22 +103.37.160.0/22 +103.37.164.0/22 +103.37.172.0/22 +103.37.176.0/22 +103.37.188.0/22 +103.37.208.0/22 +103.37.212.0/22 +103.37.216.0/21 +103.37.248.0/22 +103.37.252.0/22 +103.38.0.0/22 +103.38.32.0/22 +103.38.40.0/22 +103.38.44.0/22 +103.38.56.0/22 +103.38.76.0/22 +103.38.84.0/22 +103.38.92.0/22 +103.38.96.0/22 +103.38.116.0/22 +103.38.132.0/22 +103.38.140.0/22 +103.38.224.0/22 +103.38.228.0/22 +103.38.232.0/22 +103.39.64.0/22 +103.39.88.0/22 +103.39.100.0/22 +103.39.104.0/22 +103.39.160.0/22 +103.39.164.0/22 +103.39.168.0/22 +103.39.172.0/22 +103.39.176.0/22 +103.39.180.0/22 +103.39.184.0/22 +103.39.188.0/22 +103.39.200.0/22 +103.39.204.0/22 +103.39.208.0/22 +103.39.212.0/22 +103.39.216.0/22 +103.39.220.0/22 +103.39.224.0/22 +103.39.228.0/22 +103.39.232.0/22 +103.40.12.0/22 +103.40.16.0/22 +103.40.20.0/22 +103.40.24.0/22 +103.40.28.0/22 +103.40.32.0/22 +103.40.36.0/22 +103.40.40.0/22 +103.40.44.0/22 +103.40.88.0/22 +103.40.100.0/22 +103.40.158.0/23 +103.40.192.0/22 +103.40.212.0/22 +103.40.220.0/22 +103.40.228.0/22 +103.40.232.0/22 +103.40.236.0/22 +103.40.240.0/22 +103.40.244.0/22 +103.40.248.0/22 +103.40.252.0/22 +103.41.0.0/22 +103.41.16.0/22 +103.41.52.0/22 +103.41.116.0/22 +103.41.140.0/22 +103.41.148.0/22 +103.41.152.0/22 +103.41.160.0/22 +103.41.164.0/22 +103.41.220.0/22 +103.41.224.0/22 +103.41.228.0/22 +103.41.232.0/22 +103.42.8.0/22 +103.42.24.0/22 +103.42.28.0/22 +103.42.32.0/22 +103.42.64.0/22 +103.42.68.0/22 +103.42.76.0/22 +103.42.104.0/22 +103.42.180.0/22 +103.42.232.0/22 +103.43.16.0/22 +103.43.84.0/22 +103.43.96.0/22 +103.43.100.0/22 +103.43.104.0/22 +103.43.124.0/22 +103.43.132.0/22 +103.43.184.0/22 +103.43.192.0/22 +103.43.196.0/22 +103.43.208.0/22 +103.43.220.0/22 +103.43.224.0/22 +103.43.240.0/22 +103.44.56.0/22 +103.44.80.0/22 +103.44.120.0/22 +103.44.124.0/22 +103.44.132.0/22 +103.44.144.0/22 +103.44.168.0/22 +103.44.176.0/22 +103.44.180.0/22 +103.44.184.0/22 +103.44.188.0/22 +103.44.192.0/22 +103.44.196.0/22 +103.44.200.0/22 +103.44.204.0/22 +103.44.224.0/22 +103.44.236.0/22 +103.44.240.0/22 +103.44.244.0/22 +103.44.248.0/22 +103.44.252.0/22 +103.45.0.0/22 +103.45.4.0/22 +103.45.8.0/22 +103.45.12.0/22 +103.45.16.0/22 +103.45.20.0/22 +103.45.24.0/22 +103.45.28.0/22 +103.45.32.0/22 +103.45.36.0/22 +103.45.40.0/22 +103.45.44.0/22 +103.45.48.0/22 +103.45.52.0/22 +103.45.56.0/22 +103.45.60.0/22 +103.45.72.0/22 +103.45.76.0/22 +103.45.80.0/22 +103.45.84.0/22 +103.45.88.0/22 +103.45.92.0/22 +103.45.96.0/22 +103.45.100.0/22 +103.45.104.0/22 +103.45.108.0/22 +103.45.112.0/22 +103.45.116.0/22 +103.45.120.0/22 +103.45.124.0/22 +103.45.128.0/22 +103.45.132.0/22 +103.45.136.0/22 +103.45.140.0/22 +103.45.144.0/22 +103.45.148.0/22 +103.45.152.0/22 +103.45.156.0/22 +103.45.160.0/22 +103.45.164.0/22 +103.45.168.0/22 +103.45.172.0/22 +103.45.176.0/22 +103.45.180.0/22 +103.45.184.0/22 +103.45.188.0/22 +103.45.192.0/22 +103.45.196.0/22 +103.45.200.0/22 +103.45.204.0/22 +103.45.208.0/22 +103.45.212.0/22 +103.45.216.0/22 +103.45.220.0/22 +103.45.224.0/22 +103.45.248.0/22 +103.46.0.0/22 +103.46.12.0/22 +103.46.16.0/22 +103.46.20.0/22 +103.46.24.0/22 +103.46.28.0/22 +103.46.32.0/22 +103.46.36.0/22 +103.46.40.0/22 +103.46.44.0/22 +103.46.48.0/22 +103.46.52.0/22 +103.46.56.0/22 +103.46.60.0/22 +103.46.64.0/22 +103.46.68.0/22 +103.46.72.0/22 +103.46.76.0/22 +103.46.80.0/22 +103.46.84.0/22 +103.46.88.0/22 +103.46.92.0/22 +103.46.96.0/22 +103.46.100.0/22 +103.46.104.0/22 +103.46.108.0/22 +103.46.112.0/22 +103.46.116.0/22 +103.46.120.0/22 +103.46.124.0/22 +103.46.128.0/22 +103.46.132.0/22 +103.46.136.0/22 +103.46.152.0/22 +103.46.156.0/22 +103.46.160.0/22 +103.46.164.0/22 +103.46.168.0/22 +103.46.172.0/22 +103.46.176.0/22 +103.46.180.0/22 +103.46.244.0/22 +103.46.248.0/22 +103.47.4.0/22 +103.47.20.0/22 +103.47.36.0/22 +103.47.40.0/22 +103.47.48.0/22 +103.47.80.0/22 +103.47.96.0/22 +103.47.108.0/22 +103.47.116.0/22 +103.47.120.0/22 +103.47.136.0/22 +103.47.140.0/22 +103.47.212.0/22 +103.48.52.0/22 +103.48.92.0/22 +103.48.148.0/22 +103.48.152.0/22 +103.48.156.0/22 +103.48.202.0/23 +103.48.216.0/22 +103.48.220.0/22 +103.48.224.0/22 +103.48.228.0/22 +103.48.232.0/22 +103.48.236.0/22 +103.48.240.0/22 +103.48.244.0/22 +103.49.12.0/22 +103.49.20.0/22 +103.49.72.0/22 +103.49.76.0/22 +103.49.96.0/22 +103.49.108.0/22 +103.49.128.0/22 +103.49.176.0/22 +103.49.180.0/22 +103.49.196.0/22 +103.50.36.0/22 +103.50.44.0/22 +103.50.48.0/22 +103.50.52.0/22 +103.50.56.0/22 +103.50.60.0/22 +103.50.64.0/22 +103.50.68.0/22 +103.50.72.0/22 +103.50.108.0/22 +103.50.112.0/22 +103.50.116.0/22 +103.50.120.0/22 +103.50.124.0/22 +103.50.132.0/22 +103.50.136.0/22 +103.50.140.0/22 +103.50.172.0/22 +103.50.176.0/22 +103.50.180.0/22 +103.50.184.0/22 +103.50.188.0/22 +103.50.192.0/22 +103.50.196.0/22 +103.50.200.0/22 +103.50.220.0/22 +103.50.224.0/22 +103.50.228.0/22 +103.50.232.0/22 +103.50.236.0/22 +103.50.240.0/22 +103.50.244.0/22 +103.50.248.0/22 +103.52.40.0/22 +103.52.72.0/22 +103.52.76.0/22 +103.52.80.0/22 +103.52.84.0/22 +103.52.96.0/22 +103.52.100.0/22 +103.52.104.0/22 +103.52.160.0/22 +103.52.164.0/22 +103.52.172.0/22 +103.52.176.0/22 +103.52.184.0/22 +103.52.196.0/22 +103.53.64.0/22 +103.53.68.0/22 +103.53.92.0/22 +103.53.100.0/22 +103.53.124.0/22 +103.53.128.0/22 +103.53.132.0/22 +103.53.136.0/22 +103.53.140.0/22 +103.53.144.0/22 +103.53.180.0/22 +103.53.204.0/22 +103.53.208.0/22 +103.53.212.0/22 +103.53.236.0/22 +103.53.248.0/22 +103.54.8.0/22 +103.54.48.0/22 +103.54.160.0/22 +103.54.164.0/22 +103.54.212.0/22 +103.54.240.0/22 +103.55.80.0/22 +103.55.120.0/22 +103.55.152.0/22 +103.55.172.0/22 +103.55.204.0/22 +103.55.208.0/22 +103.55.228.0/22 +103.55.236.0/22 +103.56.8.0/22 +103.56.16.0/22 +103.56.20.0/22 +103.56.32.0/22 +103.56.56.0/22 +103.56.60.0/22 +103.56.72.0/22 +103.56.76.0/22 +103.56.94.0/23 +103.56.100.0/22 +103.56.104.0/22 +103.56.140.0/22 +103.56.152.0/22 +103.56.184.0/22 +103.56.200.0/22 +103.57.12.0/22 +103.57.52.0/22 +103.57.56.0/22 +103.57.76.0/22 +103.57.136.0/22 +103.57.196.0/22 +103.58.24.0/22 +103.59.76.0/22 +103.59.100.0/22 +103.59.112.0/22 +103.59.116.0/22 +103.59.120.0/22 +103.59.124.0/22 +103.59.128.0/22 +103.59.148.0/22 +103.59.164.0/22 +103.59.168.0/23 +103.60.32.0/22 +103.60.44.0/22 +103.60.164.0/22 +103.60.228.0/22 +103.60.236.0/22 +103.61.60.0/22 +103.61.104.0/22 +103.61.140.0/22 +103.61.152.0/22 +103.61.156.0/22 +103.61.160.0/22 +103.61.172.0/22 +103.61.176.0/22 +103.61.188.0/22 +103.62.24.0/22 +103.62.52.0/22 +103.62.72.0/22 +103.62.76.0/22 +103.62.80.0/22 +103.62.84.0/22 +103.62.88.0/22 +103.62.96.0/22 +103.62.100.0/22 +103.62.104.0/22 +103.62.108.0/22 +103.62.112.0/22 +103.62.116.0/22 +103.62.120.0/22 +103.62.124.0/22 +103.62.128.0/22 +103.62.132.0/22 +103.62.156.0/22 +103.62.160.0/22 +103.62.164.0/22 +103.62.168.0/22 +103.62.172.0/22 +103.62.176.0/22 +103.62.180.0/22 +103.62.184.0/22 +103.62.188.0/22 +103.62.192.0/22 +103.62.204.0/22 +103.62.208.0/22 +103.62.212.0/22 +103.62.216.0/22 +103.62.220.0/22 +103.62.224.0/22 +103.63.32.0/22 +103.63.36.0/22 +103.63.40.0/22 +103.63.44.0/22 +103.63.48.0/22 +103.63.52.0/22 +103.63.56.0/22 +103.63.60.0/22 +103.63.64.0/22 +103.63.68.0/22 +103.63.72.0/22 +103.63.76.0/22 +103.63.80.0/22 +103.63.84.0/22 +103.63.88.0/22 +103.63.140.0/22 +103.63.144.0/22 +103.63.152.0/22 +103.63.160.0/22 +103.63.164.0/22 +103.63.168.0/22 +103.63.172.0/22 +103.63.176.0/22 +103.63.180.0/22 +103.63.184.0/22 +103.63.192.0/22 +103.63.196.0/22 +103.63.200.0/22 +103.63.204.0/22 +103.63.208.0/22 +103.63.240.0/22 +103.63.244.0/22 +103.63.248.0/22 +103.63.252.0/22 +103.64.0.0/22 +103.64.4.0/22 +103.64.24.0/22 +103.64.28.0/22 +103.64.32.0/22 +103.64.36.0/22 +103.64.40.0/22 +103.64.44.0/22 +103.64.48.0/22 +103.64.52.0/22 +103.64.56.0/22 +103.64.60.0/22 +103.64.64.0/22 +103.64.68.0/22 +103.64.72.0/22 +103.64.76.0/22 +103.64.80.0/22 +103.64.84.0/22 +103.64.88.0/22 +103.64.92.0/22 +103.64.96.0/22 +103.64.100.0/22 +103.64.104.0/22 +103.64.108.0/22 +103.64.112.0/22 +103.64.116.0/22 +103.64.120.0/22 +103.64.124.0/22 +103.64.140.0/22 +103.64.144.0/22 +103.64.152.0/22 +103.64.156.0/22 +103.64.160.0/22 +103.64.164.0/22 +103.64.168.0/22 +103.64.172.0/22 +103.64.176.0/22 +103.64.180.0/22 +103.64.184.0/22 +103.64.188.0/22 +103.64.192.0/22 +103.64.196.0/22 +103.64.200.0/22 +103.64.204.0/22 +103.64.208.0/22 +103.64.212.0/22 +103.64.216.0/22 +103.64.220.0/22 +103.64.224.0/22 +103.64.228.0/22 +103.64.232.0/22 +103.64.236.0/22 +103.64.240.0/22 +103.64.244.0/22 +103.64.248.0/22 +103.64.252.0/22 +103.65.0.0/22 +103.65.4.0/22 +103.65.8.0/22 +103.65.12.0/22 +103.65.16.0/22 +103.65.36.0/22 +103.65.40.0/22 +103.65.48.0/22 +103.65.52.0/22 +103.65.56.0/22 +103.65.60.0/22 +103.65.64.0/22 +103.65.68.0/22 +103.65.72.0/22 +103.65.76.0/22 +103.65.80.0/22 +103.65.84.0/22 +103.65.88.0/22 +103.65.92.0/22 +103.65.100.0/22 +103.65.104.0/22 +103.65.108.0/22 +103.65.112.0/22 +103.65.144.0/22 +103.65.148.0/22 +103.65.152.0/22 +103.65.156.0/22 +103.65.160.0/22 +103.65.164.0/22 +103.65.168.0/22 +103.65.172.0/22 +103.65.204.0/23 +103.65.206.0/23 +103.65.224.0/23 +103.66.32.0/22 +103.66.40.0/22 +103.66.92.0/22 +103.66.108.0/22 +103.66.200.0/22 +103.66.216.0/22 +103.66.240.0/22 +103.66.244.0/22 +103.66.248.0/22 +103.66.252.0/22 +103.67.0.0/22 +103.67.4.0/22 +103.67.8.0/22 +103.67.100.0/22 +103.67.104.0/22 +103.67.108.0/22 +103.67.112.0/22 +103.67.116.0/22 +103.67.120.0/22 +103.67.124.0/22 +103.67.128.0/22 +103.67.132.0/22 +103.67.136.0/22 +103.67.140.0/22 +103.67.144.0/22 +103.67.148.0/22 +103.67.172.0/22 +103.67.192.0/22 +103.67.212.0/22 +103.67.252.0/22 +103.68.64.0/22 +103.68.88.0/22 +103.68.100.0/22 +103.68.128.0/22 +103.68.192.0/22 +103.69.16.0/22 +103.69.62.0/23 +103.69.116.0/22 +103.69.132.0/22 +103.69.152.0/22 +103.70.8.0/22 +103.70.14.0/23 +103.70.148.0/22 +103.70.220.0/22 +103.70.224.0/22 +103.70.236.0/22 +103.70.252.0/22 +103.71.0.0/22 +103.71.48.0/22 +103.71.68.0/22 +103.71.72.0/22 +103.71.80.0/22 +103.71.84.0/22 +103.71.88.0/22 +103.71.120.0/22 +103.71.124.0/22 +103.71.128.0/22 +103.71.144.0/22 +103.71.196.0/22 +103.71.200.0/22 +103.71.232.0/22 +103.72.12.0/22 +103.72.16.0/22 +103.72.20.0/22 +103.72.24.0/22 +103.72.28.0/22 +103.72.32.0/22 +103.72.36.0/22 +103.72.40.0/22 +103.72.44.0/22 +103.72.48.0/22 +103.72.52.0/22 +103.72.112.0/22 +103.72.116.0/22 +103.72.120.0/22 +103.72.124.0/22 +103.72.128.0/22 +103.72.132.0/22 +103.72.148.0/22 +103.72.172.0/22 +103.72.180.0/22 +103.72.224.0/22 +103.72.228.0/22 +103.72.232.0/22 +103.72.236.0/22 +103.72.240.0/22 +103.72.244.0/22 +103.72.248.0/22 +103.72.252.0/22 +103.73.0.0/22 +103.73.4.0/22 +103.73.8.0/22 +103.73.12.0/22 +103.73.16.0/22 +103.73.20.0/22 +103.73.24.0/22 +103.73.28.0/22 +103.73.48.0/22 +103.73.116.0/22 +103.73.120.0/22 +103.73.128.0/22 +103.73.132.0/22 +103.73.136.0/22 +103.73.140.0/22 +103.73.144.0/22 +103.73.168.0/22 +103.73.176.0/22 +103.73.204.0/22 +103.73.208.0/22 +103.73.240.0/22 +103.73.244.0/22 +103.73.248.0/22 +103.74.24.0/22 +103.74.28.0/22 +103.74.32.0/22 +103.74.36.0/22 +103.74.40.0/22 +103.74.44.0/22 +103.74.48.0/22 +103.74.56.0/22 +103.74.60.0/22 +103.74.80.0/22 +103.74.124.0/22 +103.74.148.0/22 +103.74.152.0/22 +103.74.156.0/22 +103.74.204.0/22 +103.74.232.0/22 +103.75.88.0/22 +103.75.92.0/22 +103.75.104.0/22 +103.75.108.0/22 +103.75.112.0/22 +103.75.120.0/22 +103.75.128.0/22 +103.75.144.0/22 +103.75.152.0/22 +103.75.236.0/24 +103.76.60.0/22 +103.76.64.0/22 +103.76.68.0/22 +103.76.72.0/22 +103.76.92.0/22 +103.76.216.0/22 +103.76.220.0/22 +103.76.224.0/22 +103.77.28.0/22 +103.77.52.0/22 +103.77.56.0/22 +103.77.72.0/22 +103.77.88.0/22 +103.77.92.0/22 +103.77.132.0/22 +103.77.148.0/22 +103.77.220.0/22 +103.78.56.0/22 +103.78.60.0/22 +103.78.64.0/22 +103.78.68.0/22 +103.78.124.0/22 +103.78.172.0/22 +103.78.176.0/22 +103.78.196.0/22 +103.78.228.0/22 +103.79.24.0/22 +103.79.28.0/22 +103.79.36.0/22 +103.79.40.0/22 +103.79.44.0/22 +103.79.52.0/22 +103.79.56.0/22 +103.79.60.0/22 +103.79.64.0/22 +103.79.68.0/22 +103.79.80.0/22 +103.79.84.0/22 +103.79.120.0/22 +103.79.136.0/22 +103.79.188.0/22 +103.79.192.0/22 +103.79.196.0/22 +103.79.200.0/22 +103.79.204.0/22 +103.79.208.0/22 +103.79.212.0/22 +103.79.228.0/23 +103.79.240.0/22 +103.80.28.0/22 +103.80.44.0/22 +103.80.72.0/22 +103.80.176.0/22 +103.80.180.0/22 +103.80.184.0/22 +103.80.192.0/22 +103.80.200.0/22 +103.80.232.0/22 +103.81.4.0/22 +103.81.8.0/22 +103.81.16.0/22 +103.81.20.0/22 +103.81.44.0/22 +103.81.48.0/22 +103.81.96.0/22 +103.81.120.0/22 +103.81.148.0/22 +103.81.164.0/22 +103.81.168.0/22 +103.81.183.0/24 +103.81.184.0/22 +103.81.200.0/22 +103.81.232.0/22 +103.82.52.0/22 +103.82.60.0/22 +103.82.68.0/22 +103.82.84.0/22 +103.82.104.0/22 +103.82.224.0/22 +103.82.236.0/22 +103.83.44.0/22 +103.83.52.0/22 +103.83.60.0/22 +103.83.64.0/22 +103.83.72.0/22 +103.83.112.0/22 +103.83.120.0/22 +103.83.180.0/22 +103.84.0.0/22 +103.84.12.0/22 +103.84.16.0/22 +103.84.20.0/22 +103.84.24.0/22 +103.84.28.0/22 +103.84.48.0/22 +103.84.64.0/22 +103.84.72.0/22 +103.84.136.0/22 +103.85.20.0/22 +103.85.24.0/22 +103.85.44.0/22 +103.85.48.0/22 +103.85.84.0/22 +103.85.136.0/22 +103.85.144.0/22 +103.85.164.0/22 +103.85.168.0/22 +103.85.172.0/22 +103.85.176.0/22 +103.85.224.0/22 +103.86.28.0/22 +103.86.32.0/22 +103.86.60.0/22 +103.86.80.0/22 +103.86.84.0/22 +103.86.204.0/22 +103.86.208.0/22 +103.86.212.0/22 +103.86.216.0/22 +103.86.220.0/22 +103.86.224.0/22 +103.86.228.0/22 +103.86.232.0/22 +103.86.236.0/22 +103.86.240.0/22 +103.86.244.0/22 +103.86.248.0/22 +103.86.252.0/22 +103.87.0.0/22 +103.87.4.0/22 +103.87.20.0/22 +103.87.32.0/22 +103.87.72.0/22 +103.87.96.0/22 +103.87.132.0/22 +103.87.180.0/22 +103.87.224.0/22 +103.88.4.0/22 +103.88.8.0/22 +103.88.12.0/22 +103.88.16.0/22 +103.88.20.0/22 +103.88.32.0/22 +103.88.36.0/22 +103.88.60.0/22 +103.88.64.0/22 +103.88.72.0/22 +103.88.96.0/22 +103.88.164.0/22 +103.88.176.0/22 +103.88.188.0/22 +103.88.212.0/22 +103.89.28.0/22 +103.89.96.0/22 +103.89.100.0/22 +103.89.104.0/22 +103.89.108.0/22 +103.89.112.0/22 +103.89.116.0/22 +103.89.148.0/22 +103.89.172.0/22 +103.89.184.0/22 +103.89.188.0/22 +103.89.192.0/22 +103.89.196.0/22 +103.89.200.0/22 +103.89.204.0/22 +103.89.208.0/22 +103.89.212.0/22 +103.89.216.0/22 +103.89.220.0/22 +103.89.224.0/22 +103.89.228.0/22 +103.90.52.0/22 +103.90.92.0/22 +103.90.100.0/22 +103.90.104.0/22 +103.90.108.0/22 +103.90.112.0/22 +103.90.116.0/22 +103.90.120.0/22 +103.90.124.0/22 +103.90.128.0/22 +103.90.132.0/22 +103.90.152.0/22 +103.90.168.0/22 +103.90.173.0/24 +103.90.176.0/22 +103.90.188.0/22 +103.90.192.0/22 +103.91.36.0/22 +103.91.40.0/22 +103.91.108.0/22 +103.91.112.0/23 +103.91.138.0/23 +103.91.152.0/22 +103.91.176.0/22 +103.91.200.0/22 +103.91.208.0/22 +103.91.212.0/22 +103.91.236.0/22 +103.91.252.0/22 +103.92.0.0/22 +103.92.4.0/22 +103.92.8.0/22 +103.92.12.0/22 +103.92.48.0/22 +103.92.52.0/22 +103.92.56.0/22 +103.92.60.0/22 +103.92.64.0/22 +103.92.68.0/22 +103.92.72.0/22 +103.92.76.0/22 +103.92.80.0/22 +103.92.86.0/24 +103.92.88.0/22 +103.92.108.0/22 +103.92.124.0/22 +103.92.128.0/24 +103.92.132.0/22 +103.92.156.0/22 +103.92.164.0/22 +103.92.168.0/22 +103.92.172.0/22 +103.92.176.0/22 +103.92.180.0/22 +103.92.184.0/22 +103.92.188.0/22 +103.92.192.0/22 +103.92.236.0/22 +103.92.240.0/22 +103.92.244.0/22 +103.92.248.0/22 +103.92.252.0/22 +103.93.0.0/22 +103.93.4.0/22 +103.93.28.0/22 +103.93.76.0/22 +103.93.84.0/22 +103.93.152.0/22 +103.93.180.0/22 +103.93.204.0/22 +103.94.12.0/22 +103.94.20.0/22 +103.94.28.0/22 +103.94.32.0/22 +103.94.36.0/22 +103.94.40.0/22 +103.94.44.0/22 +103.94.72.0/22 +103.94.88.0/22 +103.94.116.0/22 +103.94.160.0/22 +103.94.200.0/22 +103.95.52.0/22 +103.95.64.0/22 +103.95.68.0/22 +103.95.88.0/22 +103.95.92.0/22 +103.95.128.0/22 +103.95.136.0/22 +103.95.140.0/22 +103.95.144.0/22 +103.95.152.0/22 +103.95.216.0/22 +103.95.220.0/22 +103.95.224.0/22 +103.95.236.0/22 +103.95.240.0/22 +103.95.244.0/22 +103.95.248.0/22 +103.95.252.0/22 +103.96.0.0/22 +103.96.8.0/22 +103.96.80.0/22 +103.96.124.0/22 +103.96.136.0/22 +103.96.140.0/24 +103.96.152.0/22 +103.96.156.0/22 +103.96.160.0/22 +103.96.164.0/22 +103.96.168.0/22 +103.96.172.0/22 +103.96.176.0/22 +103.96.180.0/22 +103.96.184.0/22 +103.96.188.0/22 +103.96.192.0/22 +103.96.196.0/22 +103.96.200.0/22 +103.96.204.0/22 +103.96.208.0/22 +103.96.212.0/22 +103.96.216.0/22 +103.97.8.0/22 +103.97.12.0/22 +103.97.16.0/22 +103.97.20.0/22 +103.97.24.0/22 +103.97.28.0/22 +103.97.32.0/22 +103.97.36.0/22 +103.97.40.0/22 +103.97.56.0/22 +103.97.60.0/22 +103.97.64.0/22 +103.97.68.0/22 +103.97.72.0/22 +103.97.80.0/22 +103.97.112.0/22 +103.97.116.0/22 +103.97.128.0/22 +103.97.144.0/22 +103.97.148.0/22 +103.97.188.0/22 +103.97.192.0/22 +103.97.228.0/23 +103.98.28.0/23 +103.98.40.0/22 +103.98.44.0/22 +103.98.48.0/22 +103.98.56.0/22 +103.98.80.0/22 +103.98.88.0/22 +103.98.92.0/22 +103.98.96.0/22 +103.98.100.0/22 +103.98.124.0/22 +103.98.136.0/22 +103.98.140.0/22 +103.98.144.0/22 +103.98.164.0/22 +103.98.168.0/22 +103.98.180.0/22 +103.98.196.0/22 +103.98.216.0/22 +103.98.220.0/22 +103.98.224.0/22 +103.98.228.0/22 +103.98.232.0/22 +103.98.240.0/22 +103.98.244.0/22 +103.98.248.0/22 +103.98.252.0/22 +103.99.40.0/23 +103.99.52.0/22 +103.99.56.0/22 +103.99.60.0/22 +103.99.76.0/22 +103.99.104.0/22 +103.99.116.0/22 +103.99.120.0/22 +103.99.152.0/22 +103.99.220.0/22 +103.99.232.0/22 +103.99.236.0/22 +103.100.0.0/22 +103.100.32.0/22 +103.100.40.0/22 +103.100.48.0/22 +103.100.52.0/22 +103.100.56.0/22 +103.100.60.0/22 +103.100.64.0/22 +103.100.68.0/22 +103.100.88.0/22 +103.100.116.0/22 +103.100.144.0/22 +103.100.236.0/22 +103.100.240.0/22 +103.100.248.0/22 +103.100.252.0/22 +103.101.4.0/22 +103.101.8.0/22 +103.101.12.0/22 +103.101.28.0/22 +103.101.60.0/22 +103.101.120.0/22 +103.101.124.0/22 +103.101.144.0/22 +103.101.148.0/22 +103.101.180.0/22 +103.101.184.0/22 +103.102.76.0/22 +103.102.80.0/22 +103.102.168.0/22 +103.102.172.0/22 +103.102.180.0/22 +103.102.184.0/22 +103.102.188.0/22 +103.102.192.0/22 +103.102.196.0/22 +103.102.200.0/22 +103.102.208.0/22 +103.102.212.0/22 +103.103.12.0/22 +103.103.16.0/22 +103.103.36.0/22 +103.103.68.0/22 +103.103.72.0/22 +103.103.176.0/22 +103.103.188.0/22 +103.103.200.0/22 +103.103.204.0/22 +103.103.220.0/22 +103.103.224.0/22 +103.103.228.0/22 +103.103.232.0/22 +103.103.248.0/22 +103.103.252.0/22 +103.104.0.0/22 +103.104.4.0/22 +103.104.36.0/22 +103.104.40.0/22 +103.104.64.0/22 +103.104.104.0/22 +103.104.152.0/22 +103.104.168.0/22 +103.104.172.0/22 +103.104.188.0/22 +103.104.198.0/23 +103.104.252.0/22 +103.105.0.0/22 +103.105.4.0/22 +103.105.12.0/22 +103.105.16.0/22 +103.105.23.0/24 +103.105.60.0/22 +103.105.116.0/22 +103.105.132.0/22 +103.105.180.0/22 +103.105.184.0/22 +103.105.200.0/22 +103.105.204.0/22 +103.105.220.0/22 +103.106.36.0/22 +103.106.40.0/22 +103.106.44.0/22 +103.106.60.0/22 +103.106.68.0/22 +103.106.96.0/22 +103.106.120.0/22 +103.106.128.0/22 +103.106.132.0/22 +103.106.160.0/22 +103.106.196.0/22 +103.106.202.0/23 +103.106.212.0/22 +103.106.244.0/22 +103.106.252.0/22 +103.107.0.0/22 +103.107.28.0/22 +103.107.32.0/22 +103.107.44.0/22 +103.107.72.0/22 +103.107.108.0/22 +103.107.164.0/22 +103.107.168.0/22 +103.107.188.0/22 +103.107.192.0/22 +103.107.208.0/22 +103.107.212.0/22 +103.107.216.0/22 +103.107.220.0/22 +103.108.52.0/22 +103.108.160.0/22 +103.108.164.0/22 +103.108.184.0/23 +103.108.188.0/23 +103.108.192.0/22 +103.108.196.0/22 +103.108.208.0/22 +103.108.212.0/22 +103.108.224.0/22 +103.108.244.0/22 +103.109.20.0/22 +103.109.48.0/22 +103.109.88.0/22 +103.109.106.0/23 +103.109.248.0/22 +103.110.80.0/23 +103.110.92.0/22 +103.110.116.0/22 +103.110.132.0/22 +103.110.136.0/22 +103.110.152.0/22 +103.110.156.0/22 +103.110.188.0/22 +103.110.204.0/22 +103.111.64.0/22 +103.111.172.0/22 +103.111.252.0/22 +103.112.28.0/22 +103.112.68.0/22 +103.112.72.0/22 +103.112.88.0/22 +103.112.92.0/22 +103.112.96.0/22 +103.112.108.0/22 +103.112.112.0/22 +103.112.116.0/22 +103.112.140.0/22 +103.112.172.0/22 +103.112.184.0/22 +103.113.4.0/22 +103.113.92.0/22 +103.113.144.0/22 +103.113.220.0/22 +103.113.232.0/22 +103.113.236.0/22 +103.114.4.0/22 +103.114.28.0/22 +103.114.68.0/22 +103.114.72.0/22 +103.114.100.0/22 +103.114.132.0/22 +103.114.148.0/22 +103.114.156.0/22 +103.114.176.0/22 +103.114.212.0/22 +103.114.236.0/22 +103.114.240.0/22 +103.115.16.0/22 +103.115.40.0/22 +103.115.44.0/22 +103.115.48.0/22 +103.115.52.0/22 +103.115.56.0/22 +103.115.60.0/22 +103.115.64.0/22 +103.115.68.0/22 +103.115.92.0/22 +103.115.120.0/22 +103.115.148.0/22 +103.115.204.0/23 +103.115.248.0/22 +103.116.20.0/22 +103.116.40.0/22 +103.116.64.0/22 +103.116.72.0/22 +103.116.76.0/22 +103.116.92.0/22 +103.116.120.0/22 +103.116.128.0/22 +103.116.132.0/23 +103.116.148.0/22 +103.116.184.0/22 +103.116.206.0/23 +103.116.220.0/22 +103.116.224.0/22 +103.116.228.0/22 +103.117.16.0/22 +103.117.72.0/22 +103.117.88.0/22 +103.117.136.0/22 +103.117.188.0/22 +103.117.220.0/22 +103.118.36.0/22 +103.118.52.0/22 +103.118.56.0/22 +103.118.60.0/22 +103.118.64.0/22 +103.118.68.0/22 +103.118.72.0/22 +103.118.88.0/22 +103.118.173.0/24 +103.118.192.0/22 +103.118.196.0/22 +103.118.200.0/22 +103.118.204.0/22 +103.118.208.0/22 +103.118.212.0/22 +103.118.216.0/22 +103.118.220.0/22 +103.118.240.0/22 +103.118.244.0/22 +103.118.248.0/22 +103.118.252.0/22 +103.119.0.0/22 +103.119.12.0/22 +103.119.16.0/22 +103.119.28.0/22 +103.119.44.0/22 +103.119.104.0/22 +103.119.115.0/24 +103.119.156.0/22 +103.119.180.0/22 +103.119.200.0/22 +103.119.224.0/22 +103.120.52.0/22 +103.120.72.0/22 +103.120.88.0/22 +103.120.96.0/22 +103.120.100.0/22 +103.120.140.0/22 +103.120.196.0/22 +103.120.224.0/22 +103.121.52.0/22 +103.121.92.0/22 +103.121.160.0/22 +103.121.164.0/22 +103.121.250.0/24 +103.121.252.0/22 +103.122.48.0/22 +103.122.176.0/22 +103.122.192.0/22 +103.122.240.0/22 +103.123.4.0/22 +103.123.56.0/22 +103.123.88.0/22 +103.123.92.0/22 +103.123.116.0/22 +103.123.160.0/22 +103.123.176.0/22 +103.123.200.0/22 +103.123.204.0/22 +103.123.208.0/22 +103.123.212.0/22 +103.124.24.0/22 +103.124.48.0/22 +103.124.64.0/22 +103.124.212.0/22 +103.124.216.0/22 +103.125.20.0/22 +103.125.44.0/22 +103.125.132.0/22 +103.125.164.0/22 +103.125.196.0/22 +103.125.236.0/22 +103.125.248.0/22 +103.126.0.0/22 +103.126.16.0/22 +103.126.44.0/22 +103.126.100.0/22 +103.126.124.0/22 +103.126.128.0/22 +103.126.132.0/22 +103.126.208.0/22 +103.129.52.0/22 +103.130.132.0/22 +103.130.152.0/24 +103.130.160.0/22 +103.130.228.0/22 +103.131.20.0/22 +103.131.36.0/22 +103.131.152.0/22 +103.131.168.0/22 +103.131.176.0/22 +103.131.224.0/22 +103.131.228.0/22 +103.131.240.0/22 +103.132.60.0/22 +103.132.64.0/22 +103.132.68.0/22 +103.132.72.0/22 +103.132.76.0/22 +103.132.80.0/22 +103.132.104.0/22 +103.132.108.0/22 +103.132.112.0/22 +103.132.116.0/22 +103.132.120.0/22 +103.132.160.0/22 +103.132.164.0/22 +103.132.188.0/22 +103.132.208.0/22 +103.132.212.0/22 +103.132.234.0/23 +103.133.12.0/22 +103.133.40.0/22 +103.133.128.0/22 +103.133.136.0/22 +103.133.176.0/22 +103.133.232.0/22 +103.134.12.0/24 +103.134.196.0/22 +103.135.80.0/22 +103.135.124.0/22 +103.135.148.0/22 +103.135.156.0/22 +103.135.160.0/22 +103.135.164.0/22 +103.135.176.0/22 +103.135.184.0/22 +103.135.192.0/22 +103.135.196.0/22 +103.135.236.0/22 +103.136.128.0/22 +103.136.232.0/22 +103.137.58.0/23 +103.137.60.0/24 +103.137.76.0/22 +103.137.136.0/23 +103.137.149.0/24 +103.137.180.0/22 +103.137.236.0/22 +103.138.2.0/23 +103.138.12.0/23 +103.138.80.0/22 +103.138.134.0/23 +103.138.156.0/23 +103.138.208.0/23 +103.138.220.0/23 +103.138.246.0/23 +103.138.248.0/23 +103.139.0.0/23 +103.139.2.0/23 +103.139.22.0/23 +103.139.92.0/23 +103.139.113.0/24 +103.139.134.0/23 +103.139.136.0/23 +103.139.172.0/23 +103.139.204.0/23 +103.139.212.0/23 +103.140.8.0/23 +103.140.14.0/23 +103.140.70.0/23 +103.140.126.0/23 +103.140.140.0/23 +103.140.144.0/23 +103.140.152.0/23 +103.140.192.0/23 +103.140.228.0/23 +103.141.10.0/23 +103.141.58.0/23 +103.141.128.0/23 +103.141.186.0/23 +103.141.242.0/23 +103.142.28.0/23 +103.142.58.0/23 +103.142.82.0/23 +103.142.96.0/23 +103.142.102.0/23 +103.142.122.0/23 +103.142.128.0/23 +103.142.140.0/23 +103.142.154.0/23 +103.142.156.0/23 +103.142.172.0/23 +103.142.180.0/23 +103.142.186.0/23 +103.142.190.0/23 +103.142.220.0/23 +103.142.230.0/24 +103.142.234.0/23 +103.142.238.0/23 +103.142.248.0/23 +103.143.16.0/23 +103.143.18.0/23 +103.143.31.0/24 +103.143.74.0/23 +103.143.120.0/23 +103.143.124.0/23 +103.143.132.0/23 +103.143.134.0/23 +103.143.174.0/23 +103.143.228.0/23 +103.144.40.0/23 +103.144.52.0/23 +103.144.66.0/23 +103.144.70.0/23 +103.144.72.0/23 +103.144.108.0/23 +103.144.136.0/23 +103.144.148.0/23 +103.144.158.0/23 +103.144.240.0/23 +103.145.38.0/23 +103.145.40.0/23 +103.145.42.0/23 +103.145.60.0/23 +103.145.72.0/23 +103.145.80.0/23 +103.145.86.0/23 +103.145.92.0/23 +103.145.94.0/23 +103.145.98.0/23 +103.145.106.0/23 +103.145.122.0/23 +103.145.188.0/23 +103.145.190.0/23 +103.146.72.0/23 +103.146.88.0/23 +103.146.90.0/23 +103.146.124.0/23 +103.146.126.0/23 +103.146.138.0/23 +103.146.230.0/23 +103.146.236.0/23 +103.146.252.0/23 +103.147.12.0/23 +103.147.124.0/23 +103.147.198.0/23 +103.147.206.0/23 +103.148.174.0/23 +103.149.6.0/23 +103.149.17.0/24 +103.149.44.0/23 +103.149.110.0/23 +103.149.132.0/23 +103.149.144.0/23 +103.149.156.0/23 +103.149.181.0/24 +103.149.210.0/23 +103.149.214.0/23 +103.149.220.0/23 +103.149.242.0/23 +103.149.244.0/23 +103.149.246.0/23 +103.149.248.0/23 +103.150.24.0/23 +103.150.66.0/23 +103.150.72.0/23 +103.150.122.0/23 +103.150.126.0/23 +103.150.128.0/23 +103.150.130.0/23 +103.150.146.0/23 +103.150.164.0/23 +103.150.172.0/23 +103.150.180.0/23 +103.150.200.0/23 +103.150.210.0/23 +103.150.214.0/23 +103.150.216.0/23 +103.150.244.0/23 +103.151.4.0/23 +103.151.44.0/23 +103.151.138.0/23 +103.151.142.0/23 +103.151.148.0/23 +103.151.150.0/23 +103.151.158.0/23 +103.151.178.0/23 +103.151.206.0/23 +103.151.216.0/23 +103.151.228.0/23 +103.152.14.0/23 +103.152.24.0/23 +103.152.28.0/23 +103.152.30.0/23 +103.152.56.0/23 +103.152.76.0/23 +103.152.98.0/23 +103.152.112.0/23 +103.152.120.0/23 +103.152.122.0/23 +103.152.132.0/23 +103.152.152.0/23 +103.152.168.0/23 +103.152.170.0/23 +103.152.186.0/23 +103.152.190.0/23 +103.152.192.0/23 +103.152.200.0/23 +103.152.208.0/23 +103.152.224.0/23 +103.152.226.0/23 +103.152.246.0/23 +103.152.250.0/23 +103.153.4.0/23 +103.153.36.0/23 +103.153.100.0/23 +103.153.114.0/23 +103.153.122.0/23 +103.153.128.0/23 +103.153.132.0/23 +103.153.138.0/23 +103.153.146.0/23 +103.153.160.0/23 +103.154.18.0/23 +103.154.30.0/23 +103.154.32.0/23 +103.154.40.0/23 +103.154.66.0/23 +103.154.162.0/23 +103.154.164.0/23 +103.154.168.0/23 +103.154.242.0/23 +103.155.14.0/23 +103.155.16.0/23 +103.155.34.0/23 +103.155.48.0/23 +103.155.76.0/23 +103.155.100.0/23 +103.155.110.0/23 +103.155.120.0/23 +103.155.214.0/23 +103.155.248.0/23 +103.156.28.0/23 +103.156.68.0/23 +103.156.78.0/23 +103.156.104.0/23 +103.156.158.0/23 +103.156.174.0/23 +103.156.186.0/23 +103.156.228.0/23 +103.157.30.0/23 +103.157.138.0/23 +103.157.174.0/23 +103.157.212.0/23 +103.157.234.0/23 +103.157.254.0/23 +103.158.0.0/23 +103.158.8.0/23 +103.158.16.0/23 +103.158.190.0/23 +103.158.200.0/23 +103.158.224.0/23 +103.159.80.0/23 +103.159.122.0/23 +103.159.124.0/23 +103.159.134.0/23 +103.159.142.0/23 +103.160.32.0/23 +103.160.34.0/23 +103.160.112.0/23 +103.160.114.0/23 +103.160.244.0/23 +103.160.254.0/23 +103.161.14.0/23 +103.161.102.0/23 +103.161.138.0/23 +103.161.208.0/23 +103.161.220.0/23 +103.161.254.0/23 +103.162.10.0/23 +103.162.32.0/23 +103.162.116.0/23 +103.163.28.0/23 +103.163.32.0/23 +103.163.46.0/23 +103.163.74.0/23 +103.163.180.0/23 +103.164.4.0/23 +103.164.32.0/23 +103.164.40.0/23 +103.164.42.0/23 +103.164.64.0/23 +103.164.76.0/23 +103.164.178.0/23 +103.165.44.0/23 +103.165.52.0/23 +103.165.82.0/23 +103.165.110.0/23 +103.166.20.0/23 +103.166.50.0/23 +103.166.52.0/23 +103.166.54.0/23 +103.166.84.0/23 +103.166.138.0/23 +103.166.242.0/23 +103.166.246.0/23 +103.167.0.0/23 +103.167.36.0/23 +103.168.98.0/23 +103.168.170.0/23 +103.169.50.0/23 +103.169.62.0/23 +103.169.108.0/23 +103.169.162.0/23 +103.169.202.0/23 +103.169.216.0/23 +103.170.4.0/23 +103.170.72.0/23 +103.170.134.0/23 +103.170.210.0/23 +103.170.212.0/23 +103.171.32.0/23 +103.171.166.0/23 +103.171.214.0/23 +103.172.32.0/23 +103.172.160.0/23 +103.172.191.0/24 +103.173.102.0/23 +103.173.182.0/23 +103.173.184.0/23 +103.174.94.0/23 +103.175.14.0/23 +103.175.98.0/23 +103.175.114.0/23 +103.175.118.0/23 +103.176.52.0/23 +103.176.222.0/23 +103.176.244.0/23 +103.177.28.0/23 +103.177.44.0/23 +103.177.70.0/23 +103.177.136.0/23 +103.177.162.0/23 +103.178.56.0/23 +103.178.240.0/23 +103.179.76.0/23 +103.179.78.0/23 +103.180.108.0/23 +103.180.226.0/23 +103.181.164.0/23 +103.181.234.0/23 +103.183.26.0/23 +103.183.66.0/23 +103.183.122.0/23 +103.183.124.0/23 +103.184.44.0/23 +103.184.46.0/23 +103.184.60.0/23 +103.185.78.0/23 +103.185.80.0/23 +103.185.228.0/23 +103.186.4.0/23 +103.186.108.0/23 +103.186.112.0/23 +103.186.136.0/23 +103.186.158.0/23 +103.186.162.0/23 +103.186.228.0/23 +103.189.92.0/23 +103.189.140.0/23 +103.189.152.0/23 +103.189.154.0/23 +103.190.20.0/23 +103.190.71.0/24 +103.190.104.0/23 +103.190.116.0/23 +103.190.118.0/23 +103.190.122.0/23 +103.191.102.0/23 +103.191.242.0/23 +103.192.0.0/22 +103.192.4.0/22 +103.192.8.0/22 +103.192.12.0/22 +103.192.16.0/22 +103.192.20.0/22 +103.192.24.0/22 +103.192.28.0/22 +103.192.48.0/22 +103.192.52.0/22 +103.192.56.0/22 +103.192.84.0/22 +103.192.88.0/22 +103.192.92.0/22 +103.192.96.0/22 +103.192.100.0/22 +103.192.104.0/22 +103.192.108.0/22 +103.192.112.0/22 +103.192.128.0/22 +103.192.132.0/22 +103.192.136.0/22 +103.192.140.0/22 +103.192.144.0/22 +103.192.164.0/22 +103.192.188.0/22 +103.192.208.0/22 +103.192.212.0/22 +103.192.216.0/22 +103.192.252.0/22 +103.193.40.0/22 +103.193.44.0/22 +103.193.120.0/22 +103.193.140.0/22 +103.193.160.0/22 +103.193.188.0/22 +103.193.192.0/22 +103.193.212.0/22 +103.193.216.0/22 +103.193.220.0/22 +103.193.224.0/22 +103.193.228.0/22 +103.193.232.0/22 +103.193.236.0/22 +103.194.16.0/22 +103.195.104.0/22 +103.195.112.0/22 +103.195.148.0/22 +103.195.152.0/22 +103.195.160.0/22 +103.196.64.0/22 +103.196.72.0/22 +103.196.88.0/22 +103.196.92.0/22 +103.196.96.0/22 +103.196.168.0/22 +103.196.204.0/22 +103.197.180.0/22 +103.197.228.0/22 +103.198.20.0/22 +103.198.60.0/22 +103.198.64.0/22 +103.198.72.0/22 +103.198.124.0/22 +103.198.156.0/22 +103.198.180.0/22 +103.198.196.0/22 +103.198.216.0/22 +103.198.220.0/22 +103.198.224.0/22 +103.198.228.0/22 +103.198.232.0/22 +103.198.236.0/22 +103.198.240.0/22 +103.198.244.0/22 +103.199.164.0/22 +103.199.196.0/22 +103.199.228.0/22 +103.199.248.0/22 +103.199.252.0/22 +103.200.52.0/22 +103.200.64.0/22 +103.200.68.0/22 +103.200.136.0/22 +103.200.140.0/22 +103.200.144.0/22 +103.200.148.0/22 +103.200.152.0/22 +103.200.156.0/22 +103.200.160.0/22 +103.200.164.0/22 +103.200.168.0/22 +103.200.172.0/22 +103.200.176.0/22 +103.200.180.0/22 +103.200.184.0/22 +103.200.188.0/22 +103.200.192.0/22 +103.200.220.0/22 +103.200.224.0/22 +103.200.228.0/22 +103.200.232.0/22 +103.200.236.0/22 +103.200.240.0/22 +103.200.244.0/22 +103.200.248.0/22 +103.200.252.0/22 +103.201.0.0/22 +103.201.4.0/22 +103.201.8.0/22 +103.201.12.0/22 +103.201.16.0/22 +103.201.20.0/22 +103.201.28.0/22 +103.201.32.0/22 +103.201.36.0/22 +103.201.40.0/22 +103.201.44.0/22 +103.201.48.0/22 +103.201.52.0/22 +103.201.56.0/22 +103.201.60.0/22 +103.201.64.0/22 +103.201.76.0/22 +103.201.80.0/22 +103.201.84.0/22 +103.201.88.0/22 +103.201.92.0/22 +103.201.96.0/22 +103.201.100.0/22 +103.201.104.0/22 +103.201.108.0/22 +103.201.112.0/22 +103.201.116.0/22 +103.201.120.0/22 +103.201.152.0/22 +103.201.156.0/22 +103.201.160.0/22 +103.201.164.0/22 +103.201.168.0/22 +103.201.172.0/22 +103.201.176.0/22 +103.201.180.0/22 +103.201.184.0/22 +103.201.188.0/22 +103.201.192.0/22 +103.201.196.0/22 +103.201.200.0/22 +103.201.204.0/22 +103.201.208.0/22 +103.201.212.0/22 +103.201.216.0/22 +103.201.220.0/22 +103.201.224.0/22 +103.201.228.0/22 +103.201.232.0/22 +103.201.236.0/22 +103.201.240.0/22 +103.201.244.0/22 +103.201.248.0/22 +103.201.252.0/22 +103.202.0.0/22 +103.202.4.0/22 +103.202.8.0/22 +103.202.12.0/22 +103.202.16.0/22 +103.202.20.0/22 +103.202.24.0/22 +103.202.28.0/22 +103.202.32.0/22 +103.202.36.0/22 +103.202.40.0/22 +103.202.44.0/22 +103.202.56.0/22 +103.202.60.0/22 +103.202.64.0/22 +103.202.68.0/22 +103.202.72.0/22 +103.202.76.0/22 +103.202.80.0/22 +103.202.84.0/22 +103.202.88.0/22 +103.202.92.0/22 +103.202.96.0/22 +103.202.100.0/22 +103.202.104.0/22 +103.202.108.0/22 +103.202.112.0/22 +103.202.116.0/22 +103.202.120.0/22 +103.202.124.0/22 +103.202.128.0/22 +103.202.132.0/22 +103.202.136.0/22 +103.202.140.0/22 +103.202.144.0/22 +103.202.152.0/22 +103.202.156.0/22 +103.202.160.0/22 +103.202.164.0/22 +103.202.168.0/22 +103.202.172.0/22 +103.202.176.0/22 +103.202.180.0/22 +103.202.184.0/22 +103.202.188.0/22 +103.202.192.0/22 +103.202.196.0/22 +103.202.200.0/21 +103.202.212.0/22 +103.202.228.0/22 +103.202.236.0/22 +103.202.240.0/22 +103.202.244.0/22 +103.202.248.0/22 +103.202.252.0/22 +103.203.0.0/22 +103.203.4.0/22 +103.203.8.0/22 +103.203.12.0/22 +103.203.16.0/22 +103.203.20.0/22 +103.203.24.0/22 +103.203.28.0/22 +103.203.32.0/22 +103.203.56.0/22 +103.203.96.0/22 +103.203.100.0/22 +103.203.104.0/22 +103.203.108.0/22 +103.203.112.0/22 +103.203.116.0/22 +103.203.120.0/22 +103.203.124.0/22 +103.203.128.0/22 +103.203.140.0/22 +103.203.164.0/22 +103.203.168.0/22 +103.203.192.0/22 +103.203.200.0/22 +103.203.212.0/22 +103.203.216.0/22 +103.204.24.0/22 +103.204.72.0/22 +103.204.88.0/22 +103.204.112.0/22 +103.204.136.0/22 +103.204.140.0/22 +103.204.144.0/22 +103.204.148.0/22 +103.204.152.0/22 +103.204.196.0/22 +103.204.216.0/23 +103.204.232.0/22 +103.204.236.0/22 +103.205.4.0/22 +103.205.8.0/22 +103.205.40.0/22 +103.205.44.0/22 +103.205.52.0/22 +103.205.108.0/22 +103.205.116.0/22 +103.205.120.0/22 +103.205.136.0/22 +103.205.162.0/24 +103.205.188.0/22 +103.205.192.0/22 +103.205.196.0/22 +103.205.200.0/22 +103.205.236.0/22 +103.205.248.0/22 +103.205.252.0/22 +103.206.0.0/22 +103.206.44.0/22 +103.206.148.0/22 +103.207.48.0/22 +103.207.104.0/22 +103.207.184.0/22 +103.207.188.0/22 +103.207.192.0/22 +103.207.196.0/22 +103.207.200.0/22 +103.207.204.0/22 +103.207.208.0/22 +103.207.212.0/22 +103.207.220.0/22 +103.207.228.0/22 +103.207.232.0/22 +103.208.12.0/22 +103.208.16.0/22 +103.208.28.0/22 +103.208.40.0/22 +103.208.44.0/22 +103.208.48.0/22 +103.209.112.0/22 +103.209.136.0/22 +103.209.200.0/22 +103.209.208.0/22 +103.209.216.0/22 +103.210.96.0/22 +103.210.156.0/22 +103.210.160.0/22 +103.210.164.0/22 +103.210.168.0/22 +103.210.172.0/22 +103.210.176.0/22 +103.210.180.0/22 +103.210.184.0/22 +103.210.188.0/22 +103.210.216.0/22 +103.211.44.0/22 +103.211.96.0/22 +103.211.100.0/22 +103.211.156.0/22 +103.211.164.0/22 +103.211.192.0/22 +103.211.220.0/22 +103.211.224.0/22 +103.211.248.0/22 +103.212.0.0/22 +103.212.4.0/22 +103.212.8.0/22 +103.212.12.0/22 +103.212.44.0/22 +103.212.48.0/22 +103.212.84.0/22 +103.212.100.0/22 +103.212.108.0/22 +103.212.148.0/22 +103.212.164.0/22 +103.212.196.0/22 +103.212.200.0/22 +103.212.228.0/22 +103.212.252.0/22 +103.213.40.0/22 +103.213.44.0/22 +103.213.48.0/22 +103.213.52.0/22 +103.213.56.0/22 +103.213.60.0/22 +103.213.64.0/22 +103.213.68.0/22 +103.213.72.0/22 +103.213.76.0/22 +103.213.80.0/22 +103.213.84.0/22 +103.213.88.0/22 +103.213.92.0/22 +103.213.96.0/22 +103.213.132.0/22 +103.213.136.0/22 +103.213.140.0/22 +103.213.144.0/22 +103.213.148.0/22 +103.213.152.0/22 +103.213.156.0/22 +103.213.160.0/22 +103.213.164.0/22 +103.213.168.0/22 +103.213.172.0/22 +103.213.176.0/22 +103.213.180.0/22 +103.213.184.0/22 +103.213.188.0/22 +103.214.48.0/22 +103.214.84.0/22 +103.214.212.0/22 +103.214.240.0/22 +103.214.244.0/22 +103.215.28.0/22 +103.215.32.0/22 +103.215.36.0/22 +103.215.44.0/22 +103.215.48.0/22 +103.215.100.0/22 +103.215.108.0/22 +103.215.116.0/22 +103.215.120.0/22 +103.215.140.0/22 +103.216.4.0/22 +103.216.8.0/22 +103.216.12.0/22 +103.216.16.0/22 +103.216.20.0/22 +103.216.24.0/22 +103.216.28.0/22 +103.216.32.0/22 +103.216.36.0/22 +103.216.40.0/22 +103.216.44.0/22 +103.216.64.0/22 +103.216.108.0/22 +103.216.136.0/22 +103.216.152.0/22 +103.216.224.0/22 +103.216.228.0/22 +103.216.240.0/22 +103.216.244.0/22 +103.216.248.0/22 +103.216.252.0/22 +103.217.0.0/22 +103.217.4.0/22 +103.217.8.0/22 +103.217.12.0/22 +103.217.16.0/22 +103.217.20.0/22 +103.217.24.0/22 +103.217.28.0/22 +103.217.32.0/22 +103.217.36.0/22 +103.217.40.0/22 +103.217.44.0/22 +103.217.48.0/22 +103.217.52.0/22 +103.217.56.0/22 +103.217.60.0/22 +103.217.168.0/22 +103.217.180.0/22 +103.217.184.0/22 +103.217.188.0/22 +103.217.192.0/22 +103.217.196.0/22 +103.217.200.0/22 +103.217.204.0/22 +103.218.8.0/22 +103.218.12.0/22 +103.218.16.0/22 +103.218.20.0/22 +103.218.28.0/22 +103.218.32.0/22 +103.218.36.0/22 +103.218.40.0/22 +103.218.44.0/22 +103.218.48.0/22 +103.218.52.0/22 +103.218.56.0/22 +103.218.60.0/22 +103.218.64.0/22 +103.218.68.0/22 +103.218.72.0/22 +103.218.76.0/22 +103.218.80.0/22 +103.218.84.0/22 +103.218.88.0/22 +103.218.92.0/22 +103.218.192.0/22 +103.218.196.0/22 +103.218.200.0/22 +103.218.204.0/22 +103.218.208.0/22 +103.218.212.0/22 +103.218.216.0/22 +103.219.24.0/22 +103.219.28.0/22 +103.219.32.0/22 +103.219.36.0/22 +103.219.64.0/22 +103.219.84.0/22 +103.219.88.0/22 +103.219.92.0/22 +103.219.96.0/22 +103.219.100.0/22 +103.219.176.0/22 +103.219.184.0/22 +103.220.48.0/22 +103.220.52.0/22 +103.220.56.0/22 +103.220.60.0/22 +103.220.64.0/22 +103.220.92.0/22 +103.220.96.0/22 +103.220.100.0/22 +103.220.104.0/22 +103.220.108.0/22 +103.220.116.0/22 +103.220.120.0/22 +103.220.124.0/22 +103.220.128.0/22 +103.220.132.0/22 +103.220.136.0/22 +103.220.140.0/22 +103.220.144.0/22 +103.220.148.0/22 +103.220.152.0/22 +103.220.160.0/22 +103.220.164.0/22 +103.220.168.0/22 +103.220.172.0/22 +103.220.176.0/22 +103.220.180.0/22 +103.220.184.0/22 +103.220.188.0/22 +103.220.192.0/22 +103.220.196.0/22 +103.220.200.0/22 +103.220.240.0/22 +103.220.244.0/22 +103.220.248.0/22 +103.220.252.0/22 +103.221.0.0/22 +103.221.4.0/22 +103.221.8.0/22 +103.221.12.0/22 +103.221.16.0/22 +103.221.20.0/22 +103.221.24.0/22 +103.221.28.0/22 +103.221.32.0/22 +103.221.36.0/22 +103.221.40.0/22 +103.221.44.0/22 +103.221.48.0/22 +103.221.88.0/22 +103.221.92.0/22 +103.221.96.0/22 +103.221.100.0/22 +103.221.104.0/22 +103.221.108.0/22 +103.221.112.0/22 +103.221.116.0/22 +103.221.120.0/22 +103.221.124.0/22 +103.221.128.0/22 +103.221.132.0/22 +103.221.136.0/22 +103.221.140.0/22 +103.221.144.0/22 +103.221.148.0/22 +103.221.152.0/22 +103.221.156.0/22 +103.221.160.0/22 +103.221.164.0/22 +103.221.168.0/22 +103.221.172.0/22 +103.221.176.0/22 +103.221.180.0/22 +103.221.184.0/22 +103.221.188.0/22 +103.221.192.0/22 +103.221.196.0/22 +103.221.200.0/22 +103.221.204.0/22 +103.222.0.0/22 +103.222.4.0/22 +103.222.8.0/22 +103.222.12.0/22 +103.222.16.0/22 +103.222.24.0/22 +103.222.28.0/22 +103.222.32.0/22 +103.222.36.0/22 +103.222.40.0/22 +103.222.44.0/22 +103.222.48.0/22 +103.222.52.0/22 +103.222.56.0/22 +103.222.60.0/22 +103.222.64.0/22 +103.222.68.0/22 +103.222.72.0/22 +103.222.76.0/22 +103.222.80.0/22 +103.222.84.0/22 +103.222.88.0/22 +103.222.92.0/22 +103.222.96.0/22 +103.222.100.0/22 +103.222.104.0/22 +103.222.108.0/22 +103.222.112.0/22 +103.222.116.0/22 +103.222.120.0/22 +103.222.124.0/22 +103.222.128.0/22 +103.222.132.0/22 +103.222.136.0/22 +103.222.140.0/22 +103.222.144.0/22 +103.222.148.0/22 +103.222.152.0/22 +103.222.156.0/22 +103.222.160.0/22 +103.222.164.0/22 +103.222.168.0/22 +103.222.172.0/22 +103.222.176.0/22 +103.222.180.0/22 +103.222.184.0/22 +103.222.188.0/22 +103.222.192.0/22 +103.222.196.0/22 +103.222.200.0/22 +103.222.204.0/22 +103.222.208.0/22 +103.222.212.0/22 +103.222.216.0/22 +103.222.220.0/22 +103.222.224.0/22 +103.222.228.0/22 +103.222.232.0/22 +103.222.240.0/22 +103.222.244.0/22 +103.223.16.0/22 +103.223.20.0/22 +103.223.24.0/22 +103.223.28.0/22 +103.223.32.0/22 +103.223.36.0/22 +103.223.40.0/22 +103.223.44.0/22 +103.223.48.0/22 +103.223.52.0/22 +103.223.56.0/22 +103.223.60.0/22 +103.223.64.0/22 +103.223.68.0/22 +103.223.72.0/22 +103.223.76.0/22 +103.223.80.0/22 +103.223.84.0/22 +103.223.88.0/22 +103.223.92.0/22 +103.223.96.0/22 +103.223.100.0/22 +103.223.104.0/22 +103.223.108.0/22 +103.223.112.0/22 +103.223.116.0/22 +103.223.120.0/22 +103.223.124.0/22 +103.223.128.0/22 +103.223.132.0/22 +103.223.140.0/22 +103.223.144.0/22 +103.223.148.0/22 +103.223.152.0/22 +103.223.156.0/22 +103.223.160.0/22 +103.223.164.0/22 +103.223.168.0/22 +103.223.172.0/22 +103.223.176.0/22 +103.223.180.0/22 +103.223.188.0/22 +103.223.192.0/22 +103.223.196.0/22 +103.223.200.0/22 +103.223.204.0/22 +103.223.208.0/22 +103.223.212.0/22 +103.223.216.0/22 +103.223.220.0/22 +103.223.224.0/22 +103.223.228.0/22 +103.223.232.0/22 +103.223.236.0/22 +103.223.240.0/22 +103.223.244.0/22 +103.223.248.0/22 +103.223.252.0/22 +103.224.0.0/22 +103.224.40.0/22 +103.224.44.0/22 +103.224.60.0/22 +103.224.80.0/22 +103.224.220.0/22 +103.224.224.0/22 +103.224.228.0/22 +103.224.232.0/22 +103.225.84.0/22 +103.226.16.0/22 +103.226.40.0/22 +103.226.56.0/22 +103.226.60.0/22 +103.226.80.0/22 +103.226.132.0/22 +103.226.156.0/22 +103.226.180.0/22 +103.226.196.0/22 +103.227.48.0/22 +103.227.72.0/22 +103.227.76.0/22 +103.227.80.0/22 +103.227.100.0/22 +103.227.120.0/22 +103.227.132.0/22 +103.227.136.0/22 +103.227.196.0/22 +103.227.204.0/22 +103.227.212.0/22 +103.227.228.0/22 +103.228.12.0/22 +103.228.88.0/22 +103.228.136.0/22 +103.228.160.0/22 +103.228.176.0/22 +103.228.204.0/22 +103.228.208.0/22 +103.228.228.0/22 +103.228.232.0/22 +103.229.20.0/22 +103.229.60.0/22 +103.229.136.0/22 +103.229.148.0/22 +103.229.172.0/22 +103.229.212.0/22 +103.229.216.0/22 +103.229.220.0/22 +103.229.228.0/22 +103.229.236.0/22 +103.229.240.0/22 +103.230.0.0/22 +103.230.28.0/22 +103.230.44.0/22 +103.230.96.0/22 +103.230.196.0/22 +103.230.200.0/22 +103.230.204.0/22 +103.230.212.0/22 +103.230.236.0/22 +103.231.16.0/22 +103.231.20.0/22 +103.231.64.0/22 +103.231.68.0/22 +103.231.180.0/22 +103.231.184.0/22 +103.231.244.0/22 +103.232.4.0/22 +103.232.144.0/22 +103.232.188.0/22 +103.232.212.0/22 +103.233.4.0/22 +103.233.44.0/22 +103.233.52.0/22 +103.233.104.0/22 +103.233.128.0/22 +103.233.136.0/22 +103.233.162.0/23 +103.233.228.0/22 +103.234.0.0/22 +103.234.20.0/22 +103.234.56.0/22 +103.234.128.0/22 +103.234.172.0/22 +103.234.180.0/22 +103.234.244.0/22 +103.235.16.0/22 +103.235.48.0/22 +103.235.56.0/22 +103.235.60.0/22 +103.235.80.0/22 +103.235.84.0/22 +103.235.100.0/22 +103.235.128.0/22 +103.235.132.0/22 +103.235.136.0/22 +103.235.140.0/22 +103.235.144.0/22 +103.235.148.0/22 +103.235.184.0/22 +103.235.192.0/22 +103.235.200.0/22 +103.235.220.0/22 +103.235.224.0/22 +103.235.228.0/22 +103.235.232.0/22 +103.235.236.0/22 +103.235.240.0/22 +103.235.244.0/22 +103.235.248.0/22 +103.235.252.0/22 +103.236.0.0/22 +103.236.4.0/22 +103.236.8.0/22 +103.236.12.0/22 +103.236.16.0/22 +103.236.20.0/22 +103.236.24.0/22 +103.236.28.0/22 +103.236.32.0/22 +103.236.36.0/22 +103.236.40.0/22 +103.236.44.0/22 +103.236.48.0/22 +103.236.52.0/22 +103.236.56.0/22 +103.236.60.0/22 +103.236.64.0/22 +103.236.68.0/22 +103.236.72.0/22 +103.236.76.0/22 +103.236.80.0/22 +103.236.84.0/22 +103.236.88.0/22 +103.236.92.0/22 +103.236.96.0/22 +103.236.120.0/22 +103.236.184.0/22 +103.236.220.0/22 +103.236.232.0/22 +103.236.240.0/22 +103.236.244.0/22 +103.236.248.0/22 +103.236.252.0/22 +103.237.0.0/22 +103.237.4.0/22 +103.237.8.0/22 +103.237.12.0/22 +103.237.24.0/22 +103.237.28.0/22 +103.237.68.0/22 +103.237.88.0/22 +103.237.152.0/22 +103.237.176.0/22 +103.237.180.0/22 +103.237.184.0/22 +103.237.188.0/22 +103.237.192.0/22 +103.237.196.0/22 +103.237.200.0/22 +103.237.204.0/22 +103.237.208.0/22 +103.237.212.0/22 +103.237.216.0/22 +103.237.220.0/22 +103.237.224.0/22 +103.237.228.0/22 +103.237.232.0/22 +103.237.236.0/22 +103.237.240.0/22 +103.237.244.0/22 +103.237.248.0/22 +103.237.252.0/22 +103.238.0.0/22 +103.238.4.0/22 +103.238.16.0/22 +103.238.20.0/22 +103.238.24.0/22 +103.238.28.0/22 +103.238.32.0/22 +103.238.36.0/22 +103.238.40.0/22 +103.238.44.0/22 +103.238.48.0/22 +103.238.52.0/22 +103.238.56.0/22 +103.238.88.0/22 +103.238.92.0/22 +103.238.96.0/22 +103.238.132.0/22 +103.238.140.0/22 +103.238.144.0/22 +103.238.160.0/22 +103.238.164.0/22 +103.238.168.0/22 +103.238.172.0/22 +103.238.176.0/22 +103.238.180.0/22 +103.238.184.0/22 +103.238.188.0/22 +103.238.196.0/22 +103.238.204.0/22 +103.238.252.0/22 +103.239.0.0/22 +103.239.44.0/22 +103.239.68.0/22 +103.239.152.0/22 +103.239.156.0/22 +103.239.180.0/22 +103.239.184.0/22 +103.239.192.0/22 +103.239.196.0/22 +103.239.204.0/22 +103.239.208.0/22 +103.239.224.0/22 +103.239.244.0/22 +103.240.16.0/22 +103.240.36.0/22 +103.240.72.0/22 +103.240.84.0/22 +103.240.124.0/22 +103.240.172.0/22 +103.240.188.0/22 +103.240.244.0/22 +103.241.12.0/22 +103.241.72.0/22 +103.241.92.0/22 +103.241.96.0/22 +103.241.160.0/22 +103.241.184.0/22 +103.241.188.0/22 +103.241.220.0/22 +103.242.12.0/22 +103.242.64.0/22 +103.242.128.0/22 +103.242.132.0/22 +103.242.160.0/22 +103.242.168.0/22 +103.242.172.0/22 +103.242.176.0/22 +103.242.200.0/22 +103.242.212.0/22 +103.242.220.0/22 +103.242.240.0/22 +103.243.136.0/22 +103.243.252.0/22 +103.244.16.0/22 +103.244.58.0/23 +103.244.60.0/22 +103.244.64.0/22 +103.244.68.0/22 +103.244.72.0/22 +103.244.76.0/22 +103.244.80.0/22 +103.244.84.0/22 +103.244.116.0/22 +103.244.164.0/22 +103.244.232.0/22 +103.244.252.0/22 +103.245.23.0/24 +103.245.52.0/22 +103.245.60.0/22 +103.245.80.0/22 +103.245.124.0/22 +103.245.128.0/22 +103.246.8.0/22 +103.246.12.0/22 +103.246.120.0/22 +103.246.124.0/22 +103.246.132.0/22 +103.246.152.0/22 +103.246.156.0/22 +103.247.168.0/22 +103.247.172.0/22 +103.247.176.0/22 +103.247.200.0/22 +103.247.212.0/22 +103.248.0.0/23 +103.248.64.0/22 +103.248.100.0/22 +103.248.124.0/22 +103.248.152.0/22 +103.248.168.0/22 +103.248.192.0/22 +103.248.212.0/22 +103.248.224.0/22 +103.249.8.0/22 +103.249.12.0/22 +103.249.52.0/22 +103.249.104.0/22 +103.249.128.0/22 +103.249.136.0/22 +103.249.144.0/22 +103.249.164.0/22 +103.249.168.0/22 +103.249.172.0/22 +103.249.176.0/22 +103.249.188.0/22 +103.249.192.0/22 +103.249.244.0/22 +103.249.252.0/22 +103.250.32.0/22 +103.250.104.0/22 +103.250.124.0/22 +103.250.180.0/22 +103.250.192.0/22 +103.250.216.0/22 +103.250.224.0/22 +103.250.236.0/22 +103.250.248.0/22 +103.250.252.0/22 +103.251.32.0/22 +103.251.84.0/22 +103.251.96.0/22 +103.251.124.0/22 +103.251.128.0/22 +103.251.160.0/22 +103.251.192.0/22 +103.251.204.0/22 +103.251.240.0/22 +103.252.28.0/22 +103.252.36.0/22 +103.252.64.0/22 +103.252.96.0/22 +103.252.104.0/22 +103.252.172.0/22 +103.252.204.0/22 +103.252.208.0/22 +103.252.232.0/22 +103.252.248.0/22 +103.253.4.0/22 +103.253.60.0/22 +103.253.204.0/22 +103.253.220.0/22 +103.253.224.0/22 +103.253.232.0/22 +103.254.8.0/22 +103.254.20.0/22 +103.254.64.0/22 +103.254.68.0/22 +103.254.72.0/22 +103.254.76.0/22 +103.254.112.0/22 +103.254.176.0/22 +103.254.188.0/22 +103.254.196.0/24 +103.254.220.0/22 +103.255.56.0/22 +103.255.68.0/22 +103.255.88.0/22 +103.255.92.0/22 +103.255.136.0/22 +103.255.140.0/22 +103.255.184.0/22 +103.255.200.0/22 +103.255.212.0/22 +103.255.228.0/22 +106.0.0.0/24 +106.0.2.0/23 +106.0.4.0/22 +106.0.8.0/21 +106.0.16.0/20 +106.0.44.0/22 +106.0.64.0/18 +106.2.0.0/15 +106.4.0.0/14 +106.8.0.0/15 +106.11.0.0/16 +106.12.0.0/14 +106.16.0.0/12 +106.32.0.0/12 +106.48.0.0/15 +106.50.0.0/16 +106.52.0.0/14 +106.56.0.0/13 +106.74.0.0/16 +106.75.0.0/16 +106.80.0.0/12 +106.108.0.0/14 +106.112.0.0/13 +106.120.0.0/13 +106.224.0.0/12 +109.244.0.0/16 +110.6.0.0/15 +110.16.0.0/14 +110.34.40.0/22 +110.34.44.0/22 +110.40.0.0/14 +110.44.12.0/22 +110.44.144.0/20 +110.48.0.0/16 +110.51.0.0/16 +110.52.0.0/15 +110.56.0.0/13 +110.64.0.0/15 +110.72.0.0/15 +110.75.0.0/17 +110.75.128.0/19 +110.75.160.0/19 +110.75.192.0/18 +110.76.0.0/19 +110.76.32.0/19 +110.76.132.0/22 +110.76.156.0/22 +110.76.184.0/22 +110.76.192.0/18 +110.77.0.0/17 +110.80.0.0/13 +110.88.0.0/14 +110.92.68.0/22 +110.93.32.0/19 +110.94.0.0/15 +110.96.0.0/11 +110.152.0.0/14 +110.156.0.0/15 +110.165.32.0/19 +110.166.0.0/15 +110.172.192.0/18 +110.173.0.0/19 +110.173.32.0/20 +110.173.64.0/19 +110.173.96.0/19 +110.173.192.0/19 +110.176.0.0/13 +110.184.0.0/13 +110.192.0.0/11 +110.228.0.0/14 +110.232.32.0/19 +110.236.0.0/15 +110.240.0.0/12 +111.0.0.0/10 +111.66.0.0/16 +111.67.192.0/20 +111.68.64.0/19 +111.72.0.0/13 +111.85.0.0/16 +111.91.192.0/19 +111.92.240.0/22 +111.92.248.0/22 +111.92.252.0/22 +111.112.0.0/15 +111.114.0.0/15 +111.116.0.0/15 +111.118.200.0/21 +111.119.64.0/18 +111.119.128.0/19 +111.120.0.0/14 +111.124.0.0/16 +111.126.0.0/15 +111.128.0.0/11 +111.160.0.0/13 +111.170.0.0/16 +111.172.0.0/14 +111.176.0.0/13 +111.186.0.0/15 +111.192.0.0/12 +111.208.0.0/14 +111.212.0.0/14 +111.221.28.0/24 +111.221.128.0/17 +111.222.0.0/16 +111.223.4.0/22 +111.223.8.0/22 +111.223.12.0/22 +111.223.16.0/22 +111.223.240.0/22 +111.223.248.0/22 +111.224.0.0/14 +111.228.0.0/14 +111.235.96.0/19 +111.235.156.0/22 +111.235.160.0/19 +112.0.0.0/10 +112.64.0.0/15 +112.66.0.0/15 +112.73.0.0/16 +112.74.0.0/15 +112.80.0.0/13 +112.88.0.0/13 +112.96.0.0/15 +112.98.0.0/15 +112.100.0.0/14 +112.109.128.0/17 +112.111.0.0/16 +112.112.0.0/14 +112.116.0.0/15 +112.122.0.0/15 +112.124.0.0/14 +112.128.0.0/14 +112.132.0.0/16 +112.137.48.0/21 +112.192.0.0/14 +112.224.0.0/11 +113.0.0.0/13 +113.8.0.0/15 +113.11.192.0/19 +113.12.0.0/14 +113.16.0.0/15 +113.18.0.0/16 +113.21.232.0/22 +113.21.236.0/22 +113.24.0.0/14 +113.31.0.0/16 +113.44.0.0/14 +113.48.0.0/14 +113.52.160.0/19 +113.52.228.0/22 +113.54.0.0/15 +113.56.0.0/15 +113.58.0.0/16 +113.59.0.0/17 +113.59.224.0/22 +113.62.0.0/15 +113.64.0.0/11 +113.96.0.0/12 +113.112.0.0/13 +113.120.0.0/13 +113.128.0.0/15 +113.130.96.0/20 +113.130.112.0/21 +113.132.0.0/14 +113.136.0.0/13 +113.194.0.0/15 +113.197.100.0/22 +113.200.0.0/15 +113.202.0.0/16 +113.204.0.0/14 +113.208.96.0/19 +113.208.128.0/17 +113.209.0.0/16 +113.212.0.0/18 +113.212.88.0/22 +113.212.100.0/22 +113.212.184.0/21 +113.213.0.0/17 +113.214.0.0/15 +113.218.0.0/15 +113.220.0.0/14 +113.224.0.0/12 +113.240.0.0/13 +113.248.0.0/14 +114.28.0.0/16 +114.31.64.0/22 +114.31.68.0/22 +114.54.0.0/15 +114.60.0.0/14 +114.64.0.0/14 +114.68.0.0/16 +114.79.64.0/18 +114.80.0.0/12 +114.96.0.0/13 +114.104.0.0/14 +114.110.0.0/20 +114.110.64.0/18 +114.111.0.0/19 +114.111.160.0/19 +114.112.0.0/14 +114.116.0.0/16 +114.117.0.0/17 +114.117.128.0/17 +114.118.0.0/16 +114.119.0.0/17 +114.119.192.0/21 +114.119.200.0/22 +114.119.204.0/22 +114.119.208.0/20 +114.119.224.0/19 +114.132.0.0/16 +114.134.184.0/22 +114.134.188.0/23 +114.135.0.0/16 +114.138.0.0/15 +114.141.64.0/21 +114.141.80.0/22 +114.141.84.0/22 +114.141.128.0/18 +114.142.136.0/21 +114.196.0.0/15 +114.198.248.0/21 +114.208.0.0/14 +114.212.0.0/15 +114.214.0.0/16 +114.215.0.0/16 +114.216.0.0/13 +114.224.0.0/12 +114.240.0.0/12 +115.24.0.0/14 +115.28.0.0/15 +115.31.64.0/22 +115.31.68.0/22 +115.31.72.0/22 +115.31.76.0/22 +115.32.0.0/14 +115.42.56.0/22 +115.44.0.0/15 +115.46.0.0/16 +115.47.0.0/16 +115.48.0.0/12 +115.69.64.0/20 +115.84.0.0/18 +115.84.192.0/19 +115.85.192.0/18 +115.100.0.0/14 +115.104.0.0/14 +115.120.0.0/14 +115.124.16.0/20 +115.148.0.0/14 +115.152.0.0/15 +115.154.0.0/15 +115.156.0.0/15 +115.158.0.0/16 +115.159.0.0/16 +115.166.64.0/19 +115.168.0.0/14 +115.172.0.0/14 +115.180.0.0/15 +115.182.0.0/16 +115.183.0.0/16 +115.187.0.0/22 +115.187.4.0/22 +115.187.8.0/22 +115.187.12.0/22 +115.190.0.0/15 +115.192.0.0/11 +115.224.0.0/12 +116.0.8.0/21 +116.0.24.0/21 +116.1.0.0/16 +116.2.0.0/15 +116.4.0.0/14 +116.8.0.0/14 +116.13.0.0/16 +116.16.0.0/12 +116.50.0.0/20 +116.52.0.0/14 +116.56.0.0/15 +116.58.128.0/20 +116.58.208.0/20 +116.60.0.0/14 +116.66.0.0/17 +116.66.176.0/22 +116.68.136.0/22 +116.68.140.0/22 +116.68.176.0/22 +116.68.180.0/22 +116.69.0.0/16 +116.70.0.0/17 +116.76.0.0/15 +116.78.0.0/15 +116.85.0.0/16 +116.89.144.0/20 +116.89.240.0/22 +116.90.80.0/20 +116.90.184.0/21 +116.95.0.0/16 +116.112.0.0/14 +116.116.0.0/15 +116.128.0.0/10 +116.192.0.0/16 +116.193.16.0/20 +116.193.32.0/19 +116.193.152.0/22 +116.193.164.0/22 +116.193.176.0/21 +116.194.0.0/15 +116.196.0.0/17 +116.196.128.0/18 +116.196.192.0/18 +116.197.160.0/22 +116.197.164.0/22 +116.198.0.0/16 +116.199.0.0/17 +116.199.128.0/19 +116.204.0.0/17 +116.204.132.0/22 +116.204.216.0/22 +116.204.232.0/22 +116.205.0.0/16 +116.207.0.0/16 +116.208.0.0/14 +116.212.160.0/20 +116.213.44.0/22 +116.213.64.0/18 +116.213.128.0/17 +116.214.32.0/19 +116.214.64.0/20 +116.214.128.0/17 +116.215.0.0/16 +116.216.0.0/14 +116.224.0.0/12 +116.242.0.0/15 +116.244.0.0/15 +116.246.0.0/15 +116.248.0.0/15 +116.251.64.0/18 +116.252.0.0/15 +116.254.104.0/22 +116.254.108.0/22 +116.254.128.0/17 +116.255.128.0/17 +117.8.0.0/13 +117.21.0.0/16 +117.22.0.0/15 +117.24.0.0/13 +117.32.0.0/13 +117.40.0.0/14 +117.44.0.0/15 +117.48.0.0/14 +117.53.48.0/20 +117.53.176.0/20 +117.57.0.0/16 +117.58.0.0/17 +117.59.0.0/16 +117.60.0.0/14 +117.64.0.0/13 +117.72.0.0/15 +117.74.64.0/20 +117.74.80.0/20 +117.74.128.0/17 +117.75.0.0/16 +117.76.0.0/14 +117.80.0.0/12 +117.100.0.0/15 +117.103.16.0/20 +117.103.40.0/21 +117.103.72.0/21 +117.103.128.0/20 +117.104.168.0/21 +117.106.0.0/15 +117.112.0.0/13 +117.120.64.0/18 +117.120.128.0/17 +117.121.0.0/17 +117.121.128.0/18 +117.121.192.0/21 +117.122.128.0/17 +117.124.0.0/14 +117.128.0.0/10 +118.24.0.0/15 +118.26.0.0/19 +118.26.32.0/22 +118.26.40.0/21 +118.26.48.0/21 +118.26.56.0/21 +118.26.64.0/19 +118.26.96.0/21 +118.26.112.0/21 +118.26.120.0/21 +118.26.128.0/22 +118.26.133.0/24 +118.26.134.0/23 +118.26.136.0/21 +118.26.160.0/20 +118.26.188.0/22 +118.26.192.0/18 +118.28.0.0/15 +118.30.0.0/16 +118.31.0.0/16 +118.64.0.0/15 +118.66.0.0/16 +118.67.112.0/20 +118.72.0.0/13 +118.80.0.0/15 +118.84.0.0/15 +118.88.32.0/19 +118.88.64.0/18 +118.88.128.0/17 +118.89.0.0/16 +118.91.240.0/20 +118.102.16.0/20 +118.102.32.0/21 +118.103.164.0/22 +118.103.168.0/22 +118.103.172.0/22 +118.103.176.0/22 +118.112.0.0/13 +118.120.0.0/14 +118.124.0.0/15 +118.126.0.0/16 +118.127.128.0/19 +118.132.0.0/14 +118.144.0.0/14 +118.178.0.0/16 +118.180.0.0/14 +118.184.0.0/17 +118.184.128.0/17 +118.186.0.0/15 +118.188.0.0/16 +118.190.0.0/16 +118.191.0.0/21 +118.191.8.0/22 +118.191.12.0/24 +118.191.16.0/21 +118.191.64.0/20 +118.191.80.0/22 +118.191.128.0/19 +118.191.176.0/20 +118.191.192.0/20 +118.191.208.0/24 +118.191.216.0/22 +118.191.223.0/24 +118.191.224.0/24 +118.191.240.0/20 +118.192.0.0/16 +118.193.0.0/21 +118.193.8.0/21 +118.193.48.0/21 +118.193.96.0/19 +118.193.128.0/17 +118.194.0.0/17 +118.194.128.0/18 +118.194.192.0/19 +118.194.224.0/22 +118.194.240.0/21 +118.195.0.0/17 +118.195.128.0/17 +118.196.0.0/14 +118.202.0.0/15 +118.204.0.0/14 +118.212.0.0/16 +118.213.0.0/16 +118.215.192.0/18 +118.224.0.0/14 +118.228.0.0/15 +118.230.0.0/16 +118.239.0.0/16 +118.242.0.0/16 +118.244.0.0/14 +118.248.0.0/13 +119.0.0.0/15 +119.2.0.0/19 +119.2.128.0/17 +119.3.0.0/16 +119.4.0.0/14 +119.10.0.0/17 +119.15.136.0/21 +119.16.0.0/16 +119.18.192.0/20 +119.18.208.0/21 +119.18.224.0/20 +119.18.240.0/20 +119.19.0.0/16 +119.20.0.0/14 +119.27.64.0/18 +119.27.128.0/19 +119.27.160.0/19 +119.27.192.0/18 +119.28.0.0/15 +119.30.48.0/20 +119.31.192.0/19 +119.32.0.0/14 +119.36.0.0/16 +119.37.0.0/17 +119.37.128.0/18 +119.37.192.0/18 +119.38.0.0/17 +119.38.128.0/18 +119.38.192.0/20 +119.38.208.0/20 +119.38.224.0/19 +119.39.0.0/16 +119.40.0.0/18 +119.40.64.0/20 +119.40.128.0/17 +119.41.0.0/16 +119.42.0.0/19 +119.42.128.0/21 +119.42.136.0/21 +119.42.224.0/19 +119.44.0.0/15 +119.48.0.0/13 +119.57.0.0/16 +119.58.0.0/16 +119.59.128.0/17 +119.60.0.0/16 +119.61.0.0/16 +119.62.0.0/16 +119.63.32.0/19 +119.75.208.0/20 +119.78.0.0/15 +119.80.0.0/16 +119.82.208.0/20 +119.84.0.0/14 +119.88.0.0/14 +119.96.0.0/13 +119.108.0.0/15 +119.112.0.0/13 +119.120.0.0/13 +119.128.0.0/12 +119.144.0.0/14 +119.148.160.0/20 +119.148.176.0/20 +119.151.192.0/18 +119.160.200.0/21 +119.161.120.0/22 +119.161.124.0/22 +119.161.128.0/17 +119.162.0.0/15 +119.164.0.0/14 +119.176.0.0/12 +119.232.0.0/15 +119.235.128.0/18 +119.248.0.0/14 +119.252.96.0/21 +119.252.240.0/20 +119.253.0.0/16 +119.254.0.0/15 +120.0.0.0/12 +120.24.0.0/14 +120.30.0.0/16 +120.31.0.0/16 +120.32.0.0/13 +120.40.0.0/14 +120.44.0.0/15 +120.46.0.0/16 +120.47.0.0/16 +120.48.0.0/15 +120.52.0.0/16 +120.53.0.0/16 +120.54.0.0/15 +120.64.0.0/14 +120.68.0.0/14 +120.72.32.0/19 +120.72.128.0/17 +120.76.0.0/14 +120.80.0.0/13 +120.88.8.0/21 +120.90.0.0/15 +120.92.0.0/16 +120.94.0.0/16 +120.95.0.0/16 +120.128.0.0/14 +120.132.0.0/17 +120.132.128.0/17 +120.133.0.0/16 +120.134.0.0/15 +120.136.16.0/22 +120.136.20.0/22 +120.136.128.0/18 +120.137.0.0/17 +120.143.128.0/19 +120.192.0.0/10 +121.0.8.0/21 +121.0.16.0/20 +121.4.0.0/15 +121.8.0.0/13 +121.16.0.0/13 +121.24.0.0/14 +121.28.0.0/15 +121.30.0.0/16 +121.31.0.0/16 +121.32.0.0/14 +121.36.0.0/16 +121.37.0.0/16 +121.38.0.0/15 +121.40.0.0/14 +121.46.0.0/18 +121.46.76.0/22 +121.46.128.0/17 +121.47.0.0/16 +121.48.0.0/15 +121.50.8.0/21 +121.51.0.0/16 +121.52.160.0/19 +121.52.208.0/20 +121.52.224.0/19 +121.54.176.0/21 +121.54.188.0/22 +121.55.0.0/18 +121.56.0.0/15 +121.58.0.0/17 +121.58.136.0/21 +121.58.144.0/20 +121.58.160.0/21 +121.59.0.0/16 +121.60.0.0/14 +121.68.0.0/14 +121.76.0.0/15 +121.79.128.0/18 +121.89.0.0/16 +121.91.104.0/21 +121.100.128.0/17 +121.101.0.0/18 +121.101.208.0/20 +121.192.0.0/16 +121.193.0.0/16 +121.194.0.0/15 +121.196.0.0/14 +121.200.192.0/21 +121.201.0.0/16 +121.204.0.0/14 +121.224.0.0/12 +121.248.0.0/14 +121.255.0.0/16 +122.0.64.0/18 +122.0.128.0/17 +122.4.0.0/14 +122.8.0.0/17 +122.8.192.0/18 +122.9.0.0/16 +122.10.128.0/22 +122.10.132.0/23 +122.10.136.0/23 +122.10.164.0/22 +122.10.168.0/21 +122.10.176.0/20 +122.10.192.0/22 +122.10.200.0/21 +122.10.208.0/21 +122.10.216.0/22 +122.10.228.0/22 +122.10.232.0/21 +122.10.240.0/22 +122.11.0.0/17 +122.12.0.0/16 +122.13.0.0/16 +122.14.0.0/17 +122.14.128.0/18 +122.14.192.0/18 +122.48.0.0/16 +122.49.0.0/18 +122.51.0.0/16 +122.64.0.0/11 +122.96.0.0/15 +122.102.0.0/20 +122.102.64.0/20 +122.102.80.0/20 +122.112.0.0/18 +122.112.64.0/18 +122.112.128.0/17 +122.113.0.0/16 +122.114.0.0/16 +122.115.0.0/17 +122.115.128.0/19 +122.115.160.0/19 +122.115.192.0/19 +122.115.224.0/19 +122.119.0.0/16 +122.128.100.0/22 +122.128.120.0/21 +122.136.0.0/13 +122.144.128.0/17 +122.152.192.0/18 +122.156.0.0/14 +122.188.0.0/14 +122.192.0.0/14 +122.198.0.0/16 +122.200.40.0/22 +122.200.44.0/22 +122.200.64.0/18 +122.201.48.0/20 +122.204.0.0/14 +122.224.0.0/12 +122.240.0.0/13 +122.248.24.0/21 +122.248.48.0/20 +122.255.64.0/21 +123.0.128.0/18 +123.4.0.0/14 +123.8.0.0/13 +123.49.128.0/17 +123.50.160.0/19 +123.52.0.0/14 +123.56.0.0/15 +123.58.0.0/20 +123.58.16.0/20 +123.58.32.0/19 +123.58.64.0/19 +123.58.96.0/19 +123.58.128.0/18 +123.58.224.0/20 +123.58.240.0/20 +123.59.0.0/16 +123.60.0.0/16 +123.61.0.0/16 +123.62.0.0/16 +123.64.0.0/11 +123.96.0.0/15 +123.98.0.0/17 +123.99.128.0/17 +123.100.0.0/19 +123.101.0.0/16 +123.103.0.0/17 +123.108.128.0/20 +123.108.208.0/20 +123.112.0.0/12 +123.128.0.0/13 +123.136.80.0/20 +123.137.0.0/16 +123.138.0.0/15 +123.144.0.0/14 +123.148.0.0/16 +123.149.0.0/16 +123.150.0.0/15 +123.152.0.0/13 +123.160.0.0/14 +123.164.0.0/14 +123.168.0.0/14 +123.172.0.0/15 +123.174.0.0/15 +123.176.60.0/22 +123.176.80.0/20 +123.177.0.0/16 +123.178.0.0/15 +123.180.0.0/14 +123.184.0.0/14 +123.188.0.0/14 +123.196.0.0/15 +123.199.128.0/17 +123.206.0.0/15 +123.232.0.0/14 +123.242.0.0/17 +123.242.192.0/22 +123.242.196.0/22 +123.244.0.0/14 +123.249.0.0/16 +123.253.108.0/22 +123.253.240.0/22 +123.254.96.0/22 +123.254.100.0/22 +124.6.64.0/18 +124.14.0.0/15 +124.16.0.0/15 +124.20.0.0/16 +124.21.0.0/20 +124.21.16.0/20 +124.21.32.0/19 +124.21.64.0/18 +124.21.128.0/17 +124.22.0.0/15 +124.28.192.0/18 +124.29.0.0/17 +124.31.0.0/16 +124.40.112.0/20 +124.40.128.0/18 +124.40.192.0/19 +124.40.240.0/22 +124.42.0.0/17 +124.42.128.0/17 +124.47.0.0/18 +124.64.0.0/15 +124.66.0.0/17 +124.67.0.0/16 +124.68.0.0/15 +124.70.0.0/15 +124.72.0.0/16 +124.73.0.0/16 +124.74.0.0/15 +124.76.0.0/14 +124.88.0.0/16 +124.89.0.0/17 +124.89.128.0/17 +124.90.0.0/15 +124.92.0.0/14 +124.108.8.0/21 +124.108.40.0/21 +124.109.96.0/21 +124.112.0.0/15 +124.114.0.0/15 +124.116.0.0/16 +124.117.0.0/16 +124.118.0.0/15 +124.126.0.0/15 +124.128.0.0/13 +124.147.128.0/17 +124.150.137.0/24 +124.151.0.0/16 +124.152.0.0/16 +124.160.0.0/16 +124.161.0.0/16 +124.162.0.0/16 +124.163.0.0/16 +124.164.0.0/14 +124.172.0.0/15 +124.174.0.0/15 +124.192.0.0/15 +124.196.0.0/16 +124.200.0.0/13 +124.220.0.0/14 +124.224.0.0/16 +124.225.0.0/16 +124.226.0.0/15 +124.228.0.0/14 +124.232.0.0/15 +124.234.0.0/15 +124.236.0.0/14 +124.240.0.0/17 +124.240.128.0/18 +124.242.0.0/16 +124.243.192.0/18 +124.248.0.0/17 +124.249.0.0/16 +124.250.0.0/15 +124.254.0.0/18 +125.31.192.0/18 +125.32.0.0/16 +125.33.0.0/16 +125.34.0.0/16 +125.35.0.0/17 +125.35.128.0/17 +125.36.0.0/14 +125.40.0.0/13 +125.58.128.0/17 +125.61.128.0/17 +125.62.0.0/18 +125.64.0.0/13 +125.72.0.0/16 +125.73.0.0/16 +125.74.0.0/15 +125.76.0.0/17 +125.76.128.0/17 +125.77.0.0/16 +125.78.0.0/15 +125.80.0.0/13 +125.88.0.0/13 +125.96.0.0/15 +125.98.0.0/16 +125.104.0.0/13 +125.112.0.0/12 +125.169.0.0/16 +125.171.0.0/16 +125.208.0.0/18 +125.210.0.0/16 +125.211.0.0/16 +125.213.0.0/17 +125.214.96.0/19 +125.215.0.0/18 +125.216.0.0/15 +125.218.0.0/16 +125.219.0.0/16 +125.220.0.0/15 +125.222.0.0/15 +125.254.128.0/18 +125.254.192.0/18 +128.108.0.0/16 +129.28.0.0/16 +129.204.0.0/16 +129.211.0.0/16 +132.232.0.0/16 +134.175.0.0/16 +137.59.59.0/24 +137.59.88.0/22 +139.5.56.0/22 +139.5.60.0/22 +139.5.80.0/22 +139.5.92.0/22 +139.5.108.0/22 +139.5.128.0/22 +139.5.160.0/22 +139.5.192.0/22 +139.5.204.0/22 +139.5.212.0/22 +139.5.244.0/22 +139.9.0.0/16 +139.129.0.0/16 +139.148.0.0/16 +139.155.0.0/16 +139.159.0.0/16 +139.170.0.0/16 +139.176.0.0/16 +139.183.0.0/16 +139.186.0.0/16 +139.189.0.0/16 +139.196.0.0/14 +139.200.0.0/13 +139.208.0.0/13 +139.217.0.0/16 +139.219.0.0/16 +139.220.0.0/15 +139.224.0.0/16 +139.226.0.0/15 +140.75.0.0/16 +140.143.0.0/16 +140.179.0.0/16 +140.205.0.0/16 +140.206.0.0/15 +140.210.0.0/17 +140.210.128.0/17 +140.224.0.0/16 +140.237.0.0/16 +140.240.0.0/16 +140.243.0.0/16 +140.246.0.0/16 +140.249.0.0/16 +140.250.0.0/16 +140.255.0.0/16 +142.70.0.0/16 +142.86.0.0/16 +143.64.0.0/16 +144.0.0.0/16 +144.7.0.0/16 +144.12.0.0/16 +144.48.64.0/22 +144.48.88.0/22 +144.48.156.0/22 +144.48.180.0/22 +144.48.184.0/22 +144.48.204.0/22 +144.48.208.0/22 +144.48.212.0/22 +144.48.220.0/22 +144.48.252.0/22 +144.52.0.0/16 +144.123.0.0/16 +144.255.0.0/16 +146.56.192.0/18 +146.196.56.0/22 +146.196.68.0/22 +146.196.72.0/22 +146.196.92.0/22 +146.196.112.0/22 +146.196.116.0/22 +146.196.124.0/22 +148.70.0.0/16 +149.41.0.0/16 +150.0.0.0/16 +150.115.0.0/16 +150.121.0.0/16 +150.122.0.0/16 +150.129.136.0/22 +150.129.192.0/22 +150.129.216.0/22 +150.129.252.0/22 +150.138.0.0/15 +150.158.0.0/16 +150.223.0.0/16 +150.242.0.0/22 +150.242.4.0/22 +150.242.8.0/22 +150.242.28.0/22 +150.242.44.0/22 +150.242.48.0/22 +150.242.52.0/22 +150.242.56.0/22 +150.242.76.0/22 +150.242.80.0/22 +150.242.92.0/22 +150.242.96.0/22 +150.242.112.0/22 +150.242.116.0/22 +150.242.120.0/22 +150.242.152.0/22 +150.242.156.0/22 +150.242.160.0/22 +150.242.164.0/22 +150.242.168.0/22 +150.242.184.0/22 +150.242.188.0/22 +150.242.192.0/22 +150.242.212.0/22 +150.242.224.0/22 +150.242.232.0/22 +150.242.236.0/22 +150.242.240.0/22 +150.242.244.0/22 +150.242.248.0/22 +150.248.0.0/16 +150.255.0.0/16 +152.104.128.0/17 +152.136.0.0/16 +153.0.0.0/16 +153.3.0.0/16 +153.34.0.0/15 +153.36.0.0/15 +153.99.0.0/16 +153.101.0.0/16 +153.118.0.0/15 +154.8.128.0/17 +157.0.0.0/16 +157.18.0.0/16 +157.61.0.0/16 +157.119.8.0/22 +157.119.12.0/22 +157.119.16.0/22 +157.119.28.0/22 +157.119.132.0/22 +157.119.136.0/22 +157.119.140.0/22 +157.119.144.0/22 +157.119.148.0/22 +157.119.152.0/22 +157.119.156.0/22 +157.119.160.0/22 +157.119.164.0/22 +157.119.172.0/22 +157.119.192.0/22 +157.119.196.0/22 +157.119.240.0/22 +157.119.252.0/22 +157.122.0.0/16 +157.148.0.0/16 +157.156.0.0/16 +157.255.0.0/16 +158.60.0.0/16 +158.79.0.0/16 +159.27.0.0/16 +159.75.0.0/16 +159.226.0.0/16 +160.19.208.0/22 +160.19.212.0/22 +160.19.216.0/22 +160.20.48.0/22 +160.202.60.0/22 +160.202.148.0/22 +160.202.152.0/22 +160.202.168.0/22 +160.202.212.0/22 +160.202.216.0/22 +160.202.220.0/22 +160.202.224.0/22 +160.202.228.0/22 +160.202.232.0/22 +160.202.236.0/22 +160.202.240.0/22 +160.202.244.0/22 +160.202.248.0/22 +160.202.252.0/22 +160.238.64.0/22 +161.120.0.0/16 +161.189.0.0/16 +161.207.0.0/16 +162.14.0.0/16 +162.105.0.0/16 +163.0.0.0/16 +163.47.4.0/22 +163.53.0.0/22 +163.53.4.0/22 +163.53.8.0/22 +163.53.12.0/22 +163.53.36.0/22 +163.53.40.0/22 +163.53.44.0/22 +163.53.48.0/22 +163.53.52.0/22 +163.53.56.0/22 +163.53.60.0/22 +163.53.64.0/22 +163.53.88.0/22 +163.53.92.0/22 +163.53.96.0/22 +163.53.100.0/22 +163.53.104.0/22 +163.53.108.0/22 +163.53.112.0/22 +163.53.116.0/22 +163.53.120.0/22 +163.53.124.0/22 +163.53.128.0/22 +163.53.132.0/22 +163.53.136.0/22 +163.53.160.0/22 +163.53.164.0/22 +163.53.168.0/22 +163.53.172.0/22 +163.53.188.0/22 +163.53.220.0/22 +163.53.240.0/22 +163.125.0.0/16 +163.142.0.0/16 +163.177.0.0/16 +163.179.0.0/16 +163.204.0.0/16 +163.228.0.0/16 +164.52.0.0/17 +166.111.0.0/16 +167.139.0.0/16 +167.189.0.0/16 +167.220.244.0/22 +168.160.0.0/16 +170.179.0.0/16 +171.8.0.0/13 +171.34.0.0/15 +171.36.0.0/14 +171.40.0.0/13 +171.80.0.0/14 +171.84.0.0/14 +171.88.0.0/13 +171.104.0.0/13 +171.112.0.0/14 +171.116.0.0/14 +171.120.0.0/13 +171.208.0.0/12 +172.81.192.0/18 +175.0.0.0/12 +175.16.0.0/13 +175.24.0.0/16 +175.25.0.0/16 +175.26.0.0/16 +175.27.0.0/16 +175.30.0.0/15 +175.42.0.0/15 +175.44.0.0/16 +175.46.0.0/15 +175.48.0.0/12 +175.64.0.0/11 +175.102.0.0/16 +175.106.128.0/17 +175.111.144.0/22 +175.111.148.0/22 +175.111.152.0/22 +175.111.156.0/22 +175.111.160.0/22 +175.111.164.0/22 +175.111.168.0/22 +175.111.172.0/22 +175.111.184.0/22 +175.146.0.0/15 +175.148.0.0/14 +175.152.0.0/14 +175.158.96.0/22 +175.160.0.0/12 +175.176.156.0/22 +175.176.176.0/22 +175.176.188.0/22 +175.178.0.0/16 +175.184.128.0/18 +175.185.0.0/16 +175.186.0.0/15 +175.188.0.0/14 +180.76.0.0/16 +180.77.0.0/16 +180.78.0.0/15 +180.84.0.0/15 +180.86.0.0/16 +180.88.0.0/14 +180.94.56.0/21 +180.94.96.0/20 +180.94.120.0/22 +180.94.124.0/22 +180.95.128.0/17 +180.96.0.0/11 +180.129.128.0/17 +180.130.0.0/16 +180.136.0.0/13 +180.148.16.0/21 +180.148.152.0/21 +180.148.216.0/21 +180.148.224.0/19 +180.149.128.0/19 +180.149.236.0/22 +180.150.160.0/19 +180.152.0.0/13 +180.160.0.0/12 +180.178.112.0/22 +180.178.116.0/22 +180.178.192.0/18 +180.184.0.0/15 +180.186.0.0/16 +180.187.0.0/16 +180.188.0.0/17 +180.189.148.0/22 +180.200.252.0/22 +180.201.0.0/16 +180.202.0.0/15 +180.208.0.0/15 +180.210.212.0/22 +180.210.224.0/19 +180.212.0.0/15 +180.222.224.0/19 +180.223.0.0/16 +180.233.0.0/18 +180.233.64.0/19 +180.233.144.0/22 +180.235.64.0/19 +180.235.112.0/22 +182.16.144.0/22 +182.16.148.0/22 +182.16.192.0/19 +182.18.0.0/17 +182.23.184.0/21 +182.23.200.0/21 +182.32.0.0/12 +182.48.96.0/19 +182.49.0.0/16 +182.50.0.0/20 +182.50.112.0/20 +182.51.0.0/16 +182.54.0.0/17 +182.54.244.0/22 +182.61.0.0/16 +182.80.0.0/14 +182.84.0.0/14 +182.88.0.0/14 +182.92.0.0/16 +182.96.0.0/12 +182.112.0.0/12 +182.128.0.0/12 +182.144.0.0/13 +182.157.0.0/16 +182.160.64.0/19 +182.174.0.0/15 +182.200.0.0/13 +182.236.128.0/17 +182.237.24.0/22 +182.237.28.0/22 +182.238.0.0/16 +182.239.0.0/19 +182.240.0.0/13 +182.254.0.0/16 +182.255.60.0/22 +183.0.0.0/10 +183.64.0.0/13 +183.78.160.0/22 +183.78.164.0/22 +183.78.180.0/22 +183.81.172.0/22 +183.81.180.0/22 +183.84.0.0/15 +183.91.128.0/22 +183.91.136.0/21 +183.91.144.0/20 +183.92.0.0/14 +183.128.0.0/11 +183.160.0.0/13 +183.168.0.0/15 +183.170.0.0/16 +183.172.0.0/14 +183.182.0.0/19 +183.184.0.0/13 +183.192.0.0/10 +185.203.36.0/22 +188.131.128.0/17 +192.51.188.0/24 +192.55.46.0/24 +192.55.68.0/22 +192.102.204.0/23 +192.124.154.0/24 +192.140.128.0/22 +192.140.132.0/22 +192.140.136.0/22 +192.140.156.0/22 +192.140.160.0/22 +192.140.164.0/22 +192.140.168.0/22 +192.140.172.0/22 +192.140.176.0/22 +192.140.180.0/22 +192.140.184.0/22 +192.140.188.0/22 +192.140.192.0/22 +192.140.196.0/22 +192.140.200.0/22 +192.140.204.0/22 +192.140.208.0/22 +192.140.212.0/22 +192.144.128.0/17 +192.197.113.0/24 +193.112.0.0/16 +198.175.100.0/22 +199.212.57.0/24 +202.0.100.0/23 +202.0.122.0/23 +202.0.176.0/22 +202.3.128.0/23 +202.4.128.0/19 +202.4.252.0/22 +202.5.208.0/22 +202.5.212.0/22 +202.5.216.0/22 +202.6.6.0/23 +202.6.66.0/23 +202.6.72.0/23 +202.6.87.0/24 +202.6.88.0/23 +202.6.92.0/23 +202.6.103.0/24 +202.6.108.0/24 +202.6.110.0/23 +202.6.114.0/24 +202.6.176.0/20 +202.8.0.0/24 +202.8.2.0/23 +202.8.4.0/23 +202.8.12.0/24 +202.8.24.0/24 +202.8.77.0/24 +202.8.120.0/22 +202.8.128.0/19 +202.8.192.0/20 +202.9.32.0/24 +202.9.34.0/23 +202.9.48.0/23 +202.9.51.0/24 +202.9.52.0/23 +202.9.54.0/24 +202.9.57.0/24 +202.9.58.0/23 +202.10.64.0/20 +202.10.112.0/22 +202.10.116.0/22 +202.10.120.0/22 +202.10.124.0/22 +202.12.1.0/24 +202.12.2.0/24 +202.12.17.0/24 +202.12.18.0/24 +202.12.19.0/24 +202.12.72.0/24 +202.12.84.0/23 +202.12.96.0/24 +202.12.98.0/23 +202.12.106.0/24 +202.12.111.0/24 +202.12.116.0/24 +202.14.64.0/23 +202.14.69.0/24 +202.14.73.0/24 +202.14.74.0/23 +202.14.76.0/24 +202.14.78.0/23 +202.14.88.0/24 +202.14.97.0/24 +202.14.104.0/23 +202.14.108.0/23 +202.14.111.0/24 +202.14.114.0/23 +202.14.118.0/23 +202.14.124.0/23 +202.14.127.0/24 +202.14.129.0/24 +202.14.135.0/24 +202.14.136.0/24 +202.14.149.0/24 +202.14.151.0/24 +202.14.157.0/24 +202.14.158.0/23 +202.14.169.0/24 +202.14.170.0/23 +202.14.172.0/22 +202.14.176.0/24 +202.14.184.0/23 +202.14.208.0/23 +202.14.213.0/24 +202.14.219.0/24 +202.14.220.0/24 +202.14.222.0/23 +202.14.225.0/24 +202.14.226.0/23 +202.14.231.0/24 +202.14.235.0/24 +202.14.236.0/23 +202.14.238.0/24 +202.14.239.0/24 +202.14.246.0/24 +202.14.251.0/24 +202.20.66.0/24 +202.20.79.0/24 +202.20.87.0/24 +202.20.88.0/23 +202.20.90.0/24 +202.20.94.0/23 +202.20.114.0/24 +202.20.117.0/24 +202.20.120.0/24 +202.20.125.0/24 +202.20.126.0/24 +202.20.127.0/24 +202.21.48.0/22 +202.21.52.0/22 +202.21.56.0/22 +202.21.60.0/22 +202.21.131.0/24 +202.21.132.0/24 +202.21.141.0/24 +202.21.142.0/24 +202.21.147.0/24 +202.21.148.0/24 +202.21.150.0/23 +202.21.152.0/23 +202.21.154.0/24 +202.21.156.0/24 +202.22.248.0/22 +202.22.252.0/22 +202.27.12.0/24 +202.27.14.0/24 +202.27.136.0/23 +202.36.226.0/24 +202.38.0.0/23 +202.38.2.0/23 +202.38.8.0/21 +202.38.48.0/20 +202.38.64.0/19 +202.38.96.0/19 +202.38.128.0/23 +202.38.130.0/23 +202.38.132.0/23 +202.38.134.0/24 +202.38.135.0/24 +202.38.136.0/23 +202.38.138.0/24 +202.38.140.0/23 +202.38.142.0/23 +202.38.146.0/23 +202.38.149.0/24 +202.38.150.0/23 +202.38.152.0/23 +202.38.154.0/23 +202.38.156.0/24 +202.38.158.0/23 +202.38.160.0/23 +202.38.164.0/22 +202.38.168.0/23 +202.38.170.0/24 +202.38.171.0/24 +202.38.176.0/23 +202.38.184.0/21 +202.38.192.0/18 +202.40.4.0/23 +202.40.7.0/24 +202.40.15.0/24 +202.40.135.0/24 +202.40.136.0/24 +202.40.140.0/24 +202.40.143.0/24 +202.40.144.0/23 +202.40.150.0/24 +202.40.155.0/24 +202.40.156.0/24 +202.40.158.0/23 +202.40.162.0/24 +202.41.8.0/23 +202.41.11.0/24 +202.41.12.0/23 +202.41.128.0/24 +202.41.130.0/23 +202.41.152.0/21 +202.41.192.0/24 +202.41.196.0/22 +202.41.200.0/22 +202.41.240.0/20 +202.43.76.0/22 +202.43.144.0/20 +202.44.16.0/20 +202.44.48.0/22 +202.44.67.0/24 +202.44.74.0/24 +202.44.97.0/24 +202.44.129.0/24 +202.44.132.0/23 +202.44.146.0/23 +202.45.0.0/23 +202.45.2.0/24 +202.45.15.0/24 +202.45.16.0/20 +202.46.16.0/23 +202.46.18.0/24 +202.46.20.0/23 +202.46.32.0/19 +202.46.128.0/24 +202.46.224.0/20 +202.47.82.0/23 +202.47.96.0/22 +202.47.100.0/22 +202.47.104.0/22 +202.47.108.0/22 +202.47.126.0/24 +202.47.128.0/24 +202.47.130.0/23 +202.52.33.0/24 +202.52.34.0/24 +202.52.47.0/24 +202.52.143.0/24 +202.53.140.0/24 +202.53.143.0/24 +202.57.192.0/22 +202.57.196.0/22 +202.57.200.0/22 +202.57.204.0/22 +202.57.212.0/22 +202.57.216.0/22 +202.57.240.0/20 +202.58.0.0/24 +202.58.104.0/22 +202.58.112.0/22 +202.59.0.0/24 +202.59.1.0/24 +202.59.212.0/22 +202.59.236.0/24 +202.59.240.0/24 +202.60.48.0/21 +202.60.96.0/21 +202.60.112.0/20 +202.60.132.0/22 +202.60.136.0/21 +202.60.144.0/20 +202.61.68.0/22 +202.61.76.0/22 +202.61.88.0/22 +202.61.123.0/24 +202.61.127.0/24 +202.62.112.0/22 +202.62.248.0/22 +202.62.252.0/24 +202.62.255.0/24 +202.63.80.0/24 +202.63.81.0/24 +202.63.82.0/23 +202.63.84.0/22 +202.63.88.0/21 +202.63.160.0/19 +202.63.248.0/22 +202.63.253.0/24 +202.65.0.0/21 +202.65.8.0/23 +202.65.96.0/22 +202.65.100.0/22 +202.65.104.0/22 +202.65.108.0/22 +202.66.168.0/22 +202.67.0.0/22 +202.69.4.0/22 +202.69.16.0/20 +202.70.0.0/19 +202.70.96.0/20 +202.70.192.0/20 +202.71.32.0/22 +202.71.36.0/22 +202.71.40.0/22 +202.71.44.0/22 +202.72.40.0/21 +202.72.80.0/20 +202.72.112.0/22 +202.72.116.0/22 +202.72.120.0/22 +202.72.124.0/22 +202.73.128.0/22 +202.73.240.0/22 +202.73.244.0/22 +202.73.248.0/22 +202.73.252.0/22 +202.74.8.0/21 +202.74.36.0/24 +202.74.42.0/24 +202.74.52.0/24 +202.74.80.0/20 +202.74.254.0/23 +202.75.208.0/20 +202.75.252.0/22 +202.76.252.0/22 +202.77.80.0/21 +202.77.92.0/22 +202.78.8.0/21 +202.79.224.0/21 +202.79.248.0/22 +202.80.192.0/21 +202.80.200.0/21 +202.81.0.0/22 +202.81.176.0/22 +202.81.180.0/22 +202.81.184.0/22 +202.81.188.0/22 +202.83.252.0/22 +202.84.0.0/22 +202.84.4.0/22 +202.84.8.0/21 +202.84.16.0/23 +202.84.22.0/24 +202.84.24.0/21 +202.85.208.0/20 +202.86.249.0/24 +202.86.252.0/22 +202.87.80.0/20 +202.88.32.0/22 +202.89.8.0/21 +202.89.96.0/22 +202.89.108.0/22 +202.89.119.0/24 +202.89.232.0/21 +202.90.0.0/22 +202.90.16.0/22 +202.90.20.0/22 +202.90.24.0/22 +202.90.28.0/22 +202.90.37.0/24 +202.90.96.0/22 +202.90.100.0/22 +202.90.104.0/22 +202.90.108.0/22 +202.90.112.0/20 +202.90.193.0/24 +202.90.196.0/24 +202.90.205.0/24 +202.90.224.0/20 +202.91.0.0/22 +202.91.36.0/22 +202.91.96.0/20 +202.91.128.0/22 +202.91.176.0/20 +202.91.224.0/19 +202.92.0.0/22 +202.92.8.0/21 +202.92.48.0/20 +202.92.252.0/22 +202.93.0.0/22 +202.93.252.0/22 +202.94.74.0/24 +202.94.81.0/24 +202.94.92.0/22 +202.95.240.0/21 +202.95.252.0/22 +202.96.0.0/18 +202.96.64.0/21 +202.96.72.0/21 +202.96.80.0/20 +202.96.96.0/21 +202.96.104.0/21 +202.96.112.0/20 +202.96.128.0/21 +202.96.136.0/21 +202.96.144.0/20 +202.96.160.0/21 +202.96.168.0/21 +202.96.176.0/20 +202.96.192.0/21 +202.96.200.0/21 +202.96.208.0/20 +202.96.224.0/21 +202.96.232.0/21 +202.96.240.0/20 +202.97.0.0/21 +202.97.8.0/21 +202.97.16.0/20 +202.97.32.0/19 +202.97.64.0/19 +202.97.96.0/20 +202.97.112.0/20 +202.97.128.0/18 +202.97.192.0/19 +202.97.224.0/21 +202.97.232.0/21 +202.97.240.0/20 +202.98.0.0/21 +202.98.8.0/21 +202.98.16.0/20 +202.98.32.0/21 +202.98.40.0/21 +202.98.48.0/20 +202.98.64.0/19 +202.98.96.0/21 +202.98.104.0/21 +202.98.112.0/20 +202.98.128.0/19 +202.98.160.0/21 +202.98.168.0/21 +202.98.176.0/20 +202.98.192.0/21 +202.98.200.0/21 +202.98.208.0/20 +202.98.224.0/21 +202.98.232.0/21 +202.98.240.0/20 +202.99.0.0/18 +202.99.64.0/19 +202.99.96.0/21 +202.99.104.0/21 +202.99.112.0/20 +202.99.128.0/19 +202.99.160.0/21 +202.99.168.0/21 +202.99.176.0/20 +202.99.192.0/21 +202.99.200.0/21 +202.99.208.0/20 +202.99.224.0/21 +202.99.232.0/21 +202.99.240.0/20 +202.100.0.0/21 +202.100.8.0/21 +202.100.16.0/20 +202.100.32.0/19 +202.100.64.0/21 +202.100.72.0/21 +202.100.80.0/20 +202.100.96.0/21 +202.100.104.0/21 +202.100.112.0/20 +202.100.128.0/21 +202.100.136.0/21 +202.100.144.0/20 +202.100.160.0/21 +202.100.168.0/21 +202.100.176.0/20 +202.100.192.0/21 +202.100.200.0/21 +202.100.208.0/20 +202.100.224.0/19 +202.101.0.0/18 +202.101.64.0/19 +202.101.96.0/19 +202.101.128.0/18 +202.101.192.0/19 +202.101.224.0/21 +202.101.232.0/21 +202.101.240.0/20 +202.102.0.0/19 +202.102.32.0/19 +202.102.64.0/18 +202.102.128.0/21 +202.102.136.0/21 +202.102.144.0/20 +202.102.160.0/19 +202.102.192.0/21 +202.102.200.0/21 +202.102.208.0/20 +202.102.224.0/21 +202.102.232.0/21 +202.102.240.0/20 +202.103.0.0/21 +202.103.8.0/21 +202.103.16.0/20 +202.103.32.0/19 +202.103.64.0/19 +202.103.96.0/21 +202.103.104.0/21 +202.103.112.0/20 +202.103.128.0/18 +202.103.192.0/19 +202.103.224.0/21 +202.103.232.0/21 +202.103.240.0/20 +202.104.0.0/15 +202.106.0.0/16 +202.107.0.0/17 +202.107.128.0/17 +202.108.0.0/16 +202.109.0.0/16 +202.110.0.0/18 +202.110.64.0/18 +202.110.128.0/18 +202.110.192.0/18 +202.111.0.0/17 +202.111.128.0/19 +202.111.160.0/19 +202.111.192.0/18 +202.112.0.0/16 +202.113.0.0/20 +202.113.16.0/20 +202.113.32.0/19 +202.113.64.0/18 +202.113.128.0/18 +202.113.192.0/19 +202.113.224.0/20 +202.113.240.0/20 +202.114.0.0/19 +202.114.32.0/19 +202.114.64.0/18 +202.114.128.0/17 +202.115.0.0/19 +202.115.32.0/19 +202.115.64.0/18 +202.115.128.0/17 +202.116.0.0/19 +202.116.32.0/20 +202.116.48.0/20 +202.116.64.0/19 +202.116.96.0/19 +202.116.128.0/17 +202.117.0.0/18 +202.117.64.0/18 +202.117.128.0/17 +202.118.0.0/19 +202.118.32.0/19 +202.118.64.0/18 +202.118.128.0/17 +202.119.0.0/19 +202.119.32.0/19 +202.119.64.0/20 +202.119.80.0/20 +202.119.96.0/19 +202.119.128.0/17 +202.120.0.0/18 +202.120.64.0/18 +202.120.128.0/17 +202.121.0.0/16 +202.122.0.0/21 +202.122.32.0/21 +202.122.64.0/19 +202.122.112.0/21 +202.122.120.0/21 +202.122.128.0/24 +202.122.132.0/24 +202.123.96.0/20 +202.123.116.0/22 +202.123.120.0/22 +202.124.16.0/21 +202.124.24.0/22 +202.125.107.0/24 +202.125.109.0/24 +202.125.112.0/20 +202.125.176.0/20 +202.127.0.0/23 +202.127.2.0/24 +202.127.3.0/24 +202.127.4.0/24 +202.127.5.0/24 +202.127.6.0/23 +202.127.12.0/22 +202.127.16.0/20 +202.127.40.0/21 +202.127.48.0/20 +202.127.112.0/20 +202.127.128.0/20 +202.127.144.0/20 +202.127.160.0/21 +202.127.192.0/23 +202.127.194.0/23 +202.127.196.0/22 +202.127.200.0/21 +202.127.208.0/24 +202.127.209.0/24 +202.127.212.0/22 +202.127.216.0/21 +202.127.224.0/19 +202.129.208.0/24 +202.130.0.0/19 +202.130.39.0/24 +202.130.224.0/19 +202.131.16.0/21 +202.131.48.0/20 +202.131.208.0/20 +202.133.32.0/20 +202.134.58.0/24 +202.134.128.0/20 +202.134.208.0/22 +202.134.212.0/22 +202.134.216.0/22 +202.134.220.0/22 +202.136.48.0/20 +202.136.208.0/20 +202.136.224.0/20 +202.136.248.0/22 +202.137.231.0/24 +202.140.140.0/22 +202.140.144.0/22 +202.140.148.0/22 +202.140.152.0/22 +202.140.156.0/22 +202.141.160.0/19 +202.142.16.0/20 +202.143.4.0/22 +202.143.16.0/20 +202.143.32.0/20 +202.143.56.0/21 +202.143.100.0/22 +202.143.104.0/22 +202.144.196.0/22 +202.146.160.0/20 +202.146.186.0/24 +202.146.188.0/22 +202.146.196.0/22 +202.146.200.0/21 +202.147.144.0/20 +202.148.32.0/20 +202.148.64.0/19 +202.148.96.0/19 +202.149.32.0/19 +202.149.160.0/19 +202.149.224.0/19 +202.150.16.0/20 +202.150.32.0/20 +202.150.56.0/22 +202.150.192.0/20 +202.150.224.0/19 +202.151.0.0/22 +202.151.33.0/24 +202.151.128.0/19 +202.152.176.0/20 +202.153.0.0/22 +202.153.7.0/24 +202.153.48.0/20 +202.157.192.0/19 +202.158.160.0/19 +202.158.242.0/24 +202.160.140.0/22 +202.160.156.0/22 +202.160.176.0/20 +202.162.67.0/24 +202.162.75.0/24 +202.164.0.0/20 +202.164.96.0/19 +202.165.176.0/20 +202.165.208.0/20 +202.165.239.0/24 +202.165.240.0/23 +202.165.243.0/24 +202.165.245.0/24 +202.165.251.0/24 +202.165.252.0/22 +202.166.224.0/19 +202.168.80.0/22 +202.168.128.0/22 +202.168.132.0/22 +202.168.136.0/22 +202.168.140.0/22 +202.168.160.0/20 +202.168.176.0/20 +202.170.128.0/19 +202.170.216.0/21 +202.170.224.0/19 +202.171.216.0/21 +202.171.232.0/24 +202.171.235.0/24 +202.172.0.0/22 +202.172.7.0/24 +202.173.0.0/22 +202.173.6.0/24 +202.173.8.0/21 +202.173.112.0/22 +202.173.224.0/19 +202.174.64.0/20 +202.174.124.0/22 +202.176.224.0/19 +202.179.160.0/22 +202.179.164.0/22 +202.179.168.0/22 +202.179.172.0/22 +202.179.240.0/20 +202.180.128.0/19 +202.180.208.0/21 +202.181.8.0/22 +202.181.28.0/22 +202.181.112.0/20 +202.182.32.0/20 +202.182.192.0/19 +202.189.0.0/18 +202.189.80.0/20 +202.189.184.0/21 +202.191.0.0/24 +202.191.68.0/22 +202.191.72.0/21 +202.191.80.0/20 +202.192.0.0/13 +202.200.0.0/14 +202.204.0.0/14 +203.0.4.0/22 +203.0.10.0/23 +203.0.18.0/24 +203.0.24.0/24 +203.0.42.0/23 +203.0.45.0/24 +203.0.46.0/23 +203.0.81.0/24 +203.0.82.0/23 +203.0.90.0/23 +203.0.96.0/23 +203.0.104.0/21 +203.0.114.0/23 +203.0.122.0/24 +203.0.128.0/24 +203.0.130.0/23 +203.0.132.0/22 +203.0.137.0/24 +203.0.142.0/24 +203.0.144.0/24 +203.0.146.0/24 +203.0.148.0/24 +203.0.150.0/23 +203.0.152.0/24 +203.0.177.0/24 +203.0.224.0/24 +203.1.4.0/22 +203.1.18.0/24 +203.1.26.0/23 +203.1.65.0/24 +203.1.66.0/23 +203.1.70.0/23 +203.1.76.0/23 +203.1.90.0/24 +203.1.97.0/24 +203.1.98.0/23 +203.1.100.0/22 +203.1.108.0/24 +203.1.253.0/24 +203.1.254.0/24 +203.2.64.0/21 +203.2.73.0/24 +203.2.112.0/21 +203.2.126.0/23 +203.2.140.0/24 +203.2.150.0/24 +203.2.152.0/22 +203.2.156.0/23 +203.2.160.0/21 +203.2.180.0/23 +203.2.196.0/23 +203.2.209.0/24 +203.2.214.0/23 +203.2.226.0/23 +203.2.229.0/24 +203.2.236.0/23 +203.3.68.0/24 +203.3.72.0/23 +203.3.75.0/24 +203.3.80.0/21 +203.3.96.0/22 +203.3.105.0/24 +203.3.112.0/21 +203.3.120.0/24 +203.3.123.0/24 +203.3.135.0/24 +203.3.139.0/24 +203.3.143.0/24 +203.4.132.0/23 +203.4.134.0/24 +203.4.151.0/24 +203.4.152.0/22 +203.4.174.0/23 +203.4.180.0/24 +203.4.186.0/24 +203.4.205.0/24 +203.4.208.0/22 +203.4.227.0/24 +203.4.230.0/23 +203.5.4.0/23 +203.5.7.0/24 +203.5.8.0/23 +203.5.11.0/24 +203.5.21.0/24 +203.5.22.0/24 +203.5.44.0/24 +203.5.46.0/23 +203.5.52.0/22 +203.5.56.0/23 +203.5.60.0/23 +203.5.114.0/23 +203.5.118.0/24 +203.5.120.0/24 +203.5.172.0/24 +203.5.180.0/23 +203.5.182.0/24 +203.5.185.0/24 +203.5.186.0/24 +203.5.188.0/23 +203.5.190.0/24 +203.5.195.0/24 +203.5.214.0/23 +203.5.218.0/23 +203.6.131.0/24 +203.6.136.0/24 +203.6.138.0/23 +203.6.142.0/24 +203.6.150.0/23 +203.6.157.0/24 +203.6.159.0/24 +203.6.224.0/20 +203.6.248.0/23 +203.7.129.0/24 +203.7.138.0/23 +203.7.147.0/24 +203.7.150.0/23 +203.7.158.0/24 +203.7.192.0/23 +203.7.200.0/24 +203.8.0.0/24 +203.8.8.0/24 +203.8.23.0/24 +203.8.70.0/24 +203.8.82.0/24 +203.8.86.0/23 +203.8.91.0/24 +203.8.110.0/23 +203.8.115.0/24 +203.8.166.0/23 +203.8.169.0/24 +203.8.173.0/24 +203.8.184.0/24 +203.8.186.0/23 +203.8.190.0/23 +203.8.192.0/24 +203.8.197.0/24 +203.8.198.0/23 +203.8.203.0/24 +203.8.209.0/24 +203.8.210.0/23 +203.8.212.0/22 +203.8.217.0/24 +203.8.220.0/24 +203.9.32.0/24 +203.9.36.0/23 +203.9.57.0/24 +203.9.63.0/24 +203.9.65.0/24 +203.9.70.0/23 +203.9.72.0/24 +203.9.75.0/24 +203.9.76.0/23 +203.9.96.0/22 +203.9.100.0/23 +203.9.108.0/24 +203.9.158.0/24 +203.10.34.0/24 +203.10.56.0/24 +203.10.74.0/23 +203.10.84.0/22 +203.10.88.0/24 +203.10.95.0/24 +203.10.125.0/24 +203.11.70.0/24 +203.11.76.0/22 +203.11.82.0/24 +203.11.84.0/22 +203.11.100.0/22 +203.11.109.0/24 +203.11.117.0/24 +203.11.122.0/24 +203.11.126.0/24 +203.11.136.0/22 +203.11.141.0/24 +203.11.142.0/23 +203.11.180.0/22 +203.11.208.0/22 +203.12.16.0/24 +203.12.19.0/24 +203.12.24.0/24 +203.12.57.0/24 +203.12.65.0/24 +203.12.66.0/24 +203.12.70.0/23 +203.12.87.0/24 +203.12.100.0/23 +203.12.103.0/24 +203.12.114.0/24 +203.12.118.0/24 +203.12.130.0/24 +203.12.137.0/24 +203.12.196.0/22 +203.12.211.0/24 +203.12.219.0/24 +203.12.226.0/24 +203.12.240.0/22 +203.13.18.0/24 +203.13.24.0/24 +203.13.44.0/23 +203.13.88.0/23 +203.13.92.0/22 +203.13.173.0/24 +203.13.224.0/23 +203.13.227.0/24 +203.13.233.0/24 +203.14.24.0/22 +203.14.33.0/24 +203.14.56.0/24 +203.14.61.0/24 +203.14.62.0/24 +203.14.104.0/24 +203.14.114.0/23 +203.14.118.0/24 +203.14.162.0/24 +203.14.192.0/24 +203.14.194.0/23 +203.14.214.0/24 +203.14.231.0/24 +203.14.246.0/24 +203.15.0.0/20 +203.15.20.0/23 +203.15.22.0/24 +203.15.87.0/24 +203.15.88.0/23 +203.15.105.0/24 +203.15.112.0/21 +203.15.130.0/23 +203.15.149.0/24 +203.15.151.0/24 +203.15.156.0/22 +203.15.174.0/24 +203.15.227.0/24 +203.15.232.0/21 +203.15.240.0/23 +203.15.246.0/24 +203.16.10.0/24 +203.16.12.0/23 +203.16.16.0/21 +203.16.27.0/24 +203.16.38.0/24 +203.16.49.0/24 +203.16.50.0/23 +203.16.58.0/24 +203.16.63.0/24 +203.16.133.0/24 +203.16.161.0/24 +203.16.162.0/24 +203.16.186.0/23 +203.16.228.0/24 +203.16.238.0/24 +203.16.240.0/24 +203.16.245.0/24 +203.17.2.0/24 +203.17.18.0/24 +203.17.28.0/24 +203.17.39.0/24 +203.17.56.0/24 +203.17.74.0/23 +203.17.88.0/23 +203.17.136.0/24 +203.17.164.0/24 +203.17.187.0/24 +203.17.190.0/23 +203.17.231.0/24 +203.17.233.0/24 +203.17.248.0/24 +203.17.249.0/24 +203.17.255.0/24 +203.18.2.0/23 +203.18.4.0/24 +203.18.7.0/24 +203.18.31.0/24 +203.18.37.0/24 +203.18.48.0/23 +203.18.52.0/24 +203.18.72.0/22 +203.18.80.0/23 +203.18.87.0/24 +203.18.100.0/23 +203.18.105.0/24 +203.18.107.0/24 +203.18.110.0/24 +203.18.129.0/24 +203.18.131.0/24 +203.18.132.0/23 +203.18.144.0/24 +203.18.153.0/24 +203.18.199.0/24 +203.18.208.0/24 +203.18.211.0/24 +203.18.215.0/24 +203.19.1.0/24 +203.19.18.0/24 +203.19.24.0/24 +203.19.30.0/24 +203.19.32.0/21 +203.19.41.0/24 +203.19.44.0/23 +203.19.46.0/24 +203.19.58.0/24 +203.19.60.0/23 +203.19.64.0/24 +203.19.68.0/24 +203.19.72.0/24 +203.19.101.0/24 +203.19.111.0/24 +203.19.131.0/24 +203.19.133.0/24 +203.19.144.0/24 +203.19.147.0/24 +203.19.149.0/24 +203.19.156.0/24 +203.19.176.0/24 +203.19.178.0/23 +203.19.208.0/24 +203.19.228.0/22 +203.19.233.0/24 +203.19.242.0/24 +203.19.248.0/23 +203.19.255.0/24 +203.20.17.0/24 +203.20.40.0/23 +203.20.44.0/24 +203.20.48.0/24 +203.20.61.0/24 +203.20.65.0/24 +203.20.84.0/23 +203.20.89.0/24 +203.20.106.0/23 +203.20.115.0/24 +203.20.117.0/24 +203.20.118.0/23 +203.20.122.0/24 +203.20.126.0/23 +203.20.135.0/24 +203.20.136.0/21 +203.20.150.0/24 +203.20.230.0/24 +203.20.232.0/24 +203.20.236.0/24 +203.21.0.0/23 +203.21.2.0/24 +203.21.8.0/24 +203.21.10.0/24 +203.21.18.0/24 +203.21.33.0/24 +203.21.34.0/24 +203.21.41.0/24 +203.21.44.0/24 +203.21.68.0/24 +203.21.82.0/24 +203.21.96.0/22 +203.21.124.0/24 +203.21.136.0/23 +203.21.145.0/24 +203.21.206.0/24 +203.22.24.0/24 +203.22.28.0/23 +203.22.31.0/24 +203.22.68.0/24 +203.22.76.0/24 +203.22.78.0/24 +203.22.84.0/24 +203.22.87.0/24 +203.22.92.0/22 +203.22.99.0/24 +203.22.106.0/24 +203.22.122.0/23 +203.22.131.0/24 +203.22.163.0/24 +203.22.166.0/24 +203.22.170.0/24 +203.22.176.0/21 +203.22.194.0/24 +203.22.242.0/23 +203.22.245.0/24 +203.22.246.0/24 +203.22.252.0/23 +203.23.0.0/24 +203.23.47.0/24 +203.23.61.0/24 +203.23.62.0/23 +203.23.73.0/24 +203.23.85.0/24 +203.23.92.0/22 +203.23.98.0/24 +203.23.107.0/24 +203.23.112.0/24 +203.23.130.0/24 +203.23.140.0/23 +203.23.172.0/24 +203.23.182.0/24 +203.23.186.0/23 +203.23.192.0/24 +203.23.197.0/24 +203.23.198.0/24 +203.23.204.0/22 +203.23.224.0/24 +203.23.226.0/23 +203.23.228.0/22 +203.23.249.0/24 +203.23.251.0/24 +203.24.13.0/24 +203.24.18.0/24 +203.24.27.0/24 +203.24.43.0/24 +203.24.56.0/24 +203.24.58.0/24 +203.24.67.0/24 +203.24.74.0/24 +203.24.79.0/24 +203.24.80.0/23 +203.24.84.0/23 +203.24.86.0/24 +203.24.90.0/24 +203.24.111.0/24 +203.24.112.0/24 +203.24.116.0/24 +203.24.122.0/23 +203.24.145.0/24 +203.24.152.0/23 +203.24.157.0/24 +203.24.161.0/24 +203.24.167.0/24 +203.24.186.0/23 +203.24.199.0/24 +203.24.202.0/24 +203.24.212.0/23 +203.24.217.0/24 +203.24.219.0/24 +203.24.244.0/24 +203.25.19.0/24 +203.25.20.0/23 +203.25.46.0/24 +203.25.48.0/21 +203.25.64.0/23 +203.25.91.0/24 +203.25.99.0/24 +203.25.100.0/24 +203.25.106.0/24 +203.25.131.0/24 +203.25.135.0/24 +203.25.138.0/24 +203.25.147.0/24 +203.25.153.0/24 +203.25.154.0/23 +203.25.164.0/24 +203.25.166.0/24 +203.25.174.0/23 +203.25.180.0/24 +203.25.182.0/24 +203.25.191.0/24 +203.25.199.0/24 +203.25.200.0/24 +203.25.202.0/23 +203.25.208.0/20 +203.25.229.0/24 +203.25.235.0/24 +203.25.236.0/24 +203.25.242.0/24 +203.26.12.0/24 +203.26.34.0/24 +203.26.49.0/24 +203.26.50.0/24 +203.26.55.0/24 +203.26.56.0/23 +203.26.60.0/24 +203.26.65.0/24 +203.26.68.0/24 +203.26.76.0/24 +203.26.80.0/24 +203.26.84.0/24 +203.26.97.0/24 +203.26.102.0/23 +203.26.115.0/24 +203.26.116.0/24 +203.26.129.0/24 +203.26.143.0/24 +203.26.144.0/24 +203.26.148.0/23 +203.26.154.0/24 +203.26.158.0/23 +203.26.170.0/24 +203.26.173.0/24 +203.26.176.0/24 +203.26.185.0/24 +203.26.202.0/23 +203.26.210.0/24 +203.26.214.0/24 +203.26.222.0/24 +203.26.224.0/24 +203.26.228.0/24 +203.26.232.0/24 +203.27.0.0/24 +203.27.10.0/24 +203.27.15.0/24 +203.27.16.0/24 +203.27.20.0/24 +203.27.22.0/23 +203.27.40.0/24 +203.27.45.0/24 +203.27.53.0/24 +203.27.65.0/24 +203.27.66.0/24 +203.27.81.0/24 +203.27.88.0/24 +203.27.102.0/24 +203.27.109.0/24 +203.27.117.0/24 +203.27.121.0/24 +203.27.122.0/23 +203.27.125.0/24 +203.27.200.0/24 +203.27.202.0/24 +203.27.233.0/24 +203.27.241.0/24 +203.27.250.0/24 +203.28.10.0/24 +203.28.12.0/24 +203.28.33.0/24 +203.28.34.0/23 +203.28.43.0/24 +203.28.44.0/24 +203.28.54.0/24 +203.28.56.0/24 +203.28.73.0/24 +203.28.74.0/24 +203.28.76.0/24 +203.28.86.0/24 +203.28.88.0/24 +203.28.112.0/24 +203.28.131.0/24 +203.28.136.0/24 +203.28.140.0/24 +203.28.145.0/24 +203.28.165.0/24 +203.28.169.0/24 +203.28.170.0/24 +203.28.178.0/23 +203.28.185.0/24 +203.28.187.0/24 +203.28.196.0/24 +203.28.226.0/23 +203.28.239.0/24 +203.29.2.0/24 +203.29.8.0/23 +203.29.13.0/24 +203.29.14.0/24 +203.29.28.0/24 +203.29.46.0/24 +203.29.57.0/24 +203.29.61.0/24 +203.29.63.0/24 +203.29.69.0/24 +203.29.73.0/24 +203.29.81.0/24 +203.29.90.0/24 +203.29.95.0/24 +203.29.100.0/24 +203.29.103.0/24 +203.29.112.0/24 +203.29.120.0/22 +203.29.182.0/23 +203.29.187.0/24 +203.29.189.0/24 +203.29.190.0/24 +203.29.205.0/24 +203.29.210.0/24 +203.29.217.0/24 +203.29.227.0/24 +203.29.231.0/24 +203.29.233.0/24 +203.29.234.0/24 +203.29.248.0/24 +203.29.254.0/23 +203.30.16.0/23 +203.30.25.0/24 +203.30.27.0/24 +203.30.29.0/24 +203.30.66.0/24 +203.30.81.0/24 +203.30.87.0/24 +203.30.111.0/24 +203.30.121.0/24 +203.30.123.0/24 +203.30.152.0/24 +203.30.156.0/24 +203.30.162.0/24 +203.30.173.0/24 +203.30.175.0/24 +203.30.187.0/24 +203.30.194.0/24 +203.30.217.0/24 +203.30.220.0/24 +203.30.222.0/24 +203.30.232.0/23 +203.30.235.0/24 +203.30.240.0/23 +203.30.246.0/24 +203.30.250.0/23 +203.31.45.0/24 +203.31.46.0/24 +203.31.49.0/24 +203.31.51.0/24 +203.31.54.0/23 +203.31.69.0/24 +203.31.72.0/24 +203.31.80.0/24 +203.31.85.0/24 +203.31.97.0/24 +203.31.105.0/24 +203.31.106.0/24 +203.31.108.0/23 +203.31.124.0/24 +203.31.162.0/24 +203.31.174.0/24 +203.31.177.0/24 +203.31.181.0/24 +203.31.187.0/24 +203.31.189.0/24 +203.31.204.0/24 +203.31.220.0/24 +203.31.222.0/23 +203.31.225.0/24 +203.31.229.0/24 +203.31.248.0/23 +203.31.253.0/24 +203.32.20.0/24 +203.32.48.0/23 +203.32.56.0/24 +203.32.60.0/24 +203.32.62.0/24 +203.32.68.0/23 +203.32.76.0/24 +203.32.81.0/24 +203.32.84.0/23 +203.32.95.0/24 +203.32.102.0/24 +203.32.105.0/24 +203.32.130.0/24 +203.32.133.0/24 +203.32.140.0/24 +203.32.152.0/24 +203.32.186.0/23 +203.32.192.0/24 +203.32.196.0/24 +203.32.203.0/24 +203.32.204.0/23 +203.32.212.0/24 +203.33.4.0/24 +203.33.7.0/24 +203.33.8.0/21 +203.33.21.0/24 +203.33.26.0/24 +203.33.32.0/24 +203.33.63.0/24 +203.33.64.0/24 +203.33.67.0/24 +203.33.68.0/24 +203.33.73.0/24 +203.33.79.0/24 +203.33.100.0/24 +203.33.122.0/24 +203.33.129.0/24 +203.33.131.0/24 +203.33.145.0/24 +203.33.156.0/24 +203.33.158.0/23 +203.33.174.0/24 +203.33.185.0/24 +203.33.200.0/24 +203.33.202.0/23 +203.33.204.0/24 +203.33.206.0/23 +203.33.214.0/23 +203.33.224.0/23 +203.33.226.0/24 +203.33.233.0/24 +203.33.243.0/24 +203.33.250.0/24 +203.34.4.0/24 +203.34.21.0/24 +203.34.27.0/24 +203.34.39.0/24 +203.34.48.0/23 +203.34.54.0/24 +203.34.56.0/23 +203.34.67.0/24 +203.34.69.0/24 +203.34.76.0/24 +203.34.92.0/24 +203.34.106.0/24 +203.34.113.0/24 +203.34.147.0/24 +203.34.150.0/24 +203.34.152.0/23 +203.34.161.0/24 +203.34.162.0/24 +203.34.187.0/24 +203.34.192.0/21 +203.34.204.0/22 +203.34.232.0/24 +203.34.240.0/24 +203.34.242.0/24 +203.34.245.0/24 +203.34.251.0/24 +203.55.2.0/23 +203.55.4.0/24 +203.55.10.0/24 +203.55.13.0/24 +203.55.22.0/24 +203.55.30.0/24 +203.55.93.0/24 +203.55.101.0/24 +203.55.109.0/24 +203.55.110.0/24 +203.55.116.0/23 +203.55.119.0/24 +203.55.128.0/23 +203.55.146.0/23 +203.55.192.0/24 +203.55.196.0/24 +203.55.218.0/23 +203.55.221.0/24 +203.55.224.0/24 +203.56.1.0/24 +203.56.4.0/24 +203.56.12.0/24 +203.56.24.0/24 +203.56.38.0/24 +203.56.40.0/24 +203.56.46.0/24 +203.56.48.0/21 +203.56.68.0/23 +203.56.82.0/23 +203.56.84.0/23 +203.56.95.0/24 +203.56.110.0/24 +203.56.121.0/24 +203.56.161.0/24 +203.56.169.0/24 +203.56.172.0/23 +203.56.175.0/24 +203.56.183.0/24 +203.56.185.0/24 +203.56.187.0/24 +203.56.192.0/24 +203.56.198.0/24 +203.56.201.0/24 +203.56.208.0/23 +203.56.210.0/24 +203.56.214.0/24 +203.56.216.0/24 +203.56.227.0/24 +203.56.228.0/24 +203.56.231.0/24 +203.56.232.0/24 +203.56.240.0/24 +203.56.252.0/24 +203.56.254.0/24 +203.57.5.0/24 +203.57.6.0/24 +203.57.12.0/23 +203.57.28.0/24 +203.57.39.0/24 +203.57.46.0/24 +203.57.58.0/24 +203.57.61.0/24 +203.57.66.0/24 +203.57.69.0/24 +203.57.70.0/23 +203.57.73.0/24 +203.57.90.0/24 +203.57.101.0/24 +203.57.109.0/24 +203.57.123.0/24 +203.57.157.0/24 +203.57.200.0/24 +203.57.202.0/24 +203.57.206.0/24 +203.57.222.0/24 +203.57.224.0/20 +203.57.246.0/23 +203.57.249.0/24 +203.57.253.0/24 +203.57.254.0/23 +203.62.2.0/24 +203.62.131.0/24 +203.62.139.0/24 +203.62.161.0/24 +203.62.197.0/24 +203.62.228.0/22 +203.62.234.0/24 +203.62.246.0/24 +203.76.160.0/22 +203.76.168.0/22 +203.76.208.0/22 +203.76.212.0/22 +203.76.216.0/22 +203.76.240.0/22 +203.76.244.0/22 +203.77.180.0/22 +203.78.48.0/20 +203.78.156.0/22 +203.79.0.0/20 +203.79.32.0/20 +203.80.4.0/23 +203.80.32.0/20 +203.80.57.0/24 +203.80.129.0/24 +203.80.132.0/22 +203.80.136.0/21 +203.80.144.0/20 +203.81.0.0/21 +203.81.16.0/20 +203.81.244.0/22 +203.82.0.0/23 +203.82.16.0/21 +203.82.112.0/22 +203.82.116.0/22 +203.82.120.0/22 +203.82.124.0/22 +203.82.224.0/22 +203.82.228.0/22 +203.82.232.0/22 +203.82.236.0/22 +203.83.0.0/22 +203.83.8.0/22 +203.83.12.0/22 +203.83.56.0/21 +203.83.224.0/20 +203.86.0.0/19 +203.86.32.0/19 +203.86.64.0/20 +203.86.80.0/20 +203.86.96.0/19 +203.86.250.0/24 +203.86.254.0/23 +203.88.32.0/19 +203.88.192.0/19 +203.89.0.0/22 +203.89.8.0/21 +203.89.100.0/22 +203.89.133.0/24 +203.89.136.0/22 +203.89.144.0/24 +203.90.0.0/22 +203.90.8.0/22 +203.90.12.0/22 +203.90.128.0/19 +203.90.160.0/19 +203.90.192.0/19 +203.91.32.0/19 +203.91.96.0/20 +203.91.120.0/21 +203.92.0.0/22 +203.92.6.0/24 +203.92.160.0/19 +203.93.0.0/22 +203.93.4.0/22 +203.93.8.0/24 +203.93.9.0/24 +203.93.10.0/23 +203.93.12.0/22 +203.93.16.0/20 +203.93.32.0/19 +203.93.64.0/18 +203.93.128.0/21 +203.93.136.0/22 +203.93.140.0/24 +203.93.141.0/24 +203.93.142.0/23 +203.93.144.0/20 +203.93.160.0/19 +203.93.192.0/18 +203.94.0.0/22 +203.94.4.0/22 +203.94.8.0/21 +203.94.16.0/20 +203.95.0.0/21 +203.95.96.0/20 +203.95.112.0/20 +203.95.128.0/18 +203.95.200.0/22 +203.95.204.0/22 +203.95.208.0/22 +203.95.224.0/19 +203.99.8.0/21 +203.99.16.0/20 +203.99.80.0/20 +203.100.32.0/20 +203.100.48.0/21 +203.100.58.0/24 +203.100.60.0/24 +203.100.63.0/24 +203.100.80.0/20 +203.100.96.0/19 +203.100.192.0/20 +203.104.32.0/20 +203.105.96.0/19 +203.105.128.0/19 +203.107.0.0/17 +203.110.160.0/19 +203.110.208.0/20 +203.110.232.0/23 +203.110.234.0/24 +203.114.80.0/22 +203.114.84.0/22 +203.114.88.0/22 +203.114.92.0/22 +203.114.244.0/22 +203.118.192.0/19 +203.118.241.0/24 +203.118.248.0/22 +203.119.24.0/21 +203.119.32.0/22 +203.119.80.0/22 +203.119.85.0/24 +203.119.113.0/24 +203.119.114.0/23 +203.119.116.0/22 +203.119.120.0/21 +203.119.128.0/17 +203.123.58.0/24 +203.128.32.0/19 +203.128.96.0/19 +203.128.224.0/21 +203.129.8.0/21 +203.130.32.0/19 +203.132.32.0/19 +203.134.240.0/21 +203.135.96.0/20 +203.135.112.0/20 +203.135.160.0/20 +203.142.219.0/24 +203.142.224.0/19 +203.144.96.0/19 +203.145.0.0/19 +203.148.0.0/18 +203.148.64.0/20 +203.148.80.0/22 +203.148.86.0/23 +203.149.92.0/22 +203.152.64.0/19 +203.152.128.0/19 +203.153.0.0/22 +203.156.192.0/18 +203.158.16.0/21 +203.160.52.0/22 +203.160.104.0/21 +203.160.129.0/24 +203.160.192.0/19 +203.161.0.0/22 +203.161.180.0/24 +203.161.183.0/24 +203.161.192.0/19 +203.166.160.0/19 +203.167.28.0/22 +203.168.0.0/19 +203.170.58.0/23 +203.171.0.0/22 +203.171.208.0/24 +203.171.224.0/20 +203.174.4.0/24 +203.174.6.0/24 +203.174.7.0/24 +203.174.96.0/19 +203.175.128.0/19 +203.175.192.0/18 +203.176.0.0/18 +203.176.64.0/19 +203.176.168.0/21 +203.184.80.0/20 +203.185.189.0/24 +203.187.160.0/19 +203.189.0.0/23 +203.189.6.0/23 +203.189.112.0/22 +203.189.192.0/19 +203.189.240.0/22 +203.190.96.0/20 +203.190.249.0/24 +203.191.0.0/23 +203.191.2.0/24 +203.191.5.0/24 +203.191.7.0/24 +203.191.16.0/20 +203.191.64.0/18 +203.191.133.0/24 +203.191.144.0/21 +203.191.152.0/21 +203.192.0.0/19 +203.193.224.0/19 +203.194.120.0/21 +203.195.64.0/19 +203.195.112.0/21 +203.195.128.0/17 +203.196.0.0/21 +203.196.8.0/21 +203.196.28.0/22 +203.201.181.0/24 +203.201.182.0/24 +203.202.236.0/22 +203.205.64.0/19 +203.205.128.0/17 +203.207.64.0/20 +203.207.80.0/21 +203.207.88.0/22 +203.207.92.0/22 +203.207.96.0/20 +203.207.112.0/20 +203.207.128.0/18 +203.207.192.0/21 +203.207.200.0/21 +203.207.208.0/20 +203.207.224.0/19 +203.208.0.0/20 +203.208.16.0/22 +203.208.32.0/19 +203.209.224.0/19 +203.212.0.0/20 +203.212.80.0/20 +203.215.232.0/21 +203.217.164.0/22 +203.223.0.0/20 +203.223.16.0/21 +204.52.191.0/24 +210.2.0.0/20 +210.2.16.0/20 +210.5.0.0/19 +210.5.56.0/21 +210.5.128.0/20 +210.5.144.0/20 +210.7.56.0/22 +210.7.60.0/22 +210.12.0.0/18 +210.12.64.0/18 +210.12.128.0/18 +210.12.192.0/18 +210.13.0.0/18 +210.13.64.0/18 +210.13.128.0/17 +210.14.64.0/19 +210.14.112.0/20 +210.14.128.0/19 +210.14.160.0/19 +210.14.192.0/19 +210.14.224.0/19 +210.15.0.0/19 +210.15.32.0/19 +210.15.64.0/19 +210.15.96.0/19 +210.15.128.0/18 +210.16.104.0/22 +210.16.128.0/18 +210.21.0.0/17 +210.21.128.0/17 +210.22.0.0/16 +210.23.32.0/19 +210.25.0.0/16 +210.26.0.0/15 +210.28.0.0/14 +210.32.0.0/14 +210.36.0.0/14 +210.40.0.0/13 +210.51.0.0/16 +210.52.0.0/18 +210.52.64.0/18 +210.52.128.0/17 +210.53.0.0/17 +210.53.128.0/17 +210.56.192.0/19 +210.72.0.0/17 +210.72.128.0/19 +210.72.160.0/19 +210.72.192.0/18 +210.73.0.0/19 +210.73.32.0/19 +210.73.64.0/18 +210.73.128.0/17 +210.74.0.0/19 +210.74.32.0/19 +210.74.64.0/19 +210.74.96.0/19 +210.74.128.0/19 +210.74.160.0/19 +210.74.192.0/18 +210.75.0.0/16 +210.76.0.0/19 +210.76.32.0/19 +210.76.64.0/18 +210.76.128.0/17 +210.77.0.0/16 +210.78.0.0/19 +210.78.32.0/19 +210.78.64.0/18 +210.78.128.0/19 +210.78.160.0/19 +210.78.192.0/18 +210.79.64.0/18 +210.79.224.0/19 +210.82.0.0/15 +210.87.128.0/20 +210.87.144.0/20 +210.87.160.0/19 +210.185.192.0/18 +210.192.96.0/19 +211.64.0.0/14 +211.68.0.0/15 +211.70.0.0/15 +211.80.0.0/16 +211.81.0.0/16 +211.82.0.0/16 +211.83.0.0/16 +211.84.0.0/15 +211.86.0.0/15 +211.88.0.0/16 +211.89.0.0/16 +211.90.0.0/15 +211.92.0.0/15 +211.94.0.0/15 +211.96.0.0/15 +211.98.0.0/16 +211.99.0.0/18 +211.99.64.0/19 +211.99.96.0/19 +211.99.128.0/17 +211.100.0.0/16 +211.101.0.0/18 +211.101.64.0/18 +211.101.128.0/17 +211.102.0.0/16 +211.103.0.0/17 +211.103.128.0/17 +211.136.0.0/14 +211.140.0.0/15 +211.142.0.0/17 +211.142.128.0/17 +211.143.0.0/16 +211.144.0.0/15 +211.146.0.0/16 +211.147.0.0/16 +211.148.0.0/14 +211.152.0.0/15 +211.154.0.0/16 +211.155.0.0/18 +211.155.64.0/19 +211.155.96.0/19 +211.155.128.0/17 +211.156.0.0/14 +211.160.0.0/14 +211.164.0.0/14 +212.64.0.0/17 +212.129.128.0/17 +218.0.0.0/16 +218.1.0.0/16 +218.2.0.0/15 +218.4.0.0/15 +218.6.0.0/16 +218.7.0.0/16 +218.8.0.0/15 +218.10.0.0/16 +218.11.0.0/16 +218.12.0.0/16 +218.13.0.0/16 +218.14.0.0/15 +218.16.0.0/14 +218.20.0.0/16 +218.21.0.0/17 +218.21.128.0/17 +218.22.0.0/15 +218.24.0.0/15 +218.26.0.0/16 +218.27.0.0/16 +218.28.0.0/15 +218.30.0.0/15 +218.56.0.0/14 +218.60.0.0/15 +218.62.0.0/17 +218.62.128.0/17 +218.63.0.0/16 +218.64.0.0/15 +218.66.0.0/16 +218.67.0.0/17 +218.67.128.0/17 +218.68.0.0/15 +218.70.0.0/15 +218.72.0.0/14 +218.76.0.0/15 +218.78.0.0/15 +218.80.0.0/14 +218.84.0.0/14 +218.88.0.0/13 +218.96.0.0/15 +218.98.0.0/17 +218.98.128.0/18 +218.98.192.0/19 +218.98.224.0/19 +218.99.0.0/16 +218.100.88.0/21 +218.100.96.0/19 +218.100.128.0/17 +218.104.0.0/17 +218.104.128.0/19 +218.104.160.0/19 +218.104.192.0/21 +218.104.200.0/21 +218.104.208.0/20 +218.104.224.0/19 +218.105.0.0/16 +218.106.0.0/15 +218.108.0.0/16 +218.109.0.0/16 +218.185.192.0/19 +218.185.240.0/21 +218.192.0.0/16 +218.193.0.0/16 +218.194.0.0/16 +218.195.0.0/16 +218.196.0.0/14 +218.200.0.0/14 +218.204.0.0/15 +218.206.0.0/15 +218.240.0.0/14 +218.244.0.0/15 +218.246.0.0/15 +218.249.0.0/16 +219.72.0.0/16 +219.82.0.0/16 +219.83.128.0/17 +219.90.68.0/22 +219.90.72.0/22 +219.90.76.0/22 +219.128.0.0/12 +219.144.0.0/14 +219.148.0.0/16 +219.149.0.0/17 +219.149.128.0/18 +219.149.192.0/18 +219.150.0.0/19 +219.150.32.0/19 +219.150.64.0/19 +219.150.96.0/20 +219.150.112.0/20 +219.150.128.0/17 +219.151.0.0/19 +219.151.32.0/19 +219.151.64.0/18 +219.151.128.0/17 +219.152.0.0/15 +219.154.0.0/15 +219.156.0.0/15 +219.158.0.0/17 +219.158.128.0/17 +219.159.0.0/18 +219.159.64.0/18 +219.159.128.0/17 +219.216.0.0/15 +219.218.0.0/15 +219.220.0.0/16 +219.221.0.0/16 +219.222.0.0/15 +219.224.0.0/15 +219.226.0.0/16 +219.227.0.0/16 +219.228.0.0/15 +219.230.0.0/15 +219.232.0.0/14 +219.236.0.0/15 +219.238.0.0/15 +219.242.0.0/15 +219.244.0.0/14 +220.101.192.0/18 +220.112.0.0/14 +220.152.128.0/17 +220.154.0.0/15 +220.158.240.0/22 +220.160.0.0/11 +220.192.0.0/15 +220.194.0.0/15 +220.196.0.0/14 +220.200.0.0/13 +220.231.0.0/18 +220.231.128.0/17 +220.232.64.0/18 +220.234.0.0/16 +220.242.0.0/15 +220.247.136.0/21 +220.248.0.0/14 +220.252.0.0/16 +221.0.0.0/15 +221.2.0.0/16 +221.3.0.0/17 +221.3.128.0/17 +221.4.0.0/16 +221.5.0.0/17 +221.5.128.0/17 +221.6.0.0/16 +221.7.0.0/19 +221.7.32.0/19 +221.7.64.0/19 +221.7.96.0/19 +221.7.128.0/17 +221.8.0.0/15 +221.10.0.0/16 +221.11.0.0/17 +221.11.128.0/18 +221.11.192.0/19 +221.11.224.0/19 +221.12.0.0/17 +221.12.128.0/18 +221.13.0.0/18 +221.13.64.0/19 +221.13.96.0/19 +221.13.128.0/17 +221.14.0.0/15 +221.122.0.0/15 +221.128.128.0/17 +221.129.0.0/16 +221.130.0.0/15 +221.133.224.0/19 +221.136.0.0/16 +221.137.0.0/16 +221.172.0.0/14 +221.176.0.0/13 +221.192.0.0/15 +221.194.0.0/16 +221.195.0.0/16 +221.196.0.0/15 +221.198.0.0/16 +221.199.0.0/19 +221.199.32.0/20 +221.199.48.0/20 +221.199.64.0/18 +221.199.128.0/18 +221.199.192.0/20 +221.199.224.0/19 +221.200.0.0/14 +221.204.0.0/15 +221.206.0.0/16 +221.207.0.0/18 +221.207.64.0/18 +221.207.128.0/17 +221.208.0.0/14 +221.212.0.0/16 +221.213.0.0/16 +221.214.0.0/15 +221.216.0.0/13 +221.224.0.0/13 +221.232.0.0/14 +221.236.0.0/15 +221.238.0.0/16 +221.239.0.0/17 +221.239.128.0/17 +222.16.0.0/15 +222.18.0.0/15 +222.20.0.0/15 +222.22.0.0/16 +222.23.0.0/16 +222.24.0.0/15 +222.26.0.0/15 +222.28.0.0/14 +222.32.0.0/11 +222.64.0.0/13 +222.72.0.0/15 +222.74.0.0/16 +222.75.0.0/16 +222.76.0.0/14 +222.80.0.0/15 +222.82.0.0/16 +222.83.0.0/17 +222.83.128.0/17 +222.84.0.0/16 +222.85.0.0/17 +222.85.128.0/17 +222.86.0.0/15 +222.88.0.0/15 +222.90.0.0/15 +222.92.0.0/14 +222.125.0.0/16 +222.126.128.0/17 +222.128.0.0/14 +222.132.0.0/14 +222.136.0.0/13 +222.160.0.0/15 +222.162.0.0/16 +222.163.0.0/19 +222.163.32.0/19 +222.163.64.0/18 +222.163.128.0/17 +222.168.0.0/15 +222.170.0.0/15 +222.172.0.0/17 +222.172.128.0/17 +222.173.0.0/16 +222.174.0.0/15 +222.176.0.0/13 +222.184.0.0/13 +222.192.0.0/14 +222.196.0.0/15 +222.198.0.0/16 +222.199.0.0/16 +222.200.0.0/14 +222.204.0.0/15 +222.206.0.0/15 +222.208.0.0/13 +222.216.0.0/15 +222.218.0.0/16 +222.219.0.0/16 +222.220.0.0/15 +222.222.0.0/15 +222.240.0.0/13 +222.248.0.0/16 +222.249.0.0/17 +222.249.128.0/19 +222.249.160.0/20 +222.249.176.0/20 +222.249.192.0/18 +223.0.0.0/15 +223.2.0.0/15 +223.4.0.0/14 +223.8.0.0/13 +223.20.0.0/15 +223.27.184.0/22 +223.29.208.0/22 +223.29.252.0/22 +223.64.0.0/11 +223.96.0.0/12 +223.112.0.0/14 +223.116.0.0/15 +223.120.128.0/17 +223.121.128.0/17 +223.122.128.0/17 +223.123.128.0/17 +223.124.0.0/14 +223.128.0.0/15 +223.144.0.0/12 +223.160.0.0/14 +223.166.0.0/15 +223.192.0.0/15 +223.198.0.0/15 +223.201.0.0/16 +223.202.0.0/15 +223.208.0.0/14 +223.212.0.0/15 +223.214.0.0/15 +223.220.0.0/15 +223.223.176.0/20 +223.223.192.0/20 +223.240.0.0/13 +223.248.0.0/14 +223.252.128.0/17 +223.254.0.0/16 +223.255.0.0/17 +223.255.236.0/22 +223.255.252.0/23 diff --git a/luci-app-ssr-plus/root/etc/ssrplus/deny.list b/luci-app-ssr-plus/root/etc/ssrplus/deny.list new file mode 100644 index 00000000..dc4344e7 --- /dev/null +++ b/luci-app-ssr-plus/root/etc/ssrplus/deny.list @@ -0,0 +1,14 @@ +gvod.aiseejapp.atianqi.com +stat.pandora.xiaomi.com +upgrade.mishop.pandora.xiaomi.com +logonext.tv.kuyun.com +config.kuyun.com +mishop.pandora.xiaomi.com +dvb.pandora.xiaomi.com +api.ad.xiaomi.com +de.pandora.xiaomi.com +data.mistat.xiaomi.com +jellyfish.pandora.xiaomi.com +gallery.pandora.xiaomi.com +o2o.api.xiaomi.com +bss.pandora.xiaomi.com \ No newline at end of file diff --git a/luci-app-ssr-plus/root/etc/ssrplus/gfw_base.conf b/luci-app-ssr-plus/root/etc/ssrplus/gfw_base.conf new file mode 100644 index 00000000..62cec37c --- /dev/null +++ b/luci-app-ssr-plus/root/etc/ssrplus/gfw_base.conf @@ -0,0 +1,108 @@ +ipset=/91smartyun.pt/gfwlist +ipset=/adobe.com/gfwlist +ipset=/amazonaws.com/gfwlist +ipset=/ampproject.org/gfwlist +ipset=/apple.news/gfwlist +ipset=/aws.amazon.com/gfwlist +ipset=/azureedge.net/gfwlist +ipset=/backpackers.com.tw/gfwlist +ipset=/bitfinex.com/gfwlist +ipset=/buzzfeed.com/gfwlist +ipset=/clockwise.ee/gfwlist +ipset=/cloudfront.net/gfwlist +ipset=/coindesk.com/gfwlist +ipset=/coinsquare.io/gfwlist +ipset=/cryptocompare.com/gfwlist +ipset=/dropboxstatic.com/gfwlist +ipset=/eurecom.fr/gfwlist +ipset=/gdax.com/gfwlist +ipset=/github.com/gfwlist +ipset=/kknews.cc/gfwlist +ipset=/nutaq.com/gfwlist +ipset=/openairinterface.org/gfwlist +ipset=/skype.com/gfwlist +ipset=/sublimetext.com/gfwlist +ipset=/textnow.com/gfwlist +ipset=/textnow.me/gfwlist +ipset=/trouter.io/gfwlist +ipset=/t66y.com/gfwlist +ipset=/uploaded.net/gfwlist +ipset=/whatsapp.com/gfwlist +ipset=/whatsapp.net/gfwlist +ipset=/wsj.net/gfwlist +ipset=/google.com/gfwlist +ipset=/google.com.hk/gfwlist +ipset=/gstatic.com/gfwlist +ipset=/googleusercontent.com/gfwlist +ipset=/googlepages.com/gfwlist +ipset=/googlevideo.com/gfwlist +ipset=/googlecode.com/gfwlist +ipset=/googleapis.com/gfwlist +ipset=/googlesource.com/gfwlist +ipset=/googledrive.com/gfwlist +ipset=/ggpht.com/gfwlist +ipset=/youtube.com/gfwlist +ipset=/youtu.be/gfwlist +ipset=/ytimg.com/gfwlist +ipset=/twitter.com/gfwlist +ipset=/facebook.com/gfwlist +ipset=/fastly.net/gfwlist +ipset=/akamai.net/gfwlist +ipset=/akamaiedge.net/gfwlist +ipset=/akamaihd.net/gfwlist +ipset=/edgesuite.net/gfwlist +ipset=/edgekey.net/gfwlist +server=/91smartyun.pt/127.0.0.1#5335 +server=/adobe.com/127.0.0.1#5335 +server=/amazonaws.com/127.0.0.1#5335 +server=/ampproject.org/127.0.0.1#5335 +server=/apple.news/127.0.0.1#5335 +server=/aws.amazon.com/127.0.0.1#5335 +server=/azureedge.net/127.0.0.1#5335 +server=/backpackers.com.tw/127.0.0.1#5335 +server=/bitfinex.com/127.0.0.1#5335 +server=/buzzfeed.com/127.0.0.1#5335 +server=/clockwise.ee/127.0.0.1#5335 +server=/cloudfront.net/127.0.0.1#5335 +server=/coindesk.com/127.0.0.1#5335 +server=/coinsquare.io/127.0.0.1#5335 +server=/cryptocompare.com/127.0.0.1#5335 +server=/dropboxstatic.com/127.0.0.1#5335 +server=/eurecom.fr/127.0.0.1#5335 +server=/gdax.com/127.0.0.1#5335 +server=/github.com/127.0.0.1#5335 +server=/kknews.cc/127.0.0.1#5335 +server=/nutaq.com/127.0.0.1#5335 +server=/openairinterface.org/127.0.0.1#5335 +server=/skype.com/127.0.0.1#5335 +server=/sublimetext.com/127.0.0.1#5335 +server=/textnow.com/127.0.0.1#5335 +server=/textnow.me/127.0.0.1#5335 +server=/trouter.io/127.0.0.1#5335 +server=/t66y.com/127.0.0.1#5335 +server=/uploaded.net/127.0.0.1#5335 +server=/whatsapp.com/127.0.0.1#5335 +server=/whatsapp.net/127.0.0.1#5335 +server=/wsj.net/127.0.0.1#5335 +server=/google.com/127.0.0.1#5335 +server=/google.com.hk/127.0.0.1#5335 +server=/gstatic.com/127.0.0.1#5335 +server=/googleusercontent.com/127.0.0.1#5335 +server=/googlepages.com/127.0.0.1#5335 +server=/googlevideo.com/127.0.0.1#5335 +server=/googlecode.com/127.0.0.1#5335 +server=/googleapis.com/127.0.0.1#5335 +server=/googlesource.com/127.0.0.1#5335 +server=/googledrive.com/127.0.0.1#5335 +server=/ggpht.com/127.0.0.1#5335 +server=/youtube.com/127.0.0.1#5335 +server=/youtu.be/127.0.0.1#5335 +server=/ytimg.com/127.0.0.1#5335 +server=/twitter.com/127.0.0.1#5335 +server=/facebook.com/127.0.0.1#5335 +server=/fastly.net/127.0.0.1#5335 +server=/akamai.net/127.0.0.1#5335 +server=/akamaiedge.net/127.0.0.1#5335 +server=/akamaihd.net/127.0.0.1#5335 +server=/edgesuite.net/127.0.0.1#5335 +server=/edgekey.net/127.0.0.1#5335 diff --git a/luci-app-ssr-plus/root/etc/ssrplus/gfw_list.conf b/luci-app-ssr-plus/root/etc/ssrplus/gfw_list.conf new file mode 100644 index 00000000..a44d3714 --- /dev/null +++ b/luci-app-ssr-plus/root/etc/ssrplus/gfw_list.conf @@ -0,0 +1,35608 @@ +server=/samebags.com/127.0.0.1#5335 +ipset=/samebags.com/gfwlist +server=/premiumhd.net/127.0.0.1#5335 +ipset=/premiumhd.net/gfwlist +server=/facebool.com/127.0.0.1#5335 +ipset=/facebool.com/gfwlist +server=/disneystore.com/127.0.0.1#5335 +ipset=/disneystore.com/gfwlist +server=/lcsmerch.com/127.0.0.1#5335 +ipset=/lcsmerch.com/gfwlist +server=/hentais.tube/127.0.0.1#5335 +ipset=/hentais.tube/gfwlist +server=/teenport.com/127.0.0.1#5335 +ipset=/teenport.com/gfwlist +server=/zeit.sh/127.0.0.1#5335 +ipset=/zeit.sh/gfwlist +server=/mrvideosdesexo.xxx/127.0.0.1#5335 +ipset=/mrvideosdesexo.xxx/gfwlist +server=/xxxindiantv.com/127.0.0.1#5335 +ipset=/xxxindiantv.com/gfwlist +server=/visacheckout.org/127.0.0.1#5335 +ipset=/visacheckout.org/gfwlist +server=/discordapp.net/127.0.0.1#5335 +ipset=/discordapp.net/gfwlist +server=/kaggle.com/127.0.0.1#5335 +ipset=/kaggle.com/gfwlist +server=/bbycontent.net/127.0.0.1#5335 +ipset=/bbycontent.net/gfwlist +server=/imagebam.com/127.0.0.1#5335 +ipset=/imagebam.com/gfwlist +server=/oreillystatic.com/127.0.0.1#5335 +ipset=/oreillystatic.com/gfwlist +server=/ahxxx.club/127.0.0.1#5335 +ipset=/ahxxx.club/gfwlist +server=/duckduckco.com/127.0.0.1#5335 +ipset=/duckduckco.com/gfwlist +server=/duyaoss.com/127.0.0.1#5335 +ipset=/duyaoss.com/gfwlist +server=/buyitnow.org/127.0.0.1#5335 +ipset=/buyitnow.org/gfwlist +server=/paypali.net/127.0.0.1#5335 +ipset=/paypali.net/gfwlist +server=/nvidia.com.tr/127.0.0.1#5335 +ipset=/nvidia.com.tr/gfwlist +server=/applepaycash.tv/127.0.0.1#5335 +ipset=/applepaycash.tv/gfwlist +server=/livestream.com/127.0.0.1#5335 +ipset=/livestream.com/gfwlist +server=/homebrew.bintray.com/127.0.0.1#5335 +ipset=/homebrew.bintray.com/gfwlist +server=/bustylornamorgan.com/127.0.0.1#5335 +ipset=/bustylornamorgan.com/gfwlist +server=/18acg.us/127.0.0.1#5335 +ipset=/18acg.us/gfwlist +server=/google.co.ke/127.0.0.1#5335 +ipset=/google.co.ke/gfwlist +server=/itunes.mx/127.0.0.1#5335 +ipset=/itunes.mx/gfwlist +server=/beatssingaporeshop.com/127.0.0.1#5335 +ipset=/beatssingaporeshop.com/gfwlist +server=/beatsbydreuk.net/127.0.0.1#5335 +ipset=/beatsbydreuk.net/gfwlist +server=/hentaiclub.net/127.0.0.1#5335 +ipset=/hentaiclub.net/gfwlist +server=/cloudchoose.com/127.0.0.1#5335 +ipset=/cloudchoose.com/gfwlist +server=/codeforces.com/127.0.0.1#5335 +ipset=/codeforces.com/gfwlist +server=/lizol.co.in/127.0.0.1#5335 +ipset=/lizol.co.in/gfwlist +server=/applecomputer.com.hk/127.0.0.1#5335 +ipset=/applecomputer.com.hk/gfwlist +server=/bridgestonearena.com/127.0.0.1#5335 +ipset=/bridgestonearena.com/gfwlist +server=/vpngate.net/127.0.0.1#5335 +ipset=/vpngate.net/gfwlist +server=/developer-advisor.com/127.0.0.1#5335 +ipset=/developer-advisor.com/gfwlist +server=/81jia.tv/127.0.0.1#5335 +ipset=/81jia.tv/gfwlist +server=/youtube.co.uk/127.0.0.1#5335 +ipset=/youtube.co.uk/gfwlist +server=/youporngay.com/127.0.0.1#5335 +ipset=/youporngay.com/gfwlist +server=/alphabet.pt/127.0.0.1#5335 +ipset=/alphabet.pt/gfwlist +server=/itfromtheinside.com/127.0.0.1#5335 +ipset=/itfromtheinside.com/gfwlist +server=/teenchoice.com/127.0.0.1#5335 +ipset=/teenchoice.com/gfwlist +server=/filmespornos.net/127.0.0.1#5335 +ipset=/filmespornos.net/gfwlist +server=/ftvnews.com.tw/127.0.0.1#5335 +ipset=/ftvnews.com.tw/gfwlist +server=/kindle.co.jp/127.0.0.1#5335 +ipset=/kindle.co.jp/gfwlist +server=/terraform.io/127.0.0.1#5335 +ipset=/terraform.io/gfwlist +server=/faycbok.com/127.0.0.1#5335 +ipset=/faycbok.com/gfwlist +server=/scpwiki.com/127.0.0.1#5335 +ipset=/scpwiki.com/gfwlist +server=/sexyandfunny.com/127.0.0.1#5335 +ipset=/sexyandfunny.com/gfwlist +server=/google.vg/127.0.0.1#5335 +ipset=/google.vg/gfwlist +server=/runporn.com/127.0.0.1#5335 +ipset=/runporn.com/gfwlist +server=/alivertsm.com/127.0.0.1#5335 +ipset=/alivertsm.com/gfwlist +server=/camwhores.forum/127.0.0.1#5335 +ipset=/camwhores.forum/gfwlist +server=/wolfatbestbuy.net/127.0.0.1#5335 +ipset=/wolfatbestbuy.net/gfwlist +server=/legaltracker.com/127.0.0.1#5335 +ipset=/legaltracker.com/gfwlist +server=/centervillage.co.jp/127.0.0.1#5335 +ipset=/centervillage.co.jp/gfwlist +server=/cshive.com/127.0.0.1#5335 +ipset=/cshive.com/gfwlist +server=/fox13memphis.com/127.0.0.1#5335 +ipset=/fox13memphis.com/gfwlist +server=/appleone.cloud/127.0.0.1#5335 +ipset=/appleone.cloud/gfwlist +server=/aiaa.org/127.0.0.1#5335 +ipset=/aiaa.org/gfwlist +server=/yahoo.rw/127.0.0.1#5335 +ipset=/yahoo.rw/gfwlist +server=/dudethrill.com/127.0.0.1#5335 +ipset=/dudethrill.com/gfwlist +server=/ouplaw.com/127.0.0.1#5335 +ipset=/ouplaw.com/gfwlist +server=/anthemthegame.com/127.0.0.1#5335 +ipset=/anthemthegame.com/gfwlist +server=/adobetag.com/127.0.0.1#5335 +ipset=/adobetag.com/gfwlist +server=/kingkong.com.tw/127.0.0.1#5335 +ipset=/kingkong.com.tw/gfwlist +server=/appleos.tv/127.0.0.1#5335 +ipset=/appleos.tv/gfwlist +server=/igayporn.tv/127.0.0.1#5335 +ipset=/igayporn.tv/gfwlist +server=/beatsheadphonesonline.com/127.0.0.1#5335 +ipset=/beatsheadphonesonline.com/gfwlist +server=/maturetube.com/127.0.0.1#5335 +ipset=/maturetube.com/gfwlist +server=/visasoutheasteurope.com/127.0.0.1#5335 +ipset=/visasoutheasteurope.com/gfwlist +server=/trueamateurs.com/127.0.0.1#5335 +ipset=/trueamateurs.com/gfwlist +server=/telesco.pe/127.0.0.1#5335 +ipset=/telesco.pe/gfwlist +server=/monsterbeatsoutlet.us/127.0.0.1#5335 +ipset=/monsterbeatsoutlet.us/gfwlist +server=/gettyimages.it/127.0.0.1#5335 +ipset=/gettyimages.it/gfwlist +server=/videodesexo.blog/127.0.0.1#5335 +ipset=/videodesexo.blog/gfwlist +server=/hpiie.org/127.0.0.1#5335 +ipset=/hpiie.org/gfwlist +server=/ipadair.ie/127.0.0.1#5335 +ipset=/ipadair.ie/gfwlist +server=/20thcenturystudios.com.br/127.0.0.1#5335 +ipset=/20thcenturystudios.com.br/gfwlist +server=/beatsbydreoksale.com/127.0.0.1#5335 +ipset=/beatsbydreoksale.com/gfwlist +server=/paypal-security.org/127.0.0.1#5335 +ipset=/paypal-security.org/gfwlist +server=/visa.com.hk/127.0.0.1#5335 +ipset=/visa.com.hk/gfwlist +server=/webcamtubexxx.com/127.0.0.1#5335 +ipset=/webcamtubexxx.com/gfwlist +server=/hanime.tv/127.0.0.1#5335 +ipset=/hanime.tv/gfwlist +server=/beatsbymusic.net/127.0.0.1#5335 +ipset=/beatsbymusic.net/gfwlist +server=/czechvr.com/127.0.0.1#5335 +ipset=/czechvr.com/gfwlist +server=/licdn.cn.cdn20.com/127.0.0.1#5335 +ipset=/licdn.cn.cdn20.com/gfwlist +server=/sourceforge.net/127.0.0.1#5335 +ipset=/sourceforge.net/gfwlist +server=/amazonianblog.com/127.0.0.1#5335 +ipset=/amazonianblog.com/gfwlist +server=/visa.com.vn/127.0.0.1#5335 +ipset=/visa.com.vn/gfwlist +server=/gaypinoyporn.com/127.0.0.1#5335 +ipset=/gaypinoyporn.com/gfwlist +server=/blogspot.pt/127.0.0.1#5335 +ipset=/blogspot.pt/gfwlist +server=/xnxxsexmovies.com/127.0.0.1#5335 +ipset=/xnxxsexmovies.com/gfwlist +server=/ultimaonline.com/127.0.0.1#5335 +ipset=/ultimaonline.com/gfwlist +server=/paypal-latam.com/127.0.0.1#5335 +ipset=/paypal-latam.com/gfwlist +server=/echichimato.com/127.0.0.1#5335 +ipset=/echichimato.com/gfwlist +server=/escort24h.net/127.0.0.1#5335 +ipset=/escort24h.net/gfwlist +server=/apple.pk/127.0.0.1#5335 +ipset=/apple.pk/gfwlist +server=/oculus2014.com/127.0.0.1#5335 +ipset=/oculus2014.com/gfwlist +server=/intel.co.za/127.0.0.1#5335 +ipset=/intel.co.za/gfwlist +server=/pornmegaload.com/127.0.0.1#5335 +ipset=/pornmegaload.com/gfwlist +server=/facboo.com/127.0.0.1#5335 +ipset=/facboo.com/gfwlist +server=/jtube.space/127.0.0.1#5335 +ipset=/jtube.space/gfwlist +server=/pornomovies.mobi/127.0.0.1#5335 +ipset=/pornomovies.mobi/gfwlist +server=/facebookswagemea.com/127.0.0.1#5335 +ipset=/facebookswagemea.com/gfwlist +server=/mapbox.com/127.0.0.1#5335 +ipset=/mapbox.com/gfwlist +server=/eurosexscene.com/127.0.0.1#5335 +ipset=/eurosexscene.com/gfwlist +server=/kanzhongguo.com/127.0.0.1#5335 +ipset=/kanzhongguo.com/gfwlist +server=/directtv.net/127.0.0.1#5335 +ipset=/directtv.net/gfwlist +server=/swisssigngroup.ch/127.0.0.1#5335 +ipset=/swisssigngroup.ch/gfwlist +server=/muycerdas.xxx/127.0.0.1#5335 +ipset=/muycerdas.xxx/gfwlist +server=/facebuk.com/127.0.0.1#5335 +ipset=/facebuk.com/gfwlist +server=/monsterbeatsau.com/127.0.0.1#5335 +ipset=/monsterbeatsau.com/gfwlist +server=/yandex.com.am/127.0.0.1#5335 +ipset=/yandex.com.am/gfwlist +server=/softbankbb.com/127.0.0.1#5335 +ipset=/softbankbb.com/gfwlist +server=/finishinfo.nl/127.0.0.1#5335 +ipset=/finishinfo.nl/gfwlist +server=/webex.com.hk/127.0.0.1#5335 +ipset=/webex.com.hk/gfwlist +server=/pornzone.com/127.0.0.1#5335 +ipset=/pornzone.com/gfwlist +server=/microsoft.be/127.0.0.1#5335 +ipset=/microsoft.be/gfwlist +server=/bravoporn.com/127.0.0.1#5335 +ipset=/bravoporn.com/gfwlist +server=/mitao.bar/127.0.0.1#5335 +ipset=/mitao.bar/gfwlist +server=/illusionxz.com/127.0.0.1#5335 +ipset=/illusionxz.com/gfwlist +server=/paypal-qrshopping.org/127.0.0.1#5335 +ipset=/paypal-qrshopping.org/gfwlist +server=/nikeconfluence.com/127.0.0.1#5335 +ipset=/nikeconfluence.com/gfwlist +server=/applewatch.hk/127.0.0.1#5335 +ipset=/applewatch.hk/gfwlist +server=/foxfiles.com/127.0.0.1#5335 +ipset=/foxfiles.com/gfwlist +server=/sony.at/127.0.0.1#5335 +ipset=/sony.at/gfwlist +server=/openamt.com/127.0.0.1#5335 +ipset=/openamt.com/gfwlist +server=/applemusic.com.au/127.0.0.1#5335 +ipset=/applemusic.com.au/gfwlist +server=/manhub.com/127.0.0.1#5335 +ipset=/manhub.com/gfwlist +server=/hentaiz.mobi/127.0.0.1#5335 +ipset=/hentaiz.mobi/gfwlist +server=/covid19-rx.org/127.0.0.1#5335 +ipset=/covid19-rx.org/gfwlist +server=/sexcartoon.biz/127.0.0.1#5335 +ipset=/sexcartoon.biz/gfwlist +server=/hentai-ani.me/127.0.0.1#5335 +ipset=/hentai-ani.me/gfwlist +server=/gandi.net/127.0.0.1#5335 +ipset=/gandi.net/gfwlist +server=/ebaylisting.com/127.0.0.1#5335 +ipset=/ebaylisting.com/gfwlist +server=/xxxvideoamatoriali.com/127.0.0.1#5335 +ipset=/xxxvideoamatoriali.com/gfwlist +server=/persiankitty.com/127.0.0.1#5335 +ipset=/persiankitty.com/gfwlist +server=/i-book.com/127.0.0.1#5335 +ipset=/i-book.com/gfwlist +server=/spiedigitallibrary.org/127.0.0.1#5335 +ipset=/spiedigitallibrary.org/gfwlist +server=/hentaicomics.life/127.0.0.1#5335 +ipset=/hentaicomics.life/gfwlist +server=/icloud.ee/127.0.0.1#5335 +ipset=/icloud.ee/gfwlist +server=/muscdn.com/127.0.0.1#5335 +ipset=/muscdn.com/gfwlist +server=/xn--8uq428d76d.tokyo/127.0.0.1#5335 +ipset=/xn--8uq428d76d.tokyo/gfwlist +server=/mytving.com/127.0.0.1#5335 +ipset=/mytving.com/gfwlist +server=/topfreepornvideos.com/127.0.0.1#5335 +ipset=/topfreepornvideos.com/gfwlist +server=/yahoo.sh/127.0.0.1#5335 +ipset=/yahoo.sh/gfwlist +server=/stepfamilyporn.com/127.0.0.1#5335 +ipset=/stepfamilyporn.com/gfwlist +server=/vim.org/127.0.0.1#5335 +ipset=/vim.org/gfwlist +server=/nvidia.no/127.0.0.1#5335 +ipset=/nvidia.no/gfwlist +server=/seqingx.com/127.0.0.1#5335 +ipset=/seqingx.com/gfwlist +server=/liverail.tv/127.0.0.1#5335 +ipset=/liverail.tv/gfwlist +server=/espn.net/127.0.0.1#5335 +ipset=/espn.net/gfwlist +server=/beatsheadphones-discount.com/127.0.0.1#5335 +ipset=/beatsheadphones-discount.com/gfwlist +server=/dvdstudiopro.info/127.0.0.1#5335 +ipset=/dvdstudiopro.info/gfwlist +server=/khotruyentranhx.com/127.0.0.1#5335 +ipset=/khotruyentranhx.com/gfwlist +server=/gettyimages.co.jp/127.0.0.1#5335 +ipset=/gettyimages.co.jp/gfwlist +server=/avstar9.com/127.0.0.1#5335 +ipset=/avstar9.com/gfwlist +server=/javseen.tv/127.0.0.1#5335 +ipset=/javseen.tv/gfwlist +server=/amateur-gallery-post.com/127.0.0.1#5335 +ipset=/amateur-gallery-post.com/gfwlist +server=/movefreerewards.com/127.0.0.1#5335 +ipset=/movefreerewards.com/gfwlist +server=/ebayon.com/127.0.0.1#5335 +ipset=/ebayon.com/gfwlist +server=/live.com.au/127.0.0.1#5335 +ipset=/live.com.au/gfwlist +server=/easttouch.com.hk/127.0.0.1#5335 +ipset=/easttouch.com.hk/gfwlist +server=/neuralink.com/127.0.0.1#5335 +ipset=/neuralink.com/gfwlist +server=/europornstar.com/127.0.0.1#5335 +ipset=/europornstar.com/gfwlist +server=/realestatejournal.com/127.0.0.1#5335 +ipset=/realestatejournal.com/gfwlist +server=/ero-labs.net/127.0.0.1#5335 +ipset=/ero-labs.net/gfwlist +server=/qingse.one/127.0.0.1#5335 +ipset=/qingse.one/gfwlist +server=/oculusblog.com/127.0.0.1#5335 +ipset=/oculusblog.com/gfwlist +server=/youngtube.me/127.0.0.1#5335 +ipset=/youngtube.me/gfwlist +server=/xxxlucah.com/127.0.0.1#5335 +ipset=/xxxlucah.com/gfwlist +server=/bmwmotorcycleusa.com/127.0.0.1#5335 +ipset=/bmwmotorcycleusa.com/gfwlist +server=/vendu.com/127.0.0.1#5335 +ipset=/vendu.com/gfwlist +server=/facebook-newsroom.org/127.0.0.1#5335 +ipset=/facebook-newsroom.org/gfwlist +server=/disneychannelonstage.com/127.0.0.1#5335 +ipset=/disneychannelonstage.com/gfwlist +server=/filmesporno.net.br/127.0.0.1#5335 +ipset=/filmesporno.net.br/gfwlist +server=/iphonefc.com/127.0.0.1#5335 +ipset=/iphonefc.com/gfwlist +server=/arabxnxx.org/127.0.0.1#5335 +ipset=/arabxnxx.org/gfwlist +server=/google.bj/127.0.0.1#5335 +ipset=/google.bj/gfwlist +server=/tvbweekly.com/127.0.0.1#5335 +ipset=/tvbweekly.com/gfwlist +server=/avsee01.tv/127.0.0.1#5335 +ipset=/avsee01.tv/gfwlist +server=/nikegadgets.com/127.0.0.1#5335 +ipset=/nikegadgets.com/gfwlist +server=/turborepo.org/127.0.0.1#5335 +ipset=/turborepo.org/gfwlist +server=/mature.nl/127.0.0.1#5335 +ipset=/mature.nl/gfwlist +server=/ampproject.net/127.0.0.1#5335 +ipset=/ampproject.net/gfwlist +server=/tnt-ea.com/127.0.0.1#5335 +ipset=/tnt-ea.com/gfwlist +server=/huffingtonpost.in/127.0.0.1#5335 +ipset=/huffingtonpost.in/gfwlist +server=/veet.co.nz/127.0.0.1#5335 +ipset=/veet.co.nz/gfwlist +server=/lovesexdurex.com/127.0.0.1#5335 +ipset=/lovesexdurex.com/gfwlist +server=/paypal-status.com/127.0.0.1#5335 +ipset=/paypal-status.com/gfwlist +server=/volvotrucks.cl/127.0.0.1#5335 +ipset=/volvotrucks.cl/gfwlist +server=/periscope.tv/127.0.0.1#5335 +ipset=/periscope.tv/gfwlist +server=/interracial-sites.com/127.0.0.1#5335 +ipset=/interracial-sites.com/gfwlist +server=/mini-connected.lv/127.0.0.1#5335 +ipset=/mini-connected.lv/gfwlist +server=/vrfun18.com/127.0.0.1#5335 +ipset=/vrfun18.com/gfwlist +server=/twttr.net/127.0.0.1#5335 +ipset=/twttr.net/gfwlist +server=/yahoo.com.pa/127.0.0.1#5335 +ipset=/yahoo.com.pa/gfwlist +server=/omtrdc.net/127.0.0.1#5335 +ipset=/omtrdc.net/gfwlist +server=/pornoh.info/127.0.0.1#5335 +ipset=/pornoh.info/gfwlist +server=/paypal-luxury.com/127.0.0.1#5335 +ipset=/paypal-luxury.com/gfwlist +server=/theporndude.com/127.0.0.1#5335 +ipset=/theporndude.com/gfwlist +server=/hentaiaction.net/127.0.0.1#5335 +ipset=/hentaiaction.net/gfwlist +server=/pixnet.net/127.0.0.1#5335 +ipset=/pixnet.net/gfwlist +server=/r18lu.com/127.0.0.1#5335 +ipset=/r18lu.com/gfwlist +server=/hackerfacebook.com/127.0.0.1#5335 +ipset=/hackerfacebook.com/gfwlist +server=/rupress.org/127.0.0.1#5335 +ipset=/rupress.org/gfwlist +server=/eventsinfocus.org/127.0.0.1#5335 +ipset=/eventsinfocus.org/gfwlist +server=/xnxxarab.cc/127.0.0.1#5335 +ipset=/xnxxarab.cc/gfwlist +server=/chinatimes.com.tw/127.0.0.1#5335 +ipset=/chinatimes.com.tw/gfwlist +server=/hbo.com/127.0.0.1#5335 +ipset=/hbo.com/gfwlist +server=/shopee.es/127.0.0.1#5335 +ipset=/shopee.es/gfwlist +server=/akamaihd.com/127.0.0.1#5335 +ipset=/akamaihd.com/gfwlist +server=/hentaizap.com/127.0.0.1#5335 +ipset=/hentaizap.com/gfwlist +server=/windows.net/127.0.0.1#5335 +ipset=/windows.net/gfwlist +server=/machosaonatural.com.br/127.0.0.1#5335 +ipset=/machosaonatural.com.br/gfwlist +server=/compresspdf.new/127.0.0.1#5335 +ipset=/compresspdf.new/gfwlist +server=/amazonvideo.com/127.0.0.1#5335 +ipset=/amazonvideo.com/gfwlist +server=/fbjav.com/127.0.0.1#5335 +ipset=/fbjav.com/gfwlist +server=/docleradn.com/127.0.0.1#5335 +ipset=/docleradn.com/gfwlist +server=/airmax360.com/127.0.0.1#5335 +ipset=/airmax360.com/gfwlist +server=/xn--pearsonenespaol-brb.com/127.0.0.1#5335 +ipset=/xn--pearsonenespaol-brb.com/gfwlist +server=/hpeventcenter.com/127.0.0.1#5335 +ipset=/hpeventcenter.com/gfwlist +server=/apple.co/127.0.0.1#5335 +ipset=/apple.co/gfwlist +server=/18porno.tv/127.0.0.1#5335 +ipset=/18porno.tv/gfwlist +server=/r18.com/127.0.0.1#5335 +ipset=/r18.com/gfwlist +server=/starbucks.co.nz/127.0.0.1#5335 +ipset=/starbucks.co.nz/gfwlist +server=/justlesbianpussy.com/127.0.0.1#5335 +ipset=/justlesbianpussy.com/gfwlist +server=/noc.syosetu.com/127.0.0.1#5335 +ipset=/noc.syosetu.com/gfwlist +server=/certificate-transparency.org/127.0.0.1#5335 +ipset=/certificate-transparency.org/gfwlist +server=/snapads.com/127.0.0.1#5335 +ipset=/snapads.com/gfwlist +server=/txdirectv.com/127.0.0.1#5335 +ipset=/txdirectv.com/gfwlist +server=/youflix.is/127.0.0.1#5335 +ipset=/youflix.is/gfwlist +server=/foxsports.com.co/127.0.0.1#5335 +ipset=/foxsports.com.co/gfwlist +server=/bmw.lv/127.0.0.1#5335 +ipset=/bmw.lv/gfwlist +server=/rmbl.ws/127.0.0.1#5335 +ipset=/rmbl.ws/gfwlist +server=/myfoxla.com/127.0.0.1#5335 +ipset=/myfoxla.com/gfwlist +server=/microsoftteams.com/127.0.0.1#5335 +ipset=/microsoftteams.com/gfwlist +server=/harica.gr/127.0.0.1#5335 +ipset=/harica.gr/gfwlist +server=/visa.com.mx/127.0.0.1#5335 +ipset=/visa.com.mx/gfwlist +server=/readthedocs.com/127.0.0.1#5335 +ipset=/readthedocs.com/gfwlist +server=/uug26.com/127.0.0.1#5335 +ipset=/uug26.com/gfwlist +server=/bmw-motorrad.pl/127.0.0.1#5335 +ipset=/bmw-motorrad.pl/gfwlist +server=/akamam.com/127.0.0.1#5335 +ipset=/akamam.com/gfwlist +server=/redtube9.com/127.0.0.1#5335 +ipset=/redtube9.com/gfwlist +server=/mycardbenefits.com/127.0.0.1#5335 +ipset=/mycardbenefits.com/gfwlist +server=/leecountytimes.com/127.0.0.1#5335 +ipset=/leecountytimes.com/gfwlist +server=/sexasia.net/127.0.0.1#5335 +ipset=/sexasia.net/gfwlist +server=/mcrouter.net/127.0.0.1#5335 +ipset=/mcrouter.net/gfwlist +server=/bloomberg.tv/127.0.0.1#5335 +ipset=/bloomberg.tv/gfwlist +server=/lagranepoca.com/127.0.0.1#5335 +ipset=/lagranepoca.com/gfwlist +server=/ikea.es/127.0.0.1#5335 +ipset=/ikea.es/gfwlist +server=/n0vadesktop.com/127.0.0.1#5335 +ipset=/n0vadesktop.com/gfwlist +server=/google.tl/127.0.0.1#5335 +ipset=/google.tl/gfwlist +server=/disneyjuniortreataday.com/127.0.0.1#5335 +ipset=/disneyjuniortreataday.com/gfwlist +server=/minidealer.com/127.0.0.1#5335 +ipset=/minidealer.com/gfwlist +server=/webex.es/127.0.0.1#5335 +ipset=/webex.es/gfwlist +server=/intelemeastore.com/127.0.0.1#5335 +ipset=/intelemeastore.com/gfwlist +server=/nlt-media.com/127.0.0.1#5335 +ipset=/nlt-media.com/gfwlist +server=/pinterest.uk/127.0.0.1#5335 +ipset=/pinterest.uk/gfwlist +server=/avsforum.com/127.0.0.1#5335 +ipset=/avsforum.com/gfwlist +server=/cnnlabs.com/127.0.0.1#5335 +ipset=/cnnlabs.com/gfwlist +server=/sexmomsex.com/127.0.0.1#5335 +ipset=/sexmomsex.com/gfwlist +server=/mbheadphone.com/127.0.0.1#5335 +ipset=/mbheadphone.com/gfwlist +server=/xn--gtvq61aiijy0b.xn--hxt814e/127.0.0.1#5335 +ipset=/xn--gtvq61aiijy0b.xn--hxt814e/gfwlist +server=/buynikechina.com/127.0.0.1#5335 +ipset=/buynikechina.com/gfwlist +server=/durex.com.my/127.0.0.1#5335 +ipset=/durex.com.my/gfwlist +server=/pearsonhighered.com/127.0.0.1#5335 +ipset=/pearsonhighered.com/gfwlist +server=/dongtaiwang.com/127.0.0.1#5335 +ipset=/dongtaiwang.com/gfwlist +server=/visualstudio.com/127.0.0.1#5335 +ipset=/visualstudio.com/gfwlist +server=/ikea.co.ph/127.0.0.1#5335 +ipset=/ikea.co.ph/gfwlist +server=/jiyou520.com/127.0.0.1#5335 +ipset=/jiyou520.com/gfwlist +server=/pocketcasts.com/127.0.0.1#5335 +ipset=/pocketcasts.com/gfwlist +server=/ero-labs.com/127.0.0.1#5335 +ipset=/ero-labs.com/gfwlist +server=/immxd.com/127.0.0.1#5335 +ipset=/immxd.com/gfwlist +server=/bmw.com.ky/127.0.0.1#5335 +ipset=/bmw.com.ky/gfwlist +server=/hooligapps.com/127.0.0.1#5335 +ipset=/hooligapps.com/gfwlist +server=/embase.com/127.0.0.1#5335 +ipset=/embase.com/gfwlist +server=/3dadultgames.net/127.0.0.1#5335 +ipset=/3dadultgames.net/gfwlist +server=/amazon.com/127.0.0.1#5335 +ipset=/amazon.com/gfwlist +server=/cheapbeatsbydremonster.com/127.0.0.1#5335 +ipset=/cheapbeatsbydremonster.com/gfwlist +server=/fastly.com/127.0.0.1#5335 +ipset=/fastly.com/gfwlist +server=/wwwfacebok.com/127.0.0.1#5335 +ipset=/wwwfacebok.com/gfwlist +server=/drebeats-singaporecheap.net/127.0.0.1#5335 +ipset=/drebeats-singaporecheap.net/gfwlist +server=/hcomic.net/127.0.0.1#5335 +ipset=/hcomic.net/gfwlist +server=/dlib.eastview.com/127.0.0.1#5335 +ipset=/dlib.eastview.com/gfwlist +server=/masseffect.com/127.0.0.1#5335 +ipset=/masseffect.com/gfwlist +server=/ducksear.ch/127.0.0.1#5335 +ipset=/ducksear.ch/gfwlist +server=/passion-hd.com/127.0.0.1#5335 +ipset=/passion-hd.com/gfwlist +server=/secret-flirt-hub.com/127.0.0.1#5335 +ipset=/secret-flirt-hub.com/gfwlist +server=/minirichmond.com/127.0.0.1#5335 +ipset=/minirichmond.com/gfwlist +server=/google.lu/127.0.0.1#5335 +ipset=/google.lu/gfwlist +server=/alibabacloud.com.my/127.0.0.1#5335 +ipset=/alibabacloud.com.my/gfwlist +server=/veet.be/127.0.0.1#5335 +ipset=/veet.be/gfwlist +server=/alteraforum.com/127.0.0.1#5335 +ipset=/alteraforum.com/gfwlist +server=/shahvatsaraa.com/127.0.0.1#5335 +ipset=/shahvatsaraa.com/gfwlist +server=/xxxcomics.org/127.0.0.1#5335 +ipset=/xxxcomics.org/gfwlist +server=/porzo.tv/127.0.0.1#5335 +ipset=/porzo.tv/gfwlist +server=/sovec.net/127.0.0.1#5335 +ipset=/sovec.net/gfwlist +server=/stupidcams.com/127.0.0.1#5335 +ipset=/stupidcams.com/gfwlist +server=/carekit.org/127.0.0.1#5335 +ipset=/carekit.org/gfwlist +server=/apple.hu/127.0.0.1#5335 +ipset=/apple.hu/gfwlist +server=/o2action.co.kr/127.0.0.1#5335 +ipset=/o2action.co.kr/gfwlist +server=/minisaskatoon.com/127.0.0.1#5335 +ipset=/minisaskatoon.com/gfwlist +server=/nflximg.net/127.0.0.1#5335 +ipset=/nflximg.net/gfwlist +server=/hentai2games.com/127.0.0.1#5335 +ipset=/hentai2games.com/gfwlist +server=/avn.com/127.0.0.1#5335 +ipset=/avn.com/gfwlist +server=/google.by/127.0.0.1#5335 +ipset=/google.by/gfwlist +server=/abellalist.com/127.0.0.1#5335 +ipset=/abellalist.com/gfwlist +server=/dkcloud.cc/127.0.0.1#5335 +ipset=/dkcloud.cc/gfwlist +server=/mudvod.tv/127.0.0.1#5335 +ipset=/mudvod.tv/gfwlist +server=/wasdj.com/127.0.0.1#5335 +ipset=/wasdj.com/gfwlist +server=/myhentaigallery.com/127.0.0.1#5335 +ipset=/myhentaigallery.com/gfwlist +server=/swingerpornfun.com/127.0.0.1#5335 +ipset=/swingerpornfun.com/gfwlist +server=/shahvani.site/127.0.0.1#5335 +ipset=/shahvani.site/gfwlist +server=/naughtysophie.com/127.0.0.1#5335 +ipset=/naughtysophie.com/gfwlist +server=/smartonesolutions.hk/127.0.0.1#5335 +ipset=/smartonesolutions.hk/gfwlist +server=/minihalifax.com/127.0.0.1#5335 +ipset=/minihalifax.com/gfwlist +server=/firestonecomercial.co.cr/127.0.0.1#5335 +ipset=/firestonecomercial.co.cr/gfwlist +server=/onlyfreelatinaporn.com/127.0.0.1#5335 +ipset=/onlyfreelatinaporn.com/gfwlist +server=/cairnspost.com.au/127.0.0.1#5335 +ipset=/cairnspost.com.au/gfwlist +server=/easy.ac/127.0.0.1#5335 +ipset=/easy.ac/gfwlist +server=/hugesex.tv/127.0.0.1#5335 +ipset=/hugesex.tv/gfwlist +server=/opengraphprotocol.org/127.0.0.1#5335 +ipset=/opengraphprotocol.org/gfwlist +server=/vilavpn.xyz/127.0.0.1#5335 +ipset=/vilavpn.xyz/gfwlist +server=/pornsoldiers.com/127.0.0.1#5335 +ipset=/pornsoldiers.com/gfwlist +server=/firestoneip.com/127.0.0.1#5335 +ipset=/firestoneip.com/gfwlist +server=/ocul.us/127.0.0.1#5335 +ipset=/ocul.us/gfwlist +server=/microsoftcloudsummit.com/127.0.0.1#5335 +ipset=/microsoftcloudsummit.com/gfwlist +server=/hplipopensource.com/127.0.0.1#5335 +ipset=/hplipopensource.com/gfwlist +server=/zoofilianet.com/127.0.0.1#5335 +ipset=/zoofilianet.com/gfwlist +server=/intel.ua/127.0.0.1#5335 +ipset=/intel.ua/gfwlist +server=/eroprofile.com/127.0.0.1#5335 +ipset=/eroprofile.com/gfwlist +server=/xn--xsq421m.com/127.0.0.1#5335 +ipset=/xn--xsq421m.com/gfwlist +server=/eromanga-mainichi.com/127.0.0.1#5335 +ipset=/eromanga-mainichi.com/gfwlist +server=/facebooksite.net/127.0.0.1#5335 +ipset=/facebooksite.net/gfwlist +server=/javcc.cc/127.0.0.1#5335 +ipset=/javcc.cc/gfwlist +server=/gimy.cc/127.0.0.1#5335 +ipset=/gimy.cc/gfwlist +server=/honkaiimpact3.com/127.0.0.1#5335 +ipset=/honkaiimpact3.com/gfwlist +server=/line.me/127.0.0.1#5335 +ipset=/line.me/gfwlist +server=/plumperpass.com/127.0.0.1#5335 +ipset=/plumperpass.com/gfwlist +server=/durex.no/127.0.0.1#5335 +ipset=/durex.no/gfwlist +server=/abema-tv.com/127.0.0.1#5335 +ipset=/abema-tv.com/gfwlist +server=/sony.cz/127.0.0.1#5335 +ipset=/sony.cz/gfwlist +server=/porndex.com/127.0.0.1#5335 +ipset=/porndex.com/gfwlist +server=/faecebok.com/127.0.0.1#5335 +ipset=/faecebok.com/gfwlist +server=/e-goods.ru/127.0.0.1#5335 +ipset=/e-goods.ru/gfwlist +server=/boslife.biz/127.0.0.1#5335 +ipset=/boslife.biz/gfwlist +server=/onepornlist.com/127.0.0.1#5335 +ipset=/onepornlist.com/gfwlist +server=/ntdtv-dc.com/127.0.0.1#5335 +ipset=/ntdtv-dc.com/gfwlist +server=/pornzog.com/127.0.0.1#5335 +ipset=/pornzog.com/gfwlist +server=/disneymagicmoments.co.uk/127.0.0.1#5335 +ipset=/disneymagicmoments.co.uk/gfwlist +server=/astm.org/127.0.0.1#5335 +ipset=/astm.org/gfwlist +server=/gofucker.com/127.0.0.1#5335 +ipset=/gofucker.com/gfwlist +server=/intramuscularinjection.info/127.0.0.1#5335 +ipset=/intramuscularinjection.info/gfwlist +server=/camerfirma.com/127.0.0.1#5335 +ipset=/camerfirma.com/gfwlist +server=/sony.com.hk/127.0.0.1#5335 +ipset=/sony.com.hk/gfwlist +server=/ebayinc.net/127.0.0.1#5335 +ipset=/ebayinc.net/gfwlist +server=/lesbiansubmission.com/127.0.0.1#5335 +ipset=/lesbiansubmission.com/gfwlist +server=/paypa1.com/127.0.0.1#5335 +ipset=/paypa1.com/gfwlist +server=/pctlwm.com/127.0.0.1#5335 +ipset=/pctlwm.com/gfwlist +server=/volvogroup.ru/127.0.0.1#5335 +ipset=/volvogroup.ru/gfwlist +server=/pearsonassessment.se/127.0.0.1#5335 +ipset=/pearsonassessment.se/gfwlist +server=/ifuckedmy.mom/127.0.0.1#5335 +ipset=/ifuckedmy.mom/gfwlist +server=/chimeforchange.org/127.0.0.1#5335 +ipset=/chimeforchange.org/gfwlist +server=/intelrxt.com/127.0.0.1#5335 +ipset=/intelrxt.com/gfwlist +server=/oneocsp.microsoft.com/127.0.0.1#5335 +ipset=/oneocsp.microsoft.com/gfwlist +server=/hilostripper.com/127.0.0.1#5335 +ipset=/hilostripper.com/gfwlist +server=/txxx1.com/127.0.0.1#5335 +ipset=/txxx1.com/gfwlist +server=/signalbar.com/127.0.0.1#5335 +ipset=/signalbar.com/gfwlist +server=/rule34.world/127.0.0.1#5335 +ipset=/rule34.world/gfwlist +server=/goodreads.com/127.0.0.1#5335 +ipset=/goodreads.com/gfwlist +server=/hairypornsite.com/127.0.0.1#5335 +ipset=/hairypornsite.com/gfwlist +server=/beatsincanada.com/127.0.0.1#5335 +ipset=/beatsincanada.com/gfwlist +server=/thebayuk.com/127.0.0.1#5335 +ipset=/thebayuk.com/gfwlist +server=/ebaymarketplace.net/127.0.0.1#5335 +ipset=/ebaymarketplace.net/gfwlist +server=/localizestatus.com/127.0.0.1#5335 +ipset=/localizestatus.com/gfwlist +server=/thotvids.com/127.0.0.1#5335 +ipset=/thotvids.com/gfwlist +server=/erogazo-jp.net/127.0.0.1#5335 +ipset=/erogazo-jp.net/gfwlist +server=/akaint.net/127.0.0.1#5335 +ipset=/akaint.net/gfwlist +server=/acm.org/127.0.0.1#5335 +ipset=/acm.org/gfwlist +server=/whyiwantciscotelepresence.com/127.0.0.1#5335 +ipset=/whyiwantciscotelepresence.com/gfwlist +server=/awetv.com/127.0.0.1#5335 +ipset=/awetv.com/gfwlist +server=/sensueel.net/127.0.0.1#5335 +ipset=/sensueel.net/gfwlist +server=/eprc.com.hk/127.0.0.1#5335 +ipset=/eprc.com.hk/gfwlist +server=/youtube-nocookie.com/127.0.0.1#5335 +ipset=/youtube-nocookie.com/gfwlist +server=/paypal-login.com/127.0.0.1#5335 +ipset=/paypal-login.com/gfwlist +server=/macbook.wang/127.0.0.1#5335 +ipset=/macbook.wang/gfwlist +server=/xn--4vq475g.com/127.0.0.1#5335 +ipset=/xn--4vq475g.com/gfwlist +server=/ikea.sk/127.0.0.1#5335 +ipset=/ikea.sk/gfwlist +server=/xxxscenes.net/127.0.0.1#5335 +ipset=/xxxscenes.net/gfwlist +server=/mini.com.pe/127.0.0.1#5335 +ipset=/mini.com.pe/gfwlist +server=/codeish.io/127.0.0.1#5335 +ipset=/codeish.io/gfwlist +server=/hpcatridge.com/127.0.0.1#5335 +ipset=/hpcatridge.com/gfwlist +server=/yahoo.st/127.0.0.1#5335 +ipset=/yahoo.st/gfwlist +server=/starbuckssummergame.com/127.0.0.1#5335 +ipset=/starbuckssummergame.com/gfwlist +server=/adultfriendfinder.com/127.0.0.1#5335 +ipset=/adultfriendfinder.com/gfwlist +server=/showup.tv/127.0.0.1#5335 +ipset=/showup.tv/gfwlist +server=/daretoku-eromanga.info/127.0.0.1#5335 +ipset=/daretoku-eromanga.info/gfwlist +server=/wowpornlist.xyz/127.0.0.1#5335 +ipset=/wowpornlist.xyz/gfwlist +server=/justpicsplease.com/127.0.0.1#5335 +ipset=/justpicsplease.com/gfwlist +server=/readthedocs.io/127.0.0.1#5335 +ipset=/readthedocs.io/gfwlist +server=/zoho.com.au/127.0.0.1#5335 +ipset=/zoho.com.au/gfwlist +server=/sonykigyo.jp/127.0.0.1#5335 +ipset=/sonykigyo.jp/gfwlist +server=/vscode.blob.core.windows.net/127.0.0.1#5335 +ipset=/vscode.blob.core.windows.net/gfwlist +server=/ve-dash-uk-live.akamaized.net/127.0.0.1#5335 +ipset=/ve-dash-uk-live.akamaized.net/gfwlist +server=/qualcomm.sc.omtrdc.net/127.0.0.1#5335 +ipset=/qualcomm.sc.omtrdc.net/gfwlist +server=/teenagefucking.com/127.0.0.1#5335 +ipset=/teenagefucking.com/gfwlist +server=/intel.uz/127.0.0.1#5335 +ipset=/intel.uz/gfwlist +server=/facebook.shop/127.0.0.1#5335 +ipset=/facebook.shop/gfwlist +server=/edcity.hk/127.0.0.1#5335 +ipset=/edcity.hk/gfwlist +server=/5278.cc/127.0.0.1#5335 +ipset=/5278.cc/gfwlist +server=/nbys.tv/127.0.0.1#5335 +ipset=/nbys.tv/gfwlist +server=/youtubecisco.com/127.0.0.1#5335 +ipset=/youtubecisco.com/gfwlist +server=/animezilla.com/127.0.0.1#5335 +ipset=/animezilla.com/gfwlist +server=/fundinginstitutional.com/127.0.0.1#5335 +ipset=/fundinginstitutional.com/gfwlist +server=/metart.com/127.0.0.1#5335 +ipset=/metart.com/gfwlist +server=/httpsfacebook.com/127.0.0.1#5335 +ipset=/httpsfacebook.com/gfwlist +server=/icegay.tv/127.0.0.1#5335 +ipset=/icegay.tv/gfwlist +server=/animal-porn.net/127.0.0.1#5335 +ipset=/animal-porn.net/gfwlist +server=/airwick.co.uk/127.0.0.1#5335 +ipset=/airwick.co.uk/gfwlist +server=/beatsbysdrbre.com/127.0.0.1#5335 +ipset=/beatsbysdrbre.com/gfwlist +server=/fblitho.com/127.0.0.1#5335 +ipset=/fblitho.com/gfwlist +server=/iphonehangzhou.com/127.0.0.1#5335 +ipset=/iphonehangzhou.com/gfwlist +server=/orientalasianporn.com/127.0.0.1#5335 +ipset=/orientalasianporn.com/gfwlist +server=/av11.org/127.0.0.1#5335 +ipset=/av11.org/gfwlist +server=/alphabet.com.mx/127.0.0.1#5335 +ipset=/alphabet.com.mx/gfwlist +server=/goduckgo.com/127.0.0.1#5335 +ipset=/goduckgo.com/gfwlist +server=/18-teen-porn.com/127.0.0.1#5335 +ipset=/18-teen-porn.com/gfwlist +server=/pornofint.com/127.0.0.1#5335 +ipset=/pornofint.com/gfwlist +server=/gfjizz.com/127.0.0.1#5335 +ipset=/gfjizz.com/gfwlist +server=/monsterbeats-cheap.com/127.0.0.1#5335 +ipset=/monsterbeats-cheap.com/gfwlist +server=/pinterest.info/127.0.0.1#5335 +ipset=/pinterest.info/gfwlist +server=/azuredevopslaunch.com/127.0.0.1#5335 +ipset=/azuredevopslaunch.com/gfwlist +server=/volvotrucks.se/127.0.0.1#5335 +ipset=/volvotrucks.se/gfwlist +server=/otaku-168.com/127.0.0.1#5335 +ipset=/otaku-168.com/gfwlist +server=/mini.mu/127.0.0.1#5335 +ipset=/mini.mu/gfwlist +server=/bioone.org/127.0.0.1#5335 +ipset=/bioone.org/gfwlist +server=/cnnamador.com/127.0.0.1#5335 +ipset=/cnnamador.com/gfwlist +server=/hentai3dvideo.biz/127.0.0.1#5335 +ipset=/hentai3dvideo.biz/gfwlist +server=/biowarestore.com/127.0.0.1#5335 +ipset=/biowarestore.com/gfwlist +server=/veet.fr/127.0.0.1#5335 +ipset=/veet.fr/gfwlist +server=/lolibus.cc/127.0.0.1#5335 +ipset=/lolibus.cc/gfwlist +server=/fetishpapa.com/127.0.0.1#5335 +ipset=/fetishpapa.com/gfwlist +server=/linkjunkies.com/127.0.0.1#5335 +ipset=/linkjunkies.com/gfwlist +server=/inoreader.com/127.0.0.1#5335 +ipset=/inoreader.com/gfwlist +server=/go-gaytube.com/127.0.0.1#5335 +ipset=/go-gaytube.com/gfwlist +server=/kindle.in/127.0.0.1#5335 +ipset=/kindle.in/gfwlist +server=/dandalinvoa.com/127.0.0.1#5335 +ipset=/dandalinvoa.com/gfwlist +server=/cygames.jp/127.0.0.1#5335 +ipset=/cygames.jp/gfwlist +server=/alt3-mtalk.google.com/127.0.0.1#5335 +ipset=/alt3-mtalk.google.com/gfwlist +server=/hentai69.online/127.0.0.1#5335 +ipset=/hentai69.online/gfwlist +server=/metacloud.com/127.0.0.1#5335 +ipset=/metacloud.com/gfwlist +server=/weav.xyz/127.0.0.1#5335 +ipset=/weav.xyz/gfwlist +server=/facebooklogs.com/127.0.0.1#5335 +ipset=/facebooklogs.com/gfwlist +server=/uun82.com/127.0.0.1#5335 +ipset=/uun82.com/gfwlist +server=/audio-ak-spotify-com.akamaized.net/127.0.0.1#5335 +ipset=/audio-ak-spotify-com.akamaized.net/gfwlist +server=/xn--xsq605n.com/127.0.0.1#5335 +ipset=/xn--xsq605n.com/gfwlist +server=/beatsboxingdayuksale.com/127.0.0.1#5335 +ipset=/beatsboxingdayuksale.com/gfwlist +server=/apple.lk/127.0.0.1#5335 +ipset=/apple.lk/gfwlist +server=/vmwhorizonair.com/127.0.0.1#5335 +ipset=/vmwhorizonair.com/gfwlist +server=/akamaisingapore.net/127.0.0.1#5335 +ipset=/akamaisingapore.net/gfwlist +server=/sukebei.nyaa.si/127.0.0.1#5335 +ipset=/sukebei.nyaa.si/gfwlist +server=/youtube.ni/127.0.0.1#5335 +ipset=/youtube.ni/gfwlist +server=/femdomcc.net/127.0.0.1#5335 +ipset=/femdomcc.net/gfwlist +server=/abc-studios.com/127.0.0.1#5335 +ipset=/abc-studios.com/gfwlist +server=/cheapbeatsbydreoutlet.com/127.0.0.1#5335 +ipset=/cheapbeatsbydreoutlet.com/gfwlist +server=/nvidia.jp/127.0.0.1#5335 +ipset=/nvidia.jp/gfwlist +server=/nvidia.com.pl/127.0.0.1#5335 +ipset=/nvidia.com.pl/gfwlist +server=/travelex.com.au/127.0.0.1#5335 +ipset=/travelex.com.au/gfwlist +server=/gnews.org/127.0.0.1#5335 +ipset=/gnews.org/gfwlist +server=/eboobstore.com/127.0.0.1#5335 +ipset=/eboobstore.com/gfwlist +server=/vanish.com.br/127.0.0.1#5335 +ipset=/vanish.com.br/gfwlist +server=/swiftbank.us/127.0.0.1#5335 +ipset=/swiftbank.us/gfwlist +server=/naver.jp/127.0.0.1#5335 +ipset=/naver.jp/gfwlist +server=/google.se/127.0.0.1#5335 +ipset=/google.se/gfwlist +server=/dawngate.com/127.0.0.1#5335 +ipset=/dawngate.com/gfwlist +server=/icloud.de/127.0.0.1#5335 +ipset=/icloud.de/gfwlist +server=/mini.be/127.0.0.1#5335 +ipset=/mini.be/gfwlist +server=/illusionn4.com/127.0.0.1#5335 +ipset=/illusionn4.com/gfwlist +server=/pornmd.com/127.0.0.1#5335 +ipset=/pornmd.com/gfwlist +server=/stufferdb.com/127.0.0.1#5335 +ipset=/stufferdb.com/gfwlist +server=/ebaybank.com/127.0.0.1#5335 +ipset=/ebaybank.com/gfwlist +server=/porn-list.site/127.0.0.1#5335 +ipset=/porn-list.site/gfwlist +server=/foxbusiness.tv/127.0.0.1#5335 +ipset=/foxbusiness.tv/gfwlist +server=/quickiepage.com/127.0.0.1#5335 +ipset=/quickiepage.com/gfwlist +server=/gettyimages.co.nz/127.0.0.1#5335 +ipset=/gettyimages.co.nz/gfwlist +server=/doujin-freee.com/127.0.0.1#5335 +ipset=/doujin-freee.com/gfwlist +server=/illusionn5.com/127.0.0.1#5335 +ipset=/illusionn5.com/gfwlist +server=/sankei-ad-info.com/127.0.0.1#5335 +ipset=/sankei-ad-info.com/gfwlist +server=/applelink.com/127.0.0.1#5335 +ipset=/applelink.com/gfwlist +server=/nyahentai.re/127.0.0.1#5335 +ipset=/nyahentai.re/gfwlist +server=/youtube.co.ug/127.0.0.1#5335 +ipset=/youtube.co.ug/gfwlist +server=/youtube.pt/127.0.0.1#5335 +ipset=/youtube.pt/gfwlist +server=/nikebetterworld.info/127.0.0.1#5335 +ipset=/nikebetterworld.info/gfwlist +server=/bmwmontreal.ca/127.0.0.1#5335 +ipset=/bmwmontreal.ca/gfwlist +server=/dollarphotoclub.com/127.0.0.1#5335 +ipset=/dollarphotoclub.com/gfwlist +server=/jenkins.io/127.0.0.1#5335 +ipset=/jenkins.io/gfwlist +server=/volvotruckcenter.kz/127.0.0.1#5335 +ipset=/volvotruckcenter.kz/gfwlist +server=/bestbuybusinessadvantageaccount.com/127.0.0.1#5335 +ipset=/bestbuybusinessadvantageaccount.com/gfwlist +server=/lineshoppingseller.com/127.0.0.1#5335 +ipset=/lineshoppingseller.com/gfwlist +server=/kumo.com/127.0.0.1#5335 +ipset=/kumo.com/gfwlist +server=/visacards.com/127.0.0.1#5335 +ipset=/visacards.com/gfwlist +server=/nab.demdex.net/127.0.0.1#5335 +ipset=/nab.demdex.net/gfwlist +server=/jibemobile.com/127.0.0.1#5335 +ipset=/jibemobile.com/gfwlist +server=/wheelworks.net/127.0.0.1#5335 +ipset=/wheelworks.net/gfwlist +server=/businessinsider.jp/127.0.0.1#5335 +ipset=/businessinsider.jp/gfwlist +server=/boxofficemojo.com/127.0.0.1#5335 +ipset=/boxofficemojo.com/gfwlist +server=/m2m.com/127.0.0.1#5335 +ipset=/m2m.com/gfwlist +server=/lightbridge.com/127.0.0.1#5335 +ipset=/lightbridge.com/gfwlist +server=/momsexypics.com/127.0.0.1#5335 +ipset=/momsexypics.com/gfwlist +server=/fury.co/127.0.0.1#5335 +ipset=/fury.co/gfwlist +server=/topchats.com/127.0.0.1#5335 +ipset=/topchats.com/gfwlist +server=/xl-gaytube.com/127.0.0.1#5335 +ipset=/xl-gaytube.com/gfwlist +server=/szcheapmonsterheadphones.com/127.0.0.1#5335 +ipset=/szcheapmonsterheadphones.com/gfwlist +server=/visa.com.py/127.0.0.1#5335 +ipset=/visa.com.py/gfwlist +server=/dettol.com.hk/127.0.0.1#5335 +ipset=/dettol.com.hk/gfwlist +server=/dettolsitishield.co.in/127.0.0.1#5335 +ipset=/dettolsitishield.co.in/gfwlist +server=/hightopnikes.com/127.0.0.1#5335 +ipset=/hightopnikes.com/gfwlist +server=/ebay-delivery.com/127.0.0.1#5335 +ipset=/ebay-delivery.com/gfwlist +server=/bmw-motorrad.com.py/127.0.0.1#5335 +ipset=/bmw-motorrad.com.py/gfwlist +server=/bmw.vn/127.0.0.1#5335 +ipset=/bmw.vn/gfwlist +server=/hellokittybeats.com/127.0.0.1#5335 +ipset=/hellokittybeats.com/gfwlist +server=/apple.dk/127.0.0.1#5335 +ipset=/apple.dk/gfwlist +server=/topexhib.net/127.0.0.1#5335 +ipset=/topexhib.net/gfwlist +server=/hentaiera.com/127.0.0.1#5335 +ipset=/hentaiera.com/gfwlist +server=/svensksexfilm.com/127.0.0.1#5335 +ipset=/svensksexfilm.com/gfwlist +server=/citizenlab.ca/127.0.0.1#5335 +ipset=/citizenlab.ca/gfwlist +server=/pornacho.com/127.0.0.1#5335 +ipset=/pornacho.com/gfwlist +server=/doujinfree.com/127.0.0.1#5335 +ipset=/doujinfree.com/gfwlist +server=/xn--gogl-0nd52e.com/127.0.0.1#5335 +ipset=/xn--gogl-0nd52e.com/gfwlist +server=/ceicdata.com/127.0.0.1#5335 +ipset=/ceicdata.com/gfwlist +server=/thomsonreuters.cn/127.0.0.1#5335 +ipset=/thomsonreuters.cn/gfwlist +server=/lesboerotica.net/127.0.0.1#5335 +ipset=/lesboerotica.net/gfwlist +server=/youtube.sv/127.0.0.1#5335 +ipset=/youtube.sv/gfwlist +server=/pakistanporntube.net/127.0.0.1#5335 +ipset=/pakistanporntube.net/gfwlist +server=/alhs.link/127.0.0.1#5335 +ipset=/alhs.link/gfwlist +server=/ignites.com/127.0.0.1#5335 +ipset=/ignites.com/gfwlist +server=/ikea.ph/127.0.0.1#5335 +ipset=/ikea.ph/gfwlist +server=/duckduckgo.ca/127.0.0.1#5335 +ipset=/duckduckgo.ca/gfwlist +server=/xvideos.com/127.0.0.1#5335 +ipset=/xvideos.com/gfwlist +server=/youtube.bg/127.0.0.1#5335 +ipset=/youtube.bg/gfwlist +server=/getadblock.com/127.0.0.1#5335 +ipset=/getadblock.com/gfwlist +server=/hentai.pro/127.0.0.1#5335 +ipset=/hentai.pro/gfwlist +server=/bmw-corporate-sales.com/127.0.0.1#5335 +ipset=/bmw-corporate-sales.com/gfwlist +server=/amateursecrets.net/127.0.0.1#5335 +ipset=/amateursecrets.net/gfwlist +server=/shopfacebook.com/127.0.0.1#5335 +ipset=/shopfacebook.com/gfwlist +server=/mypornbookmarks.com/127.0.0.1#5335 +ipset=/mypornbookmarks.com/gfwlist +server=/bigboobsalert.com/127.0.0.1#5335 +ipset=/bigboobsalert.com/gfwlist +server=/nudeandhairy.com/127.0.0.1#5335 +ipset=/nudeandhairy.com/gfwlist +server=/githubpreview.dev/127.0.0.1#5335 +ipset=/githubpreview.dev/gfwlist +server=/pornopantry.com/127.0.0.1#5335 +ipset=/pornopantry.com/gfwlist +server=/baselinestudy.com/127.0.0.1#5335 +ipset=/baselinestudy.com/gfwlist +server=/braventures.com/127.0.0.1#5335 +ipset=/braventures.com/gfwlist +server=/disney.ru/127.0.0.1#5335 +ipset=/disney.ru/gfwlist +server=/xxvideoss.org/127.0.0.1#5335 +ipset=/xxvideoss.org/gfwlist +server=/conan.xxx/127.0.0.1#5335 +ipset=/conan.xxx/gfwlist +server=/findmyipad.com/127.0.0.1#5335 +ipset=/findmyipad.com/gfwlist +server=/flickr.com/127.0.0.1#5335 +ipset=/flickr.com/gfwlist +server=/ipod.co.za/127.0.0.1#5335 +ipset=/ipod.co.za/gfwlist +server=/iwantmature.com/127.0.0.1#5335 +ipset=/iwantmature.com/gfwlist +server=/hclips.com/127.0.0.1#5335 +ipset=/hclips.com/gfwlist +server=/macosxlion.com/127.0.0.1#5335 +ipset=/macosxlion.com/gfwlist +server=/dartpad.dev/127.0.0.1#5335 +ipset=/dartpad.dev/gfwlist +server=/applewatchsport.com/127.0.0.1#5335 +ipset=/applewatchsport.com/gfwlist +server=/wifesharingpics.com/127.0.0.1#5335 +ipset=/wifesharingpics.com/gfwlist +server=/google.com.np/127.0.0.1#5335 +ipset=/google.com.np/gfwlist +server=/googil.com/127.0.0.1#5335 +ipset=/googil.com/gfwlist +server=/cloudinary.com/127.0.0.1#5335 +ipset=/cloudinary.com/gfwlist +server=/canon.nl/127.0.0.1#5335 +ipset=/canon.nl/gfwlist +server=/blogspot.com.by/127.0.0.1#5335 +ipset=/blogspot.com.by/gfwlist +server=/tesla-cdn.thron.com/127.0.0.1#5335 +ipset=/tesla-cdn.thron.com/gfwlist +server=/braintreegateway.com/127.0.0.1#5335 +ipset=/braintreegateway.com/gfwlist +server=/zoopornmd.com/127.0.0.1#5335 +ipset=/zoopornmd.com/gfwlist +server=/fuckmatureporn.com/127.0.0.1#5335 +ipset=/fuckmatureporn.com/gfwlist +server=/llnw-trials.com/127.0.0.1#5335 +ipset=/llnw-trials.com/gfwlist +server=/amdfanstore.com/127.0.0.1#5335 +ipset=/amdfanstore.com/gfwlist +server=/beatsbydressolo.com/127.0.0.1#5335 +ipset=/beatsbydressolo.com/gfwlist +server=/rarbgaccess.org/127.0.0.1#5335 +ipset=/rarbgaccess.org/gfwlist +server=/drebeatscanada.com/127.0.0.1#5335 +ipset=/drebeatscanada.com/gfwlist +server=/nflximg.com/127.0.0.1#5335 +ipset=/nflximg.com/gfwlist +server=/wholesalediscountpurses.com/127.0.0.1#5335 +ipset=/wholesalediscountpurses.com/gfwlist +server=/wvm0agb4.me/127.0.0.1#5335 +ipset=/wvm0agb4.me/gfwlist +server=/debian.org/127.0.0.1#5335 +ipset=/debian.org/gfwlist +server=/idol-sagasukun.com/127.0.0.1#5335 +ipset=/idol-sagasukun.com/gfwlist +server=/scpdb.org/127.0.0.1#5335 +ipset=/scpdb.org/gfwlist +server=/india.com/127.0.0.1#5335 +ipset=/india.com/gfwlist +server=/vanish.com.mx/127.0.0.1#5335 +ipset=/vanish.com.mx/gfwlist +server=/page3.com/127.0.0.1#5335 +ipset=/page3.com/gfwlist +server=/signalprocessingsociety.org/127.0.0.1#5335 +ipset=/signalprocessingsociety.org/gfwlist +server=/bmwgroupdirect.com/127.0.0.1#5335 +ipset=/bmwgroupdirect.com/gfwlist +server=/avcrempie.com/127.0.0.1#5335 +ipset=/avcrempie.com/gfwlist +server=/movefreeoffers.com/127.0.0.1#5335 +ipset=/movefreeoffers.com/gfwlist +server=/pearsonclinical.ca/127.0.0.1#5335 +ipset=/pearsonclinical.ca/gfwlist +server=/google.fr/127.0.0.1#5335 +ipset=/google.fr/gfwlist +server=/foxnewschannel.com/127.0.0.1#5335 +ipset=/foxnewschannel.com/gfwlist +server=/touhouwiki.net/127.0.0.1#5335 +ipset=/touhouwiki.net/gfwlist +server=/youtube.it/127.0.0.1#5335 +ipset=/youtube.it/gfwlist +server=/1lib.education/127.0.0.1#5335 +ipset=/1lib.education/gfwlist +server=/forbiddenmomsarchive.com/127.0.0.1#5335 +ipset=/forbiddenmomsarchive.com/gfwlist +server=/animalincum.com/127.0.0.1#5335 +ipset=/animalincum.com/gfwlist +server=/alphabet.pl/127.0.0.1#5335 +ipset=/alphabet.pl/gfwlist +server=/alteraforums.com/127.0.0.1#5335 +ipset=/alteraforums.com/gfwlist +server=/xxxstreams.org/127.0.0.1#5335 +ipset=/xxxstreams.org/gfwlist +server=/imgix.com/127.0.0.1#5335 +ipset=/imgix.com/gfwlist +server=/mini-connected.se/127.0.0.1#5335 +ipset=/mini-connected.se/gfwlist +server=/chubbypornonly.com/127.0.0.1#5335 +ipset=/chubbypornonly.com/gfwlist +server=/radeon.com/127.0.0.1#5335 +ipset=/radeon.com/gfwlist +server=/hplaptopbattery.com/127.0.0.1#5335 +ipset=/hplaptopbattery.com/gfwlist +server=/google.fm/127.0.0.1#5335 +ipset=/google.fm/gfwlist +server=/hqseek.com/127.0.0.1#5335 +ipset=/hqseek.com/gfwlist +server=/zeetv.com/127.0.0.1#5335 +ipset=/zeetv.com/gfwlist +server=/shadowcomplex.com/127.0.0.1#5335 +ipset=/shadowcomplex.com/gfwlist +server=/get.rsvp/127.0.0.1#5335 +ipset=/get.rsvp/gfwlist +server=/maturesinhd.com/127.0.0.1#5335 +ipset=/maturesinhd.com/gfwlist +server=/cheapbeats365.com/127.0.0.1#5335 +ipset=/cheapbeats365.com/gfwlist +server=/svc.ms/127.0.0.1#5335 +ipset=/svc.ms/gfwlist +server=/asextube.net/127.0.0.1#5335 +ipset=/asextube.net/gfwlist +server=/intel.hu/127.0.0.1#5335 +ipset=/intel.hu/gfwlist +server=/directvcincinnatioh.com/127.0.0.1#5335 +ipset=/directvcincinnatioh.com/gfwlist +server=/starbucks.ca/127.0.0.1#5335 +ipset=/starbucks.ca/gfwlist +server=/muryouav.net/127.0.0.1#5335 +ipset=/muryouav.net/gfwlist +server=/directvcrossvilletn.com/127.0.0.1#5335 +ipset=/directvcrossvilletn.com/gfwlist +server=/msft.net/127.0.0.1#5335 +ipset=/msft.net/gfwlist +server=/teensloveanal.com/127.0.0.1#5335 +ipset=/teensloveanal.com/gfwlist +server=/beats1.tv/127.0.0.1#5335 +ipset=/beats1.tv/gfwlist +server=/apple-pay.wang/127.0.0.1#5335 +ipset=/apple-pay.wang/gfwlist +server=/ocsp.microsoft.com/127.0.0.1#5335 +ipset=/ocsp.microsoft.com/gfwlist +server=/atttvnow.com/127.0.0.1#5335 +ipset=/atttvnow.com/gfwlist +server=/milofetch.com/127.0.0.1#5335 +ipset=/milofetch.com/gfwlist +server=/telegram-cdn.org/127.0.0.1#5335 +ipset=/telegram-cdn.org/gfwlist +server=/researchkit.hk/127.0.0.1#5335 +ipset=/researchkit.hk/gfwlist +server=/airport.eu/127.0.0.1#5335 +ipset=/airport.eu/gfwlist +server=/ieeer10.org/127.0.0.1#5335 +ipset=/ieeer10.org/gfwlist +server=/paramountplus.com/127.0.0.1#5335 +ipset=/paramountplus.com/gfwlist +server=/nuget.org/127.0.0.1#5335 +ipset=/nuget.org/gfwlist +server=/bbcpersian.com/127.0.0.1#5335 +ipset=/bbcpersian.com/gfwlist +server=/idvd.eu/127.0.0.1#5335 +ipset=/idvd.eu/gfwlist +server=/garena.co.th/127.0.0.1#5335 +ipset=/garena.co.th/gfwlist +server=/scholar.google.dk/127.0.0.1#5335 +ipset=/scholar.google.dk/gfwlist +server=/1lib.eu/127.0.0.1#5335 +ipset=/1lib.eu/gfwlist +server=/intel.ly/127.0.0.1#5335 +ipset=/intel.ly/gfwlist +server=/ohyeah1080.com/127.0.0.1#5335 +ipset=/ohyeah1080.com/gfwlist +server=/xxxpornmovs.com/127.0.0.1#5335 +ipset=/xxxpornmovs.com/gfwlist +server=/czechwifeswap.com/127.0.0.1#5335 +ipset=/czechwifeswap.com/gfwlist +server=/facebookmanager.info/127.0.0.1#5335 +ipset=/facebookmanager.info/gfwlist +server=/siska.video/127.0.0.1#5335 +ipset=/siska.video/gfwlist +server=/4tubefree.net/127.0.0.1#5335 +ipset=/4tubefree.net/gfwlist +server=/97dounai.top/127.0.0.1#5335 +ipset=/97dounai.top/gfwlist +server=/wmt.co/127.0.0.1#5335 +ipset=/wmt.co/gfwlist +server=/attic.io/127.0.0.1#5335 +ipset=/attic.io/gfwlist +server=/drmario-world.com/127.0.0.1#5335 +ipset=/drmario-world.com/gfwlist +server=/zingtruyen.net/127.0.0.1#5335 +ipset=/zingtruyen.net/gfwlist +server=/dctbeatsbydre.com/127.0.0.1#5335 +ipset=/dctbeatsbydre.com/gfwlist +server=/smm99999.com/127.0.0.1#5335 +ipset=/smm99999.com/gfwlist +server=/anonproxy.info/127.0.0.1#5335 +ipset=/anonproxy.info/gfwlist +server=/shopify.com/127.0.0.1#5335 +ipset=/shopify.com/gfwlist +server=/zndsk.com/127.0.0.1#5335 +ipset=/zndsk.com/gfwlist +server=/kingstagram.com/127.0.0.1#5335 +ipset=/kingstagram.com/gfwlist +server=/metaporn.com/127.0.0.1#5335 +ipset=/metaporn.com/gfwlist +server=/mini.ch/127.0.0.1#5335 +ipset=/mini.ch/gfwlist +server=/buyitnow.net/127.0.0.1#5335 +ipset=/buyitnow.net/gfwlist +server=/newsexwap.com/127.0.0.1#5335 +ipset=/newsexwap.com/gfwlist +server=/blogspot.nl/127.0.0.1#5335 +ipset=/blogspot.nl/gfwlist +server=/canon.co.za/127.0.0.1#5335 +ipset=/canon.co.za/gfwlist +server=/aesworkshops.com/127.0.0.1#5335 +ipset=/aesworkshops.com/gfwlist +server=/danemarket.com/127.0.0.1#5335 +ipset=/danemarket.com/gfwlist +server=/bmw-world.net/127.0.0.1#5335 +ipset=/bmw-world.net/gfwlist +server=/pornobrasileiro.tv/127.0.0.1#5335 +ipset=/pornobrasileiro.tv/gfwlist +server=/tabustudios.co/127.0.0.1#5335 +ipset=/tabustudios.co/gfwlist +server=/attproxy.com/127.0.0.1#5335 +ipset=/attproxy.com/gfwlist +server=/hayabusa.dev/127.0.0.1#5335 +ipset=/hayabusa.dev/gfwlist +server=/yahoo-news.com.hk/127.0.0.1#5335 +ipset=/yahoo-news.com.hk/gfwlist +server=/hotwifemovies.com/127.0.0.1#5335 +ipset=/hotwifemovies.com/gfwlist +server=/v2ex.com/127.0.0.1#5335 +ipset=/v2ex.com/gfwlist +server=/ikea.hr/127.0.0.1#5335 +ipset=/ikea.hr/gfwlist +server=/hk01.com/127.0.0.1#5335 +ipset=/hk01.com/gfwlist +server=/boy18tube.com/127.0.0.1#5335 +ipset=/boy18tube.com/gfwlist +server=/google.com.ua/127.0.0.1#5335 +ipset=/google.com.ua/gfwlist +server=/hrsaz.com/127.0.0.1#5335 +ipset=/hrsaz.com/gfwlist +server=/boodigogo.com/127.0.0.1#5335 +ipset=/boodigogo.com/gfwlist +server=/fsacebok.com/127.0.0.1#5335 +ipset=/fsacebok.com/gfwlist +server=/beats-bydrecheapsale.com/127.0.0.1#5335 +ipset=/beats-bydrecheapsale.com/gfwlist +server=/alt8-mtalk.google.com/127.0.0.1#5335 +ipset=/alt8-mtalk.google.com/gfwlist +server=/facebookpay.com/127.0.0.1#5335 +ipset=/facebookpay.com/gfwlist +server=/pearson.ch/127.0.0.1#5335 +ipset=/pearson.ch/gfwlist +server=/intel.ma/127.0.0.1#5335 +ipset=/intel.ma/gfwlist +server=/canon.ua/127.0.0.1#5335 +ipset=/canon.ua/gfwlist +server=/usaco.org/127.0.0.1#5335 +ipset=/usaco.org/gfwlist +server=/scopus.com/127.0.0.1#5335 +ipset=/scopus.com/gfwlist +server=/mortein.co.in/127.0.0.1#5335 +ipset=/mortein.co.in/gfwlist +server=/savitahd.net/127.0.0.1#5335 +ipset=/savitahd.net/gfwlist +server=/5i01.com/127.0.0.1#5335 +ipset=/5i01.com/gfwlist +server=/facebookemail.com/127.0.0.1#5335 +ipset=/facebookemail.com/gfwlist +server=/faproulette.co/127.0.0.1#5335 +ipset=/faproulette.co/gfwlist +server=/bmw-voli.me/127.0.0.1#5335 +ipset=/bmw-voli.me/gfwlist +server=/pearson.com.hk/127.0.0.1#5335 +ipset=/pearson.com.hk/gfwlist +server=/webex.de/127.0.0.1#5335 +ipset=/webex.de/gfwlist +server=/men.com/127.0.0.1#5335 +ipset=/men.com/gfwlist +server=/skypeassets.net/127.0.0.1#5335 +ipset=/skypeassets.net/gfwlist +server=/xxxfree.watch/127.0.0.1#5335 +ipset=/xxxfree.watch/gfwlist +server=/verisign.co.in/127.0.0.1#5335 +ipset=/verisign.co.in/gfwlist +server=/alphera.co.nz/127.0.0.1#5335 +ipset=/alphera.co.nz/gfwlist +server=/stateofthemap.org/127.0.0.1#5335 +ipset=/stateofthemap.org/gfwlist +server=/mobileporngames.com/127.0.0.1#5335 +ipset=/mobileporngames.com/gfwlist +server=/strip-poker.xxx/127.0.0.1#5335 +ipset=/strip-poker.xxx/gfwlist +server=/tytporno.online/127.0.0.1#5335 +ipset=/tytporno.online/gfwlist +server=/bestbuycharityclassic.com/127.0.0.1#5335 +ipset=/bestbuycharityclassic.com/gfwlist +server=/scholar.google.li/127.0.0.1#5335 +ipset=/scholar.google.li/gfwlist +server=/unwire.hk/127.0.0.1#5335 +ipset=/unwire.hk/gfwlist +server=/google.sr/127.0.0.1#5335 +ipset=/google.sr/gfwlist +server=/kubeacademy.com/127.0.0.1#5335 +ipset=/kubeacademy.com/gfwlist +server=/e-bay.it/127.0.0.1#5335 +ipset=/e-bay.it/gfwlist +server=/fontawesome.com/127.0.0.1#5335 +ipset=/fontawesome.com/gfwlist +server=/soundofhope.kr/127.0.0.1#5335 +ipset=/soundofhope.kr/gfwlist +server=/globalriskregulator.com/127.0.0.1#5335 +ipset=/globalriskregulator.com/gfwlist +server=/paofuyun.me/127.0.0.1#5335 +ipset=/paofuyun.me/gfwlist +server=/pornoisy.com/127.0.0.1#5335 +ipset=/pornoisy.com/gfwlist +server=/calgon.ch/127.0.0.1#5335 +ipset=/calgon.ch/gfwlist +server=/xxxporndig.com/127.0.0.1#5335 +ipset=/xxxporndig.com/gfwlist +server=/v2fly.org/127.0.0.1#5335 +ipset=/v2fly.org/gfwlist +server=/ipad.co.kr/127.0.0.1#5335 +ipset=/ipad.co.kr/gfwlist +server=/udn.com/127.0.0.1#5335 +ipset=/udn.com/gfwlist +server=/ikea.com.pt/127.0.0.1#5335 +ipset=/ikea.com.pt/gfwlist +server=/minirichmond.ca/127.0.0.1#5335 +ipset=/minirichmond.ca/gfwlist +server=/fxnetworks.com/127.0.0.1#5335 +ipset=/fxnetworks.com/gfwlist +server=/beatsbydreoutletsale.com/127.0.0.1#5335 +ipset=/beatsbydreoutletsale.com/gfwlist +server=/virsto.net/127.0.0.1#5335 +ipset=/virsto.net/gfwlist +server=/gayapatal.com/127.0.0.1#5335 +ipset=/gayapatal.com/gfwlist +server=/facebooktv.org/127.0.0.1#5335 +ipset=/facebooktv.org/gfwlist +server=/beatsbydrecolors.com/127.0.0.1#5335 +ipset=/beatsbydrecolors.com/gfwlist +server=/adultgames.me/127.0.0.1#5335 +ipset=/adultgames.me/gfwlist +server=/zoo-xvideo.com/127.0.0.1#5335 +ipset=/zoo-xvideo.com/gfwlist +server=/nextwork.hk/127.0.0.1#5335 +ipset=/nextwork.hk/gfwlist +server=/applestore.de/127.0.0.1#5335 +ipset=/applestore.de/gfwlist +server=/azurecomm.net/127.0.0.1#5335 +ipset=/azurecomm.net/gfwlist +server=/adult3dfantasycomics.com/127.0.0.1#5335 +ipset=/adult3dfantasycomics.com/gfwlist +server=/directvbundles.com/127.0.0.1#5335 +ipset=/directvbundles.com/gfwlist +server=/iijav.com/127.0.0.1#5335 +ipset=/iijav.com/gfwlist +server=/serialssolutions.com/127.0.0.1#5335 +ipset=/serialssolutions.com/gfwlist +server=/salecheaphandbags.com/127.0.0.1#5335 +ipset=/salecheaphandbags.com/gfwlist +server=/vixvids.to/127.0.0.1#5335 +ipset=/vixvids.to/gfwlist +server=/geeksquadcentral.com/127.0.0.1#5335 +ipset=/geeksquadcentral.com/gfwlist +server=/myhpsupport.com/127.0.0.1#5335 +ipset=/myhpsupport.com/gfwlist +server=/vipoo.es/127.0.0.1#5335 +ipset=/vipoo.es/gfwlist +server=/xn--uis17aj9kmuf.com/127.0.0.1#5335 +ipset=/xn--uis17aj9kmuf.com/gfwlist +server=/buycheapbeatsbus.com/127.0.0.1#5335 +ipset=/buycheapbeatsbus.com/gfwlist +server=/bmw-golfsport.com/127.0.0.1#5335 +ipset=/bmw-golfsport.com/gfwlist +server=/hbo.com.edgesuite.net/127.0.0.1#5335 +ipset=/hbo.com.edgesuite.net/gfwlist +server=/giratina.com/127.0.0.1#5335 +ipset=/giratina.com/gfwlist +server=/honawalaan.com/127.0.0.1#5335 +ipset=/honawalaan.com/gfwlist +server=/thottok.com/127.0.0.1#5335 +ipset=/thottok.com/gfwlist +server=/durexusa.com/127.0.0.1#5335 +ipset=/durexusa.com/gfwlist +server=/nikecdn.com/127.0.0.1#5335 +ipset=/nikecdn.com/gfwlist +server=/sciencedirectassets.com/127.0.0.1#5335 +ipset=/sciencedirectassets.com/gfwlist +server=/minibrossard.com/127.0.0.1#5335 +ipset=/minibrossard.com/gfwlist +server=/paypal-online.org/127.0.0.1#5335 +ipset=/paypal-online.org/gfwlist +server=/awseducate.net/127.0.0.1#5335 +ipset=/awseducate.net/gfwlist +server=/kirbysuperstarultra.com/127.0.0.1#5335 +ipset=/kirbysuperstarultra.com/gfwlist +server=/disney.ph/127.0.0.1#5335 +ipset=/disney.ph/gfwlist +server=/youtube.bh/127.0.0.1#5335 +ipset=/youtube.bh/gfwlist +server=/globalsign.com.sg/127.0.0.1#5335 +ipset=/globalsign.com.sg/gfwlist +server=/flipnotestudio.com/127.0.0.1#5335 +ipset=/flipnotestudio.com/gfwlist +server=/amazon.in/127.0.0.1#5335 +ipset=/amazon.in/gfwlist +server=/paypal-scoop.com/127.0.0.1#5335 +ipset=/paypal-scoop.com/gfwlist +server=/vs-cmaf-pushb-ww-live.akamaized.net/127.0.0.1#5335 +ipset=/vs-cmaf-pushb-ww-live.akamaized.net/gfwlist +server=/youngpornvideos.com/127.0.0.1#5335 +ipset=/youngpornvideos.com/gfwlist +server=/yandex.co.il/127.0.0.1#5335 +ipset=/yandex.co.il/gfwlist +server=/sexyseeker.com/127.0.0.1#5335 +ipset=/sexyseeker.com/gfwlist +server=/ggjav.com/127.0.0.1#5335 +ipset=/ggjav.com/gfwlist +server=/beatsbydreforyououtlet.com/127.0.0.1#5335 +ipset=/beatsbydreforyououtlet.com/gfwlist +server=/follasian.com/127.0.0.1#5335 +ipset=/follasian.com/gfwlist +server=/adultdvdmarketplace.com/127.0.0.1#5335 +ipset=/adultdvdmarketplace.com/gfwlist +server=/xxxmofo.com/127.0.0.1#5335 +ipset=/xxxmofo.com/gfwlist +server=/gitstar.com/127.0.0.1#5335 +ipset=/gitstar.com/gfwlist +server=/pixtronix.com/127.0.0.1#5335 +ipset=/pixtronix.com/gfwlist +server=/redfaptube.com/127.0.0.1#5335 +ipset=/redfaptube.com/gfwlist +server=/danskpornofilm.com/127.0.0.1#5335 +ipset=/danskpornofilm.com/gfwlist +server=/smutty.com/127.0.0.1#5335 +ipset=/smutty.com/gfwlist +server=/talksport.com/127.0.0.1#5335 +ipset=/talksport.com/gfwlist +server=/latintubeporn.com/127.0.0.1#5335 +ipset=/latintubeporn.com/gfwlist +server=/analhomeporn.com/127.0.0.1#5335 +ipset=/analhomeporn.com/gfwlist +server=/coedcherry.com/127.0.0.1#5335 +ipset=/coedcherry.com/gfwlist +server=/javbraze.com/127.0.0.1#5335 +ipset=/javbraze.com/gfwlist +server=/brazzer.com/127.0.0.1#5335 +ipset=/brazzer.com/gfwlist +server=/apple.co.hu/127.0.0.1#5335 +ipset=/apple.co.hu/gfwlist +server=/hkbn.com.hk/127.0.0.1#5335 +ipset=/hkbn.com.hk/gfwlist +server=/iphone-vip1.com/127.0.0.1#5335 +ipset=/iphone-vip1.com/gfwlist +server=/vmware.com/127.0.0.1#5335 +ipset=/vmware.com/gfwlist +server=/ypmate.com/127.0.0.1#5335 +ipset=/ypmate.com/gfwlist +server=/duck.co/127.0.0.1#5335 +ipset=/duck.co/gfwlist +server=/bmw.ca/127.0.0.1#5335 +ipset=/bmw.ca/gfwlist +server=/researchkit.org/127.0.0.1#5335 +ipset=/researchkit.org/gfwlist +server=/cloudlive.com/127.0.0.1#5335 +ipset=/cloudlive.com/gfwlist +server=/sexygloz.com/127.0.0.1#5335 +ipset=/sexygloz.com/gfwlist +server=/ciscoknowledgenetwork.com/127.0.0.1#5335 +ipset=/ciscoknowledgenetwork.com/gfwlist +server=/pdncommunity.com/127.0.0.1#5335 +ipset=/pdncommunity.com/gfwlist +server=/yahoo.ph/127.0.0.1#5335 +ipset=/yahoo.ph/gfwlist +server=/needforspeedtimeattack.com/127.0.0.1#5335 +ipset=/needforspeedtimeattack.com/gfwlist +server=/worldemojiday.com/127.0.0.1#5335 +ipset=/worldemojiday.com/gfwlist +server=/beatsfactoroutlets.com/127.0.0.1#5335 +ipset=/beatsfactoroutlets.com/gfwlist +server=/manhwahentai.me/127.0.0.1#5335 +ipset=/manhwahentai.me/gfwlist +server=/nike.com.hk/127.0.0.1#5335 +ipset=/nike.com.hk/gfwlist +server=/spotifycdn.com/127.0.0.1#5335 +ipset=/spotifycdn.com/gfwlist +server=/scholar.google.com.eg/127.0.0.1#5335 +ipset=/scholar.google.com.eg/gfwlist +server=/title.sh/127.0.0.1#5335 +ipset=/title.sh/gfwlist +server=/triokini.com/127.0.0.1#5335 +ipset=/triokini.com/gfwlist +server=/xxxyoungxxx.com/127.0.0.1#5335 +ipset=/xxxyoungxxx.com/gfwlist +server=/visasavingsedge.ca/127.0.0.1#5335 +ipset=/visasavingsedge.ca/gfwlist +server=/echocdn.com/127.0.0.1#5335 +ipset=/echocdn.com/gfwlist +server=/amateur-home-sex.com/127.0.0.1#5335 +ipset=/amateur-home-sex.com/gfwlist +server=/fixtracking.com/127.0.0.1#5335 +ipset=/fixtracking.com/gfwlist +server=/highwirepress.com/127.0.0.1#5335 +ipset=/highwirepress.com/gfwlist +server=/celebrityslips.com/127.0.0.1#5335 +ipset=/celebrityslips.com/gfwlist +server=/nurofen.co.uk/127.0.0.1#5335 +ipset=/nurofen.co.uk/gfwlist +server=/disney.es/127.0.0.1#5335 +ipset=/disney.es/gfwlist +server=/blogspot.ug/127.0.0.1#5335 +ipset=/blogspot.ug/gfwlist +server=/facebokk.com/127.0.0.1#5335 +ipset=/facebokk.com/gfwlist +server=/lezpoo.com/127.0.0.1#5335 +ipset=/lezpoo.com/gfwlist +server=/sportswomanoftheyear.co.uk/127.0.0.1#5335 +ipset=/sportswomanoftheyear.co.uk/gfwlist +server=/appbridge.io/127.0.0.1#5335 +ipset=/appbridge.io/gfwlist +server=/teamneedforspeed.com/127.0.0.1#5335 +ipset=/teamneedforspeed.com/gfwlist +server=/r-new-sale.blog.jp/127.0.0.1#5335 +ipset=/r-new-sale.blog.jp/gfwlist +server=/freehdinterracialporn.in/127.0.0.1#5335 +ipset=/freehdinterracialporn.in/gfwlist +server=/ffmpeg.org/127.0.0.1#5335 +ipset=/ffmpeg.org/gfwlist +server=/liveporngirls.com/127.0.0.1#5335 +ipset=/liveporngirls.com/gfwlist +server=/mirrorsedge2.com/127.0.0.1#5335 +ipset=/mirrorsedge2.com/gfwlist +server=/01.org/127.0.0.1#5335 +ipset=/01.org/gfwlist +server=/alphabetfinance.net/127.0.0.1#5335 +ipset=/alphabetfinance.net/gfwlist +server=/camrabbit.com/127.0.0.1#5335 +ipset=/camrabbit.com/gfwlist +server=/intel.nu/127.0.0.1#5335 +ipset=/intel.nu/gfwlist +server=/pornpaw.com/127.0.0.1#5335 +ipset=/pornpaw.com/gfwlist +server=/emac.co.in/127.0.0.1#5335 +ipset=/emac.co.in/gfwlist +server=/altmetric.com/127.0.0.1#5335 +ipset=/altmetric.com/gfwlist +server=/azure.microsoft.com/127.0.0.1#5335 +ipset=/azure.microsoft.com/gfwlist +server=/drebeatssolocybermondaysale.com/127.0.0.1#5335 +ipset=/drebeatssolocybermondaysale.com/gfwlist +server=/insiderdevtour.com/127.0.0.1#5335 +ipset=/insiderdevtour.com/gfwlist +server=/mastercard.ch/127.0.0.1#5335 +ipset=/mastercard.ch/gfwlist +server=/libgen.fun/127.0.0.1#5335 +ipset=/libgen.fun/gfwlist +server=/visa.com.ms/127.0.0.1#5335 +ipset=/visa.com.ms/gfwlist +server=/mucinex.cn/127.0.0.1#5335 +ipset=/mucinex.cn/gfwlist +server=/apple.xyz/127.0.0.1#5335 +ipset=/apple.xyz/gfwlist +server=/paypalnet.net/127.0.0.1#5335 +ipset=/paypalnet.net/gfwlist +server=/hentai.toys/127.0.0.1#5335 +ipset=/hentai.toys/gfwlist +server=/privatecasting-x.com/127.0.0.1#5335 +ipset=/privatecasting-x.com/gfwlist +server=/foxnewsplayer-a.akamaihd.net/127.0.0.1#5335 +ipset=/foxnewsplayer-a.akamaihd.net/gfwlist +server=/bellsouth.net/127.0.0.1#5335 +ipset=/bellsouth.net/gfwlist +server=/sgp1.fun/127.0.0.1#5335 +ipset=/sgp1.fun/gfwlist +server=/bellesa.co/127.0.0.1#5335 +ipset=/bellesa.co/gfwlist +server=/tropictube.com/127.0.0.1#5335 +ipset=/tropictube.com/gfwlist +server=/virsto.com/127.0.0.1#5335 +ipset=/virsto.com/gfwlist +server=/getboxer.com/127.0.0.1#5335 +ipset=/getboxer.com/gfwlist +server=/dirty.games/127.0.0.1#5335 +ipset=/dirty.games/gfwlist +server=/vfsco.nl/127.0.0.1#5335 +ipset=/vfsco.nl/gfwlist +server=/nudes7.com/127.0.0.1#5335 +ipset=/nudes7.com/gfwlist +server=/zeit-world.com/127.0.0.1#5335 +ipset=/zeit-world.com/gfwlist +server=/mixvintagesex.com/127.0.0.1#5335 +ipset=/mixvintagesex.com/gfwlist +server=/fansnudes.com/127.0.0.1#5335 +ipset=/fansnudes.com/gfwlist +server=/kijij.ca/127.0.0.1#5335 +ipset=/kijij.ca/gfwlist +server=/hotstar.com/127.0.0.1#5335 +ipset=/hotstar.com/gfwlist +server=/amateurs-fuck.com/127.0.0.1#5335 +ipset=/amateurs-fuck.com/gfwlist +server=/lin.ee/127.0.0.1#5335 +ipset=/lin.ee/gfwlist +server=/l-0005.dc-msedge.net/127.0.0.1#5335 +ipset=/l-0005.dc-msedge.net/gfwlist +server=/agag.tw/127.0.0.1#5335 +ipset=/agag.tw/gfwlist +server=/volvomerchandise.com/127.0.0.1#5335 +ipset=/volvomerchandise.com/gfwlist +server=/xmoviesforyou.com/127.0.0.1#5335 +ipset=/xmoviesforyou.com/gfwlist +server=/quora.com/127.0.0.1#5335 +ipset=/quora.com/gfwlist +server=/iop.org/127.0.0.1#5335 +ipset=/iop.org/gfwlist +server=/ebayvalet.com/127.0.0.1#5335 +ipset=/ebayvalet.com/gfwlist +server=/oculus3d.com/127.0.0.1#5335 +ipset=/oculus3d.com/gfwlist +server=/instagify.com/127.0.0.1#5335 +ipset=/instagify.com/gfwlist +server=/beatsbydreformall2013-nl.com/127.0.0.1#5335 +ipset=/beatsbydreformall2013-nl.com/gfwlist +server=/oyeloca.com/127.0.0.1#5335 +ipset=/oyeloca.com/gfwlist +server=/foofle.com/127.0.0.1#5335 +ipset=/foofle.com/gfwlist +server=/directvpomise.com/127.0.0.1#5335 +ipset=/directvpomise.com/gfwlist +server=/aliverewind.com/127.0.0.1#5335 +ipset=/aliverewind.com/gfwlist +server=/cbsi.video/127.0.0.1#5335 +ipset=/cbsi.video/gfwlist +server=/bmwmotorshowblog.com/127.0.0.1#5335 +ipset=/bmwmotorshowblog.com/gfwlist +server=/b-ok.org/127.0.0.1#5335 +ipset=/b-ok.org/gfwlist +server=/xsava.xyz/127.0.0.1#5335 +ipset=/xsava.xyz/gfwlist +server=/flow.org/127.0.0.1#5335 +ipset=/flow.org/gfwlist +server=/adultepic.com/127.0.0.1#5335 +ipset=/adultepic.com/gfwlist +server=/lysol.cl/127.0.0.1#5335 +ipset=/lysol.cl/gfwlist +server=/crr.com/127.0.0.1#5335 +ipset=/crr.com/gfwlist +server=/immidio.com/127.0.0.1#5335 +ipset=/immidio.com/gfwlist +server=/thomsonreuters.com/127.0.0.1#5335 +ipset=/thomsonreuters.com/gfwlist +server=/bigboobbundle.com/127.0.0.1#5335 +ipset=/bigboobbundle.com/gfwlist +server=/bmw.bs/127.0.0.1#5335 +ipset=/bmw.bs/gfwlist +server=/hentaihand.com/127.0.0.1#5335 +ipset=/hentaihand.com/gfwlist +server=/macbookair.com/127.0.0.1#5335 +ipset=/macbookair.com/gfwlist +server=/bloomberg.co.kr/127.0.0.1#5335 +ipset=/bloomberg.co.kr/gfwlist +server=/mrpornlive.com/127.0.0.1#5335 +ipset=/mrpornlive.com/gfwlist +server=/bigtitangelawhite.com/127.0.0.1#5335 +ipset=/bigtitangelawhite.com/gfwlist +server=/meridian.net/127.0.0.1#5335 +ipset=/meridian.net/gfwlist +server=/erome.it/127.0.0.1#5335 +ipset=/erome.it/gfwlist +server=/mediafiles-cisco.com/127.0.0.1#5335 +ipset=/mediafiles-cisco.com/gfwlist +server=/hentaibar.com/127.0.0.1#5335 +ipset=/hentaibar.com/gfwlist +server=/sb-telecom.net/127.0.0.1#5335 +ipset=/sb-telecom.net/gfwlist +server=/amiibo.com/127.0.0.1#5335 +ipset=/amiibo.com/gfwlist +server=/ikea.com.do/127.0.0.1#5335 +ipset=/ikea.com.do/gfwlist +server=/youtube.ph/127.0.0.1#5335 +ipset=/youtube.ph/gfwlist +server=/12diasderegalosdeitunes.com.co/127.0.0.1#5335 +ipset=/12diasderegalosdeitunes.com.co/gfwlist +server=/senzuritv.net/127.0.0.1#5335 +ipset=/senzuritv.net/gfwlist +server=/xn--gtvz22d.wang/127.0.0.1#5335 +ipset=/xn--gtvz22d.wang/gfwlist +server=/reabble.com/127.0.0.1#5335 +ipset=/reabble.com/gfwlist +server=/bdsm123.xyz/127.0.0.1#5335 +ipset=/bdsm123.xyz/gfwlist +server=/beastythumbs.com/127.0.0.1#5335 +ipset=/beastythumbs.com/gfwlist +server=/yourcolonic.com/127.0.0.1#5335 +ipset=/yourcolonic.com/gfwlist +server=/ebayshoesstore.com/127.0.0.1#5335 +ipset=/ebayshoesstore.com/gfwlist +server=/playno1.com/127.0.0.1#5335 +ipset=/playno1.com/gfwlist +server=/applestore.com.ro/127.0.0.1#5335 +ipset=/applestore.com.ro/gfwlist +server=/ebayinc.org/127.0.0.1#5335 +ipset=/ebayinc.org/gfwlist +server=/storage.live.com/127.0.0.1#5335 +ipset=/storage.live.com/gfwlist +server=/cheapcustombeatsbydre.com/127.0.0.1#5335 +ipset=/cheapcustombeatsbydre.com/gfwlist +server=/casquebeatsdocteurdre.com/127.0.0.1#5335 +ipset=/casquebeatsdocteurdre.com/gfwlist +server=/ikea.com.lv/127.0.0.1#5335 +ipset=/ikea.com.lv/gfwlist +server=/account-paypal.info/127.0.0.1#5335 +ipset=/account-paypal.info/gfwlist +server=/google.de/127.0.0.1#5335 +ipset=/google.de/gfwlist +server=/evilx.su/127.0.0.1#5335 +ipset=/evilx.su/gfwlist +server=/artstation.com/127.0.0.1#5335 +ipset=/artstation.com/gfwlist +server=/freshscat.com/127.0.0.1#5335 +ipset=/freshscat.com/gfwlist +server=/hpconnected.net/127.0.0.1#5335 +ipset=/hpconnected.net/gfwlist +server=/wbvm4s.com/127.0.0.1#5335 +ipset=/wbvm4s.com/gfwlist +server=/binance.com/127.0.0.1#5335 +ipset=/binance.com/gfwlist +server=/mini.is/127.0.0.1#5335 +ipset=/mini.is/gfwlist +server=/rea-asia.com/127.0.0.1#5335 +ipset=/rea-asia.com/gfwlist +server=/youtube.az/127.0.0.1#5335 +ipset=/youtube.az/gfwlist +server=/hacklang.org/127.0.0.1#5335 +ipset=/hacklang.org/gfwlist +server=/webtoons.com/127.0.0.1#5335 +ipset=/webtoons.com/gfwlist +server=/volvogroup.mx/127.0.0.1#5335 +ipset=/volvogroup.mx/gfwlist +server=/myavsuper.com/127.0.0.1#5335 +ipset=/myavsuper.com/gfwlist +server=/csakporno.hu/127.0.0.1#5335 +ipset=/csakporno.hu/gfwlist +server=/animeidhentai.com/127.0.0.1#5335 +ipset=/animeidhentai.com/gfwlist +server=/consul.io/127.0.0.1#5335 +ipset=/consul.io/gfwlist +server=/volvobuses.com.au/127.0.0.1#5335 +ipset=/volvobuses.com.au/gfwlist +server=/beatsbydrestudio.com/127.0.0.1#5335 +ipset=/beatsbydrestudio.com/gfwlist +server=/paypal-survey.com/127.0.0.1#5335 +ipset=/paypal-survey.com/gfwlist +server=/valuegb.com/127.0.0.1#5335 +ipset=/valuegb.com/gfwlist +server=/world3d.biz/127.0.0.1#5335 +ipset=/world3d.biz/gfwlist +server=/yuvutu.com/127.0.0.1#5335 +ipset=/yuvutu.com/gfwlist +server=/prettynubiles.com/127.0.0.1#5335 +ipset=/prettynubiles.com/gfwlist +server=/zooporn.shiksha/127.0.0.1#5335 +ipset=/zooporn.shiksha/gfwlist +server=/mastercard.com.ar/127.0.0.1#5335 +ipset=/mastercard.com.ar/gfwlist +server=/xinmeitulu.com/127.0.0.1#5335 +ipset=/xinmeitulu.com/gfwlist +server=/borderlessprepaid.com/127.0.0.1#5335 +ipset=/borderlessprepaid.com/gfwlist +server=/miraheze.org/127.0.0.1#5335 +ipset=/miraheze.org/gfwlist +server=/6parknews.com/127.0.0.1#5335 +ipset=/6parknews.com/gfwlist +server=/drebeatsbuy.com/127.0.0.1#5335 +ipset=/drebeatsbuy.com/gfwlist +server=/enpirion.com/127.0.0.1#5335 +ipset=/enpirion.com/gfwlist +server=/miniso.co.id/127.0.0.1#5335 +ipset=/miniso.co.id/gfwlist +server=/acgfabu.com/127.0.0.1#5335 +ipset=/acgfabu.com/gfwlist +server=/date2night.xyz/127.0.0.1#5335 +ipset=/date2night.xyz/gfwlist +server=/minicanada.ca/127.0.0.1#5335 +ipset=/minicanada.ca/gfwlist +server=/gamedownloads-rockstargames-com.akamaized.net/127.0.0.1#5335 +ipset=/gamedownloads-rockstargames-com.akamaized.net/gfwlist +server=/bandwagonhost.com/127.0.0.1#5335 +ipset=/bandwagonhost.com/gfwlist +server=/alpherafs.ca/127.0.0.1#5335 +ipset=/alpherafs.ca/gfwlist +server=/javcdn.cc/127.0.0.1#5335 +ipset=/javcdn.cc/gfwlist +server=/bridgestonecomercial.com.mx/127.0.0.1#5335 +ipset=/bridgestonecomercial.com.mx/gfwlist +server=/nijie.info/127.0.0.1#5335 +ipset=/nijie.info/gfwlist +server=/dkr.com/127.0.0.1#5335 +ipset=/dkr.com/gfwlist +server=/facdebook.com/127.0.0.1#5335 +ipset=/facdebook.com/gfwlist +server=/japanxxxfilms.com/127.0.0.1#5335 +ipset=/japanxxxfilms.com/gfwlist +server=/cms-twdigitalassets.com/127.0.0.1#5335 +ipset=/cms-twdigitalassets.com/gfwlist +server=/malaypornhub.com/127.0.0.1#5335 +ipset=/malaypornhub.com/gfwlist +server=/animehentaihub.com/127.0.0.1#5335 +ipset=/animehentaihub.com/gfwlist +server=/curvybbwwives.com/127.0.0.1#5335 +ipset=/curvybbwwives.com/gfwlist +server=/weareebay.com/127.0.0.1#5335 +ipset=/weareebay.com/gfwlist +server=/bejewled-stars.com/127.0.0.1#5335 +ipset=/bejewled-stars.com/gfwlist +server=/topcuckolds.com/127.0.0.1#5335 +ipset=/topcuckolds.com/gfwlist +server=/aspbjournals.org/127.0.0.1#5335 +ipset=/aspbjournals.org/gfwlist +server=/intel.com.br/127.0.0.1#5335 +ipset=/intel.com.br/gfwlist +server=/bloombergbriefs.com/127.0.0.1#5335 +ipset=/bloombergbriefs.com/gfwlist +server=/freebasics.net/127.0.0.1#5335 +ipset=/freebasics.net/gfwlist +server=/google.com.hk/127.0.0.1#5335 +ipset=/google.com.hk/gfwlist +server=/meetfasttrack.com/127.0.0.1#5335 +ipset=/meetfasttrack.com/gfwlist +server=/xvideosamadoras.com/127.0.0.1#5335 +ipset=/xvideosamadoras.com/gfwlist +server=/baeb.com/127.0.0.1#5335 +ipset=/baeb.com/gfwlist +server=/macos.com.au/127.0.0.1#5335 +ipset=/macos.com.au/gfwlist +server=/mastercard.com.eg/127.0.0.1#5335 +ipset=/mastercard.com.eg/gfwlist +server=/hpbuiltforlearning.com/127.0.0.1#5335 +ipset=/hpbuiltforlearning.com/gfwlist +server=/clitgames.com/127.0.0.1#5335 +ipset=/clitgames.com/gfwlist +server=/nikesnowboarding.com/127.0.0.1#5335 +ipset=/nikesnowboarding.com/gfwlist +server=/sexvid.xxx/127.0.0.1#5335 +ipset=/sexvid.xxx/gfwlist +server=/pornogrund.com/127.0.0.1#5335 +ipset=/pornogrund.com/gfwlist +server=/pornlulu.com/127.0.0.1#5335 +ipset=/pornlulu.com/gfwlist +server=/youtube.co.th/127.0.0.1#5335 +ipset=/youtube.co.th/gfwlist +server=/newscommercial.co.uk/127.0.0.1#5335 +ipset=/newscommercial.co.uk/gfwlist +server=/xxxvideor.com/127.0.0.1#5335 +ipset=/xxxvideor.com/gfwlist +server=/sexinsex.net/127.0.0.1#5335 +ipset=/sexinsex.net/gfwlist +server=/daftporn.com/127.0.0.1#5335 +ipset=/daftporn.com/gfwlist +server=/beatsbydreoutletscheap.com/127.0.0.1#5335 +ipset=/beatsbydreoutletscheap.com/gfwlist +server=/mini-connected.dk/127.0.0.1#5335 +ipset=/mini-connected.dk/gfwlist +server=/google.dm/127.0.0.1#5335 +ipset=/google.dm/gfwlist +server=/starbuckscard.ph/127.0.0.1#5335 +ipset=/starbuckscard.ph/gfwlist +server=/nike.xn--hxt814e/127.0.0.1#5335 +ipset=/nike.xn--hxt814e/gfwlist +server=/terapeak.com.hk/127.0.0.1#5335 +ipset=/terapeak.com.hk/gfwlist +server=/theverge.com/127.0.0.1#5335 +ipset=/theverge.com/gfwlist +server=/youtube.com.py/127.0.0.1#5335 +ipset=/youtube.com.py/gfwlist +server=/cisconetspace.info/127.0.0.1#5335 +ipset=/cisconetspace.info/gfwlist +server=/youtube.co.hu/127.0.0.1#5335 +ipset=/youtube.co.hu/gfwlist +server=/xmalay.com/127.0.0.1#5335 +ipset=/xmalay.com/gfwlist +server=/wowindianporn.com/127.0.0.1#5335 +ipset=/wowindianporn.com/gfwlist +server=/google.com.mx/127.0.0.1#5335 +ipset=/google.com.mx/gfwlist +server=/watchmygf.to/127.0.0.1#5335 +ipset=/watchmygf.to/gfwlist +server=/nikerunningshoes.com/127.0.0.1#5335 +ipset=/nikerunningshoes.com/gfwlist +server=/ipadaustralia.com/127.0.0.1#5335 +ipset=/ipadaustralia.com/gfwlist +server=/foxsports.cl/127.0.0.1#5335 +ipset=/foxsports.cl/gfwlist +server=/duckduckgo.in/127.0.0.1#5335 +ipset=/duckduckgo.in/gfwlist +server=/collins.co.uk/127.0.0.1#5335 +ipset=/collins.co.uk/gfwlist +server=/playbar.biz/127.0.0.1#5335 +ipset=/playbar.biz/gfwlist +server=/youtube.tn/127.0.0.1#5335 +ipset=/youtube.tn/gfwlist +server=/tubepornclassic.com/127.0.0.1#5335 +ipset=/tubepornclassic.com/gfwlist +server=/amandalist.com/127.0.0.1#5335 +ipset=/amandalist.com/gfwlist +server=/allswingersclubs.org/127.0.0.1#5335 +ipset=/allswingersclubs.org/gfwlist +server=/macbook.hk/127.0.0.1#5335 +ipset=/macbook.hk/gfwlist +server=/50dh.app/127.0.0.1#5335 +ipset=/50dh.app/gfwlist +server=/sony.no/127.0.0.1#5335 +ipset=/sony.no/gfwlist +server=/radiyoyacuvoa.com/127.0.0.1#5335 +ipset=/radiyoyacuvoa.com/gfwlist +server=/pwnedpasswords.com/127.0.0.1#5335 +ipset=/pwnedpasswords.com/gfwlist +server=/intel.lk/127.0.0.1#5335 +ipset=/intel.lk/gfwlist +server=/apple.bs/127.0.0.1#5335 +ipset=/apple.bs/gfwlist +server=/go-lang.net/127.0.0.1#5335 +ipset=/go-lang.net/gfwlist +server=/banatfun.com/127.0.0.1#5335 +ipset=/banatfun.com/gfwlist +server=/johnpersons.com/127.0.0.1#5335 +ipset=/johnpersons.com/gfwlist +server=/nextwork.tw/127.0.0.1#5335 +ipset=/nextwork.tw/gfwlist +server=/office365.com/127.0.0.1#5335 +ipset=/office365.com/gfwlist +server=/thebankerdatabase.com/127.0.0.1#5335 +ipset=/thebankerdatabase.com/gfwlist +server=/animal-hentai.com/127.0.0.1#5335 +ipset=/animal-hentai.com/gfwlist +server=/samsungknox.com/127.0.0.1#5335 +ipset=/samsungknox.com/gfwlist +server=/veetclub.it/127.0.0.1#5335 +ipset=/veetclub.it/gfwlist +server=/bmw-connecteddrive.at/127.0.0.1#5335 +ipset=/bmw-connecteddrive.at/gfwlist +server=/hotstar-cdn.net/127.0.0.1#5335 +ipset=/hotstar-cdn.net/gfwlist +server=/l-0005.l-msedge.net/127.0.0.1#5335 +ipset=/l-0005.l-msedge.net/gfwlist +server=/fapster.xxx/127.0.0.1#5335 +ipset=/fapster.xxx/gfwlist +server=/d2pass.com/127.0.0.1#5335 +ipset=/d2pass.com/gfwlist +server=/magentomobile.com/127.0.0.1#5335 +ipset=/magentomobile.com/gfwlist +server=/gayvl.net/127.0.0.1#5335 +ipset=/gayvl.net/gfwlist +server=/facebock.com/127.0.0.1#5335 +ipset=/facebock.com/gfwlist +server=/facerbooik.com/127.0.0.1#5335 +ipset=/facerbooik.com/gfwlist +server=/ping.pe/127.0.0.1#5335 +ipset=/ping.pe/gfwlist +server=/camgirlstemple.com/127.0.0.1#5335 +ipset=/camgirlstemple.com/gfwlist +server=/beats-bydre-mall.com/127.0.0.1#5335 +ipset=/beats-bydre-mall.com/gfwlist +server=/milfsexstart.nl/127.0.0.1#5335 +ipset=/milfsexstart.nl/gfwlist +server=/machigoto.jp/127.0.0.1#5335 +ipset=/machigoto.jp/gfwlist +server=/monsterbeats365buy.com/127.0.0.1#5335 +ipset=/monsterbeats365buy.com/gfwlist +server=/newbienudes.com/127.0.0.1#5335 +ipset=/newbienudes.com/gfwlist +server=/studiofow.com/127.0.0.1#5335 +ipset=/studiofow.com/gfwlist +server=/beatsheadphoness.com/127.0.0.1#5335 +ipset=/beatsheadphoness.com/gfwlist +server=/pyrobot.org/127.0.0.1#5335 +ipset=/pyrobot.org/gfwlist +server=/befuck.com/127.0.0.1#5335 +ipset=/befuck.com/gfwlist +server=/bimbim.com/127.0.0.1#5335 +ipset=/bimbim.com/gfwlist +server=/yahoo.co.id/127.0.0.1#5335 +ipset=/yahoo.co.id/gfwlist +server=/minisaskatoon.ca/127.0.0.1#5335 +ipset=/minisaskatoon.ca/gfwlist +server=/macbookair.hk/127.0.0.1#5335 +ipset=/macbookair.hk/gfwlist +server=/wiivc.net/127.0.0.1#5335 +ipset=/wiivc.net/gfwlist +server=/bridgestone-korea.co.kr/127.0.0.1#5335 +ipset=/bridgestone-korea.co.kr/gfwlist +server=/bestbuy.com/127.0.0.1#5335 +ipset=/bestbuy.com/gfwlist +server=/trannyvideosxxx.com/127.0.0.1#5335 +ipset=/trannyvideosxxx.com/gfwlist +server=/catalina.hk/127.0.0.1#5335 +ipset=/catalina.hk/gfwlist +server=/lelavement.com/127.0.0.1#5335 +ipset=/lelavement.com/gfwlist +server=/udacity.com/127.0.0.1#5335 +ipset=/udacity.com/gfwlist +server=/sexzy4.com/127.0.0.1#5335 +ipset=/sexzy4.com/gfwlist +server=/spankbang1.com/127.0.0.1#5335 +ipset=/spankbang1.com/gfwlist +server=/pixnet.tw/127.0.0.1#5335 +ipset=/pixnet.tw/gfwlist +server=/beatsbydrdrebiz.com/127.0.0.1#5335 +ipset=/beatsbydrdrebiz.com/gfwlist +server=/applecoronavirus.com/127.0.0.1#5335 +ipset=/applecoronavirus.com/gfwlist +server=/goodsdunk.net/127.0.0.1#5335 +ipset=/goodsdunk.net/gfwlist +server=/youtube.com.pt/127.0.0.1#5335 +ipset=/youtube.com.pt/gfwlist +server=/uncams.com/127.0.0.1#5335 +ipset=/uncams.com/gfwlist +server=/salesforce.com/127.0.0.1#5335 +ipset=/salesforce.com/gfwlist +server=/travelex.co.nz/127.0.0.1#5335 +ipset=/travelex.co.nz/gfwlist +server=/vaultproject.io/127.0.0.1#5335 +ipset=/vaultproject.io/gfwlist +server=/cervical-exam.com/127.0.0.1#5335 +ipset=/cervical-exam.com/gfwlist +server=/microsoftnewsforkids.net/127.0.0.1#5335 +ipset=/microsoftnewsforkids.net/gfwlist +server=/brandporno.com/127.0.0.1#5335 +ipset=/brandporno.com/gfwlist +server=/anyhentai.com/127.0.0.1#5335 +ipset=/anyhentai.com/gfwlist +server=/travelex.bh/127.0.0.1#5335 +ipset=/travelex.bh/gfwlist +server=/ieeer8.org/127.0.0.1#5335 +ipset=/ieeer8.org/gfwlist +server=/rat.xxx/127.0.0.1#5335 +ipset=/rat.xxx/gfwlist +server=/tmdb.org/127.0.0.1#5335 +ipset=/tmdb.org/gfwlist +server=/playsexygame.com/127.0.0.1#5335 +ipset=/playsexygame.com/gfwlist +server=/akacrypto.net/127.0.0.1#5335 +ipset=/akacrypto.net/gfwlist +server=/atlassian.com/127.0.0.1#5335 +ipset=/atlassian.com/gfwlist +server=/cheapmonstersbeatsonsale.com/127.0.0.1#5335 +ipset=/cheapmonstersbeatsonsale.com/gfwlist +server=/semanticscholar.org/127.0.0.1#5335 +ipset=/semanticscholar.org/gfwlist +server=/vmware20mosaic.com/127.0.0.1#5335 +ipset=/vmware20mosaic.com/gfwlist +server=/iphonese.tv/127.0.0.1#5335 +ipset=/iphonese.tv/gfwlist +server=/vfsco.ru/127.0.0.1#5335 +ipset=/vfsco.ru/gfwlist +server=/kubernetes.io/127.0.0.1#5335 +ipset=/kubernetes.io/gfwlist +server=/eastbabes.com/127.0.0.1#5335 +ipset=/eastbabes.com/gfwlist +server=/google.sh/127.0.0.1#5335 +ipset=/google.sh/gfwlist +server=/facebook.ca/127.0.0.1#5335 +ipset=/facebook.ca/gfwlist +server=/epicgames.com/127.0.0.1#5335 +ipset=/epicgames.com/gfwlist +server=/beatsbydrdremall.com/127.0.0.1#5335 +ipset=/beatsbydrdremall.com/gfwlist +server=/nhncorp.jp/127.0.0.1#5335 +ipset=/nhncorp.jp/gfwlist +server=/pics.ee/127.0.0.1#5335 +ipset=/pics.ee/gfwlist +server=/blog.descargasgay.com/127.0.0.1#5335 +ipset=/blog.descargasgay.com/gfwlist +server=/smuttymoms.com/127.0.0.1#5335 +ipset=/smuttymoms.com/gfwlist +server=/ueberamazon.de/127.0.0.1#5335 +ipset=/ueberamazon.de/gfwlist +server=/yahoo.pt/127.0.0.1#5335 +ipset=/yahoo.pt/gfwlist +server=/getsexgames.com/127.0.0.1#5335 +ipset=/getsexgames.com/gfwlist +server=/investorschronicle.co.uk/127.0.0.1#5335 +ipset=/investorschronicle.co.uk/gfwlist +server=/connected-drive.com/127.0.0.1#5335 +ipset=/connected-drive.com/gfwlist +server=/udemycdn.com/127.0.0.1#5335 +ipset=/udemycdn.com/gfwlist +server=/one.one.one/127.0.0.1#5335 +ipset=/one.one.one/gfwlist +server=/nozomi.la/127.0.0.1#5335 +ipset=/nozomi.la/gfwlist +server=/bloomberggovernment.com/127.0.0.1#5335 +ipset=/bloomberggovernment.com/gfwlist +server=/logitechg.fr/127.0.0.1#5335 +ipset=/logitechg.fr/gfwlist +server=/steam.cdn.slingshot.co.nz/127.0.0.1#5335 +ipset=/steam.cdn.slingshot.co.nz/gfwlist +server=/g.dev/127.0.0.1#5335 +ipset=/g.dev/gfwlist +server=/videosection.com/127.0.0.1#5335 +ipset=/videosection.com/gfwlist +server=/mulheresafoder.com/127.0.0.1#5335 +ipset=/mulheresafoder.com/gfwlist +server=/woodmancastingx.com/127.0.0.1#5335 +ipset=/woodmancastingx.com/gfwlist +server=/imac.com/127.0.0.1#5335 +ipset=/imac.com/gfwlist +server=/cartoonporn.com/127.0.0.1#5335 +ipset=/cartoonporn.com/gfwlist +server=/bili2.cc/127.0.0.1#5335 +ipset=/bili2.cc/gfwlist +server=/beatsbydresold.com/127.0.0.1#5335 +ipset=/beatsbydresold.com/gfwlist +server=/kktv.me/127.0.0.1#5335 +ipset=/kktv.me/gfwlist +server=/phimsex47.club/127.0.0.1#5335 +ipset=/phimsex47.club/gfwlist +server=/wwwwebay.com/127.0.0.1#5335 +ipset=/wwwwebay.com/gfwlist +server=/disneytickets.co.uk/127.0.0.1#5335 +ipset=/disneytickets.co.uk/gfwlist +server=/hulufree.com/127.0.0.1#5335 +ipset=/hulufree.com/gfwlist +server=/wnacg.com/127.0.0.1#5335 +ipset=/wnacg.com/gfwlist +server=/ikea.pr/127.0.0.1#5335 +ipset=/ikea.pr/gfwlist +server=/minispace.com/127.0.0.1#5335 +ipset=/minispace.com/gfwlist +server=/cuckoldvideos.xxx/127.0.0.1#5335 +ipset=/cuckoldvideos.xxx/gfwlist +server=/opensourceinsights.dev/127.0.0.1#5335 +ipset=/opensourceinsights.dev/gfwlist +server=/connectcommerce.hk/127.0.0.1#5335 +ipset=/connectcommerce.hk/gfwlist +server=/zohocdn.com/127.0.0.1#5335 +ipset=/zohocdn.com/gfwlist +server=/netflix.net/127.0.0.1#5335 +ipset=/netflix.net/gfwlist +server=/pornohd.plus/127.0.0.1#5335 +ipset=/pornohd.plus/gfwlist +server=/battleforcecomix.com/127.0.0.1#5335 +ipset=/battleforcecomix.com/gfwlist +server=/imgur.com/127.0.0.1#5335 +ipset=/imgur.com/gfwlist +server=/pingguotv.xyz/127.0.0.1#5335 +ipset=/pingguotv.xyz/gfwlist +server=/ipod.com.sg/127.0.0.1#5335 +ipset=/ipod.com.sg/gfwlist +server=/avcens.xyz/127.0.0.1#5335 +ipset=/avcens.xyz/gfwlist +server=/pbabes.com/127.0.0.1#5335 +ipset=/pbabes.com/gfwlist +server=/paypal-cash.com/127.0.0.1#5335 +ipset=/paypal-cash.com/gfwlist +server=/pornguide.blog/127.0.0.1#5335 +ipset=/pornguide.blog/gfwlist +server=/yahoo.sn/127.0.0.1#5335 +ipset=/yahoo.sn/gfwlist +server=/enfabebe.com.mx/127.0.0.1#5335 +ipset=/enfabebe.com.mx/gfwlist +server=/massagerepublic.com/127.0.0.1#5335 +ipset=/massagerepublic.com/gfwlist +server=/worldcurrencycard.co.za/127.0.0.1#5335 +ipset=/worldcurrencycard.co.za/gfwlist +server=/myvisaluxuryhotels.com/127.0.0.1#5335 +ipset=/myvisaluxuryhotels.com/gfwlist +server=/erodougazo.com/127.0.0.1#5335 +ipset=/erodougazo.com/gfwlist +server=/mdlf.xyz/127.0.0.1#5335 +ipset=/mdlf.xyz/gfwlist +server=/weblive-hamivideo.cdn.hinet.net/127.0.0.1#5335 +ipset=/weblive-hamivideo.cdn.hinet.net/gfwlist +server=/bmw.bb/127.0.0.1#5335 +ipset=/bmw.bb/gfwlist +server=/pornhubs.video/127.0.0.1#5335 +ipset=/pornhubs.video/gfwlist +server=/fivestarpornsites.com/127.0.0.1#5335 +ipset=/fivestarpornsites.com/gfwlist +server=/avhd101.com/127.0.0.1#5335 +ipset=/avhd101.com/gfwlist +server=/tnaflix.com/127.0.0.1#5335 +ipset=/tnaflix.com/gfwlist +server=/google.nr/127.0.0.1#5335 +ipset=/google.nr/gfwlist +server=/applepay.hamburg/127.0.0.1#5335 +ipset=/applepay.hamburg/gfwlist +server=/kampalaexclusiveescorts.com/127.0.0.1#5335 +ipset=/kampalaexclusiveescorts.com/gfwlist +server=/pp-soc.com/127.0.0.1#5335 +ipset=/pp-soc.com/gfwlist +server=/steamdb.info/127.0.0.1#5335 +ipset=/steamdb.info/gfwlist +server=/apple.cz/127.0.0.1#5335 +ipset=/apple.cz/gfwlist +server=/visa.com.lc/127.0.0.1#5335 +ipset=/visa.com.lc/gfwlist +server=/certinomis.com/127.0.0.1#5335 +ipset=/certinomis.com/gfwlist +server=/awsbraket.com/127.0.0.1#5335 +ipset=/awsbraket.com/gfwlist +server=/animesexhq.com/127.0.0.1#5335 +ipset=/animesexhq.com/gfwlist +server=/monsterbeatstang.com/127.0.0.1#5335 +ipset=/monsterbeatstang.com/gfwlist +server=/hentai2w.com/127.0.0.1#5335 +ipset=/hentai2w.com/gfwlist +server=/evemodels.com/127.0.0.1#5335 +ipset=/evemodels.com/gfwlist +server=/porntea.com/127.0.0.1#5335 +ipset=/porntea.com/gfwlist +server=/cloudflare-quic.com/127.0.0.1#5335 +ipset=/cloudflare-quic.com/gfwlist +server=/disney-plus.net/127.0.0.1#5335 +ipset=/disney-plus.net/gfwlist +server=/line-apps-rc.com/127.0.0.1#5335 +ipset=/line-apps-rc.com/gfwlist +server=/cambridge.org/127.0.0.1#5335 +ipset=/cambridge.org/gfwlist +server=/inside.com.tw/127.0.0.1#5335 +ipset=/inside.com.tw/gfwlist +server=/ichat.co.in/127.0.0.1#5335 +ipset=/ichat.co.in/gfwlist +server=/kannewyork.com/127.0.0.1#5335 +ipset=/kannewyork.com/gfwlist +server=/alphabet.mx/127.0.0.1#5335 +ipset=/alphabet.mx/gfwlist +server=/cdkworkshop.com/127.0.0.1#5335 +ipset=/cdkworkshop.com/gfwlist +server=/5fang.cc/127.0.0.1#5335 +ipset=/5fang.cc/gfwlist +server=/tctsx28d.xyz/127.0.0.1#5335 +ipset=/tctsx28d.xyz/gfwlist +server=/escortdude.com/127.0.0.1#5335 +ipset=/escortdude.com/gfwlist +server=/ksyp10.com/127.0.0.1#5335 +ipset=/ksyp10.com/gfwlist +server=/mini.com.cy/127.0.0.1#5335 +ipset=/mini.com.cy/gfwlist +server=/volvobuses.om/127.0.0.1#5335 +ipset=/volvobuses.om/gfwlist +server=/enemanozzle.info/127.0.0.1#5335 +ipset=/enemanozzle.info/gfwlist +server=/alphera.com.es/127.0.0.1#5335 +ipset=/alphera.com.es/gfwlist +server=/hpcontinuum.com/127.0.0.1#5335 +ipset=/hpcontinuum.com/gfwlist +server=/audiencenetwork.tv/127.0.0.1#5335 +ipset=/audiencenetwork.tv/gfwlist +server=/yahoo.com.bd/127.0.0.1#5335 +ipset=/yahoo.com.bd/gfwlist +server=/ebayinkblog.com/127.0.0.1#5335 +ipset=/ebayinkblog.com/gfwlist +server=/govforce.com/127.0.0.1#5335 +ipset=/govforce.com/gfwlist +server=/awssecworkshops.com/127.0.0.1#5335 +ipset=/awssecworkshops.com/gfwlist +server=/bmw-art-journey.com/127.0.0.1#5335 +ipset=/bmw-art-journey.com/gfwlist +server=/omniroot.com/127.0.0.1#5335 +ipset=/omniroot.com/gfwlist +server=/swiftfinancial.net/127.0.0.1#5335 +ipset=/swiftfinancial.net/gfwlist +server=/imdb.to/127.0.0.1#5335 +ipset=/imdb.to/gfwlist +server=/jsbridgestone.com/127.0.0.1#5335 +ipset=/jsbridgestone.com/gfwlist +server=/mcdelivery.co.id/127.0.0.1#5335 +ipset=/mcdelivery.co.id/gfwlist +server=/thismon.ee/127.0.0.1#5335 +ipset=/thismon.ee/gfwlist +server=/quickoffice.com/127.0.0.1#5335 +ipset=/quickoffice.com/gfwlist +server=/facebook.wang/127.0.0.1#5335 +ipset=/facebook.wang/gfwlist +server=/free64all.com/127.0.0.1#5335 +ipset=/free64all.com/gfwlist +server=/ebaysocial.ru/127.0.0.1#5335 +ipset=/ebaysocial.ru/gfwlist +server=/vanish.com.tr/127.0.0.1#5335 +ipset=/vanish.com.tr/gfwlist +server=/quicinc.com/127.0.0.1#5335 +ipset=/quicinc.com/gfwlist +server=/pinterest.be/127.0.0.1#5335 +ipset=/pinterest.be/gfwlist +server=/filmesporno.com.br/127.0.0.1#5335 +ipset=/filmesporno.com.br/gfwlist +server=/hsprepack.akamaized.net/127.0.0.1#5335 +ipset=/hsprepack.akamaized.net/gfwlist +server=/verisign.net/127.0.0.1#5335 +ipset=/verisign.net/gfwlist +server=/mhhanman.xyz/127.0.0.1#5335 +ipset=/mhhanman.xyz/gfwlist +server=/bmwarchiv.at/127.0.0.1#5335 +ipset=/bmwarchiv.at/gfwlist +server=/hxc10.vip/127.0.0.1#5335 +ipset=/hxc10.vip/gfwlist +server=/famous-nudes.com/127.0.0.1#5335 +ipset=/famous-nudes.com/gfwlist +server=/aavs.xyz/127.0.0.1#5335 +ipset=/aavs.xyz/gfwlist +server=/bestbuycanada.com/127.0.0.1#5335 +ipset=/bestbuycanada.com/gfwlist +server=/bmw-connecteddrive.dk/127.0.0.1#5335 +ipset=/bmw-connecteddrive.dk/gfwlist +server=/escort.guide/127.0.0.1#5335 +ipset=/escort.guide/gfwlist +server=/scholar.google.es/127.0.0.1#5335 +ipset=/scholar.google.es/gfwlist +server=/igoogle.com/127.0.0.1#5335 +ipset=/igoogle.com/gfwlist +server=/apple.no/127.0.0.1#5335 +ipset=/apple.no/gfwlist +server=/ggoogle.com/127.0.0.1#5335 +ipset=/ggoogle.com/gfwlist +server=/applecard.tv/127.0.0.1#5335 +ipset=/applecard.tv/gfwlist +server=/epicreads.com/127.0.0.1#5335 +ipset=/epicreads.com/gfwlist +server=/minivalueservice.com/127.0.0.1#5335 +ipset=/minivalueservice.com/gfwlist +server=/heroesofthestorm.com/127.0.0.1#5335 +ipset=/heroesofthestorm.com/gfwlist +server=/xnxxhamster.net/127.0.0.1#5335 +ipset=/xnxxhamster.net/gfwlist +server=/blogspot.com.uy/127.0.0.1#5335 +ipset=/blogspot.com.uy/gfwlist +server=/xeon.com/127.0.0.1#5335 +ipset=/xeon.com/gfwlist +server=/101xxx.xyz/127.0.0.1#5335 +ipset=/101xxx.xyz/gfwlist +server=/adobetechcommcallback.com/127.0.0.1#5335 +ipset=/adobetechcommcallback.com/gfwlist +server=/pinterest.com.py/127.0.0.1#5335 +ipset=/pinterest.com.py/gfwlist +server=/topmanga.biz/127.0.0.1#5335 +ipset=/topmanga.biz/gfwlist +server=/efuckt.com/127.0.0.1#5335 +ipset=/efuckt.com/gfwlist +server=/blinkload.zone/127.0.0.1#5335 +ipset=/blinkload.zone/gfwlist +server=/mybabehotz.com/127.0.0.1#5335 +ipset=/mybabehotz.com/gfwlist +server=/apple.de/127.0.0.1#5335 +ipset=/apple.de/gfwlist +server=/pinterest.com.uy/127.0.0.1#5335 +ipset=/pinterest.com.uy/gfwlist +server=/voaportugues.com/127.0.0.1#5335 +ipset=/voaportugues.com/gfwlist +server=/cursecdn.com/127.0.0.1#5335 +ipset=/cursecdn.com/gfwlist +server=/annstores.net/127.0.0.1#5335 +ipset=/annstores.net/gfwlist +server=/wolfatbestbuy.com/127.0.0.1#5335 +ipset=/wolfatbestbuy.com/gfwlist +server=/applepay.hk/127.0.0.1#5335 +ipset=/applepay.hk/gfwlist +server=/xn--80aaazx1an0a.lol/127.0.0.1#5335 +ipset=/xn--80aaazx1an0a.lol/gfwlist +server=/s-msn.com/127.0.0.1#5335 +ipset=/s-msn.com/gfwlist +server=/feet9.com/127.0.0.1#5335 +ipset=/feet9.com/gfwlist +server=/ioinformatics.org/127.0.0.1#5335 +ipset=/ioinformatics.org/gfwlist +server=/themessengeradelaide.com.au/127.0.0.1#5335 +ipset=/themessengeradelaide.com.au/gfwlist +server=/exploreintel.com/127.0.0.1#5335 +ipset=/exploreintel.com/gfwlist +server=/facebooi.com/127.0.0.1#5335 +ipset=/facebooi.com/gfwlist +server=/scholar.google.co.ve/127.0.0.1#5335 +ipset=/scholar.google.co.ve/gfwlist +server=/alphabet.com.es/127.0.0.1#5335 +ipset=/alphabet.com.es/gfwlist +server=/akamainewzealand.com/127.0.0.1#5335 +ipset=/akamainewzealand.com/gfwlist +server=/buzzardflapper.com/127.0.0.1#5335 +ipset=/buzzardflapper.com/gfwlist +server=/honestpornreviews.com/127.0.0.1#5335 +ipset=/honestpornreviews.com/gfwlist +server=/amateurporndump.com/127.0.0.1#5335 +ipset=/amateurporndump.com/gfwlist +server=/amebame.com/127.0.0.1#5335 +ipset=/amebame.com/gfwlist +server=/line-apps.com/127.0.0.1#5335 +ipset=/line-apps.com/gfwlist +server=/camelphat.com/127.0.0.1#5335 +ipset=/camelphat.com/gfwlist +server=/techatbloomberg.com/127.0.0.1#5335 +ipset=/techatbloomberg.com/gfwlist +server=/winhec.com/127.0.0.1#5335 +ipset=/winhec.com/gfwlist +server=/hotgirl.asia/127.0.0.1#5335 +ipset=/hotgirl.asia/gfwlist +server=/pvt.sexy/127.0.0.1#5335 +ipset=/pvt.sexy/gfwlist +server=/animestigma.com/127.0.0.1#5335 +ipset=/animestigma.com/gfwlist +server=/google.bt/127.0.0.1#5335 +ipset=/google.bt/gfwlist +server=/becomeindex.com/127.0.0.1#5335 +ipset=/becomeindex.com/gfwlist +server=/disney.dk/127.0.0.1#5335 +ipset=/disney.dk/gfwlist +server=/videobreakdown.com/127.0.0.1#5335 +ipset=/videobreakdown.com/gfwlist +server=/oculus.com/127.0.0.1#5335 +ipset=/oculus.com/gfwlist +server=/joyhentai.com/127.0.0.1#5335 +ipset=/joyhentai.com/gfwlist +server=/apple.at/127.0.0.1#5335 +ipset=/apple.at/gfwlist +server=/experience-vmware.com/127.0.0.1#5335 +ipset=/experience-vmware.com/gfwlist +server=/nvidiaforhp.com/127.0.0.1#5335 +ipset=/nvidiaforhp.com/gfwlist +server=/facebookphotos.com/127.0.0.1#5335 +ipset=/facebookphotos.com/gfwlist +server=/mini-connected.ie/127.0.0.1#5335 +ipset=/mini-connected.ie/gfwlist +server=/visacheckout.net/127.0.0.1#5335 +ipset=/visacheckout.net/gfwlist +server=/zweiporn.com/127.0.0.1#5335 +ipset=/zweiporn.com/gfwlist +server=/airport.com/127.0.0.1#5335 +ipset=/airport.com/gfwlist +server=/buyaapl.com/127.0.0.1#5335 +ipset=/buyaapl.com/gfwlist +server=/realcleardefense.com/127.0.0.1#5335 +ipset=/realcleardefense.com/gfwlist +server=/maktoob.com/127.0.0.1#5335 +ipset=/maktoob.com/gfwlist +server=/linefriends.com.tw/127.0.0.1#5335 +ipset=/linefriends.com.tw/gfwlist +server=/ebaytopratedseller.net/127.0.0.1#5335 +ipset=/ebaytopratedseller.net/gfwlist +server=/database.asahi.com/127.0.0.1#5335 +ipset=/database.asahi.com/gfwlist +server=/analytictech.com/127.0.0.1#5335 +ipset=/analytictech.com/gfwlist +server=/foxsportsworld.com/127.0.0.1#5335 +ipset=/foxsportsworld.com/gfwlist +server=/avgle.com/127.0.0.1#5335 +ipset=/avgle.com/gfwlist +server=/ixquick.com/127.0.0.1#5335 +ipset=/ixquick.com/gfwlist +server=/backroomcastingcouch.com/127.0.0.1#5335 +ipset=/backroomcastingcouch.com/gfwlist +server=/xknoop.com/127.0.0.1#5335 +ipset=/xknoop.com/gfwlist +server=/canon.lu/127.0.0.1#5335 +ipset=/canon.lu/gfwlist +server=/nikerunner.com/127.0.0.1#5335 +ipset=/nikerunner.com/gfwlist +server=/registerhulu.com/127.0.0.1#5335 +ipset=/registerhulu.com/gfwlist +server=/yandex.com.ge/127.0.0.1#5335 +ipset=/yandex.com.ge/gfwlist +server=/durex.ru/127.0.0.1#5335 +ipset=/durex.ru/gfwlist +server=/wisekey.com.hk/127.0.0.1#5335 +ipset=/wisekey.com.hk/gfwlist +server=/volvotrucks.ch/127.0.0.1#5335 +ipset=/volvotrucks.ch/gfwlist +server=/detaliczny.com/127.0.0.1#5335 +ipset=/detaliczny.com/gfwlist +server=/visa.co.ao/127.0.0.1#5335 +ipset=/visa.co.ao/gfwlist +server=/dreamtoplay.com/127.0.0.1#5335 +ipset=/dreamtoplay.com/gfwlist +server=/paypal-notify.com/127.0.0.1#5335 +ipset=/paypal-notify.com/gfwlist +server=/buydrdrebeatbox.com/127.0.0.1#5335 +ipset=/buydrdrebeatbox.com/gfwlist +server=/tryfunctions.com/127.0.0.1#5335 +ipset=/tryfunctions.com/gfwlist +server=/scoregroup.com/127.0.0.1#5335 +ipset=/scoregroup.com/gfwlist +server=/pypl.info/127.0.0.1#5335 +ipset=/pypl.info/gfwlist +server=/nlsexfilmpjes.com/127.0.0.1#5335 +ipset=/nlsexfilmpjes.com/gfwlist +server=/family.co.jp/127.0.0.1#5335 +ipset=/family.co.jp/gfwlist +server=/finish.com.tr/127.0.0.1#5335 +ipset=/finish.com.tr/gfwlist +server=/porndiscount.org/127.0.0.1#5335 +ipset=/porndiscount.org/gfwlist +server=/ds-vod-abematv.akamaized.net/127.0.0.1#5335 +ipset=/ds-vod-abematv.akamaized.net/gfwlist +server=/ikea.at/127.0.0.1#5335 +ipset=/ikea.at/gfwlist +server=/altera.com/127.0.0.1#5335 +ipset=/altera.com/gfwlist +server=/xhamster.desi/127.0.0.1#5335 +ipset=/xhamster.desi/gfwlist +server=/scholar.google.fr/127.0.0.1#5335 +ipset=/scholar.google.fr/gfwlist +server=/wolterskluwer.com/127.0.0.1#5335 +ipset=/wolterskluwer.com/gfwlist +server=/youskbe.com/127.0.0.1#5335 +ipset=/youskbe.com/gfwlist +server=/cameraboys.com/127.0.0.1#5335 +ipset=/cameraboys.com/gfwlist +server=/intel.ar/127.0.0.1#5335 +ipset=/intel.ar/gfwlist +server=/bmw-connecteddrive.nl/127.0.0.1#5335 +ipset=/bmw-connecteddrive.nl/gfwlist +server=/google.com.cu/127.0.0.1#5335 +ipset=/google.com.cu/gfwlist +server=/paypal-survey.org/127.0.0.1#5335 +ipset=/paypal-survey.org/gfwlist +server=/nikehyperdunk.com/127.0.0.1#5335 +ipset=/nikehyperdunk.com/gfwlist +server=/ieeenano.org/127.0.0.1#5335 +ipset=/ieeenano.org/gfwlist +server=/monstercockland.com/127.0.0.1#5335 +ipset=/monstercockland.com/gfwlist +server=/shopee.com.my/127.0.0.1#5335 +ipset=/shopee.com.my/gfwlist +server=/volvotrucks.com.kw/127.0.0.1#5335 +ipset=/volvotrucks.com.kw/gfwlist +server=/my-enema.com/127.0.0.1#5335 +ipset=/my-enema.com/gfwlist +server=/vanish.it/127.0.0.1#5335 +ipset=/vanish.it/gfwlist +server=/social.com/127.0.0.1#5335 +ipset=/social.com/gfwlist +server=/scholar.google.hu/127.0.0.1#5335 +ipset=/scholar.google.hu/gfwlist +server=/huluim.com/127.0.0.1#5335 +ipset=/huluim.com/gfwlist +server=/andygod.com/127.0.0.1#5335 +ipset=/andygod.com/gfwlist +server=/wikia.com/127.0.0.1#5335 +ipset=/wikia.com/gfwlist +server=/ipadmini.cm/127.0.0.1#5335 +ipset=/ipadmini.cm/gfwlist +server=/pdf.new/127.0.0.1#5335 +ipset=/pdf.new/gfwlist +server=/cebay.com/127.0.0.1#5335 +ipset=/cebay.com/gfwlist +server=/xxxfiles.com/127.0.0.1#5335 +ipset=/xxxfiles.com/gfwlist +server=/foxtube.com/127.0.0.1#5335 +ipset=/foxtube.com/gfwlist +server=/2ch.hk/127.0.0.1#5335 +ipset=/2ch.hk/gfwlist +server=/cbsstatic.com/127.0.0.1#5335 +ipset=/cbsstatic.com/gfwlist +server=/appletips.net/127.0.0.1#5335 +ipset=/appletips.net/gfwlist +server=/vxxsred.xyz/127.0.0.1#5335 +ipset=/vxxsred.xyz/gfwlist +server=/pokemon-moon.com/127.0.0.1#5335 +ipset=/pokemon-moon.com/gfwlist +server=/facebookthreads.net/127.0.0.1#5335 +ipset=/facebookthreads.net/gfwlist +server=/avizoone.com/127.0.0.1#5335 +ipset=/avizoone.com/gfwlist +server=/durexcanada.com/127.0.0.1#5335 +ipset=/durexcanada.com/gfwlist +server=/mypornwap.fun/127.0.0.1#5335 +ipset=/mypornwap.fun/gfwlist +server=/microsoftpartnersolutions.com/127.0.0.1#5335 +ipset=/microsoftpartnersolutions.com/gfwlist +server=/erogazo-ngo.com/127.0.0.1#5335 +ipset=/erogazo-ngo.com/gfwlist +server=/iebay.com/127.0.0.1#5335 +ipset=/iebay.com/gfwlist +server=/docker.com/127.0.0.1#5335 +ipset=/docker.com/gfwlist +server=/rumporn.com/127.0.0.1#5335 +ipset=/rumporn.com/gfwlist +server=/alphabet.us/127.0.0.1#5335 +ipset=/alphabet.us/gfwlist +server=/momsneversayno.com/127.0.0.1#5335 +ipset=/momsneversayno.com/gfwlist +server=/pricelessmarketingengine.com/127.0.0.1#5335 +ipset=/pricelessmarketingengine.com/gfwlist +server=/bmw-motorrad.se/127.0.0.1#5335 +ipset=/bmw-motorrad.se/gfwlist +server=/bestpornclip.com/127.0.0.1#5335 +ipset=/bestpornclip.com/gfwlist +server=/soccerfanz.com.my/127.0.0.1#5335 +ipset=/soccerfanz.com.my/gfwlist +server=/wiley.com/127.0.0.1#5335 +ipset=/wiley.com/gfwlist +server=/beatsonblackfriday2013.com/127.0.0.1#5335 +ipset=/beatsonblackfriday2013.com/gfwlist +server=/visa.fr/127.0.0.1#5335 +ipset=/visa.fr/gfwlist +server=/shequ8.cam/127.0.0.1#5335 +ipset=/shequ8.cam/gfwlist +server=/starbucks.ch/127.0.0.1#5335 +ipset=/starbucks.ch/gfwlist +server=/torrentkitty.tv/127.0.0.1#5335 +ipset=/torrentkitty.tv/gfwlist +server=/mini.dz/127.0.0.1#5335 +ipset=/mini.dz/gfwlist +server=/girlsongirlstube.com/127.0.0.1#5335 +ipset=/girlsongirlstube.com/gfwlist +server=/niuc2.com/127.0.0.1#5335 +ipset=/niuc2.com/gfwlist +server=/speedracegear.com/127.0.0.1#5335 +ipset=/speedracegear.com/gfwlist +server=/hpuae.com/127.0.0.1#5335 +ipset=/hpuae.com/gfwlist +server=/yahoo.com.tw/127.0.0.1#5335 +ipset=/yahoo.com.tw/gfwlist +server=/nikkan-gendai.com/127.0.0.1#5335 +ipset=/nikkan-gendai.com/gfwlist +server=/buyonlineheadphones.com/127.0.0.1#5335 +ipset=/buyonlineheadphones.com/gfwlist +server=/truedepth3d.com/127.0.0.1#5335 +ipset=/truedepth3d.com/gfwlist +server=/ichigocandy.com/127.0.0.1#5335 +ipset=/ichigocandy.com/gfwlist +server=/royalsocietypublishing.org/127.0.0.1#5335 +ipset=/royalsocietypublishing.org/gfwlist +server=/zoomingin.tv/127.0.0.1#5335 +ipset=/zoomingin.tv/gfwlist +server=/discordapp.io/127.0.0.1#5335 +ipset=/discordapp.io/gfwlist +server=/sndcdn.com/127.0.0.1#5335 +ipset=/sndcdn.com/gfwlist +server=/modelsfreecams.com/127.0.0.1#5335 +ipset=/modelsfreecams.com/gfwlist +server=/daytontrucktires.com/127.0.0.1#5335 +ipset=/daytontrucktires.com/gfwlist +server=/ero-kawa.com/127.0.0.1#5335 +ipset=/ero-kawa.com/gfwlist +server=/cabletvdirectv.com/127.0.0.1#5335 +ipset=/cabletvdirectv.com/gfwlist +server=/getdrebeatssale.com/127.0.0.1#5335 +ipset=/getdrebeatssale.com/gfwlist +server=/apple.co.kr/127.0.0.1#5335 +ipset=/apple.co.kr/gfwlist +server=/dealerspeed.net/127.0.0.1#5335 +ipset=/dealerspeed.net/gfwlist +server=/rm2029.com/127.0.0.1#5335 +ipset=/rm2029.com/gfwlist +server=/x1337x.ws/127.0.0.1#5335 +ipset=/x1337x.ws/gfwlist +server=/pinkcore.com/127.0.0.1#5335 +ipset=/pinkcore.com/gfwlist +server=/dirtyscat.org/127.0.0.1#5335 +ipset=/dirtyscat.org/gfwlist +server=/bisq.network/127.0.0.1#5335 +ipset=/bisq.network/gfwlist +server=/0x0.st/127.0.0.1#5335 +ipset=/0x0.st/gfwlist +server=/durex.co.th/127.0.0.1#5335 +ipset=/durex.co.th/gfwlist +server=/pullstring.net/127.0.0.1#5335 +ipset=/pullstring.net/gfwlist +server=/dmmapis.com/127.0.0.1#5335 +ipset=/dmmapis.com/gfwlist +server=/pornodebolivia.net/127.0.0.1#5335 +ipset=/pornodebolivia.net/gfwlist +server=/adultdvdtalk.com/127.0.0.1#5335 +ipset=/adultdvdtalk.com/gfwlist +server=/free-abbywinters.com/127.0.0.1#5335 +ipset=/free-abbywinters.com/gfwlist +server=/aflamsexhd.com/127.0.0.1#5335 +ipset=/aflamsexhd.com/gfwlist +server=/sexyculo.com/127.0.0.1#5335 +ipset=/sexyculo.com/gfwlist +server=/sony.it/127.0.0.1#5335 +ipset=/sony.it/gfwlist +server=/faronics.co.uk/127.0.0.1#5335 +ipset=/faronics.co.uk/gfwlist +server=/bridgestonerewards.com/127.0.0.1#5335 +ipset=/bridgestonerewards.com/gfwlist +server=/disney.com.tw/127.0.0.1#5335 +ipset=/disney.com.tw/gfwlist +server=/herokussl.com/127.0.0.1#5335 +ipset=/herokussl.com/gfwlist +server=/harpercollins.com.au/127.0.0.1#5335 +ipset=/harpercollins.com.au/gfwlist +server=/camwhores-tv.com/127.0.0.1#5335 +ipset=/camwhores-tv.com/gfwlist +server=/instagramhashtags.net/127.0.0.1#5335 +ipset=/instagramhashtags.net/gfwlist +server=/ebayy.com/127.0.0.1#5335 +ipset=/ebayy.com/gfwlist +server=/google.co.jp/127.0.0.1#5335 +ipset=/google.co.jp/gfwlist +server=/7mm.tv/127.0.0.1#5335 +ipset=/7mm.tv/gfwlist +server=/findhername.net/127.0.0.1#5335 +ipset=/findhername.net/gfwlist +server=/thenipslip.com/127.0.0.1#5335 +ipset=/thenipslip.com/gfwlist +server=/bmw-antilles.fr/127.0.0.1#5335 +ipset=/bmw-antilles.fr/gfwlist +server=/yandexcloud.net/127.0.0.1#5335 +ipset=/yandexcloud.net/gfwlist +server=/ubi.com/127.0.0.1#5335 +ipset=/ubi.com/gfwlist +server=/inventorship.com.au/127.0.0.1#5335 +ipset=/inventorship.com.au/gfwlist +server=/ds-linear-abematv.akamaized.net/127.0.0.1#5335 +ipset=/ds-linear-abematv.akamaized.net/gfwlist +server=/recelebrity.com/127.0.0.1#5335 +ipset=/recelebrity.com/gfwlist +server=/trello.com/127.0.0.1#5335 +ipset=/trello.com/gfwlist +server=/nikeelite.com/127.0.0.1#5335 +ipset=/nikeelite.com/gfwlist +server=/beatsblackfridayretails.com/127.0.0.1#5335 +ipset=/beatsblackfridayretails.com/gfwlist +server=/whatsapp.com/127.0.0.1#5335 +ipset=/whatsapp.com/gfwlist +server=/durex.pl/127.0.0.1#5335 +ipset=/durex.pl/gfwlist +server=/na-att-idns.net/127.0.0.1#5335 +ipset=/na-att-idns.net/gfwlist +server=/babypink.to/127.0.0.1#5335 +ipset=/babypink.to/gfwlist +server=/xvideoscom.me/127.0.0.1#5335 +ipset=/xvideoscom.me/gfwlist +server=/ipod.ch/127.0.0.1#5335 +ipset=/ipod.ch/gfwlist +server=/veryladyboy.com/127.0.0.1#5335 +ipset=/veryladyboy.com/gfwlist +server=/bloombergquint.com/127.0.0.1#5335 +ipset=/bloombergquint.com/gfwlist +server=/animalsporn.tv/127.0.0.1#5335 +ipset=/animalsporn.tv/gfwlist +server=/volvo.ca/127.0.0.1#5335 +ipset=/volvo.ca/gfwlist +server=/hulunet.com/127.0.0.1#5335 +ipset=/hulunet.com/gfwlist +server=/firestonetire.com/127.0.0.1#5335 +ipset=/firestonetire.com/gfwlist +server=/thepornarea.com/127.0.0.1#5335 +ipset=/thepornarea.com/gfwlist +server=/asianporntrends.com/127.0.0.1#5335 +ipset=/asianporntrends.com/gfwlist +server=/mahajantech.com/127.0.0.1#5335 +ipset=/mahajantech.com/gfwlist +server=/shopibay.net/127.0.0.1#5335 +ipset=/shopibay.net/gfwlist +server=/mbeats-tech.com/127.0.0.1#5335 +ipset=/mbeats-tech.com/gfwlist +server=/cnnarabic.com/127.0.0.1#5335 +ipset=/cnnarabic.com/gfwlist +server=/fxnetwork.com/127.0.0.1#5335 +ipset=/fxnetwork.com/gfwlist +server=/google.net/127.0.0.1#5335 +ipset=/google.net/gfwlist +server=/google.ga/127.0.0.1#5335 +ipset=/google.ga/gfwlist +server=/google.no/127.0.0.1#5335 +ipset=/google.no/gfwlist +server=/drebeatsforsaleus.com/127.0.0.1#5335 +ipset=/drebeatsforsaleus.com/gfwlist +server=/c4slive.com/127.0.0.1#5335 +ipset=/c4slive.com/gfwlist +server=/youtube.is/127.0.0.1#5335 +ipset=/youtube.is/gfwlist +server=/mscrl.microsoft.com/127.0.0.1#5335 +ipset=/mscrl.microsoft.com/gfwlist +server=/facebboc.com/127.0.0.1#5335 +ipset=/facebboc.com/gfwlist +server=/macruby.net/127.0.0.1#5335 +ipset=/macruby.net/gfwlist +server=/txvlog.com/127.0.0.1#5335 +ipset=/txvlog.com/gfwlist +server=/itunesfestivals.com/127.0.0.1#5335 +ipset=/itunesfestivals.com/gfwlist +server=/vercel.events/127.0.0.1#5335 +ipset=/vercel.events/gfwlist +server=/pastebin.com/127.0.0.1#5335 +ipset=/pastebin.com/gfwlist +server=/enfagrow4.com/127.0.0.1#5335 +ipset=/enfagrow4.com/gfwlist +server=/applenews.tv/127.0.0.1#5335 +ipset=/applenews.tv/gfwlist +server=/volvogroup.com.br/127.0.0.1#5335 +ipset=/volvogroup.com.br/gfwlist +server=/harpercollins.ca/127.0.0.1#5335 +ipset=/harpercollins.ca/gfwlist +server=/knowswho.co.jp/127.0.0.1#5335 +ipset=/knowswho.co.jp/gfwlist +server=/rarbgget.org/127.0.0.1#5335 +ipset=/rarbgget.org/gfwlist +server=/palcomix.com/127.0.0.1#5335 +ipset=/palcomix.com/gfwlist +server=/18jms.com/127.0.0.1#5335 +ipset=/18jms.com/gfwlist +server=/gratisvideokijken.nl/127.0.0.1#5335 +ipset=/gratisvideokijken.nl/gfwlist +server=/osm.org/127.0.0.1#5335 +ipset=/osm.org/gfwlist +server=/me-gay.com/127.0.0.1#5335 +ipset=/me-gay.com/gfwlist +server=/notion.site/127.0.0.1#5335 +ipset=/notion.site/gfwlist +server=/keytransparency.foo/127.0.0.1#5335 +ipset=/keytransparency.foo/gfwlist +server=/google.ru/127.0.0.1#5335 +ipset=/google.ru/gfwlist +server=/asm.org/127.0.0.1#5335 +ipset=/asm.org/gfwlist +server=/lushstories.com/127.0.0.1#5335 +ipset=/lushstories.com/gfwlist +server=/foxcredit.org/127.0.0.1#5335 +ipset=/foxcredit.org/gfwlist +server=/applestore.com.hk/127.0.0.1#5335 +ipset=/applestore.com.hk/gfwlist +server=/google.com.gt/127.0.0.1#5335 +ipset=/google.com.gt/gfwlist +server=/charlestonroadregistry.com/127.0.0.1#5335 +ipset=/charlestonroadregistry.com/gfwlist +server=/asha.org/127.0.0.1#5335 +ipset=/asha.org/gfwlist +server=/creativesdk.com/127.0.0.1#5335 +ipset=/creativesdk.com/gfwlist +server=/airhorn.solutions/127.0.0.1#5335 +ipset=/airhorn.solutions/gfwlist +server=/bittrex.com/127.0.0.1#5335 +ipset=/bittrex.com/gfwlist +server=/cloudrobotics.com/127.0.0.1#5335 +ipset=/cloudrobotics.com/gfwlist +server=/java.net/127.0.0.1#5335 +ipset=/java.net/gfwlist +server=/pokemon-sun.com/127.0.0.1#5335 +ipset=/pokemon-sun.com/gfwlist +server=/koubaibu.jp/127.0.0.1#5335 +ipset=/koubaibu.jp/gfwlist +server=/volvobuses.de/127.0.0.1#5335 +ipset=/volvobuses.de/gfwlist +server=/easymatureporn.com/127.0.0.1#5335 +ipset=/easymatureporn.com/gfwlist +server=/extremepornfilms.com/127.0.0.1#5335 +ipset=/extremepornfilms.com/gfwlist +server=/uun99.com/127.0.0.1#5335 +ipset=/uun99.com/gfwlist +server=/ebayclassifieds.info/127.0.0.1#5335 +ipset=/ebayclassifieds.info/gfwlist +server=/manyvids.com/127.0.0.1#5335 +ipset=/manyvids.com/gfwlist +server=/gmossp-sp.jp/127.0.0.1#5335 +ipset=/gmossp-sp.jp/gfwlist +server=/pearson.cl/127.0.0.1#5335 +ipset=/pearson.cl/gfwlist +server=/epochcar.com/127.0.0.1#5335 +ipset=/epochcar.com/gfwlist +server=/lululu.one/127.0.0.1#5335 +ipset=/lululu.one/gfwlist +server=/cinemax.com/127.0.0.1#5335 +ipset=/cinemax.com/gfwlist +server=/whatisairwatch.com/127.0.0.1#5335 +ipset=/whatisairwatch.com/gfwlist +server=/pvzgw2.com/127.0.0.1#5335 +ipset=/pvzgw2.com/gfwlist +server=/1e100.net/127.0.0.1#5335 +ipset=/1e100.net/gfwlist +server=/dlsitestudio.com/127.0.0.1#5335 +ipset=/dlsitestudio.com/gfwlist +server=/dettol.net/127.0.0.1#5335 +ipset=/dettol.net/gfwlist +server=/nike-fr.com/127.0.0.1#5335 +ipset=/nike-fr.com/gfwlist +server=/tedcdn.com/127.0.0.1#5335 +ipset=/tedcdn.com/gfwlist +server=/youtube.com.ua/127.0.0.1#5335 +ipset=/youtube.com.ua/gfwlist +server=/vsezoo.com/127.0.0.1#5335 +ipset=/vsezoo.com/gfwlist +server=/intunewiki.com/127.0.0.1#5335 +ipset=/intunewiki.com/gfwlist +server=/erotic-hentai.com/127.0.0.1#5335 +ipset=/erotic-hentai.com/gfwlist +server=/beatsdreforsale.com/127.0.0.1#5335 +ipset=/beatsdreforsale.com/gfwlist +server=/bmw-driving-center.co.kr/127.0.0.1#5335 +ipset=/bmw-driving-center.co.kr/gfwlist +server=/intel.dz/127.0.0.1#5335 +ipset=/intel.dz/gfwlist +server=/conair.me/127.0.0.1#5335 +ipset=/conair.me/gfwlist +server=/cloudyzgirl.com/127.0.0.1#5335 +ipset=/cloudyzgirl.com/gfwlist +server=/applewatch.tv/127.0.0.1#5335 +ipset=/applewatch.tv/gfwlist +server=/hkt-enterprise.com/127.0.0.1#5335 +ipset=/hkt-enterprise.com/gfwlist +server=/nvidia.it/127.0.0.1#5335 +ipset=/nvidia.it/gfwlist +server=/welcomix.com/127.0.0.1#5335 +ipset=/welcomix.com/gfwlist +server=/cispaletter.com/127.0.0.1#5335 +ipset=/cispaletter.com/gfwlist +server=/drdrebeatsuk.com/127.0.0.1#5335 +ipset=/drdrebeatsuk.com/gfwlist +server=/volvotrucks.tn/127.0.0.1#5335 +ipset=/volvotrucks.tn/gfwlist +server=/adbecrsl.com/127.0.0.1#5335 +ipset=/adbecrsl.com/gfwlist +server=/newscorp.com/127.0.0.1#5335 +ipset=/newscorp.com/gfwlist +server=/paypal-profile.com/127.0.0.1#5335 +ipset=/paypal-profile.com/gfwlist +server=/vfsco.bg/127.0.0.1#5335 +ipset=/vfsco.bg/gfwlist +server=/quiksee.com/127.0.0.1#5335 +ipset=/quiksee.com/gfwlist +server=/awsstatic.com/127.0.0.1#5335 +ipset=/awsstatic.com/gfwlist +server=/bmw.md/127.0.0.1#5335 +ipset=/bmw.md/gfwlist +server=/facebookdating.net/127.0.0.1#5335 +ipset=/facebookdating.net/gfwlist +server=/62fh1bnj.me/127.0.0.1#5335 +ipset=/62fh1bnj.me/gfwlist +server=/porngladiator.com/127.0.0.1#5335 +ipset=/porngladiator.com/gfwlist +server=/cfake.com/127.0.0.1#5335 +ipset=/cfake.com/gfwlist +server=/myxxgirl.com/127.0.0.1#5335 +ipset=/myxxgirl.com/gfwlist +server=/dmed.technology/127.0.0.1#5335 +ipset=/dmed.technology/gfwlist +server=/cricketcountry.com/127.0.0.1#5335 +ipset=/cricketcountry.com/gfwlist +server=/pinterest.ru/127.0.0.1#5335 +ipset=/pinterest.ru/gfwlist +server=/peoplenews.tw/127.0.0.1#5335 +ipset=/peoplenews.tw/gfwlist +server=/ikea.com.my/127.0.0.1#5335 +ipset=/ikea.com.my/gfwlist +server=/naturemag.org/127.0.0.1#5335 +ipset=/naturemag.org/gfwlist +server=/intel.tv/127.0.0.1#5335 +ipset=/intel.tv/gfwlist +server=/steamserver.net/127.0.0.1#5335 +ipset=/steamserver.net/gfwlist +server=/realcuckoldsex.com/127.0.0.1#5335 +ipset=/realcuckoldsex.com/gfwlist +server=/torproject.org/127.0.0.1#5335 +ipset=/torproject.org/gfwlist +server=/narumiya.xii.jp/127.0.0.1#5335 +ipset=/narumiya.xii.jp/gfwlist +server=/daytonbmw.com/127.0.0.1#5335 +ipset=/daytonbmw.com/gfwlist +server=/netflixdnstest5.com/127.0.0.1#5335 +ipset=/netflixdnstest5.com/gfwlist +server=/nude-pics.org/127.0.0.1#5335 +ipset=/nude-pics.org/gfwlist +server=/applepay.jp/127.0.0.1#5335 +ipset=/applepay.jp/gfwlist +server=/jav321.com/127.0.0.1#5335 +ipset=/jav321.com/gfwlist +server=/finish.lv/127.0.0.1#5335 +ipset=/finish.lv/gfwlist +server=/fbinfer.com/127.0.0.1#5335 +ipset=/fbinfer.com/gfwlist +server=/amateurcuckoldporn.com/127.0.0.1#5335 +ipset=/amateurcuckoldporn.com/gfwlist +server=/bareporno.com/127.0.0.1#5335 +ipset=/bareporno.com/gfwlist +server=/keyporntube.com/127.0.0.1#5335 +ipset=/keyporntube.com/gfwlist +server=/snap-dev.net/127.0.0.1#5335 +ipset=/snap-dev.net/gfwlist +server=/researchkit.net/127.0.0.1#5335 +ipset=/researchkit.net/gfwlist +server=/sokmil.com/127.0.0.1#5335 +ipset=/sokmil.com/gfwlist +server=/telesec.de/127.0.0.1#5335 +ipset=/telesec.de/gfwlist +server=/mastercard.com/127.0.0.1#5335 +ipset=/mastercard.com/gfwlist +server=/insiderintelligence.com/127.0.0.1#5335 +ipset=/insiderintelligence.com/gfwlist +server=/bridgestonemarketing.com/127.0.0.1#5335 +ipset=/bridgestonemarketing.com/gfwlist +server=/amatporn.com/127.0.0.1#5335 +ipset=/amatporn.com/gfwlist +server=/connectcommerce.info/127.0.0.1#5335 +ipset=/connectcommerce.info/gfwlist +server=/shit-porn.net/127.0.0.1#5335 +ipset=/shit-porn.net/gfwlist +server=/bmw-ghana.com/127.0.0.1#5335 +ipset=/bmw-ghana.com/gfwlist +server=/microsoftads.com/127.0.0.1#5335 +ipset=/microsoftads.com/gfwlist +server=/lolclub.org/127.0.0.1#5335 +ipset=/lolclub.org/gfwlist +server=/vanish.at/127.0.0.1#5335 +ipset=/vanish.at/gfwlist +server=/gfycat.com/127.0.0.1#5335 +ipset=/gfycat.com/gfwlist +server=/google.be/127.0.0.1#5335 +ipset=/google.be/gfwlist +server=/magicalmirai.com/127.0.0.1#5335 +ipset=/magicalmirai.com/gfwlist +server=/vfsco.lv/127.0.0.1#5335 +ipset=/vfsco.lv/gfwlist +server=/oann.com/127.0.0.1#5335 +ipset=/oann.com/gfwlist +server=/smartonesolutions.com.hk/127.0.0.1#5335 +ipset=/smartonesolutions.com.hk/gfwlist +server=/coolloud.org.tw/127.0.0.1#5335 +ipset=/coolloud.org.tw/gfwlist +server=/pittpatt.com/127.0.0.1#5335 +ipset=/pittpatt.com/gfwlist +server=/yourfreeporn.tv/127.0.0.1#5335 +ipset=/yourfreeporn.tv/gfwlist +server=/kmc-av.com/127.0.0.1#5335 +ipset=/kmc-av.com/gfwlist +server=/blackfridaydrebeatsshop.com/127.0.0.1#5335 +ipset=/blackfridaydrebeatsshop.com/gfwlist +server=/zdusercontent.com/127.0.0.1#5335 +ipset=/zdusercontent.com/gfwlist +server=/kindleoasis.info/127.0.0.1#5335 +ipset=/kindleoasis.info/gfwlist +server=/pornhat.com/127.0.0.1#5335 +ipset=/pornhat.com/gfwlist +server=/youtube.com.ng/127.0.0.1#5335 +ipset=/youtube.com.ng/gfwlist +server=/exxxtrasmall1.com/127.0.0.1#5335 +ipset=/exxxtrasmall1.com/gfwlist +server=/vmwdemo.com/127.0.0.1#5335 +ipset=/vmwdemo.com/gfwlist +server=/facebzook.com/127.0.0.1#5335 +ipset=/facebzook.com/gfwlist +server=/renderos.com/127.0.0.1#5335 +ipset=/renderos.com/gfwlist +server=/thomsonreuters.com.my/127.0.0.1#5335 +ipset=/thomsonreuters.com.my/gfwlist +server=/putty.org/127.0.0.1#5335 +ipset=/putty.org/gfwlist +server=/voahausa.com/127.0.0.1#5335 +ipset=/voahausa.com/gfwlist +server=/porndeepfake.net/127.0.0.1#5335 +ipset=/porndeepfake.net/gfwlist +server=/apple-mapkit.com/127.0.0.1#5335 +ipset=/apple-mapkit.com/gfwlist +server=/moxing.news/127.0.0.1#5335 +ipset=/moxing.news/gfwlist +server=/nekoxxx.com/127.0.0.1#5335 +ipset=/nekoxxx.com/gfwlist +server=/fei.ru/127.0.0.1#5335 +ipset=/fei.ru/gfwlist +server=/applecomputer.hu/127.0.0.1#5335 +ipset=/applecomputer.hu/gfwlist +server=/iphone.com/127.0.0.1#5335 +ipset=/iphone.com/gfwlist +server=/mdpi.com/127.0.0.1#5335 +ipset=/mdpi.com/gfwlist +server=/nginx.org/127.0.0.1#5335 +ipset=/nginx.org/gfwlist +server=/sexanime.net/127.0.0.1#5335 +ipset=/sexanime.net/gfwlist +server=/artstationmedia.com/127.0.0.1#5335 +ipset=/artstationmedia.com/gfwlist +server=/bridgestone.com.br/127.0.0.1#5335 +ipset=/bridgestone.com.br/gfwlist +server=/google.com.bn/127.0.0.1#5335 +ipset=/google.com.bn/gfwlist +server=/shopdisney.com/127.0.0.1#5335 +ipset=/shopdisney.com/gfwlist +server=/foxsports.net/127.0.0.1#5335 +ipset=/foxsports.net/gfwlist +server=/beatsep.com/127.0.0.1#5335 +ipset=/beatsep.com/gfwlist +server=/paypal-merchantloyalty.com/127.0.0.1#5335 +ipset=/paypal-merchantloyalty.com/gfwlist +server=/atwiki.jp/127.0.0.1#5335 +ipset=/atwiki.jp/gfwlist +server=/bmw-connecteddrive.pt/127.0.0.1#5335 +ipset=/bmw-connecteddrive.pt/gfwlist +server=/nikeonlinestore.com/127.0.0.1#5335 +ipset=/nikeonlinestore.com/gfwlist +server=/mastercard.com.sa/127.0.0.1#5335 +ipset=/mastercard.com.sa/gfwlist +server=/amateuralbum.net/127.0.0.1#5335 +ipset=/amateuralbum.net/gfwlist +server=/xvxxtube.com/127.0.0.1#5335 +ipset=/xvxxtube.com/gfwlist +server=/bucketeer.jp/127.0.0.1#5335 +ipset=/bucketeer.jp/gfwlist +server=/logitechio.com.cn/127.0.0.1#5335 +ipset=/logitechio.com.cn/gfwlist +server=/ikea.hu/127.0.0.1#5335 +ipset=/ikea.hu/gfwlist +server=/edge-skype-com.s-0001.s-msedge.net/127.0.0.1#5335 +ipset=/edge-skype-com.s-0001.s-msedge.net/gfwlist +server=/sexgalaxy.net/127.0.0.1#5335 +ipset=/sexgalaxy.net/gfwlist +server=/jstage.jst.go.jp/127.0.0.1#5335 +ipset=/jstage.jst.go.jp/gfwlist +server=/amateurblowjobporn.com/127.0.0.1#5335 +ipset=/amateurblowjobporn.com/gfwlist +server=/watchteencam.com/127.0.0.1#5335 +ipset=/watchteencam.com/gfwlist +server=/facebookawards.com/127.0.0.1#5335 +ipset=/facebookawards.com/gfwlist +server=/cloudflare-dns.com/127.0.0.1#5335 +ipset=/cloudflare-dns.com/gfwlist +server=/porngeek.com/127.0.0.1#5335 +ipset=/porngeek.com/gfwlist +server=/bmwgroup-posdigital.com/127.0.0.1#5335 +ipset=/bmwgroup-posdigital.com/gfwlist +server=/bridgestone.com.mx/127.0.0.1#5335 +ipset=/bridgestone.com.mx/gfwlist +server=/hqtube.xxx/127.0.0.1#5335 +ipset=/hqtube.xxx/gfwlist +server=/deutschsex.com/127.0.0.1#5335 +ipset=/deutschsex.com/gfwlist +server=/hidive.com/127.0.0.1#5335 +ipset=/hidive.com/gfwlist +server=/lolusercontent.com/127.0.0.1#5335 +ipset=/lolusercontent.com/gfwlist +server=/ikea.co.at/127.0.0.1#5335 +ipset=/ikea.co.at/gfwlist +server=/pinterest.co.uk/127.0.0.1#5335 +ipset=/pinterest.co.uk/gfwlist +server=/volvotrucks.com.ua/127.0.0.1#5335 +ipset=/volvotrucks.com.ua/gfwlist +server=/wrenchead.com/127.0.0.1#5335 +ipset=/wrenchead.com/gfwlist +server=/1337x.is/127.0.0.1#5335 +ipset=/1337x.is/gfwlist +server=/mariokart8.com/127.0.0.1#5335 +ipset=/mariokart8.com/gfwlist +server=/bangher.net/127.0.0.1#5335 +ipset=/bangher.net/gfwlist +server=/cnbetacdn.com/127.0.0.1#5335 +ipset=/cnbetacdn.com/gfwlist +server=/pearsonassessment.dk/127.0.0.1#5335 +ipset=/pearsonassessment.dk/gfwlist +server=/bloombergbeta.com/127.0.0.1#5335 +ipset=/bloombergbeta.com/gfwlist +server=/gittigidiyor.net/127.0.0.1#5335 +ipset=/gittigidiyor.net/gfwlist +server=/pricelessarabia.com/127.0.0.1#5335 +ipset=/pricelessarabia.com/gfwlist +server=/booksinprint.com/127.0.0.1#5335 +ipset=/booksinprint.com/gfwlist +server=/letsencrypt.org/127.0.0.1#5335 +ipset=/letsencrypt.org/gfwlist +server=/toppornsites.net/127.0.0.1#5335 +ipset=/toppornsites.net/gfwlist +server=/visa.com.bs/127.0.0.1#5335 +ipset=/visa.com.bs/gfwlist +server=/morisawa.co.jp/127.0.0.1#5335 +ipset=/morisawa.co.jp/gfwlist +server=/nikeaw77.com/127.0.0.1#5335 +ipset=/nikeaw77.com/gfwlist +server=/cordcloud.org/127.0.0.1#5335 +ipset=/cordcloud.org/gfwlist +server=/igkbroker.com/127.0.0.1#5335 +ipset=/igkbroker.com/gfwlist +server=/omotenashi.cygames.jp/127.0.0.1#5335 +ipset=/omotenashi.cygames.jp/gfwlist +server=/blogspot.al/127.0.0.1#5335 +ipset=/blogspot.al/gfwlist +server=/myfoxzone.com/127.0.0.1#5335 +ipset=/myfoxzone.com/gfwlist +server=/nvidia.be/127.0.0.1#5335 +ipset=/nvidia.be/gfwlist +server=/playwarcraft3.com/127.0.0.1#5335 +ipset=/playwarcraft3.com/gfwlist +server=/bbhub.io/127.0.0.1#5335 +ipset=/bbhub.io/gfwlist +server=/vercel.store/127.0.0.1#5335 +ipset=/vercel.store/gfwlist +server=/google.co.il/127.0.0.1#5335 +ipset=/google.co.il/gfwlist +server=/hegre.com/127.0.0.1#5335 +ipset=/hegre.com/gfwlist +server=/enfagrow.com.bn/127.0.0.1#5335 +ipset=/enfagrow.com.bn/gfwlist +server=/pornwild.to/127.0.0.1#5335 +ipset=/pornwild.to/gfwlist +server=/nicodic.jp/127.0.0.1#5335 +ipset=/nicodic.jp/gfwlist +server=/justporno.es/127.0.0.1#5335 +ipset=/justporno.es/gfwlist +server=/kindle.de/127.0.0.1#5335 +ipset=/kindle.de/gfwlist +server=/yahoo.bi/127.0.0.1#5335 +ipset=/yahoo.bi/gfwlist +server=/amazon.ae/127.0.0.1#5335 +ipset=/amazon.ae/gfwlist +server=/mageconf.com/127.0.0.1#5335 +ipset=/mageconf.com/gfwlist +server=/voatiengviet.com/127.0.0.1#5335 +ipset=/voatiengviet.com/gfwlist +server=/boylove1.cc/127.0.0.1#5335 +ipset=/boylove1.cc/gfwlist +server=/latencytop.com/127.0.0.1#5335 +ipset=/latencytop.com/gfwlist +server=/alexa.com/127.0.0.1#5335 +ipset=/alexa.com/gfwlist +server=/porncana.com/127.0.0.1#5335 +ipset=/porncana.com/gfwlist +server=/shopee.vn/127.0.0.1#5335 +ipset=/shopee.vn/gfwlist +server=/hentaistube.com/127.0.0.1#5335 +ipset=/hentaistube.com/gfwlist +server=/seniortgp.com/127.0.0.1#5335 +ipset=/seniortgp.com/gfwlist +server=/wikinews.org/127.0.0.1#5335 +ipset=/wikinews.org/gfwlist +server=/gettyimages.com.mx/127.0.0.1#5335 +ipset=/gettyimages.com.mx/gfwlist +server=/3movs.com/127.0.0.1#5335 +ipset=/3movs.com/gfwlist +server=/geeksquadonline.com/127.0.0.1#5335 +ipset=/geeksquadonline.com/gfwlist +server=/alphera-finance.com.hk/127.0.0.1#5335 +ipset=/alphera-finance.com.hk/gfwlist +server=/hustler.com/127.0.0.1#5335 +ipset=/hustler.com/gfwlist +server=/openstreetmaps.org/127.0.0.1#5335 +ipset=/openstreetmaps.org/gfwlist +server=/launchpad.net/127.0.0.1#5335 +ipset=/launchpad.net/gfwlist +server=/ikea.pt/127.0.0.1#5335 +ipset=/ikea.pt/gfwlist +server=/blacktowhite.net/127.0.0.1#5335 +ipset=/blacktowhite.net/gfwlist +server=/youtube.ee/127.0.0.1#5335 +ipset=/youtube.ee/gfwlist +server=/hddirectv.com/127.0.0.1#5335 +ipset=/hddirectv.com/gfwlist +server=/visa.com.jm/127.0.0.1#5335 +ipset=/visa.com.jm/gfwlist +server=/justporno.sex/127.0.0.1#5335 +ipset=/justporno.sex/gfwlist +server=/pornoweb.win/127.0.0.1#5335 +ipset=/pornoweb.win/gfwlist +server=/battlefieldbadcompany2.com/127.0.0.1#5335 +ipset=/battlefieldbadcompany2.com/gfwlist +server=/adobeexchange.com/127.0.0.1#5335 +ipset=/adobeexchange.com/gfwlist +server=/localizejs.com/127.0.0.1#5335 +ipset=/localizejs.com/gfwlist +server=/bmworegon.com/127.0.0.1#5335 +ipset=/bmworegon.com/gfwlist +server=/pcre.org/127.0.0.1#5335 +ipset=/pcre.org/gfwlist +server=/ilove-movies.com/127.0.0.1#5335 +ipset=/ilove-movies.com/gfwlist +server=/applescreensavers.com/127.0.0.1#5335 +ipset=/applescreensavers.com/gfwlist +server=/hentailegendado.com/127.0.0.1#5335 +ipset=/hentailegendado.com/gfwlist +server=/xn--x-qeu1ji09tzlg.biz/127.0.0.1#5335 +ipset=/xn--x-qeu1ji09tzlg.biz/gfwlist +server=/instagramkusu.com/127.0.0.1#5335 +ipset=/instagramkusu.com/gfwlist +server=/nikefoundation.org/127.0.0.1#5335 +ipset=/nikefoundation.org/gfwlist +server=/vercel-status.com/127.0.0.1#5335 +ipset=/vercel-status.com/gfwlist +server=/qzav.tv/127.0.0.1#5335 +ipset=/qzav.tv/gfwlist +server=/hdtube1.com/127.0.0.1#5335 +ipset=/hdtube1.com/gfwlist +server=/bmw-connecteddrive.ro/127.0.0.1#5335 +ipset=/bmw-connecteddrive.ro/gfwlist +server=/mybeatsbydrestudio.com/127.0.0.1#5335 +ipset=/mybeatsbydrestudio.com/gfwlist +server=/beatsbydrdrecustom.com/127.0.0.1#5335 +ipset=/beatsbydrdrecustom.com/gfwlist +server=/metropolitana.tokyo/127.0.0.1#5335 +ipset=/metropolitana.tokyo/gfwlist +server=/gimy.co/127.0.0.1#5335 +ipset=/gimy.co/gfwlist +server=/e-bay.com/127.0.0.1#5335 +ipset=/e-bay.com/gfwlist +server=/gannett-cdn.com/127.0.0.1#5335 +ipset=/gannett-cdn.com/gfwlist +server=/vol.moe/127.0.0.1#5335 +ipset=/vol.moe/gfwlist +server=/razer.com/127.0.0.1#5335 +ipset=/razer.com/gfwlist +server=/nurofen.hr/127.0.0.1#5335 +ipset=/nurofen.hr/gfwlist +server=/xiaofu.me/127.0.0.1#5335 +ipset=/xiaofu.me/gfwlist +server=/jneurosci.org/127.0.0.1#5335 +ipset=/jneurosci.org/gfwlist +server=/paypal-gifts.com/127.0.0.1#5335 +ipset=/paypal-gifts.com/gfwlist +server=/yahoofinance.com/127.0.0.1#5335 +ipset=/yahoofinance.com/gfwlist +server=/voxops.net/127.0.0.1#5335 +ipset=/voxops.net/gfwlist +server=/okex.com/127.0.0.1#5335 +ipset=/okex.com/gfwlist +server=/rustup.rs/127.0.0.1#5335 +ipset=/rustup.rs/gfwlist +server=/teenporntube.xxx/127.0.0.1#5335 +ipset=/teenporntube.xxx/gfwlist +server=/iphonecase5.com/127.0.0.1#5335 +ipset=/iphonecase5.com/gfwlist +server=/akamai-cdn.com/127.0.0.1#5335 +ipset=/akamai-cdn.com/gfwlist +server=/iqq3.cc/127.0.0.1#5335 +ipset=/iqq3.cc/gfwlist +server=/extrajapaneseporn.com/127.0.0.1#5335 +ipset=/extrajapaneseporn.com/gfwlist +server=/bydrebeats.com/127.0.0.1#5335 +ipset=/bydrebeats.com/gfwlist +server=/pagecdn.io/127.0.0.1#5335 +ipset=/pagecdn.io/gfwlist +server=/facebookcareer.com/127.0.0.1#5335 +ipset=/facebookcareer.com/gfwlist +server=/mastercard.cl/127.0.0.1#5335 +ipset=/mastercard.cl/gfwlist +server=/componentkit.org/127.0.0.1#5335 +ipset=/componentkit.org/gfwlist +server=/mywife.cc/127.0.0.1#5335 +ipset=/mywife.cc/gfwlist +server=/facebook.nl/127.0.0.1#5335 +ipset=/facebook.nl/gfwlist +server=/keytransparency.com/127.0.0.1#5335 +ipset=/keytransparency.com/gfwlist +server=/wwwxoom.com/127.0.0.1#5335 +ipset=/wwwxoom.com/gfwlist +server=/amd.com/127.0.0.1#5335 +ipset=/amd.com/gfwlist +server=/japteenx.com/127.0.0.1#5335 +ipset=/japteenx.com/gfwlist +server=/hulucall.com/127.0.0.1#5335 +ipset=/hulucall.com/gfwlist +server=/microsoftonline.com/127.0.0.1#5335 +ipset=/microsoftonline.com/gfwlist +server=/graiasmovies.com/127.0.0.1#5335 +ipset=/graiasmovies.com/gfwlist +server=/nikeidshoes.com/127.0.0.1#5335 +ipset=/nikeidshoes.com/gfwlist +server=/google.rs/127.0.0.1#5335 +ipset=/google.rs/gfwlist +server=/myfoxny.com/127.0.0.1#5335 +ipset=/myfoxny.com/gfwlist +server=/xvideos.tv.br/127.0.0.1#5335 +ipset=/xvideos.tv.br/gfwlist +server=/foxnews.tv/127.0.0.1#5335 +ipset=/foxnews.tv/gfwlist +server=/hongmaodan100.com/127.0.0.1#5335 +ipset=/hongmaodan100.com/gfwlist +server=/topbeatsforsale.com/127.0.0.1#5335 +ipset=/topbeatsforsale.com/gfwlist +server=/pearsonperu.pe/127.0.0.1#5335 +ipset=/pearsonperu.pe/gfwlist +server=/gayrawclub.com/127.0.0.1#5335 +ipset=/gayrawclub.com/gfwlist +server=/chromebook.com/127.0.0.1#5335 +ipset=/chromebook.com/gfwlist +server=/newsconcierge.com.au/127.0.0.1#5335 +ipset=/newsconcierge.com.au/gfwlist +server=/velkaepocha.cz/127.0.0.1#5335 +ipset=/velkaepocha.cz/gfwlist +server=/homo.xxx/127.0.0.1#5335 +ipset=/homo.xxx/gfwlist +server=/mini.re/127.0.0.1#5335 +ipset=/mini.re/gfwlist +server=/ieeemagnetics.org/127.0.0.1#5335 +ipset=/ieeemagnetics.org/gfwlist +server=/halfjapan.com/127.0.0.1#5335 +ipset=/halfjapan.com/gfwlist +server=/outlook.com/127.0.0.1#5335 +ipset=/outlook.com/gfwlist +server=/filmeporno.blog/127.0.0.1#5335 +ipset=/filmeporno.blog/gfwlist +server=/xxbook.cc/127.0.0.1#5335 +ipset=/xxbook.cc/gfwlist +server=/huffingtonpost.gr/127.0.0.1#5335 +ipset=/huffingtonpost.gr/gfwlist +server=/592r.com/127.0.0.1#5335 +ipset=/592r.com/gfwlist +server=/beatsbydreauofficial.com/127.0.0.1#5335 +ipset=/beatsbydreauofficial.com/gfwlist +server=/cuckwatchingwife.com/127.0.0.1#5335 +ipset=/cuckwatchingwife.com/gfwlist +server=/cockofhorse.com/127.0.0.1#5335 +ipset=/cockofhorse.com/gfwlist +server=/nutaku.com/127.0.0.1#5335 +ipset=/nutaku.com/gfwlist +server=/mature-nl.eu/127.0.0.1#5335 +ipset=/mature-nl.eu/gfwlist +server=/paypalnetwork.info/127.0.0.1#5335 +ipset=/paypalnetwork.info/gfwlist +server=/azadiradio.com/127.0.0.1#5335 +ipset=/azadiradio.com/gfwlist +server=/anaconda.com/127.0.0.1#5335 +ipset=/anaconda.com/gfwlist +server=/affirmtrust.com/127.0.0.1#5335 +ipset=/affirmtrust.com/gfwlist +server=/microsoft.fi/127.0.0.1#5335 +ipset=/microsoft.fi/gfwlist +server=/iphone4.com.br/127.0.0.1#5335 +ipset=/iphone4.com.br/gfwlist +server=/tyler-brown.com/127.0.0.1#5335 +ipset=/tyler-brown.com/gfwlist +server=/buypass.com/127.0.0.1#5335 +ipset=/buypass.com/gfwlist +server=/uplust.com/127.0.0.1#5335 +ipset=/uplust.com/gfwlist +server=/nvidia.asia/127.0.0.1#5335 +ipset=/nvidia.asia/gfwlist +server=/teendreams.com/127.0.0.1#5335 +ipset=/teendreams.com/gfwlist +server=/longman.ch/127.0.0.1#5335 +ipset=/longman.ch/gfwlist +server=/starbucks.com.gr/127.0.0.1#5335 +ipset=/starbucks.com.gr/gfwlist +server=/fout.jp/127.0.0.1#5335 +ipset=/fout.jp/gfwlist +server=/google.com.tw/127.0.0.1#5335 +ipset=/google.com.tw/gfwlist +server=/intel.ch/127.0.0.1#5335 +ipset=/intel.ch/gfwlist +server=/apa.org/127.0.0.1#5335 +ipset=/apa.org/gfwlist +server=/strikingly.com/127.0.0.1#5335 +ipset=/strikingly.com/gfwlist +server=/yahoo.tl/127.0.0.1#5335 +ipset=/yahoo.tl/gfwlist +server=/xiaogirls.com/127.0.0.1#5335 +ipset=/xiaogirls.com/gfwlist +server=/cargigileads.com/127.0.0.1#5335 +ipset=/cargigileads.com/gfwlist +server=/google.com.kh/127.0.0.1#5335 +ipset=/google.com.kh/gfwlist +server=/coinonecorp.com/127.0.0.1#5335 +ipset=/coinonecorp.com/gfwlist +server=/javfuck.net/127.0.0.1#5335 +ipset=/javfuck.net/gfwlist +server=/iskoot.com/127.0.0.1#5335 +ipset=/iskoot.com/gfwlist +server=/2o7.net/127.0.0.1#5335 +ipset=/2o7.net/gfwlist +server=/scholar.google.com.vn/127.0.0.1#5335 +ipset=/scholar.google.com.vn/gfwlist +server=/comments.app/127.0.0.1#5335 +ipset=/comments.app/gfwlist +server=/thebanker.com/127.0.0.1#5335 +ipset=/thebanker.com/gfwlist +server=/skysports.com/127.0.0.1#5335 +ipset=/skysports.com/gfwlist +server=/freenode.net/127.0.0.1#5335 +ipset=/freenode.net/gfwlist +server=/mini.ru/127.0.0.1#5335 +ipset=/mini.ru/gfwlist +server=/1lib.cloud/127.0.0.1#5335 +ipset=/1lib.cloud/gfwlist +server=/supadou.blogism.jp/127.0.0.1#5335 +ipset=/supadou.blogism.jp/gfwlist +server=/maddenrewards.com/127.0.0.1#5335 +ipset=/maddenrewards.com/gfwlist +server=/freyalist.com/127.0.0.1#5335 +ipset=/freyalist.com/gfwlist +server=/naughty.com/127.0.0.1#5335 +ipset=/naughty.com/gfwlist +server=/sacduc.com/127.0.0.1#5335 +ipset=/sacduc.com/gfwlist +server=/nypost.help/127.0.0.1#5335 +ipset=/nypost.help/gfwlist +server=/17mimei.club/127.0.0.1#5335 +ipset=/17mimei.club/gfwlist +server=/pornotube69.nl/127.0.0.1#5335 +ipset=/pornotube69.nl/gfwlist +server=/visa.be/127.0.0.1#5335 +ipset=/visa.be/gfwlist +server=/musical.ly/127.0.0.1#5335 +ipset=/musical.ly/gfwlist +server=/app0le.com/127.0.0.1#5335 +ipset=/app0le.com/gfwlist +server=/gaytube.com/127.0.0.1#5335 +ipset=/gaytube.com/gfwlist +server=/delicious.com.au/127.0.0.1#5335 +ipset=/delicious.com.au/gfwlist +server=/facebook-studio.com/127.0.0.1#5335 +ipset=/facebook-studio.com/gfwlist +server=/macreach.com/127.0.0.1#5335 +ipset=/macreach.com/gfwlist +server=/naughtygamesource.com/127.0.0.1#5335 +ipset=/naughtygamesource.com/gfwlist +server=/blogspot.co.uk/127.0.0.1#5335 +ipset=/blogspot.co.uk/gfwlist +server=/minecraft.net/127.0.0.1#5335 +ipset=/minecraft.net/gfwlist +server=/androidify.com/127.0.0.1#5335 +ipset=/androidify.com/gfwlist +server=/bmw-motorrad.be/127.0.0.1#5335 +ipset=/bmw-motorrad.be/gfwlist +server=/vs-hls-push-uk-live.akamaized.net/127.0.0.1#5335 +ipset=/vs-hls-push-uk-live.akamaized.net/gfwlist +server=/foxsmallbusinesscenter.com/127.0.0.1#5335 +ipset=/foxsmallbusinesscenter.com/gfwlist +server=/nikesellorder.com/127.0.0.1#5335 +ipset=/nikesellorder.com/gfwlist +server=/asianscreens.com/127.0.0.1#5335 +ipset=/asianscreens.com/gfwlist +server=/jmcomic1.city/127.0.0.1#5335 +ipset=/jmcomic1.city/gfwlist +server=/twistys.com/127.0.0.1#5335 +ipset=/twistys.com/gfwlist +server=/deutschepornos-kostenlos.net/127.0.0.1#5335 +ipset=/deutschepornos-kostenlos.net/gfwlist +server=/sdcountybmw.com/127.0.0.1#5335 +ipset=/sdcountybmw.com/gfwlist +server=/bmw-classic.com/127.0.0.1#5335 +ipset=/bmw-classic.com/gfwlist +server=/heptio.com/127.0.0.1#5335 +ipset=/heptio.com/gfwlist +server=/visa.co.nz/127.0.0.1#5335 +ipset=/visa.co.nz/gfwlist +server=/libgen.me/127.0.0.1#5335 +ipset=/libgen.me/gfwlist +server=/bmw.hu/127.0.0.1#5335 +ipset=/bmw.hu/gfwlist +server=/xn--mtswd61ejxq.com/127.0.0.1#5335 +ipset=/xn--mtswd61ejxq.com/gfwlist +server=/terapeak.hk/127.0.0.1#5335 +ipset=/terapeak.hk/gfwlist +server=/favepornvids.com/127.0.0.1#5335 +ipset=/favepornvids.com/gfwlist +server=/ted.com/127.0.0.1#5335 +ipset=/ted.com/gfwlist +server=/nikebbn.com/127.0.0.1#5335 +ipset=/nikebbn.com/gfwlist +server=/oed.com/127.0.0.1#5335 +ipset=/oed.com/gfwlist +server=/apple-cloudkit.com/127.0.0.1#5335 +ipset=/apple-cloudkit.com/gfwlist +server=/bmw.hn/127.0.0.1#5335 +ipset=/bmw.hn/gfwlist +server=/povpornonly.com/127.0.0.1#5335 +ipset=/povpornonly.com/gfwlist +server=/mylust.com/127.0.0.1#5335 +ipset=/mylust.com/gfwlist +server=/reiporno.com/127.0.0.1#5335 +ipset=/reiporno.com/gfwlist +server=/asiansex.sexy/127.0.0.1#5335 +ipset=/asiansex.sexy/gfwlist +server=/vfsco.es/127.0.0.1#5335 +ipset=/vfsco.es/gfwlist +server=/pearsoneducacion.net/127.0.0.1#5335 +ipset=/pearsoneducacion.net/gfwlist +server=/apple.nl/127.0.0.1#5335 +ipset=/apple.nl/gfwlist +server=/brightcove.net/127.0.0.1#5335 +ipset=/brightcove.net/gfwlist +server=/boshancy.com/127.0.0.1#5335 +ipset=/boshancy.com/gfwlist +server=/facebookexchange.com/127.0.0.1#5335 +ipset=/facebookexchange.com/gfwlist +server=/xnxx.health/127.0.0.1#5335 +ipset=/xnxx.health/gfwlist +server=/adult-web-site.net/127.0.0.1#5335 +ipset=/adult-web-site.net/gfwlist +server=/zzgays.com/127.0.0.1#5335 +ipset=/zzgays.com/gfwlist +server=/beatsbydreirelandonlines.com/127.0.0.1#5335 +ipset=/beatsbydreirelandonlines.com/gfwlist +server=/hentaia.net/127.0.0.1#5335 +ipset=/hentaia.net/gfwlist +server=/google.co.th/127.0.0.1#5335 +ipset=/google.co.th/gfwlist +server=/adidas.pl/127.0.0.1#5335 +ipset=/adidas.pl/gfwlist +server=/google.la/127.0.0.1#5335 +ipset=/google.la/gfwlist +server=/teenporngallery.net/127.0.0.1#5335 +ipset=/teenporngallery.net/gfwlist +server=/bigblackdicklover.com/127.0.0.1#5335 +ipset=/bigblackdicklover.com/gfwlist +server=/miniinvasion.ca/127.0.0.1#5335 +ipset=/miniinvasion.ca/gfwlist +server=/intel.ca/127.0.0.1#5335 +ipset=/intel.ca/gfwlist +server=/erofus.com/127.0.0.1#5335 +ipset=/erofus.com/gfwlist +server=/novinhagostosa10.com/127.0.0.1#5335 +ipset=/novinhagostosa10.com/gfwlist +server=/mirrormedia.mg/127.0.0.1#5335 +ipset=/mirrormedia.mg/gfwlist +server=/pearsonactivelearn.com/127.0.0.1#5335 +ipset=/pearsonactivelearn.com/gfwlist +server=/linotype.com/127.0.0.1#5335 +ipset=/linotype.com/gfwlist +server=/bmw-motorrad.bh/127.0.0.1#5335 +ipset=/bmw-motorrad.bh/gfwlist +server=/pantswalker.net/127.0.0.1#5335 +ipset=/pantswalker.net/gfwlist +server=/alphera.ie/127.0.0.1#5335 +ipset=/alphera.ie/gfwlist +server=/zeeuk.com/127.0.0.1#5335 +ipset=/zeeuk.com/gfwlist +server=/ve-uhd-push-uk-live.akamaized.net/127.0.0.1#5335 +ipset=/ve-uhd-push-uk-live.akamaized.net/gfwlist +server=/glam0ur.com/127.0.0.1#5335 +ipset=/glam0ur.com/gfwlist +server=/ccav691api.com/127.0.0.1#5335 +ipset=/ccav691api.com/gfwlist +server=/bbycloud.com/127.0.0.1#5335 +ipset=/bbycloud.com/gfwlist +server=/bmw-motorrad.no/127.0.0.1#5335 +ipset=/bmw-motorrad.no/gfwlist +server=/icloudsetup.com/127.0.0.1#5335 +ipset=/icloudsetup.com/gfwlist +server=/abema.io/127.0.0.1#5335 +ipset=/abema.io/gfwlist +server=/netvigator.com/127.0.0.1#5335 +ipset=/netvigator.com/gfwlist +server=/fli8.xyz/127.0.0.1#5335 +ipset=/fli8.xyz/gfwlist +server=/erogazou-pinkline.com/127.0.0.1#5335 +ipset=/erogazou-pinkline.com/gfwlist +server=/jpg4.info/127.0.0.1#5335 +ipset=/jpg4.info/gfwlist +server=/virtualtaboo.com/127.0.0.1#5335 +ipset=/virtualtaboo.com/gfwlist +server=/netflix.com/127.0.0.1#5335 +ipset=/netflix.com/gfwlist +server=/pstorage.space/127.0.0.1#5335 +ipset=/pstorage.space/gfwlist +server=/applestoreonline.com/127.0.0.1#5335 +ipset=/applestoreonline.com/gfwlist +server=/dettolarabia.com/127.0.0.1#5335 +ipset=/dettolarabia.com/gfwlist +server=/trustwave.com/127.0.0.1#5335 +ipset=/trustwave.com/gfwlist +server=/eroyakuba.com/127.0.0.1#5335 +ipset=/eroyakuba.com/gfwlist +server=/encoretvb.com/127.0.0.1#5335 +ipset=/encoretvb.com/gfwlist +server=/grannytube.net/127.0.0.1#5335 +ipset=/grannytube.net/gfwlist +server=/eacodigos.com/127.0.0.1#5335 +ipset=/eacodigos.com/gfwlist +server=/intel.mw/127.0.0.1#5335 +ipset=/intel.mw/gfwlist +server=/porndigger.me/127.0.0.1#5335 +ipset=/porndigger.me/gfwlist +server=/slackdemo.com/127.0.0.1#5335 +ipset=/slackdemo.com/gfwlist +server=/bmw-connecteddrive.tw/127.0.0.1#5335 +ipset=/bmw-connecteddrive.tw/gfwlist +server=/charticulator.com/127.0.0.1#5335 +ipset=/charticulator.com/gfwlist +server=/7mmtv.sx/127.0.0.1#5335 +ipset=/7mmtv.sx/gfwlist +server=/yahoo.by/127.0.0.1#5335 +ipset=/yahoo.by/gfwlist +server=/cutt.ly/127.0.0.1#5335 +ipset=/cutt.ly/gfwlist +server=/mycartoonsexgames.com/127.0.0.1#5335 +ipset=/mycartoonsexgames.com/gfwlist +server=/google.com.qa/127.0.0.1#5335 +ipset=/google.com.qa/gfwlist +server=/analpornosex.com/127.0.0.1#5335 +ipset=/analpornosex.com/gfwlist +server=/asianporn.rest/127.0.0.1#5335 +ipset=/asianporn.rest/gfwlist +server=/exposedlatinas.com/127.0.0.1#5335 +ipset=/exposedlatinas.com/gfwlist +server=/swissid.ch/127.0.0.1#5335 +ipset=/swissid.ch/gfwlist +server=/ksescortclub.com/127.0.0.1#5335 +ipset=/ksescortclub.com/gfwlist +server=/applestore.com.ee/127.0.0.1#5335 +ipset=/applestore.com.ee/gfwlist +server=/tegrazone.co.kr/127.0.0.1#5335 +ipset=/tegrazone.co.kr/gfwlist +server=/drebeatsheadphones-nz.com/127.0.0.1#5335 +ipset=/drebeatsheadphones-nz.com/gfwlist +server=/ftvmilfs.com/127.0.0.1#5335 +ipset=/ftvmilfs.com/gfwlist +server=/picasa.com/127.0.0.1#5335 +ipset=/picasa.com/gfwlist +server=/zoom.com/127.0.0.1#5335 +ipset=/zoom.com/gfwlist +server=/xoom.com/127.0.0.1#5335 +ipset=/xoom.com/gfwlist +server=/pokemonbank.com/127.0.0.1#5335 +ipset=/pokemonbank.com/gfwlist +server=/adaptivecards.io/127.0.0.1#5335 +ipset=/adaptivecards.io/gfwlist +server=/i-book.net/127.0.0.1#5335 +ipset=/i-book.net/gfwlist +server=/openweather.co.uk/127.0.0.1#5335 +ipset=/openweather.co.uk/gfwlist +server=/loveparents.org/127.0.0.1#5335 +ipset=/loveparents.org/gfwlist +server=/google.tg/127.0.0.1#5335 +ipset=/google.tg/gfwlist +server=/brasiltudoliberado.com/127.0.0.1#5335 +ipset=/brasiltudoliberado.com/gfwlist +server=/beatspascher-fr.net/127.0.0.1#5335 +ipset=/beatspascher-fr.net/gfwlist +server=/theporntoplist.com/127.0.0.1#5335 +ipset=/theporntoplist.com/gfwlist +server=/vintagemedicalpictures.com/127.0.0.1#5335 +ipset=/vintagemedicalpictures.com/gfwlist +server=/nikemarketing.com/127.0.0.1#5335 +ipset=/nikemarketing.com/gfwlist +server=/youpornru.com/127.0.0.1#5335 +ipset=/youpornru.com/gfwlist +server=/cambridgeschoolshakespeare.com/127.0.0.1#5335 +ipset=/cambridgeschoolshakespeare.com/gfwlist +server=/onedinesfree.com/127.0.0.1#5335 +ipset=/onedinesfree.com/gfwlist +server=/termius.com/127.0.0.1#5335 +ipset=/termius.com/gfwlist +server=/hypnoporn.net/127.0.0.1#5335 +ipset=/hypnoporn.net/gfwlist +server=/espn.com/127.0.0.1#5335 +ipset=/espn.com/gfwlist +server=/nikkei.co.jp/127.0.0.1#5335 +ipset=/nikkei.co.jp/gfwlist +server=/seedmov18.com/127.0.0.1#5335 +ipset=/seedmov18.com/gfwlist +server=/tourporno.com/127.0.0.1#5335 +ipset=/tourporno.com/gfwlist +server=/mini-coupe.ca/127.0.0.1#5335 +ipset=/mini-coupe.ca/gfwlist +server=/akamaihd-staging.net/127.0.0.1#5335 +ipset=/akamaihd-staging.net/gfwlist +server=/realamericanstories.com/127.0.0.1#5335 +ipset=/realamericanstories.com/gfwlist +server=/google-syndication.com/127.0.0.1#5335 +ipset=/google-syndication.com/gfwlist +server=/singlelogin.app/127.0.0.1#5335 +ipset=/singlelogin.app/gfwlist +server=/marvel.com/127.0.0.1#5335 +ipset=/marvel.com/gfwlist +server=/xn--9kr7l.com/127.0.0.1#5335 +ipset=/xn--9kr7l.com/gfwlist +server=/facebokbook.com/127.0.0.1#5335 +ipset=/facebokbook.com/gfwlist +server=/pornogayphy.com/127.0.0.1#5335 +ipset=/pornogayphy.com/gfwlist +server=/hotporntubes.com/127.0.0.1#5335 +ipset=/hotporntubes.com/gfwlist +server=/mastercard.us/127.0.0.1#5335 +ipset=/mastercard.us/gfwlist +server=/spiritofecstasy.com/127.0.0.1#5335 +ipset=/spiritofecstasy.com/gfwlist +server=/freepornq.com/127.0.0.1#5335 +ipset=/freepornq.com/gfwlist +server=/ravm.tv/127.0.0.1#5335 +ipset=/ravm.tv/gfwlist +server=/2kgames.com/127.0.0.1#5335 +ipset=/2kgames.com/gfwlist +server=/bluefootcms.com/127.0.0.1#5335 +ipset=/bluefootcms.com/gfwlist +server=/eastore.com/127.0.0.1#5335 +ipset=/eastore.com/gfwlist +server=/2013beatsbydrdreonline.com/127.0.0.1#5335 +ipset=/2013beatsbydrdreonline.com/gfwlist +server=/enfamama.com.ar/127.0.0.1#5335 +ipset=/enfamama.com.ar/gfwlist +server=/monotype.com/127.0.0.1#5335 +ipset=/monotype.com/gfwlist +server=/starwarsbattlefront.com/127.0.0.1#5335 +ipset=/starwarsbattlefront.com/gfwlist +server=/visa.no/127.0.0.1#5335 +ipset=/visa.no/gfwlist +server=/akamah.com/127.0.0.1#5335 +ipset=/akamah.com/gfwlist +server=/fandom.com/127.0.0.1#5335 +ipset=/fandom.com/gfwlist +server=/tver.co.jp/127.0.0.1#5335 +ipset=/tver.co.jp/gfwlist +server=/fashionnike.com/127.0.0.1#5335 +ipset=/fashionnike.com/gfwlist +server=/javsin.tv/127.0.0.1#5335 +ipset=/javsin.tv/gfwlist +server=/exxxtrasmall.com/127.0.0.1#5335 +ipset=/exxxtrasmall.com/gfwlist +server=/financialsoccer.ca/127.0.0.1#5335 +ipset=/financialsoccer.ca/gfwlist +server=/zatrahal.online/127.0.0.1#5335 +ipset=/zatrahal.online/gfwlist +server=/fbinnovation.com/127.0.0.1#5335 +ipset=/fbinnovation.com/gfwlist +server=/gfarchive.com/127.0.0.1#5335 +ipset=/gfarchive.com/gfwlist +server=/az764295.vo.msecnd.net/127.0.0.1#5335 +ipset=/az764295.vo.msecnd.net/gfwlist +server=/firestonecomercial.cl/127.0.0.1#5335 +ipset=/firestonecomercial.cl/gfwlist +server=/impact-ad.jp/127.0.0.1#5335 +ipset=/impact-ad.jp/gfwlist +server=/volvotruckcenter.it/127.0.0.1#5335 +ipset=/volvotruckcenter.it/gfwlist +server=/pornoelena.net/127.0.0.1#5335 +ipset=/pornoelena.net/gfwlist +server=/ignitesasia.com/127.0.0.1#5335 +ipset=/ignitesasia.com/gfwlist +server=/evanottyvideos.com/127.0.0.1#5335 +ipset=/evanottyvideos.com/gfwlist +server=/feacbooke.com/127.0.0.1#5335 +ipset=/feacbooke.com/gfwlist +server=/bcovlive.io/127.0.0.1#5335 +ipset=/bcovlive.io/gfwlist +server=/wikihow.com/127.0.0.1#5335 +ipset=/wikihow.com/gfwlist +server=/mini-qatar.com/127.0.0.1#5335 +ipset=/mini-qatar.com/gfwlist +server=/idelreal.org/127.0.0.1#5335 +ipset=/idelreal.org/gfwlist +server=/omnitek.tv/127.0.0.1#5335 +ipset=/omnitek.tv/gfwlist +server=/monsterbeatsbydres.com/127.0.0.1#5335 +ipset=/monsterbeatsbydres.com/gfwlist +server=/epochtimes-bg.com/127.0.0.1#5335 +ipset=/epochtimes-bg.com/gfwlist +server=/starbucksrewardsstarland.com/127.0.0.1#5335 +ipset=/starbucksrewardsstarland.com/gfwlist +server=/nu-bay.com/127.0.0.1#5335 +ipset=/nu-bay.com/gfwlist +server=/mastercard.co.in/127.0.0.1#5335 +ipset=/mastercard.co.in/gfwlist +server=/amateuranalvideos.com/127.0.0.1#5335 +ipset=/amateuranalvideos.com/gfwlist +server=/asiansmaster.com/127.0.0.1#5335 +ipset=/asiansmaster.com/gfwlist +server=/facebook.net/127.0.0.1#5335 +ipset=/facebook.net/gfwlist +server=/minisojordan.com/127.0.0.1#5335 +ipset=/minisojordan.com/gfwlist +server=/youtube.com.tn/127.0.0.1#5335 +ipset=/youtube.com.tn/gfwlist +server=/finlitsummit.org/127.0.0.1#5335 +ipset=/finlitsummit.org/gfwlist +server=/bookfi.net/127.0.0.1#5335 +ipset=/bookfi.net/gfwlist +server=/ebayradio.com/127.0.0.1#5335 +ipset=/ebayradio.com/gfwlist +server=/swisssign-group.ch/127.0.0.1#5335 +ipset=/swisssign-group.ch/gfwlist +server=/realvision.com/127.0.0.1#5335 +ipset=/realvision.com/gfwlist +server=/ipod.com.hk/127.0.0.1#5335 +ipset=/ipod.com.hk/gfwlist +server=/bbgevent.com/127.0.0.1#5335 +ipset=/bbgevent.com/gfwlist +server=/sexguide.ro/127.0.0.1#5335 +ipset=/sexguide.ro/gfwlist +server=/travelexch.com/127.0.0.1#5335 +ipset=/travelexch.com/gfwlist +server=/creativecommons.engineering/127.0.0.1#5335 +ipset=/creativecommons.engineering/gfwlist +server=/londonreal.tv/127.0.0.1#5335 +ipset=/londonreal.tv/gfwlist +server=/ipad3.com/127.0.0.1#5335 +ipset=/ipad3.com/gfwlist +server=/azadliq.org/127.0.0.1#5335 +ipset=/azadliq.org/gfwlist +server=/visualstudio.eu/127.0.0.1#5335 +ipset=/visualstudio.eu/gfwlist +server=/bookclubgirl.com/127.0.0.1#5335 +ipset=/bookclubgirl.com/gfwlist +server=/sluttyrat.com/127.0.0.1#5335 +ipset=/sluttyrat.com/gfwlist +server=/headlinejobs.hk/127.0.0.1#5335 +ipset=/headlinejobs.hk/gfwlist +server=/ie8.co/127.0.0.1#5335 +ipset=/ie8.co/gfwlist +server=/sexygirlfriendtube.com/127.0.0.1#5335 +ipset=/sexygirlfriendtube.com/gfwlist +server=/netlify.app/127.0.0.1#5335 +ipset=/netlify.app/gfwlist +server=/mini.co.kr/127.0.0.1#5335 +ipset=/mini.co.kr/gfwlist +server=/creampiehomevideos.com/127.0.0.1#5335 +ipset=/creampiehomevideos.com/gfwlist +server=/appledaily.com.tw/127.0.0.1#5335 +ipset=/appledaily.com.tw/gfwlist +server=/sci-hub.mksa.top/127.0.0.1#5335 +ipset=/sci-hub.mksa.top/gfwlist +server=/domywife.com/127.0.0.1#5335 +ipset=/domywife.com/gfwlist +server=/dreamworks.com/127.0.0.1#5335 +ipset=/dreamworks.com/gfwlist +server=/dirtyshack.com/127.0.0.1#5335 +ipset=/dirtyshack.com/gfwlist +server=/canonical.com/127.0.0.1#5335 +ipset=/canonical.com/gfwlist +server=/volvotrucks.ro/127.0.0.1#5335 +ipset=/volvotrucks.ro/gfwlist +server=/bmwdealercareers.com/127.0.0.1#5335 +ipset=/bmwdealercareers.com/gfwlist +server=/canon-ois.qa/127.0.0.1#5335 +ipset=/canon-ois.qa/gfwlist +server=/weltweitwachsen.de/127.0.0.1#5335 +ipset=/weltweitwachsen.de/gfwlist +server=/visa.sx/127.0.0.1#5335 +ipset=/visa.sx/gfwlist +server=/ebonywebcamhub.com/127.0.0.1#5335 +ipset=/ebonywebcamhub.com/gfwlist +server=/xo104.com/127.0.0.1#5335 +ipset=/xo104.com/gfwlist +server=/aboutamazon.it/127.0.0.1#5335 +ipset=/aboutamazon.it/gfwlist +server=/facebookmarketingpartners.com/127.0.0.1#5335 +ipset=/facebookmarketingpartners.com/gfwlist +server=/scc.ott.hinet.net/127.0.0.1#5335 +ipset=/scc.ott.hinet.net/gfwlist +server=/jetfuelapps.com/127.0.0.1#5335 +ipset=/jetfuelapps.com/gfwlist +server=/jambotube.com/127.0.0.1#5335 +ipset=/jambotube.com/gfwlist +server=/gtvmediagroupfairfund.com/127.0.0.1#5335 +ipset=/gtvmediagroupfairfund.com/gfwlist +server=/tbr.tangbr.net/127.0.0.1#5335 +ipset=/tbr.tangbr.net/gfwlist +server=/apple.ru/127.0.0.1#5335 +ipset=/apple.ru/gfwlist +server=/zdassets.com/127.0.0.1#5335 +ipset=/zdassets.com/gfwlist +server=/derpibooru.org/127.0.0.1#5335 +ipset=/derpibooru.org/gfwlist +server=/shopee.com.mx/127.0.0.1#5335 +ipset=/shopee.com.mx/gfwlist +server=/stripparadise.com/127.0.0.1#5335 +ipset=/stripparadise.com/gfwlist +server=/54647.global/127.0.0.1#5335 +ipset=/54647.global/gfwlist +server=/businessinsider.mx/127.0.0.1#5335 +ipset=/businessinsider.mx/gfwlist +server=/supanimegames.com/127.0.0.1#5335 +ipset=/supanimegames.com/gfwlist +server=/paypal.us/127.0.0.1#5335 +ipset=/paypal.us/gfwlist +server=/ntd.com/127.0.0.1#5335 +ipset=/ntd.com/gfwlist +server=/scholar.google.com.pa/127.0.0.1#5335 +ipset=/scholar.google.com.pa/gfwlist +server=/okazudouga.tokyo/127.0.0.1#5335 +ipset=/okazudouga.tokyo/gfwlist +server=/cloudflareinsights.com/127.0.0.1#5335 +ipset=/cloudflareinsights.com/gfwlist +server=/facebookpoke.org/127.0.0.1#5335 +ipset=/facebookpoke.org/gfwlist +server=/messytube.com/127.0.0.1#5335 +ipset=/messytube.com/gfwlist +server=/arirangmeari.com/127.0.0.1#5335 +ipset=/arirangmeari.com/gfwlist +server=/ruinedking.com/127.0.0.1#5335 +ipset=/ruinedking.com/gfwlist +server=/monsterbeatsbydrenew.com/127.0.0.1#5335 +ipset=/monsterbeatsbydrenew.com/gfwlist +server=/xvidios.xxx/127.0.0.1#5335 +ipset=/xvidios.xxx/gfwlist +server=/8muses.xxx/127.0.0.1#5335 +ipset=/8muses.xxx/gfwlist +server=/facebook.cc/127.0.0.1#5335 +ipset=/facebook.cc/gfwlist +server=/softbank-robotics.com/127.0.0.1#5335 +ipset=/softbank-robotics.com/gfwlist +server=/bmwgroup-gaad.com/127.0.0.1#5335 +ipset=/bmwgroup-gaad.com/gfwlist +server=/amaaozn.com/127.0.0.1#5335 +ipset=/amaaozn.com/gfwlist +server=/microsoftiotinsiderlabs.com/127.0.0.1#5335 +ipset=/microsoftiotinsiderlabs.com/gfwlist +server=/wwe9.com/127.0.0.1#5335 +ipset=/wwe9.com/gfwlist +server=/akamii.com/127.0.0.1#5335 +ipset=/akamii.com/gfwlist +server=/yahoodns.net/127.0.0.1#5335 +ipset=/yahoodns.net/gfwlist +server=/fansta.me/127.0.0.1#5335 +ipset=/fansta.me/gfwlist +server=/mastercard.co.uk/127.0.0.1#5335 +ipset=/mastercard.co.uk/gfwlist +server=/pussy-pics.net/127.0.0.1#5335 +ipset=/pussy-pics.net/gfwlist +server=/adidas.com.tw/127.0.0.1#5335 +ipset=/adidas.com.tw/gfwlist +server=/meendo.com/127.0.0.1#5335 +ipset=/meendo.com/gfwlist +server=/kyodonews.jp/127.0.0.1#5335 +ipset=/kyodonews.jp/gfwlist +server=/pornoboliviaxxx.com/127.0.0.1#5335 +ipset=/pornoboliviaxxx.com/gfwlist +server=/nvidia.co.kr/127.0.0.1#5335 +ipset=/nvidia.co.kr/gfwlist +server=/ios-icloud.com/127.0.0.1#5335 +ipset=/ios-icloud.com/gfwlist +server=/tamilsexvideos.cc/127.0.0.1#5335 +ipset=/tamilsexvideos.cc/gfwlist +server=/youtube.ae/127.0.0.1#5335 +ipset=/youtube.ae/gfwlist +server=/blogspot.com.ng/127.0.0.1#5335 +ipset=/blogspot.com.ng/gfwlist +server=/steamdeck.com/127.0.0.1#5335 +ipset=/steamdeck.com/gfwlist +server=/aboutamazon.co.uk/127.0.0.1#5335 +ipset=/aboutamazon.co.uk/gfwlist +server=/netflav.com/127.0.0.1#5335 +ipset=/netflav.com/gfwlist +server=/beatsdrdre2014.com/127.0.0.1#5335 +ipset=/beatsdrdre2014.com/gfwlist +server=/swingerporntube.com/127.0.0.1#5335 +ipset=/swingerporntube.com/gfwlist +server=/garena.vn/127.0.0.1#5335 +ipset=/garena.vn/gfwlist +server=/genshinh.com/127.0.0.1#5335 +ipset=/genshinh.com/gfwlist +server=/trendyporn.com/127.0.0.1#5335 +ipset=/trendyporn.com/gfwlist +server=/pornhdtube.tv/127.0.0.1#5335 +ipset=/pornhdtube.tv/gfwlist +server=/zoom.us/127.0.0.1#5335 +ipset=/zoom.us/gfwlist +server=/moviepost.com/127.0.0.1#5335 +ipset=/moviepost.com/gfwlist +server=/avxde.org/127.0.0.1#5335 +ipset=/avxde.org/gfwlist +server=/milfnut.com/127.0.0.1#5335 +ipset=/milfnut.com/gfwlist +server=/googletagservices.com/127.0.0.1#5335 +ipset=/googletagservices.com/gfwlist +server=/googleacquisitionmigration.com/127.0.0.1#5335 +ipset=/googleacquisitionmigration.com/gfwlist +server=/i.org/127.0.0.1#5335 +ipset=/i.org/gfwlist +server=/hplfmedia.com/127.0.0.1#5335 +ipset=/hplfmedia.com/gfwlist +server=/xbnat.com/127.0.0.1#5335 +ipset=/xbnat.com/gfwlist +server=/nudistsexvideos.com/127.0.0.1#5335 +ipset=/nudistsexvideos.com/gfwlist +server=/starbucks.co.uk/127.0.0.1#5335 +ipset=/starbucks.co.uk/gfwlist +server=/slack-core.com/127.0.0.1#5335 +ipset=/slack-core.com/gfwlist +server=/travelexae.com/127.0.0.1#5335 +ipset=/travelexae.com/gfwlist +server=/crazyxxxworld.com/127.0.0.1#5335 +ipset=/crazyxxxworld.com/gfwlist +server=/hp-invent.com/127.0.0.1#5335 +ipset=/hp-invent.com/gfwlist +server=/w.org/127.0.0.1#5335 +ipset=/w.org/gfwlist +server=/x.org/127.0.0.1#5335 +ipset=/x.org/gfwlist +server=/bs-adreview.com/127.0.0.1#5335 +ipset=/bs-adreview.com/gfwlist +server=/swisssigner.ch/127.0.0.1#5335 +ipset=/swisssigner.ch/gfwlist +server=/wallet.com/127.0.0.1#5335 +ipset=/wallet.com/gfwlist +server=/atos.net/127.0.0.1#5335 +ipset=/atos.net/gfwlist +server=/disney.gr/127.0.0.1#5335 +ipset=/disney.gr/gfwlist +server=/gogoanime.wiki/127.0.0.1#5335 +ipset=/gogoanime.wiki/gfwlist +server=/youtube.com.lb/127.0.0.1#5335 +ipset=/youtube.com.lb/gfwlist +server=/tvnaviweb.jp/127.0.0.1#5335 +ipset=/tvnaviweb.jp/gfwlist +server=/david-laserscanner.com/127.0.0.1#5335 +ipset=/david-laserscanner.com/gfwlist +server=/sweetmlif.net/127.0.0.1#5335 +ipset=/sweetmlif.net/gfwlist +server=/vod-dash-uk-live.akamaized.net/127.0.0.1#5335 +ipset=/vod-dash-uk-live.akamaized.net/gfwlist +server=/reastatic.net/127.0.0.1#5335 +ipset=/reastatic.net/gfwlist +server=/tubemogul.com/127.0.0.1#5335 +ipset=/tubemogul.com/gfwlist +server=/mastercard.com.kw/127.0.0.1#5335 +ipset=/mastercard.com.kw/gfwlist +server=/webex.com.mx/127.0.0.1#5335 +ipset=/webex.com.mx/gfwlist +server=/intel.cl/127.0.0.1#5335 +ipset=/intel.cl/gfwlist +server=/skinstrip.net/127.0.0.1#5335 +ipset=/skinstrip.net/gfwlist +server=/whisolutions.com/127.0.0.1#5335 +ipset=/whisolutions.com/gfwlist +server=/500caocao.com/127.0.0.1#5335 +ipset=/500caocao.com/gfwlist +server=/lysol.com.mx/127.0.0.1#5335 +ipset=/lysol.com.mx/gfwlist +server=/clincha.cn/127.0.0.1#5335 +ipset=/clincha.cn/gfwlist +server=/yahoo.co.th/127.0.0.1#5335 +ipset=/yahoo.co.th/gfwlist +server=/ctitv.com.tw/127.0.0.1#5335 +ipset=/ctitv.com.tw/gfwlist +server=/punishbang.com/127.0.0.1#5335 +ipset=/punishbang.com/gfwlist +server=/bit.ly/127.0.0.1#5335 +ipset=/bit.ly/gfwlist +server=/chedteb.eu/127.0.0.1#5335 +ipset=/chedteb.eu/gfwlist +server=/bwin.com/127.0.0.1#5335 +ipset=/bwin.com/gfwlist +server=/visiontimes.it/127.0.0.1#5335 +ipset=/visiontimes.it/gfwlist +server=/mature-tube.sexy/127.0.0.1#5335 +ipset=/mature-tube.sexy/gfwlist +server=/sourceforge.com/127.0.0.1#5335 +ipset=/sourceforge.com/gfwlist +server=/51dh.site/127.0.0.1#5335 +ipset=/51dh.site/gfwlist +server=/themathsfactor.com/127.0.0.1#5335 +ipset=/themathsfactor.com/gfwlist +server=/bodyfluids-jav.com/127.0.0.1#5335 +ipset=/bodyfluids-jav.com/gfwlist +server=/bestrecipes.com.au/127.0.0.1#5335 +ipset=/bestrecipes.com.au/gfwlist +server=/videosporno.com.br/127.0.0.1#5335 +ipset=/videosporno.com.br/gfwlist +server=/kompoz.com/127.0.0.1#5335 +ipset=/kompoz.com/gfwlist +server=/canon.ba/127.0.0.1#5335 +ipset=/canon.ba/gfwlist +server=/ozodlik.org/127.0.0.1#5335 +ipset=/ozodlik.org/gfwlist +server=/garena.ph/127.0.0.1#5335 +ipset=/garena.ph/gfwlist +server=/blogspot.hr/127.0.0.1#5335 +ipset=/blogspot.hr/gfwlist +server=/tranny.one/127.0.0.1#5335 +ipset=/tranny.one/gfwlist +server=/hentai44.com/127.0.0.1#5335 +ipset=/hentai44.com/gfwlist +server=/ikea.sg/127.0.0.1#5335 +ipset=/ikea.sg/gfwlist +server=/lihkg.com/127.0.0.1#5335 +ipset=/lihkg.com/gfwlist +server=/flash-xxx.com/127.0.0.1#5335 +ipset=/flash-xxx.com/gfwlist +server=/miniso.ge/127.0.0.1#5335 +ipset=/miniso.ge/gfwlist +server=/pearsononlineacademy.com/127.0.0.1#5335 +ipset=/pearsononlineacademy.com/gfwlist +server=/cloudflareclient.com/127.0.0.1#5335 +ipset=/cloudflareclient.com/gfwlist +server=/campuslondon.com/127.0.0.1#5335 +ipset=/campuslondon.com/gfwlist +server=/tryfuckmenow.com/127.0.0.1#5335 +ipset=/tryfuckmenow.com/gfwlist +server=/nesaporn.com/127.0.0.1#5335 +ipset=/nesaporn.com/gfwlist +server=/xnxx2.org/127.0.0.1#5335 +ipset=/xnxx2.org/gfwlist +server=/zenodo.org/127.0.0.1#5335 +ipset=/zenodo.org/gfwlist +server=/lsj2.shop/127.0.0.1#5335 +ipset=/lsj2.shop/gfwlist +server=/ajsjx.com/127.0.0.1#5335 +ipset=/ajsjx.com/gfwlist +server=/fakehub.com/127.0.0.1#5335 +ipset=/fakehub.com/gfwlist +server=/bmw-connecteddrive.bg/127.0.0.1#5335 +ipset=/bmw-connecteddrive.bg/gfwlist +server=/scholar.google.com.my/127.0.0.1#5335 +ipset=/scholar.google.com.my/gfwlist +server=/netflixtechblog.com/127.0.0.1#5335 +ipset=/netflixtechblog.com/gfwlist +server=/dopaminegirl.com/127.0.0.1#5335 +ipset=/dopaminegirl.com/gfwlist +server=/freexxx.win/127.0.0.1#5335 +ipset=/freexxx.win/gfwlist +server=/tdesktop.com/127.0.0.1#5335 +ipset=/tdesktop.com/gfwlist +server=/himalaya.exchange/127.0.0.1#5335 +ipset=/himalaya.exchange/gfwlist +server=/acgfbw.com/127.0.0.1#5335 +ipset=/acgfbw.com/gfwlist +server=/live.eu/127.0.0.1#5335 +ipset=/live.eu/gfwlist +server=/cnbcfm.com/127.0.0.1#5335 +ipset=/cnbcfm.com/gfwlist +server=/playvids.com/127.0.0.1#5335 +ipset=/playvids.com/gfwlist +server=/uninhibitedcomix.com/127.0.0.1#5335 +ipset=/uninhibitedcomix.com/gfwlist +server=/moms-sex-videos.com/127.0.0.1#5335 +ipset=/moms-sex-videos.com/gfwlist +server=/rukoebxx.com/127.0.0.1#5335 +ipset=/rukoebxx.com/gfwlist +server=/msinnovationchallenge.com/127.0.0.1#5335 +ipset=/msinnovationchallenge.com/gfwlist +server=/xnxx-com.cfd/127.0.0.1#5335 +ipset=/xnxx-com.cfd/gfwlist +server=/alibabacloud.com.tw/127.0.0.1#5335 +ipset=/alibabacloud.com.tw/gfwlist +server=/levelsex.com/127.0.0.1#5335 +ipset=/levelsex.com/gfwlist +server=/tantaly.com/127.0.0.1#5335 +ipset=/tantaly.com/gfwlist +server=/nvidia.eu/127.0.0.1#5335 +ipset=/nvidia.eu/gfwlist +server=/z-lib.org/127.0.0.1#5335 +ipset=/z-lib.org/gfwlist +server=/vipbeatsbydre.com/127.0.0.1#5335 +ipset=/vipbeatsbydre.com/gfwlist +server=/dogmovie.net/127.0.0.1#5335 +ipset=/dogmovie.net/gfwlist +server=/dettol.com.my/127.0.0.1#5335 +ipset=/dettol.com.my/gfwlist +server=/teenpornvideo.xxx/127.0.0.1#5335 +ipset=/teenpornvideo.xxx/gfwlist +server=/yomiuri-shimbun.pressreader.com/127.0.0.1#5335 +ipset=/yomiuri-shimbun.pressreader.com/gfwlist +server=/pornhubpremium.com/127.0.0.1#5335 +ipset=/pornhubpremium.com/gfwlist +server=/internationalconnectionsacademy.com/127.0.0.1#5335 +ipset=/internationalconnectionsacademy.com/gfwlist +server=/bigassporn.tv/127.0.0.1#5335 +ipset=/bigassporn.tv/gfwlist +server=/xxxreal.com/127.0.0.1#5335 +ipset=/xxxreal.com/gfwlist +server=/volvotruckcenter.nl/127.0.0.1#5335 +ipset=/volvotruckcenter.nl/gfwlist +server=/bmw-motorrad.com.pe/127.0.0.1#5335 +ipset=/bmw-motorrad.com.pe/gfwlist +server=/free-wap-tube.com/127.0.0.1#5335 +ipset=/free-wap-tube.com/gfwlist +server=/covid19rx.org/127.0.0.1#5335 +ipset=/covid19rx.org/gfwlist +server=/xxxbullet.com/127.0.0.1#5335 +ipset=/xxxbullet.com/gfwlist +server=/nike23.com/127.0.0.1#5335 +ipset=/nike23.com/gfwlist +server=/facxebook.com/127.0.0.1#5335 +ipset=/facxebook.com/gfwlist +server=/yusjb.com/127.0.0.1#5335 +ipset=/yusjb.com/gfwlist +server=/webobjects.net/127.0.0.1#5335 +ipset=/webobjects.net/gfwlist +server=/google.org/127.0.0.1#5335 +ipset=/google.org/gfwlist +server=/disney.my.sentry.io/127.0.0.1#5335 +ipset=/disney.my.sentry.io/gfwlist +server=/instagrampartners.com/127.0.0.1#5335 +ipset=/instagrampartners.com/gfwlist +server=/truyen-hentai.ru/127.0.0.1#5335 +ipset=/truyen-hentai.ru/gfwlist +server=/cumlouder.com/127.0.0.1#5335 +ipset=/cumlouder.com/gfwlist +server=/hentaizilla.com/127.0.0.1#5335 +ipset=/hentaizilla.com/gfwlist +server=/mini.co.il/127.0.0.1#5335 +ipset=/mini.co.il/gfwlist +server=/thothub.ru/127.0.0.1#5335 +ipset=/thothub.ru/gfwlist +server=/diamondgirls.co.uk/127.0.0.1#5335 +ipset=/diamondgirls.co.uk/gfwlist +server=/shitjav.com/127.0.0.1#5335 +ipset=/shitjav.com/gfwlist +server=/dtlgalleryint.cloudapp.net/127.0.0.1#5335 +ipset=/dtlgalleryint.cloudapp.net/gfwlist +server=/darkness-risen.com/127.0.0.1#5335 +ipset=/darkness-risen.com/gfwlist +server=/github.io/127.0.0.1#5335 +ipset=/github.io/gfwlist +server=/adsensecustomsearchads.com/127.0.0.1#5335 +ipset=/adsensecustomsearchads.com/gfwlist +server=/badaas.com/127.0.0.1#5335 +ipset=/badaas.com/gfwlist +server=/ebaycafe.com/127.0.0.1#5335 +ipset=/ebaycafe.com/gfwlist +server=/uun97.com/127.0.0.1#5335 +ipset=/uun97.com/gfwlist +server=/nodesource.com/127.0.0.1#5335 +ipset=/nodesource.com/gfwlist +server=/bmw.co.il/127.0.0.1#5335 +ipset=/bmw.co.il/gfwlist +server=/cloudc.one/127.0.0.1#5335 +ipset=/cloudc.one/gfwlist +server=/voyeurporntapes.com/127.0.0.1#5335 +ipset=/voyeurporntapes.com/gfwlist +server=/mega.io/127.0.0.1#5335 +ipset=/mega.io/gfwlist +server=/psg-int-eastus.cloudapp.net/127.0.0.1#5335 +ipset=/psg-int-eastus.cloudapp.net/gfwlist +server=/webcam-teen.net/127.0.0.1#5335 +ipset=/webcam-teen.net/gfwlist +server=/dcard.cc/127.0.0.1#5335 +ipset=/dcard.cc/gfwlist +server=/youtube.ug/127.0.0.1#5335 +ipset=/youtube.ug/gfwlist +server=/shuziyimin.org/127.0.0.1#5335 +ipset=/shuziyimin.org/gfwlist +server=/islamiccenterofnewlondon.com/127.0.0.1#5335 +ipset=/islamiccenterofnewlondon.com/gfwlist +server=/who.int/127.0.0.1#5335 +ipset=/who.int/gfwlist +server=/shemaletubevideos.com/127.0.0.1#5335 +ipset=/shemaletubevideos.com/gfwlist +server=/incezt.net/127.0.0.1#5335 +ipset=/incezt.net/gfwlist +server=/girlfuckshorse.net/127.0.0.1#5335 +ipset=/girlfuckshorse.net/gfwlist +server=/facebook-login.com/127.0.0.1#5335 +ipset=/facebook-login.com/gfwlist +server=/luckyissue.com/127.0.0.1#5335 +ipset=/luckyissue.com/gfwlist +server=/amerikayidzayn.com/127.0.0.1#5335 +ipset=/amerikayidzayn.com/gfwlist +server=/ipod.cm/127.0.0.1#5335 +ipset=/ipod.cm/gfwlist +server=/sonystoragemedia.co.jp/127.0.0.1#5335 +ipset=/sonystoragemedia.co.jp/gfwlist +server=/blz-contentstack.com/127.0.0.1#5335 +ipset=/blz-contentstack.com/gfwlist +server=/myq2.com/127.0.0.1#5335 +ipset=/myq2.com/gfwlist +server=/fapvid.com/127.0.0.1#5335 +ipset=/fapvid.com/gfwlist +server=/postgresql.org/127.0.0.1#5335 +ipset=/postgresql.org/gfwlist +server=/mytrannycams.com/127.0.0.1#5335 +ipset=/mytrannycams.com/gfwlist +server=/cheapbeatsbydreshop.com/127.0.0.1#5335 +ipset=/cheapbeatsbydreshop.com/gfwlist +server=/bmw-motorrad.nl/127.0.0.1#5335 +ipset=/bmw-motorrad.nl/gfwlist +server=/braveux.com/127.0.0.1#5335 +ipset=/braveux.com/gfwlist +server=/dazndn.com/127.0.0.1#5335 +ipset=/dazndn.com/gfwlist +server=/deepfakeporn.net/127.0.0.1#5335 +ipset=/deepfakeporn.net/gfwlist +server=/thesexbible.com/127.0.0.1#5335 +ipset=/thesexbible.com/gfwlist +server=/jizzhut.com/127.0.0.1#5335 +ipset=/jizzhut.com/gfwlist +server=/techhub.ms/127.0.0.1#5335 +ipset=/techhub.ms/gfwlist +server=/vgg8.com/127.0.0.1#5335 +ipset=/vgg8.com/gfwlist +server=/ccna5.net/127.0.0.1#5335 +ipset=/ccna5.net/gfwlist +server=/canon.ru/127.0.0.1#5335 +ipset=/canon.ru/gfwlist +server=/huashundg.com/127.0.0.1#5335 +ipset=/huashundg.com/gfwlist +server=/monsterbeatsbydre-nz.com/127.0.0.1#5335 +ipset=/monsterbeatsbydre-nz.com/gfwlist +server=/ohpornocasero.com/127.0.0.1#5335 +ipset=/ohpornocasero.com/gfwlist +server=/porncomics.com/127.0.0.1#5335 +ipset=/porncomics.com/gfwlist +server=/visa.com.sv/127.0.0.1#5335 +ipset=/visa.com.sv/gfwlist +server=/bmw-group.com/127.0.0.1#5335 +ipset=/bmw-group.com/gfwlist +server=/pornxs.com/127.0.0.1#5335 +ipset=/pornxs.com/gfwlist +server=/youx.xxx/127.0.0.1#5335 +ipset=/youx.xxx/gfwlist +server=/compose-spec.io/127.0.0.1#5335 +ipset=/compose-spec.io/gfwlist +server=/radiomango.fm/127.0.0.1#5335 +ipset=/radiomango.fm/gfwlist +server=/scat-shop.net/127.0.0.1#5335 +ipset=/scat-shop.net/gfwlist +server=/npmjs.org/127.0.0.1#5335 +ipset=/npmjs.org/gfwlist +server=/gdansk-amazon.com/127.0.0.1#5335 +ipset=/gdansk-amazon.com/gfwlist +server=/hyperdreams.com/127.0.0.1#5335 +ipset=/hyperdreams.com/gfwlist +server=/fastly-terrarium.com/127.0.0.1#5335 +ipset=/fastly-terrarium.com/gfwlist +server=/adobehiddentreasures.com/127.0.0.1#5335 +ipset=/adobehiddentreasures.com/gfwlist +server=/appleid.hamburg/127.0.0.1#5335 +ipset=/appleid.hamburg/gfwlist +server=/comsoc.org/127.0.0.1#5335 +ipset=/comsoc.org/gfwlist +server=/nudography.com/127.0.0.1#5335 +ipset=/nudography.com/gfwlist +server=/mastercard.com.pe/127.0.0.1#5335 +ipset=/mastercard.com.pe/gfwlist +server=/nikeairhuarache.com/127.0.0.1#5335 +ipset=/nikeairhuarache.com/gfwlist +server=/chwr7s8u.com/127.0.0.1#5335 +ipset=/chwr7s8u.com/gfwlist +server=/cartoonsexfantazy.com/127.0.0.1#5335 +ipset=/cartoonsexfantazy.com/gfwlist +server=/road-crew.com/127.0.0.1#5335 +ipset=/road-crew.com/gfwlist +server=/ieeedeis.org/127.0.0.1#5335 +ipset=/ieeedeis.org/gfwlist +server=/rbmavericks.com/127.0.0.1#5335 +ipset=/rbmavericks.com/gfwlist +server=/senpaiheat.com/127.0.0.1#5335 +ipset=/senpaiheat.com/gfwlist +server=/nflhotsalejerseys.com/127.0.0.1#5335 +ipset=/nflhotsalejerseys.com/gfwlist +server=/codethemicrobit.com/127.0.0.1#5335 +ipset=/codethemicrobit.com/gfwlist +server=/durex.lv/127.0.0.1#5335 +ipset=/durex.lv/gfwlist +server=/wp-themes.com/127.0.0.1#5335 +ipset=/wp-themes.com/gfwlist +server=/homealonemilfs.com/127.0.0.1#5335 +ipset=/homealonemilfs.com/gfwlist +server=/wikiquote.org/127.0.0.1#5335 +ipset=/wikiquote.org/gfwlist +server=/110xnxx.com/127.0.0.1#5335 +ipset=/110xnxx.com/gfwlist +server=/xgaytube.com/127.0.0.1#5335 +ipset=/xgaytube.com/gfwlist +server=/archiveofourown.net/127.0.0.1#5335 +ipset=/archiveofourown.net/gfwlist +server=/volvotrucks.bg/127.0.0.1#5335 +ipset=/volvotrucks.bg/gfwlist +server=/studywatchbyverily.org/127.0.0.1#5335 +ipset=/studywatchbyverily.org/gfwlist +server=/svobodnaevropa.bg/127.0.0.1#5335 +ipset=/svobodnaevropa.bg/gfwlist +server=/metrotoons.com/127.0.0.1#5335 +ipset=/metrotoons.com/gfwlist +server=/amourangels.com/127.0.0.1#5335 +ipset=/amourangels.com/gfwlist +server=/directvsports.com/127.0.0.1#5335 +ipset=/directvsports.com/gfwlist +server=/niconico.com/127.0.0.1#5335 +ipset=/niconico.com/gfwlist +server=/comdotgame.com/127.0.0.1#5335 +ipset=/comdotgame.com/gfwlist +server=/iknowthatgirl.com/127.0.0.1#5335 +ipset=/iknowthatgirl.com/gfwlist +server=/headphones-cool.com/127.0.0.1#5335 +ipset=/headphones-cool.com/gfwlist +server=/office.net/127.0.0.1#5335 +ipset=/office.net/gfwlist +server=/paypal-notice.com/127.0.0.1#5335 +ipset=/paypal-notice.com/gfwlist +server=/foxsoccerplus.com/127.0.0.1#5335 +ipset=/foxsoccerplus.com/gfwlist +server=/cna.com.tw/127.0.0.1#5335 +ipset=/cna.com.tw/gfwlist +server=/aboutamazon.fr/127.0.0.1#5335 +ipset=/aboutamazon.fr/gfwlist +server=/discord-activities.com/127.0.0.1#5335 +ipset=/discord-activities.com/gfwlist +server=/i-o-u.info/127.0.0.1#5335 +ipset=/i-o-u.info/gfwlist +server=/slideshare.net/127.0.0.1#5335 +ipset=/slideshare.net/gfwlist +server=/nintendo.co.kr/127.0.0.1#5335 +ipset=/nintendo.co.kr/gfwlist +server=/canon.ro/127.0.0.1#5335 +ipset=/canon.ro/gfwlist +server=/intimateinvasions.com/127.0.0.1#5335 +ipset=/intimateinvasions.com/gfwlist +server=/visafintechfasttrack.com/127.0.0.1#5335 +ipset=/visafintechfasttrack.com/gfwlist +server=/svsgames.org/127.0.0.1#5335 +ipset=/svsgames.org/gfwlist +server=/hpconnected.com/127.0.0.1#5335 +ipset=/hpconnected.com/gfwlist +server=/bmw.lu/127.0.0.1#5335 +ipset=/bmw.lu/gfwlist +server=/xn--gtvz22d.xn--hxt814e/127.0.0.1#5335 +ipset=/xn--gtvz22d.xn--hxt814e/gfwlist +server=/pornov1080.name/127.0.0.1#5335 +ipset=/pornov1080.name/gfwlist +server=/hotcuckoldwife.com/127.0.0.1#5335 +ipset=/hotcuckoldwife.com/gfwlist +server=/smplace.com/127.0.0.1#5335 +ipset=/smplace.com/gfwlist +server=/moefuns.co/127.0.0.1#5335 +ipset=/moefuns.co/gfwlist +server=/deadspacegame.com/127.0.0.1#5335 +ipset=/deadspacegame.com/gfwlist +server=/pornogram.xxx/127.0.0.1#5335 +ipset=/pornogram.xxx/gfwlist +server=/beatsbydreireland-sales.com/127.0.0.1#5335 +ipset=/beatsbydreireland-sales.com/gfwlist +server=/waranlov.com/127.0.0.1#5335 +ipset=/waranlov.com/gfwlist +server=/glamourtits.com/127.0.0.1#5335 +ipset=/glamourtits.com/gfwlist +server=/personaltrainermath.com/127.0.0.1#5335 +ipset=/personaltrainermath.com/gfwlist +server=/boswp.com/127.0.0.1#5335 +ipset=/boswp.com/gfwlist +server=/harvard.xxx/127.0.0.1#5335 +ipset=/harvard.xxx/gfwlist +server=/naughtymachinima.com/127.0.0.1#5335 +ipset=/naughtymachinima.com/gfwlist +server=/chinaclothesstore.com/127.0.0.1#5335 +ipset=/chinaclothesstore.com/gfwlist +server=/av-baron.com/127.0.0.1#5335 +ipset=/av-baron.com/gfwlist +server=/economist.com/127.0.0.1#5335 +ipset=/economist.com/gfwlist +server=/amdigital.co.uk/127.0.0.1#5335 +ipset=/amdigital.co.uk/gfwlist +server=/facebpook.com/127.0.0.1#5335 +ipset=/facebpook.com/gfwlist +server=/lpsg.com/127.0.0.1#5335 +ipset=/lpsg.com/gfwlist +server=/dicela.net/127.0.0.1#5335 +ipset=/dicela.net/gfwlist +server=/stockagainstphotography.com/127.0.0.1#5335 +ipset=/stockagainstphotography.com/gfwlist +server=/wto.org/127.0.0.1#5335 +ipset=/wto.org/gfwlist +server=/hashicorp.com/127.0.0.1#5335 +ipset=/hashicorp.com/gfwlist +server=/hp-ww.com/127.0.0.1#5335 +ipset=/hp-ww.com/gfwlist +server=/bmwdcsnet.net/127.0.0.1#5335 +ipset=/bmwdcsnet.net/gfwlist +server=/bmw-connecteddrive.pl/127.0.0.1#5335 +ipset=/bmw-connecteddrive.pl/gfwlist +server=/applestore.com.bn/127.0.0.1#5335 +ipset=/applestore.com.bn/gfwlist +server=/intel.sa/127.0.0.1#5335 +ipset=/intel.sa/gfwlist +server=/visa.com.dm/127.0.0.1#5335 +ipset=/visa.com.dm/gfwlist +server=/facebookloginhelp.net/127.0.0.1#5335 +ipset=/facebookloginhelp.net/gfwlist +server=/enfabebe.com.do/127.0.0.1#5335 +ipset=/enfabebe.com.do/gfwlist +server=/vjav.com/127.0.0.1#5335 +ipset=/vjav.com/gfwlist +server=/akamaihd.net/127.0.0.1#5335 +ipset=/akamaihd.net/gfwlist +server=/porngames.games/127.0.0.1#5335 +ipset=/porngames.games/gfwlist +server=/veet.com.mx/127.0.0.1#5335 +ipset=/veet.com.mx/gfwlist +server=/sexy-photos.net/127.0.0.1#5335 +ipset=/sexy-photos.net/gfwlist +server=/wantblogger.com/127.0.0.1#5335 +ipset=/wantblogger.com/gfwlist +server=/vkuservideo.net/127.0.0.1#5335 +ipset=/vkuservideo.net/gfwlist +server=/bmw.com.au/127.0.0.1#5335 +ipset=/bmw.com.au/gfwlist +server=/oxfordscholarlyeditions.com/127.0.0.1#5335 +ipset=/oxfordscholarlyeditions.com/gfwlist +server=/pornkind.net/127.0.0.1#5335 +ipset=/pornkind.net/gfwlist +server=/nikkei-cnbc.co.jp/127.0.0.1#5335 +ipset=/nikkei-cnbc.co.jp/gfwlist +server=/ebaytradingassistant.com/127.0.0.1#5335 +ipset=/ebaytradingassistant.com/gfwlist +server=/porndr.com/127.0.0.1#5335 +ipset=/porndr.com/gfwlist +server=/debug.com/127.0.0.1#5335 +ipset=/debug.com/gfwlist +server=/stin31.ru/127.0.0.1#5335 +ipset=/stin31.ru/gfwlist +server=/hpstore.com/127.0.0.1#5335 +ipset=/hpstore.com/gfwlist +server=/nxtdig.com.hk/127.0.0.1#5335 +ipset=/nxtdig.com.hk/gfwlist +server=/watchmygf.me/127.0.0.1#5335 +ipset=/watchmygf.me/gfwlist +server=/facebomok.com/127.0.0.1#5335 +ipset=/facebomok.com/gfwlist +server=/shoping.com/127.0.0.1#5335 +ipset=/shoping.com/gfwlist +server=/scholar.google.bg/127.0.0.1#5335 +ipset=/scholar.google.bg/gfwlist +server=/hotmail.co/127.0.0.1#5335 +ipset=/hotmail.co/gfwlist +server=/mini.com.do/127.0.0.1#5335 +ipset=/mini.com.do/gfwlist +server=/sonypicturestelevisiongames.com/127.0.0.1#5335 +ipset=/sonypicturestelevisiongames.com/gfwlist +server=/netvideogirls.com/127.0.0.1#5335 +ipset=/netvideogirls.com/gfwlist +server=/innovations-i.com/127.0.0.1#5335 +ipset=/innovations-i.com/gfwlist +server=/bitfinex.com/127.0.0.1#5335 +ipset=/bitfinex.com/gfwlist +server=/godaddy.com/127.0.0.1#5335 +ipset=/godaddy.com/gfwlist +server=/verisign.sg/127.0.0.1#5335 +ipset=/verisign.sg/gfwlist +server=/3dsexvilla.com/127.0.0.1#5335 +ipset=/3dsexvilla.com/gfwlist +server=/static.fun/127.0.0.1#5335 +ipset=/static.fun/gfwlist +server=/bmw-connecteddrive.se/127.0.0.1#5335 +ipset=/bmw-connecteddrive.se/gfwlist +server=/ssl-lvlt.cdn.ea.com/127.0.0.1#5335 +ipset=/ssl-lvlt.cdn.ea.com/gfwlist +server=/beatsneon.com/127.0.0.1#5335 +ipset=/beatsneon.com/gfwlist +server=/savvyshopper.net.au/127.0.0.1#5335 +ipset=/savvyshopper.net.au/gfwlist +server=/muchohentai.com/127.0.0.1#5335 +ipset=/muchohentai.com/gfwlist +server=/freechatnow.com/127.0.0.1#5335 +ipset=/freechatnow.com/gfwlist +server=/binancezh.link/127.0.0.1#5335 +ipset=/binancezh.link/gfwlist +server=/fap18.net/127.0.0.1#5335 +ipset=/fap18.net/gfwlist +server=/web.app/127.0.0.1#5335 +ipset=/web.app/gfwlist +server=/canon.sk/127.0.0.1#5335 +ipset=/canon.sk/gfwlist +server=/cooliphonecasesstore.com/127.0.0.1#5335 +ipset=/cooliphonecasesstore.com/gfwlist +server=/xvedo.net/127.0.0.1#5335 +ipset=/xvedo.net/gfwlist +server=/faphouse.com/127.0.0.1#5335 +ipset=/faphouse.com/gfwlist +server=/businessinsider.nl/127.0.0.1#5335 +ipset=/businessinsider.nl/gfwlist +server=/mini-connected.de/127.0.0.1#5335 +ipset=/mini-connected.de/gfwlist +server=/johren.games/127.0.0.1#5335 +ipset=/johren.games/gfwlist +server=/gouri.xyz/127.0.0.1#5335 +ipset=/gouri.xyz/gfwlist +server=/lantern.io/127.0.0.1#5335 +ipset=/lantern.io/gfwlist +server=/cnbc.com/127.0.0.1#5335 +ipset=/cnbc.com/gfwlist +server=/porner.tv/127.0.0.1#5335 +ipset=/porner.tv/gfwlist +server=/pixiv.co.jp/127.0.0.1#5335 +ipset=/pixiv.co.jp/gfwlist +server=/nurofen.cz/127.0.0.1#5335 +ipset=/nurofen.cz/gfwlist +server=/harpercollinschristian.com/127.0.0.1#5335 +ipset=/harpercollinschristian.com/gfwlist +server=/ctfassets.net/127.0.0.1#5335 +ipset=/ctfassets.net/gfwlist +server=/cloupia.net/127.0.0.1#5335 +ipset=/cloupia.net/gfwlist +server=/google.com.kw/127.0.0.1#5335 +ipset=/google.com.kw/gfwlist +server=/yaeby.info/127.0.0.1#5335 +ipset=/yaeby.info/gfwlist +server=/glasamerike.net/127.0.0.1#5335 +ipset=/glasamerike.net/gfwlist +server=/pearsoninstitute.ac.za/127.0.0.1#5335 +ipset=/pearsoninstitute.ac.za/gfwlist +server=/thesimssocial.com/127.0.0.1#5335 +ipset=/thesimssocial.com/gfwlist +server=/minimotorsport.com/127.0.0.1#5335 +ipset=/minimotorsport.com/gfwlist +server=/travelex.be/127.0.0.1#5335 +ipset=/travelex.be/gfwlist +server=/viewgals.com/127.0.0.1#5335 +ipset=/viewgals.com/gfwlist +server=/falundafa.org/127.0.0.1#5335 +ipset=/falundafa.org/gfwlist +server=/wipower.com/127.0.0.1#5335 +ipset=/wipower.com/gfwlist +server=/disneynow.com/127.0.0.1#5335 +ipset=/disneynow.com/gfwlist +server=/findtubes.com/127.0.0.1#5335 +ipset=/findtubes.com/gfwlist +server=/webex.com/127.0.0.1#5335 +ipset=/webex.com/gfwlist +server=/chicagolandbmw.com/127.0.0.1#5335 +ipset=/chicagolandbmw.com/gfwlist +server=/wnacg.org/127.0.0.1#5335 +ipset=/wnacg.org/gfwlist +server=/bmw.ba/127.0.0.1#5335 +ipset=/bmw.ba/gfwlist +server=/brightcovecdn.com/127.0.0.1#5335 +ipset=/brightcovecdn.com/gfwlist +server=/mortein.com.ng/127.0.0.1#5335 +ipset=/mortein.com.ng/gfwlist +server=/disneyenconcert.com/127.0.0.1#5335 +ipset=/disneyenconcert.com/gfwlist +server=/llnw.net/127.0.0.1#5335 +ipset=/llnw.net/gfwlist +server=/bestbuyrewardzone.ca/127.0.0.1#5335 +ipset=/bestbuyrewardzone.ca/gfwlist +server=/xxx-porn.info/127.0.0.1#5335 +ipset=/xxx-porn.info/gfwlist +server=/careersatfb.com/127.0.0.1#5335 +ipset=/careersatfb.com/gfwlist +server=/fox47.com/127.0.0.1#5335 +ipset=/fox47.com/gfwlist +server=/hpceo.com/127.0.0.1#5335 +ipset=/hpceo.com/gfwlist +server=/faceboox.com/127.0.0.1#5335 +ipset=/faceboox.com/gfwlist +server=/votolia.com/127.0.0.1#5335 +ipset=/votolia.com/gfwlist +server=/bmw-connecteddrive.be/127.0.0.1#5335 +ipset=/bmw-connecteddrive.be/gfwlist +server=/amateur-porn-clips.com/127.0.0.1#5335 +ipset=/amateur-porn-clips.com/gfwlist +server=/sni1dcb6gl.wpc.edgecastcdn.net/127.0.0.1#5335 +ipset=/sni1dcb6gl.wpc.edgecastcdn.net/gfwlist +server=/cotolia.com/127.0.0.1#5335 +ipset=/cotolia.com/gfwlist +server=/whatsapp.cc/127.0.0.1#5335 +ipset=/whatsapp.cc/gfwlist +server=/fotolia.com/127.0.0.1#5335 +ipset=/fotolia.com/gfwlist +server=/megapornfreehd.com/127.0.0.1#5335 +ipset=/megapornfreehd.com/gfwlist +server=/vkuservideo.com/127.0.0.1#5335 +ipset=/vkuservideo.com/gfwlist +server=/mit.edu/127.0.0.1#5335 +ipset=/mit.edu/gfwlist +server=/myfbfans.com/127.0.0.1#5335 +ipset=/myfbfans.com/gfwlist +server=/handjobtube4free.com/127.0.0.1#5335 +ipset=/handjobtube4free.com/gfwlist +server=/nikefootballjersey.com/127.0.0.1#5335 +ipset=/nikefootballjersey.com/gfwlist +server=/galleryarchives.com/127.0.0.1#5335 +ipset=/galleryarchives.com/gfwlist +server=/mytimesplus.co.uk/127.0.0.1#5335 +ipset=/mytimesplus.co.uk/gfwlist +server=/v8.dev/127.0.0.1#5335 +ipset=/v8.dev/gfwlist +server=/alphabet.jp/127.0.0.1#5335 +ipset=/alphabet.jp/gfwlist +server=/attssl.com/127.0.0.1#5335 +ipset=/attssl.com/gfwlist +server=/sexmex.xxx/127.0.0.1#5335 +ipset=/sexmex.xxx/gfwlist +server=/paypal-integration.com/127.0.0.1#5335 +ipset=/paypal-integration.com/gfwlist +server=/pccwsolutions.com/127.0.0.1#5335 +ipset=/pccwsolutions.com/gfwlist +server=/yourflashporn.com/127.0.0.1#5335 +ipset=/yourflashporn.com/gfwlist +server=/fox32.com/127.0.0.1#5335 +ipset=/fox32.com/gfwlist +server=/dowjones.io/127.0.0.1#5335 +ipset=/dowjones.io/gfwlist +server=/faceobk.com/127.0.0.1#5335 +ipset=/faceobk.com/gfwlist +server=/vanish.nl/127.0.0.1#5335 +ipset=/vanish.nl/gfwlist +server=/adx.promo/127.0.0.1#5335 +ipset=/adx.promo/gfwlist +server=/disney.co.jp/127.0.0.1#5335 +ipset=/disney.co.jp/gfwlist +server=/1monsterbeatsbydreus.com/127.0.0.1#5335 +ipset=/1monsterbeatsbydreus.com/gfwlist +server=/ebayopensource.net/127.0.0.1#5335 +ipset=/ebayopensource.net/gfwlist +server=/alphera.com/127.0.0.1#5335 +ipset=/alphera.com/gfwlist +server=/line-beta.me/127.0.0.1#5335 +ipset=/line-beta.me/gfwlist +server=/hbogoasia.id/127.0.0.1#5335 +ipset=/hbogoasia.id/gfwlist +server=/linux.org/127.0.0.1#5335 +ipset=/linux.org/gfwlist +server=/thefappening.pro/127.0.0.1#5335 +ipset=/thefappening.pro/gfwlist +server=/localpresshk.com/127.0.0.1#5335 +ipset=/localpresshk.com/gfwlist +server=/regex101.com/127.0.0.1#5335 +ipset=/regex101.com/gfwlist +server=/snapvolumes.com/127.0.0.1#5335 +ipset=/snapvolumes.com/gfwlist +server=/sarennasworld.com/127.0.0.1#5335 +ipset=/sarennasworld.com/gfwlist +server=/google.cl/127.0.0.1#5335 +ipset=/google.cl/gfwlist +server=/openstreetmap.com/127.0.0.1#5335 +ipset=/openstreetmap.com/gfwlist +server=/heads4-ak-spotify-com.akamaized.net/127.0.0.1#5335 +ipset=/heads4-ak-spotify-com.akamaized.net/gfwlist +server=/freehulu.com/127.0.0.1#5335 +ipset=/freehulu.com/gfwlist +server=/shinhangmc.com/127.0.0.1#5335 +ipset=/shinhangmc.com/gfwlist +server=/beatsbydre.jp/127.0.0.1#5335 +ipset=/beatsbydre.jp/gfwlist +server=/swpr.livedoor.blog/127.0.0.1#5335 +ipset=/swpr.livedoor.blog/gfwlist +server=/amateurthreesomeporn.com/127.0.0.1#5335 +ipset=/amateurthreesomeporn.com/gfwlist +server=/whatsapp.tv/127.0.0.1#5335 +ipset=/whatsapp.tv/gfwlist +server=/yahoo.co.mz/127.0.0.1#5335 +ipset=/yahoo.co.mz/gfwlist +server=/acpica.com/127.0.0.1#5335 +ipset=/acpica.com/gfwlist +server=/xshr.online/127.0.0.1#5335 +ipset=/xshr.online/gfwlist +server=/scifisex.net/127.0.0.1#5335 +ipset=/scifisex.net/gfwlist +server=/nudeteenladies.com/127.0.0.1#5335 +ipset=/nudeteenladies.com/gfwlist +server=/microsoft.by/127.0.0.1#5335 +ipset=/microsoft.by/gfwlist +server=/mingw.org/127.0.0.1#5335 +ipset=/mingw.org/gfwlist +server=/skysports.fr/127.0.0.1#5335 +ipset=/skysports.fr/gfwlist +server=/riotgames.info/127.0.0.1#5335 +ipset=/riotgames.info/gfwlist +server=/ipadair.hk/127.0.0.1#5335 +ipset=/ipadair.hk/gfwlist +server=/xnxxpornvid.com/127.0.0.1#5335 +ipset=/xnxxpornvid.com/gfwlist +server=/web.dev/127.0.0.1#5335 +ipset=/web.dev/gfwlist +server=/webmoneyinfo.com/127.0.0.1#5335 +ipset=/webmoneyinfo.com/gfwlist +server=/amazonalexavoxcon.com/127.0.0.1#5335 +ipset=/amazonalexavoxcon.com/gfwlist +server=/appe-store.com/127.0.0.1#5335 +ipset=/appe-store.com/gfwlist +server=/bvfce6wz.xyz/127.0.0.1#5335 +ipset=/bvfce6wz.xyz/gfwlist +server=/bmwclassic.com/127.0.0.1#5335 +ipset=/bmwclassic.com/gfwlist +server=/theguardiandns.com/127.0.0.1#5335 +ipset=/theguardiandns.com/gfwlist +server=/eduplus.hk/127.0.0.1#5335 +ipset=/eduplus.hk/gfwlist +server=/manurefetish.com/127.0.0.1#5335 +ipset=/manurefetish.com/gfwlist +server=/pinterest.nz/127.0.0.1#5335 +ipset=/pinterest.nz/gfwlist +server=/wldfnjh.com/127.0.0.1#5335 +ipset=/wldfnjh.com/gfwlist +server=/bmw-motorrad.gt/127.0.0.1#5335 +ipset=/bmw-motorrad.gt/gfwlist +server=/visa.com.sg/127.0.0.1#5335 +ipset=/visa.com.sg/gfwlist +server=/multicurrencycashpassport.com/127.0.0.1#5335 +ipset=/multicurrencycashpassport.com/gfwlist +server=/travelex.co.in/127.0.0.1#5335 +ipset=/travelex.co.in/gfwlist +server=/leakxxx.com/127.0.0.1#5335 +ipset=/leakxxx.com/gfwlist +server=/youtube.qa/127.0.0.1#5335 +ipset=/youtube.qa/gfwlist +server=/pinterest.com.pe/127.0.0.1#5335 +ipset=/pinterest.com.pe/gfwlist +server=/respawnbyrazer.com/127.0.0.1#5335 +ipset=/respawnbyrazer.com/gfwlist +server=/quip.com/127.0.0.1#5335 +ipset=/quip.com/gfwlist +server=/mepn.com/127.0.0.1#5335 +ipset=/mepn.com/gfwlist +server=/go.dev/127.0.0.1#5335 +ipset=/go.dev/gfwlist +server=/thestandnews.com/127.0.0.1#5335 +ipset=/thestandnews.com/gfwlist +server=/perfectkickz.net/127.0.0.1#5335 +ipset=/perfectkickz.net/gfwlist +server=/beatswirelesscheap.com/127.0.0.1#5335 +ipset=/beatswirelesscheap.com/gfwlist +server=/huluasks.com/127.0.0.1#5335 +ipset=/huluasks.com/gfwlist +server=/babushky.club/127.0.0.1#5335 +ipset=/babushky.club/gfwlist +server=/rust-lang.org/127.0.0.1#5335 +ipset=/rust-lang.org/gfwlist +server=/facebookfacebook.com/127.0.0.1#5335 +ipset=/facebookfacebook.com/gfwlist +server=/apple.cl/127.0.0.1#5335 +ipset=/apple.cl/gfwlist +server=/dynacw.com.tw/127.0.0.1#5335 +ipset=/dynacw.com.tw/gfwlist +server=/canon.uz/127.0.0.1#5335 +ipset=/canon.uz/gfwlist +server=/bbestmall.com/127.0.0.1#5335 +ipset=/bbestmall.com/gfwlist +server=/tegrazone.jp/127.0.0.1#5335 +ipset=/tegrazone.jp/gfwlist +server=/51luoli.info/127.0.0.1#5335 +ipset=/51luoli.info/gfwlist +server=/bmw-lebanon.com/127.0.0.1#5335 +ipset=/bmw-lebanon.com/gfwlist +server=/pcloud.tw/127.0.0.1#5335 +ipset=/pcloud.tw/gfwlist +server=/jokerlu1.cc/127.0.0.1#5335 +ipset=/jokerlu1.cc/gfwlist +server=/audio4-ak-spotify-com.akamaized.net/127.0.0.1#5335 +ipset=/audio4-ak-spotify-com.akamaized.net/gfwlist +server=/beatsbydreforsalesonline.com/127.0.0.1#5335 +ipset=/beatsbydreforsalesonline.com/gfwlist +server=/vrpornranked.com/127.0.0.1#5335 +ipset=/vrpornranked.com/gfwlist +server=/mini.jp/127.0.0.1#5335 +ipset=/mini.jp/gfwlist +server=/microsoftreactor.info/127.0.0.1#5335 +ipset=/microsoftreactor.info/gfwlist +server=/nikepioneer.com/127.0.0.1#5335 +ipset=/nikepioneer.com/gfwlist +server=/mini.com.tw/127.0.0.1#5335 +ipset=/mini.com.tw/gfwlist +server=/applepencil.net/127.0.0.1#5335 +ipset=/applepencil.net/gfwlist +server=/vagrantup.com/127.0.0.1#5335 +ipset=/vagrantup.com/gfwlist +server=/intelsecurity.com/127.0.0.1#5335 +ipset=/intelsecurity.com/gfwlist +server=/angelbeats.jp/127.0.0.1#5335 +ipset=/angelbeats.jp/gfwlist +server=/okaapps.com/127.0.0.1#5335 +ipset=/okaapps.com/gfwlist +server=/heraldsun.com.au/127.0.0.1#5335 +ipset=/heraldsun.com.au/gfwlist +server=/bustydanniashe.com/127.0.0.1#5335 +ipset=/bustydanniashe.com/gfwlist +server=/mujikorea.net/127.0.0.1#5335 +ipset=/mujikorea.net/gfwlist +server=/wogx.com/127.0.0.1#5335 +ipset=/wogx.com/gfwlist +server=/streamporn.pw/127.0.0.1#5335 +ipset=/streamporn.pw/gfwlist +server=/fapdude.com/127.0.0.1#5335 +ipset=/fapdude.com/gfwlist +server=/fbboostyourbusiness.com/127.0.0.1#5335 +ipset=/fbboostyourbusiness.com/gfwlist +server=/codeish.co/127.0.0.1#5335 +ipset=/codeish.co/gfwlist +server=/patentgold.net/127.0.0.1#5335 +ipset=/patentgold.net/gfwlist +server=/uun87.com/127.0.0.1#5335 +ipset=/uun87.com/gfwlist +server=/kyodonews.net/127.0.0.1#5335 +ipset=/kyodonews.net/gfwlist +server=/intagram.com/127.0.0.1#5335 +ipset=/intagram.com/gfwlist +server=/minihk.com/127.0.0.1#5335 +ipset=/minihk.com/gfwlist +server=/contentful.com/127.0.0.1#5335 +ipset=/contentful.com/gfwlist +server=/gaybubble.com/127.0.0.1#5335 +ipset=/gaybubble.com/gfwlist +server=/dnaindia.com/127.0.0.1#5335 +ipset=/dnaindia.com/gfwlist +server=/csis-prod.s3.amazonaws.com/127.0.0.1#5335 +ipset=/csis-prod.s3.amazonaws.com/gfwlist +server=/steamvideo-a.akamaihd.net/127.0.0.1#5335 +ipset=/steamvideo-a.akamaihd.net/gfwlist +server=/hdb1.app/127.0.0.1#5335 +ipset=/hdb1.app/gfwlist +server=/plug.game/127.0.0.1#5335 +ipset=/plug.game/gfwlist +server=/chinaeconomicreview.com/127.0.0.1#5335 +ipset=/chinaeconomicreview.com/gfwlist +server=/vercel.live/127.0.0.1#5335 +ipset=/vercel.live/gfwlist +server=/theintelstore.com/127.0.0.1#5335 +ipset=/theintelstore.com/gfwlist +server=/fastlylb.net/127.0.0.1#5335 +ipset=/fastlylb.net/gfwlist +server=/lenkino.xxx/127.0.0.1#5335 +ipset=/lenkino.xxx/gfwlist +server=/sankei-ad.net/127.0.0.1#5335 +ipset=/sankei-ad.net/gfwlist +server=/fuskator.com/127.0.0.1#5335 +ipset=/fuskator.com/gfwlist +server=/monsterbeatscasques.com/127.0.0.1#5335 +ipset=/monsterbeatscasques.com/gfwlist +server=/paypalhere.info/127.0.0.1#5335 +ipset=/paypalhere.info/gfwlist +server=/attvoip.com/127.0.0.1#5335 +ipset=/attvoip.com/gfwlist +server=/intel.ee/127.0.0.1#5335 +ipset=/intel.ee/gfwlist +server=/verisign.ch/127.0.0.1#5335 +ipset=/verisign.ch/gfwlist +server=/jmcomic2.moe/127.0.0.1#5335 +ipset=/jmcomic2.moe/gfwlist +server=/reut.rs/127.0.0.1#5335 +ipset=/reut.rs/gfwlist +server=/myfreeporngames.com/127.0.0.1#5335 +ipset=/myfreeporngames.com/gfwlist +server=/makesenseofdata.com/127.0.0.1#5335 +ipset=/makesenseofdata.com/gfwlist +server=/letsjerk.cc/127.0.0.1#5335 +ipset=/letsjerk.cc/gfwlist +server=/svscomics.asia/127.0.0.1#5335 +ipset=/svscomics.asia/gfwlist +server=/mini.se/127.0.0.1#5335 +ipset=/mini.se/gfwlist +server=/ikea.com.om/127.0.0.1#5335 +ipset=/ikea.com.om/gfwlist +server=/offresspecialesbmw.ca/127.0.0.1#5335 +ipset=/offresspecialesbmw.ca/gfwlist +server=/ietf.org/127.0.0.1#5335 +ipset=/ietf.org/gfwlist +server=/ebay.com.mt/127.0.0.1#5335 +ipset=/ebay.com.mt/gfwlist +server=/katestube.com/127.0.0.1#5335 +ipset=/katestube.com/gfwlist +server=/yahoosandbox.com/127.0.0.1#5335 +ipset=/yahoosandbox.com/gfwlist +server=/spacely.com.au/127.0.0.1#5335 +ipset=/spacely.com.au/gfwlist +server=/assistirhentai.com/127.0.0.1#5335 +ipset=/assistirhentai.com/gfwlist +server=/bmw-motorrad.ee/127.0.0.1#5335 +ipset=/bmw-motorrad.ee/gfwlist +server=/attwirelessinternet.com/127.0.0.1#5335 +ipset=/attwirelessinternet.com/gfwlist +server=/gazounabi.com/127.0.0.1#5335 +ipset=/gazounabi.com/gfwlist +server=/jerk-porn.com/127.0.0.1#5335 +ipset=/jerk-porn.com/gfwlist +server=/fakku.net/127.0.0.1#5335 +ipset=/fakku.net/gfwlist +server=/tkb008.xyz/127.0.0.1#5335 +ipset=/tkb008.xyz/gfwlist +server=/starbucks.fr/127.0.0.1#5335 +ipset=/starbucks.fr/gfwlist +server=/minecraftshop.com/127.0.0.1#5335 +ipset=/minecraftshop.com/gfwlist +server=/porngo.tube/127.0.0.1#5335 +ipset=/porngo.tube/gfwlist +server=/wetpussygames.com/127.0.0.1#5335 +ipset=/wetpussygames.com/gfwlist +server=/facebood.com/127.0.0.1#5335 +ipset=/facebood.com/gfwlist +server=/ntdtv.ru/127.0.0.1#5335 +ipset=/ntdtv.ru/gfwlist +server=/bmwarchiv.de/127.0.0.1#5335 +ipset=/bmwarchiv.de/gfwlist +server=/visabg.com/127.0.0.1#5335 +ipset=/visabg.com/gfwlist +server=/feceboox.com/127.0.0.1#5335 +ipset=/feceboox.com/gfwlist +server=/iphone5casescovers.com/127.0.0.1#5335 +ipset=/iphone5casescovers.com/gfwlist +server=/volvotrucks.co.mz/127.0.0.1#5335 +ipset=/volvotrucks.co.mz/gfwlist +server=/alpinelinux.org/127.0.0.1#5335 +ipset=/alpinelinux.org/gfwlist +server=/dba.dk/127.0.0.1#5335 +ipset=/dba.dk/gfwlist +server=/pali.ltd/127.0.0.1#5335 +ipset=/pali.ltd/gfwlist +server=/livrariart.com.br/127.0.0.1#5335 +ipset=/livrariart.com.br/gfwlist +server=/imlive.com/127.0.0.1#5335 +ipset=/imlive.com/gfwlist +server=/mvk.com/127.0.0.1#5335 +ipset=/mvk.com/gfwlist +server=/mrcong.com/127.0.0.1#5335 +ipset=/mrcong.com/gfwlist +server=/scoreland.com/127.0.0.1#5335 +ipset=/scoreland.com/gfwlist +server=/fburl.com/127.0.0.1#5335 +ipset=/fburl.com/gfwlist +server=/beatselectronicsllc.tt.omtrdc.net/127.0.0.1#5335 +ipset=/beatselectronicsllc.tt.omtrdc.net/gfwlist +server=/keyhole.com/127.0.0.1#5335 +ipset=/keyhole.com/gfwlist +server=/linecorp.com/127.0.0.1#5335 +ipset=/linecorp.com/gfwlist +server=/fuqqt.com/127.0.0.1#5335 +ipset=/fuqqt.com/gfwlist +server=/csnjcbnxdnb.com/127.0.0.1#5335 +ipset=/csnjcbnxdnb.com/gfwlist +server=/porn7.net/127.0.0.1#5335 +ipset=/porn7.net/gfwlist +server=/onindiansex.com/127.0.0.1#5335 +ipset=/onindiansex.com/gfwlist +server=/youtube.com.br/127.0.0.1#5335 +ipset=/youtube.com.br/gfwlist +server=/xbrasilporno.com/127.0.0.1#5335 +ipset=/xbrasilporno.com/gfwlist +server=/beatsbydreforstore.com/127.0.0.1#5335 +ipset=/beatsbydreforstore.com/gfwlist +server=/fapteencam.com/127.0.0.1#5335 +ipset=/fapteencam.com/gfwlist +server=/connectedcommerce.tv/127.0.0.1#5335 +ipset=/connectedcommerce.tv/gfwlist +server=/siteripz.net/127.0.0.1#5335 +ipset=/siteripz.net/gfwlist +server=/twinkspornos.com/127.0.0.1#5335 +ipset=/twinkspornos.com/gfwlist +server=/ctyun.online/127.0.0.1#5335 +ipset=/ctyun.online/gfwlist +server=/18eighteen.com/127.0.0.1#5335 +ipset=/18eighteen.com/gfwlist +server=/msn.com/127.0.0.1#5335 +ipset=/msn.com/gfwlist +server=/bigtitsextapes.com/127.0.0.1#5335 +ipset=/bigtitsextapes.com/gfwlist +server=/javspanking.com/127.0.0.1#5335 +ipset=/javspanking.com/gfwlist +server=/dynacw.com.cn/127.0.0.1#5335 +ipset=/dynacw.com.cn/gfwlist +server=/spotifycharts.com/127.0.0.1#5335 +ipset=/spotifycharts.com/gfwlist +server=/newsadds.com.au/127.0.0.1#5335 +ipset=/newsadds.com.au/gfwlist +server=/riot.im/127.0.0.1#5335 +ipset=/riot.im/gfwlist +server=/animalforsex.com/127.0.0.1#5335 +ipset=/animalforsex.com/gfwlist +server=/maturepornonly.com/127.0.0.1#5335 +ipset=/maturepornonly.com/gfwlist +server=/youtube.ge/127.0.0.1#5335 +ipset=/youtube.ge/gfwlist +server=/minigeorgian.ca/127.0.0.1#5335 +ipset=/minigeorgian.ca/gfwlist +server=/muji.net/127.0.0.1#5335 +ipset=/muji.net/gfwlist +server=/erodouga.8sp.biz/127.0.0.1#5335 +ipset=/erodouga.8sp.biz/gfwlist +server=/chatango.com/127.0.0.1#5335 +ipset=/chatango.com/gfwlist +server=/findbare.com/127.0.0.1#5335 +ipset=/findbare.com/gfwlist +server=/thelancet.com/127.0.0.1#5335 +ipset=/thelancet.com/gfwlist +server=/ebenporno.com/127.0.0.1#5335 +ipset=/ebenporno.com/gfwlist +server=/moystoys.com/127.0.0.1#5335 +ipset=/moystoys.com/gfwlist +server=/google.as/127.0.0.1#5335 +ipset=/google.as/gfwlist +server=/appledaily.com.hk/127.0.0.1#5335 +ipset=/appledaily.com.hk/gfwlist +server=/firestonecomercial.com.br/127.0.0.1#5335 +ipset=/firestonecomercial.com.br/gfwlist +server=/hongkongpost.gov.hk/127.0.0.1#5335 +ipset=/hongkongpost.gov.hk/gfwlist +server=/verily.com/127.0.0.1#5335 +ipset=/verily.com/gfwlist +server=/duckduckgo.jp/127.0.0.1#5335 +ipset=/duckduckgo.jp/gfwlist +server=/twlegs.com/127.0.0.1#5335 +ipset=/twlegs.com/gfwlist +server=/dettol.com.br/127.0.0.1#5335 +ipset=/dettol.com.br/gfwlist +server=/mansurfer.com/127.0.0.1#5335 +ipset=/mansurfer.com/gfwlist +server=/eacashcard.com/127.0.0.1#5335 +ipset=/eacashcard.com/gfwlist +server=/hacksear.ch/127.0.0.1#5335 +ipset=/hacksear.ch/gfwlist +server=/mcdelivery.com.au/127.0.0.1#5335 +ipset=/mcdelivery.com.au/gfwlist +server=/nugettest.org/127.0.0.1#5335 +ipset=/nugettest.org/gfwlist +server=/softbank-jp.com/127.0.0.1#5335 +ipset=/softbank-jp.com/gfwlist +server=/skysportsracing.com/127.0.0.1#5335 +ipset=/skysportsracing.com/gfwlist +server=/onlinegeeksquad.com/127.0.0.1#5335 +ipset=/onlinegeeksquad.com/gfwlist +server=/mygaysites.com/127.0.0.1#5335 +ipset=/mygaysites.com/gfwlist +server=/twitch.tv/127.0.0.1#5335 +ipset=/twitch.tv/gfwlist +server=/beatssaleus.com/127.0.0.1#5335 +ipset=/beatssaleus.com/gfwlist +server=/gayharem.com/127.0.0.1#5335 +ipset=/gayharem.com/gfwlist +server=/strepsils.es/127.0.0.1#5335 +ipset=/strepsils.es/gfwlist +server=/porntsunami.com/127.0.0.1#5335 +ipset=/porntsunami.com/gfwlist +server=/d-upp.com/127.0.0.1#5335 +ipset=/d-upp.com/gfwlist +server=/pornxxx.bid/127.0.0.1#5335 +ipset=/pornxxx.bid/gfwlist +server=/yahoo.im/127.0.0.1#5335 +ipset=/yahoo.im/gfwlist +server=/hulusports.com/127.0.0.1#5335 +ipset=/hulusports.com/gfwlist +server=/firestonetire.ca/127.0.0.1#5335 +ipset=/firestonetire.ca/gfwlist +server=/favepornmovs.com/127.0.0.1#5335 +ipset=/favepornmovs.com/gfwlist +server=/jdbimgs.com/127.0.0.1#5335 +ipset=/jdbimgs.com/gfwlist +server=/tubev.sex/127.0.0.1#5335 +ipset=/tubev.sex/gfwlist +server=/beatsbydreforshop2013-nl.com/127.0.0.1#5335 +ipset=/beatsbydreforshop2013-nl.com/gfwlist +server=/pussyshine.info/127.0.0.1#5335 +ipset=/pussyshine.info/gfwlist +server=/alphabet.com/127.0.0.1#5335 +ipset=/alphabet.com/gfwlist +server=/twoo.com/127.0.0.1#5335 +ipset=/twoo.com/gfwlist +server=/lss55.com/127.0.0.1#5335 +ipset=/lss55.com/gfwlist +server=/ninecommentaries.com/127.0.0.1#5335 +ipset=/ninecommentaries.com/gfwlist +server=/ahmia.fi/127.0.0.1#5335 +ipset=/ahmia.fi/gfwlist +server=/windowsphone.com/127.0.0.1#5335 +ipset=/windowsphone.com/gfwlist +server=/paypal-service.org/127.0.0.1#5335 +ipset=/paypal-service.org/gfwlist +server=/pinkpussy.tv/127.0.0.1#5335 +ipset=/pinkpussy.tv/gfwlist +server=/norsk.mobi/127.0.0.1#5335 +ipset=/norsk.mobi/gfwlist +server=/cheapwirelessbeats.com/127.0.0.1#5335 +ipset=/cheapwirelessbeats.com/gfwlist +server=/cultura-kolomna.ru/127.0.0.1#5335 +ipset=/cultura-kolomna.ru/gfwlist +server=/bestamateurcumshots.com/127.0.0.1#5335 +ipset=/bestamateurcumshots.com/gfwlist +server=/elsevier.io/127.0.0.1#5335 +ipset=/elsevier.io/gfwlist +server=/voatibetan.com/127.0.0.1#5335 +ipset=/voatibetan.com/gfwlist +server=/erogazoufactory.com/127.0.0.1#5335 +ipset=/erogazoufactory.com/gfwlist +server=/av-top.com/127.0.0.1#5335 +ipset=/av-top.com/gfwlist +server=/sankakucomplex.com/127.0.0.1#5335 +ipset=/sankakucomplex.com/gfwlist +server=/paypal-engineering.com/127.0.0.1#5335 +ipset=/paypal-engineering.com/gfwlist +server=/beatspascher.net/127.0.0.1#5335 +ipset=/beatspascher.net/gfwlist +server=/alt7-mtalk.google.com/127.0.0.1#5335 +ipset=/alt7-mtalk.google.com/gfwlist +server=/hentaixxx.vip/127.0.0.1#5335 +ipset=/hentaixxx.vip/gfwlist +server=/efukt.com/127.0.0.1#5335 +ipset=/efukt.com/gfwlist +server=/xxxgirls88.com/127.0.0.1#5335 +ipset=/xxxgirls88.com/gfwlist +server=/gettyimages.ie/127.0.0.1#5335 +ipset=/gettyimages.ie/gfwlist +server=/myporno.photos/127.0.0.1#5335 +ipset=/myporno.photos/gfwlist +server=/isexomega.tw/127.0.0.1#5335 +ipset=/isexomega.tw/gfwlist +server=/fse.tv/127.0.0.1#5335 +ipset=/fse.tv/gfwlist +server=/5mb48g.com/127.0.0.1#5335 +ipset=/5mb48g.com/gfwlist +server=/sun.com/127.0.0.1#5335 +ipset=/sun.com/gfwlist +server=/beatsaudiobydre.net/127.0.0.1#5335 +ipset=/beatsaudiobydre.net/gfwlist +server=/gandhara.ru/127.0.0.1#5335 +ipset=/gandhara.ru/gfwlist +server=/azureplanetscale.info/127.0.0.1#5335 +ipset=/azureplanetscale.info/gfwlist +server=/pornrox.com/127.0.0.1#5335 +ipset=/pornrox.com/gfwlist +server=/bigsex.tv/127.0.0.1#5335 +ipset=/bigsex.tv/gfwlist +server=/asianboygay.com/127.0.0.1#5335 +ipset=/asianboygay.com/gfwlist +server=/amateurhomevids.com/127.0.0.1#5335 +ipset=/amateurhomevids.com/gfwlist +server=/inkchoice.com/127.0.0.1#5335 +ipset=/inkchoice.com/gfwlist +server=/amapornofilme.com/127.0.0.1#5335 +ipset=/amapornofilme.com/gfwlist +server=/activeteachonline.com/127.0.0.1#5335 +ipset=/activeteachonline.com/gfwlist +server=/yahoo.es/127.0.0.1#5335 +ipset=/yahoo.es/gfwlist +server=/google.co.ao/127.0.0.1#5335 +ipset=/google.co.ao/gfwlist +server=/171xx.com/127.0.0.1#5335 +ipset=/171xx.com/gfwlist +server=/anyporn.com/127.0.0.1#5335 +ipset=/anyporn.com/gfwlist +server=/sexy-more.com/127.0.0.1#5335 +ipset=/sexy-more.com/gfwlist +server=/momentumms.com/127.0.0.1#5335 +ipset=/momentumms.com/gfwlist +server=/sexxxtape.net/127.0.0.1#5335 +ipset=/sexxxtape.net/gfwlist +server=/ebayadvertising.com/127.0.0.1#5335 +ipset=/ebayadvertising.com/gfwlist +server=/nii.ac.jp/127.0.0.1#5335 +ipset=/nii.ac.jp/gfwlist +server=/appleappstore.tv/127.0.0.1#5335 +ipset=/appleappstore.tv/gfwlist +server=/infinitetoons.com/127.0.0.1#5335 +ipset=/infinitetoons.com/gfwlist +server=/mini.co.th/127.0.0.1#5335 +ipset=/mini.co.th/gfwlist +server=/cuckporn.com/127.0.0.1#5335 +ipset=/cuckporn.com/gfwlist +server=/tokyoporns.com/127.0.0.1#5335 +ipset=/tokyoporns.com/gfwlist +server=/vfsco.com/127.0.0.1#5335 +ipset=/vfsco.com/gfwlist +server=/navercorp.com/127.0.0.1#5335 +ipset=/navercorp.com/gfwlist +server=/tandf.co.uk/127.0.0.1#5335 +ipset=/tandf.co.uk/gfwlist +server=/microsoft.ge/127.0.0.1#5335 +ipset=/microsoft.ge/gfwlist +server=/javmost.com/127.0.0.1#5335 +ipset=/javmost.com/gfwlist +server=/lovethiscity.com/127.0.0.1#5335 +ipset=/lovethiscity.com/gfwlist +server=/seneporno.com/127.0.0.1#5335 +ipset=/seneporno.com/gfwlist +server=/adventuresbydisney.com/127.0.0.1#5335 +ipset=/adventuresbydisney.com/gfwlist +server=/asiamoviepass.com/127.0.0.1#5335 +ipset=/asiamoviepass.com/gfwlist +server=/tianbiav10.com/127.0.0.1#5335 +ipset=/tianbiav10.com/gfwlist +server=/damplips.com/127.0.0.1#5335 +ipset=/damplips.com/gfwlist +server=/volvotrucks.lt/127.0.0.1#5335 +ipset=/volvotrucks.lt/gfwlist +server=/boycall.com/127.0.0.1#5335 +ipset=/boycall.com/gfwlist +server=/mcstories.com/127.0.0.1#5335 +ipset=/mcstories.com/gfwlist +server=/akamai-access.net/127.0.0.1#5335 +ipset=/akamai-access.net/gfwlist +server=/bumptop.org/127.0.0.1#5335 +ipset=/bumptop.org/gfwlist +server=/fuck.sc/127.0.0.1#5335 +ipset=/fuck.sc/gfwlist +server=/mastercard.fi/127.0.0.1#5335 +ipset=/mastercard.fi/gfwlist +server=/odysee.com/127.0.0.1#5335 +ipset=/odysee.com/gfwlist +server=/ebayprivacycenter.com/127.0.0.1#5335 +ipset=/ebayprivacycenter.com/gfwlist +server=/durex.pt/127.0.0.1#5335 +ipset=/durex.pt/gfwlist +server=/pnas.org/127.0.0.1#5335 +ipset=/pnas.org/gfwlist +server=/boringcompany.com/127.0.0.1#5335 +ipset=/boringcompany.com/gfwlist +server=/apkcombo.com/127.0.0.1#5335 +ipset=/apkcombo.com/gfwlist +server=/infotimes.com.tw/127.0.0.1#5335 +ipset=/infotimes.com.tw/gfwlist +server=/lingeriepornonly.com/127.0.0.1#5335 +ipset=/lingeriepornonly.com/gfwlist +server=/orgasmlist.com/127.0.0.1#5335 +ipset=/orgasmlist.com/gfwlist +server=/uplay-istrip.com/127.0.0.1#5335 +ipset=/uplay-istrip.com/gfwlist +server=/smartline.com.au/127.0.0.1#5335 +ipset=/smartline.com.au/gfwlist +server=/wide-youtube.l.google.com/127.0.0.1#5335 +ipset=/wide-youtube.l.google.com/gfwlist +server=/xhub.tv/127.0.0.1#5335 +ipset=/xhub.tv/gfwlist +server=/bmw-connecteddrive.com.hr/127.0.0.1#5335 +ipset=/bmw-connecteddrive.com.hr/gfwlist +server=/unityads.unitychina.cn/127.0.0.1#5335 +ipset=/unityads.unitychina.cn/gfwlist +server=/superpapermario.com/127.0.0.1#5335 +ipset=/superpapermario.com/gfwlist +server=/qdmomentum.com/127.0.0.1#5335 +ipset=/qdmomentum.com/gfwlist +server=/blogspot.cl/127.0.0.1#5335 +ipset=/blogspot.cl/gfwlist +server=/practicalmoneyskills.jp/127.0.0.1#5335 +ipset=/practicalmoneyskills.jp/gfwlist +server=/realclearfoundation.org/127.0.0.1#5335 +ipset=/realclearfoundation.org/gfwlist +server=/feedburner.com/127.0.0.1#5335 +ipset=/feedburner.com/gfwlist +server=/airwick.com.br/127.0.0.1#5335 +ipset=/airwick.com.br/gfwlist +server=/techtimes.com/127.0.0.1#5335 +ipset=/techtimes.com/gfwlist +server=/espncdn.com/127.0.0.1#5335 +ipset=/espncdn.com/gfwlist +server=/amazonaws.com/127.0.0.1#5335 +ipset=/amazonaws.com/gfwlist +server=/ikea.com.pl/127.0.0.1#5335 +ipset=/ikea.com.pl/gfwlist +server=/acjj.net/127.0.0.1#5335 +ipset=/acjj.net/gfwlist +server=/wuso.me/127.0.0.1#5335 +ipset=/wuso.me/gfwlist +server=/bestbuy-communityrelations.com/127.0.0.1#5335 +ipset=/bestbuy-communityrelations.com/gfwlist +server=/ituneas.com/127.0.0.1#5335 +ipset=/ituneas.com/gfwlist +server=/kyodo-d.jp/127.0.0.1#5335 +ipset=/kyodo-d.jp/gfwlist +server=/blogspot.cz/127.0.0.1#5335 +ipset=/blogspot.cz/gfwlist +server=/vancouverbmwretailers.ca/127.0.0.1#5335 +ipset=/vancouverbmwretailers.ca/gfwlist +server=/spearhead.kr/127.0.0.1#5335 +ipset=/spearhead.kr/gfwlist +server=/visa.co.il/127.0.0.1#5335 +ipset=/visa.co.il/gfwlist +server=/thai-xxx.com/127.0.0.1#5335 +ipset=/thai-xxx.com/gfwlist +server=/facebook-inc.com/127.0.0.1#5335 +ipset=/facebook-inc.com/gfwlist +server=/cloudsync-prod.s3.amazonaws.com/127.0.0.1#5335 +ipset=/cloudsync-prod.s3.amazonaws.com/gfwlist +server=/waplog.com/127.0.0.1#5335 +ipset=/waplog.com/gfwlist +server=/nvidia.dk/127.0.0.1#5335 +ipset=/nvidia.dk/gfwlist +server=/xgsp.tv/127.0.0.1#5335 +ipset=/xgsp.tv/gfwlist +server=/monsterbeats-headphone.com/127.0.0.1#5335 +ipset=/monsterbeats-headphone.com/gfwlist +server=/youtube.co.id/127.0.0.1#5335 +ipset=/youtube.co.id/gfwlist +server=/disneyturkiye.com.tr/127.0.0.1#5335 +ipset=/disneyturkiye.com.tr/gfwlist +server=/iphone.ru/127.0.0.1#5335 +ipset=/iphone.ru/gfwlist +server=/pics.vc/127.0.0.1#5335 +ipset=/pics.vc/gfwlist +server=/redwap.pro/127.0.0.1#5335 +ipset=/redwap.pro/gfwlist +server=/hyperscan.io/127.0.0.1#5335 +ipset=/hyperscan.io/gfwlist +server=/sandisk.fr/127.0.0.1#5335 +ipset=/sandisk.fr/gfwlist +server=/ccievoicelabs.com/127.0.0.1#5335 +ipset=/ccievoicelabs.com/gfwlist +server=/mini-stjohns.ca/127.0.0.1#5335 +ipset=/mini-stjohns.ca/gfwlist +server=/xkorean.cam/127.0.0.1#5335 +ipset=/xkorean.cam/gfwlist +server=/yomiuri-ryokou.co.jp/127.0.0.1#5335 +ipset=/yomiuri-ryokou.co.jp/gfwlist +server=/discord.media/127.0.0.1#5335 +ipset=/discord.media/gfwlist +server=/thomsonreuters.com.tr/127.0.0.1#5335 +ipset=/thomsonreuters.com.tr/gfwlist +server=/timestalks.com/127.0.0.1#5335 +ipset=/timestalks.com/gfwlist +server=/geek-squad.net/127.0.0.1#5335 +ipset=/geek-squad.net/gfwlist +server=/pornvideotop.com/127.0.0.1#5335 +ipset=/pornvideotop.com/gfwlist +server=/qt-project.org/127.0.0.1#5335 +ipset=/qt-project.org/gfwlist +server=/ciscospark.ca/127.0.0.1#5335 +ipset=/ciscospark.ca/gfwlist +server=/headphoneshome.com/127.0.0.1#5335 +ipset=/headphoneshome.com/gfwlist +server=/nurofen.bg/127.0.0.1#5335 +ipset=/nurofen.bg/gfwlist +server=/visa.com.br/127.0.0.1#5335 +ipset=/visa.com.br/gfwlist +server=/pearsonassessments.com/127.0.0.1#5335 +ipset=/pearsonassessments.com/gfwlist +server=/bigbigshop.com/127.0.0.1#5335 +ipset=/bigbigshop.com/gfwlist +server=/streamhentaimovies.com/127.0.0.1#5335 +ipset=/streamhentaimovies.com/gfwlist +server=/hpgraphicspartners.com/127.0.0.1#5335 +ipset=/hpgraphicspartners.com/gfwlist +server=/cnn.com/127.0.0.1#5335 +ipset=/cnn.com/gfwlist +server=/teengirlfriendtube.com/127.0.0.1#5335 +ipset=/teengirlfriendtube.com/gfwlist +server=/adult-list.com/127.0.0.1#5335 +ipset=/adult-list.com/gfwlist +server=/realclearworld.com/127.0.0.1#5335 +ipset=/realclearworld.com/gfwlist +server=/volvotruckcenter.es/127.0.0.1#5335 +ipset=/volvotruckcenter.es/gfwlist +server=/braintreepayments.tv/127.0.0.1#5335 +ipset=/braintreepayments.tv/gfwlist +server=/pokemonrubysapphire.com/127.0.0.1#5335 +ipset=/pokemonrubysapphire.com/gfwlist +server=/yomiuri.co.jp/127.0.0.1#5335 +ipset=/yomiuri.co.jp/gfwlist +server=/finishinfo.cl/127.0.0.1#5335 +ipset=/finishinfo.cl/gfwlist +server=/volvotrucks.uy/127.0.0.1#5335 +ipset=/volvotrucks.uy/gfwlist +server=/viet69.news/127.0.0.1#5335 +ipset=/viet69.news/gfwlist +server=/suxib.com/127.0.0.1#5335 +ipset=/suxib.com/gfwlist +server=/theclubprive.com/127.0.0.1#5335 +ipset=/theclubprive.com/gfwlist +server=/thelittleslush.com/127.0.0.1#5335 +ipset=/thelittleslush.com/gfwlist +server=/starbuckscoffeegear.com/127.0.0.1#5335 +ipset=/starbuckscoffeegear.com/gfwlist +server=/indiangfvideos.com/127.0.0.1#5335 +ipset=/indiangfvideos.com/gfwlist +server=/leporno.org/127.0.0.1#5335 +ipset=/leporno.org/gfwlist +server=/thebestfetishsites.com/127.0.0.1#5335 +ipset=/thebestfetishsites.com/gfwlist +server=/family-sex.me/127.0.0.1#5335 +ipset=/family-sex.me/gfwlist +server=/bitchmomporn.com/127.0.0.1#5335 +ipset=/bitchmomporn.com/gfwlist +server=/creamlemon.info/127.0.0.1#5335 +ipset=/creamlemon.info/gfwlist +server=/fotolia.cc/127.0.0.1#5335 +ipset=/fotolia.cc/gfwlist +server=/niketrainer.com/127.0.0.1#5335 +ipset=/niketrainer.com/gfwlist +server=/zohomerchandise.com/127.0.0.1#5335 +ipset=/zohomerchandise.com/gfwlist +server=/youtube.com.ro/127.0.0.1#5335 +ipset=/youtube.com.ro/gfwlist +server=/fulib711.shop/127.0.0.1#5335 +ipset=/fulib711.shop/gfwlist +server=/sexsaoy.com/127.0.0.1#5335 +ipset=/sexsaoy.com/gfwlist +server=/uhtube.me/127.0.0.1#5335 +ipset=/uhtube.me/gfwlist +server=/beatscheap-uk.com/127.0.0.1#5335 +ipset=/beatscheap-uk.com/gfwlist +server=/kjj05.cn/127.0.0.1#5335 +ipset=/kjj05.cn/gfwlist +server=/ie11.com/127.0.0.1#5335 +ipset=/ie11.com/gfwlist +server=/garena.sg/127.0.0.1#5335 +ipset=/garena.sg/gfwlist +server=/mini.com.sg/127.0.0.1#5335 +ipset=/mini.com.sg/gfwlist +server=/roku.com/127.0.0.1#5335 +ipset=/roku.com/gfwlist +server=/bmw.it/127.0.0.1#5335 +ipset=/bmw.it/gfwlist +server=/xn--urs05q.jp/127.0.0.1#5335 +ipset=/xn--urs05q.jp/gfwlist +server=/kotlinlang.org/127.0.0.1#5335 +ipset=/kotlinlang.org/gfwlist +server=/imdb.com/127.0.0.1#5335 +ipset=/imdb.com/gfwlist +server=/epochtimes.nl/127.0.0.1#5335 +ipset=/epochtimes.nl/gfwlist +server=/trmini.com/127.0.0.1#5335 +ipset=/trmini.com/gfwlist +server=/paisapay.tv/127.0.0.1#5335 +ipset=/paisapay.tv/gfwlist +server=/coursera.community/127.0.0.1#5335 +ipset=/coursera.community/gfwlist +server=/jwpsrv.com/127.0.0.1#5335 +ipset=/jwpsrv.com/gfwlist +server=/vkgo.app/127.0.0.1#5335 +ipset=/vkgo.app/gfwlist +server=/gamesfuckgirls.com/127.0.0.1#5335 +ipset=/gamesfuckgirls.com/gfwlist +server=/nudecelebforum.com/127.0.0.1#5335 +ipset=/nudecelebforum.com/gfwlist +server=/pornwebmasters.com/127.0.0.1#5335 +ipset=/pornwebmasters.com/gfwlist +server=/disneyme.com/127.0.0.1#5335 +ipset=/disneyme.com/gfwlist +server=/vanitha.in/127.0.0.1#5335 +ipset=/vanitha.in/gfwlist +server=/babesandgirls.com/127.0.0.1#5335 +ipset=/babesandgirls.com/gfwlist +server=/thawte.fr/127.0.0.1#5335 +ipset=/thawte.fr/gfwlist +server=/site.com/127.0.0.1#5335 +ipset=/site.com/gfwlist +server=/ieee-pels.org/127.0.0.1#5335 +ipset=/ieee-pels.org/gfwlist +server=/google.sc/127.0.0.1#5335 +ipset=/google.sc/gfwlist +server=/appleone.tech/127.0.0.1#5335 +ipset=/appleone.tech/gfwlist +server=/facebook.in/127.0.0.1#5335 +ipset=/facebook.in/gfwlist +server=/amerikaninsesi.com/127.0.0.1#5335 +ipset=/amerikaninsesi.com/gfwlist +server=/bbci.co.uk/127.0.0.1#5335 +ipset=/bbci.co.uk/gfwlist +server=/madpeople.net/127.0.0.1#5335 +ipset=/madpeople.net/gfwlist +server=/chatwhores.net/127.0.0.1#5335 +ipset=/chatwhores.net/gfwlist +server=/bmw-motorrad-test-ride.com/127.0.0.1#5335 +ipset=/bmw-motorrad-test-ride.com/gfwlist +server=/braintreepayments.info/127.0.0.1#5335 +ipset=/braintreepayments.info/gfwlist +server=/monsterbeatstienda.com/127.0.0.1#5335 +ipset=/monsterbeatstienda.com/gfwlist +server=/ginmoe.com/127.0.0.1#5335 +ipset=/ginmoe.com/gfwlist +server=/sapphicpornonly.com/127.0.0.1#5335 +ipset=/sapphicpornonly.com/gfwlist +server=/foxcincy.com/127.0.0.1#5335 +ipset=/foxcincy.com/gfwlist +server=/darknun.com/127.0.0.1#5335 +ipset=/darknun.com/gfwlist +server=/bloombergforeducation.com/127.0.0.1#5335 +ipset=/bloombergforeducation.com/gfwlist +server=/free-xxx-porn.org/127.0.0.1#5335 +ipset=/free-xxx-porn.org/gfwlist +server=/mindmeld.com/127.0.0.1#5335 +ipset=/mindmeld.com/gfwlist +server=/mobilevrxxx.com/127.0.0.1#5335 +ipset=/mobilevrxxx.com/gfwlist +server=/12diasderegalosdeitunes.com.ni/127.0.0.1#5335 +ipset=/12diasderegalosdeitunes.com.ni/gfwlist +server=/realclearbooks.com/127.0.0.1#5335 +ipset=/realclearbooks.com/gfwlist +server=/tonicmovies.com/127.0.0.1#5335 +ipset=/tonicmovies.com/gfwlist +server=/asian-max.com/127.0.0.1#5335 +ipset=/asian-max.com/gfwlist +server=/shemalestube.com/127.0.0.1#5335 +ipset=/shemalestube.com/gfwlist +server=/ancensored.com/127.0.0.1#5335 +ipset=/ancensored.com/gfwlist +server=/clubtubes.com/127.0.0.1#5335 +ipset=/clubtubes.com/gfwlist +server=/nikefuelband.com/127.0.0.1#5335 +ipset=/nikefuelband.com/gfwlist +server=/zunked.com/127.0.0.1#5335 +ipset=/zunked.com/gfwlist +server=/xvideoporno.tv/127.0.0.1#5335 +ipset=/xvideoporno.tv/gfwlist +server=/wnacg.link/127.0.0.1#5335 +ipset=/wnacg.link/gfwlist +server=/adobe.io/127.0.0.1#5335 +ipset=/adobe.io/gfwlist +server=/easportsmma.com/127.0.0.1#5335 +ipset=/easportsmma.com/gfwlist +server=/cuebic.biz/127.0.0.1#5335 +ipset=/cuebic.biz/gfwlist +server=/foxtv.com/127.0.0.1#5335 +ipset=/foxtv.com/gfwlist +server=/anal.casa/127.0.0.1#5335 +ipset=/anal.casa/gfwlist +server=/playvalorant.com/127.0.0.1#5335 +ipset=/playvalorant.com/gfwlist +server=/rebrandly.com/127.0.0.1#5335 +ipset=/rebrandly.com/gfwlist +server=/fi11.com/127.0.0.1#5335 +ipset=/fi11.com/gfwlist +server=/best3dhere.com/127.0.0.1#5335 +ipset=/best3dhere.com/gfwlist +server=/starbucks.dk/127.0.0.1#5335 +ipset=/starbucks.dk/gfwlist +server=/intel-research.net/127.0.0.1#5335 +ipset=/intel-research.net/gfwlist +server=/ieee-ccnc.org/127.0.0.1#5335 +ipset=/ieee-ccnc.org/gfwlist +server=/perfectsexnow.com/127.0.0.1#5335 +ipset=/perfectsexnow.com/gfwlist +server=/trendmicro.com/127.0.0.1#5335 +ipset=/trendmicro.com/gfwlist +server=/toptoonsites.com/127.0.0.1#5335 +ipset=/toptoonsites.com/gfwlist +server=/softbankusa.net/127.0.0.1#5335 +ipset=/softbankusa.net/gfwlist +server=/geoport.com/127.0.0.1#5335 +ipset=/geoport.com/gfwlist +server=/google.je/127.0.0.1#5335 +ipset=/google.je/gfwlist +server=/vanithaveedu.com/127.0.0.1#5335 +ipset=/vanithaveedu.com/gfwlist +server=/ebay.com.ar/127.0.0.1#5335 +ipset=/ebay.com.ar/gfwlist +server=/japan-whores.com/127.0.0.1#5335 +ipset=/japan-whores.com/gfwlist +server=/opte.org/127.0.0.1#5335 +ipset=/opte.org/gfwlist +server=/wetchicks.org/127.0.0.1#5335 +ipset=/wetchicks.org/gfwlist +server=/vscode-sync.trafficmanager.net/127.0.0.1#5335 +ipset=/vscode-sync.trafficmanager.net/gfwlist +server=/fotoiia.com/127.0.0.1#5335 +ipset=/fotoiia.com/gfwlist +server=/myvodafone.com.ws/127.0.0.1#5335 +ipset=/myvodafone.com.ws/gfwlist +server=/mini-grouparchiv.de/127.0.0.1#5335 +ipset=/mini-grouparchiv.de/gfwlist +server=/microsoft-sap-events.com/127.0.0.1#5335 +ipset=/microsoft-sap-events.com/gfwlist +server=/ebaygroup.com/127.0.0.1#5335 +ipset=/ebaygroup.com/gfwlist +server=/chikiporn.com/127.0.0.1#5335 +ipset=/chikiporn.com/gfwlist +server=/cumasianporn.com/127.0.0.1#5335 +ipset=/cumasianporn.com/gfwlist +server=/twitchsvc.net/127.0.0.1#5335 +ipset=/twitchsvc.net/gfwlist +server=/cashify.net/127.0.0.1#5335 +ipset=/cashify.net/gfwlist +server=/sony-asia.com/127.0.0.1#5335 +ipset=/sony-asia.com/gfwlist +server=/mingpaocanada.com/127.0.0.1#5335 +ipset=/mingpaocanada.com/gfwlist +server=/gwins.org/127.0.0.1#5335 +ipset=/gwins.org/gfwlist +server=/buyingfacebooklikes.com/127.0.0.1#5335 +ipset=/buyingfacebooklikes.com/gfwlist +server=/yahoosportsbook.com/127.0.0.1#5335 +ipset=/yahoosportsbook.com/gfwlist +server=/pornv.org/127.0.0.1#5335 +ipset=/pornv.org/gfwlist +server=/gayporn.com/127.0.0.1#5335 +ipset=/gayporn.com/gfwlist +server=/poopeegirls.com/127.0.0.1#5335 +ipset=/poopeegirls.com/gfwlist +server=/coursera.help/127.0.0.1#5335 +ipset=/coursera.help/gfwlist +server=/smart-edge.com/127.0.0.1#5335 +ipset=/smart-edge.com/gfwlist +server=/everydayporn.co/127.0.0.1#5335 +ipset=/everydayporn.co/gfwlist +server=/thecleversense.com/127.0.0.1#5335 +ipset=/thecleversense.com/gfwlist +server=/hentaigasm.com/127.0.0.1#5335 +ipset=/hentaigasm.com/gfwlist +server=/pornid.xxx/127.0.0.1#5335 +ipset=/pornid.xxx/gfwlist +server=/bigbeans.solutions/127.0.0.1#5335 +ipset=/bigbeans.solutions/gfwlist +server=/overthumbs.com/127.0.0.1#5335 +ipset=/overthumbs.com/gfwlist +server=/purenudism.com/127.0.0.1#5335 +ipset=/purenudism.com/gfwlist +server=/steambroadcast.akamaized.net/127.0.0.1#5335 +ipset=/steambroadcast.akamaized.net/gfwlist +server=/mac.wang/127.0.0.1#5335 +ipset=/mac.wang/gfwlist +server=/ie9.com/127.0.0.1#5335 +ipset=/ie9.com/gfwlist +server=/xpee.com/127.0.0.1#5335 +ipset=/xpee.com/gfwlist +server=/creamasia.com/127.0.0.1#5335 +ipset=/creamasia.com/gfwlist +server=/iphone-vip5.com/127.0.0.1#5335 +ipset=/iphone-vip5.com/gfwlist +server=/google.com.pg/127.0.0.1#5335 +ipset=/google.com.pg/gfwlist +server=/kindnudist.com/127.0.0.1#5335 +ipset=/kindnudist.com/gfwlist +server=/xn--ngstr-lra8j.com/127.0.0.1#5335 +ipset=/xn--ngstr-lra8j.com/gfwlist +server=/anatomy.tv/127.0.0.1#5335 +ipset=/anatomy.tv/gfwlist +server=/blogspot.my/127.0.0.1#5335 +ipset=/blogspot.my/gfwlist +server=/dungeonkeeper.com/127.0.0.1#5335 +ipset=/dungeonkeeper.com/gfwlist +server=/tidelift.com/127.0.0.1#5335 +ipset=/tidelift.com/gfwlist +server=/youtube.se/127.0.0.1#5335 +ipset=/youtube.se/gfwlist +server=/fetish-bb.com/127.0.0.1#5335 +ipset=/fetish-bb.com/gfwlist +server=/myfoxdetroit.com/127.0.0.1#5335 +ipset=/myfoxdetroit.com/gfwlist +server=/es-visiontimes.com/127.0.0.1#5335 +ipset=/es-visiontimes.com/gfwlist +server=/sigmoidoscopeexam.com/127.0.0.1#5335 +ipset=/sigmoidoscopeexam.com/gfwlist +server=/yahoo.ie/127.0.0.1#5335 +ipset=/yahoo.ie/gfwlist +server=/voanews.eu/127.0.0.1#5335 +ipset=/voanews.eu/gfwlist +server=/facebookstudios.net/127.0.0.1#5335 +ipset=/facebookstudios.net/gfwlist +server=/vhxqa6.com/127.0.0.1#5335 +ipset=/vhxqa6.com/gfwlist +server=/steamusercontent.com/127.0.0.1#5335 +ipset=/steamusercontent.com/gfwlist +server=/crossborderexpansion.com/127.0.0.1#5335 +ipset=/crossborderexpansion.com/gfwlist +server=/sexgamefun.com/127.0.0.1#5335 +ipset=/sexgamefun.com/gfwlist +server=/bmwusrideracademy.com/127.0.0.1#5335 +ipset=/bmwusrideracademy.com/gfwlist +server=/amzn.to/127.0.0.1#5335 +ipset=/amzn.to/gfwlist +server=/applemusicconnect.com/127.0.0.1#5335 +ipset=/applemusicconnect.com/gfwlist +server=/badoinkvr.com/127.0.0.1#5335 +ipset=/badoinkvr.com/gfwlist +server=/foxsports.info/127.0.0.1#5335 +ipset=/foxsports.info/gfwlist +server=/foxsuper6.com/127.0.0.1#5335 +ipset=/foxsuper6.com/gfwlist +server=/microsoftinternetsafety.net/127.0.0.1#5335 +ipset=/microsoftinternetsafety.net/gfwlist +server=/intgram.com/127.0.0.1#5335 +ipset=/intgram.com/gfwlist +server=/bridgestone-tac-oman.com/127.0.0.1#5335 +ipset=/bridgestone-tac-oman.com/gfwlist +server=/arphic.com.cn/127.0.0.1#5335 +ipset=/arphic.com.cn/gfwlist +server=/miaomwu.com/127.0.0.1#5335 +ipset=/miaomwu.com/gfwlist +server=/qmttqg3k.me/127.0.0.1#5335 +ipset=/qmttqg3k.me/gfwlist +server=/hqcollect.net/127.0.0.1#5335 +ipset=/hqcollect.net/gfwlist +server=/bmw.co.cr/127.0.0.1#5335 +ipset=/bmw.co.cr/gfwlist +server=/imageshack.com/127.0.0.1#5335 +ipset=/imageshack.com/gfwlist +server=/cherrybrady.com/127.0.0.1#5335 +ipset=/cherrybrady.com/gfwlist +server=/photoshop.com/127.0.0.1#5335 +ipset=/photoshop.com/gfwlist +server=/rarbgmirror.com/127.0.0.1#5335 +ipset=/rarbgmirror.com/gfwlist +server=/storiesonline.net/127.0.0.1#5335 +ipset=/storiesonline.net/gfwlist +server=/hindiweb.com/127.0.0.1#5335 +ipset=/hindiweb.com/gfwlist +server=/1jsa22.vip/127.0.0.1#5335 +ipset=/1jsa22.vip/gfwlist +server=/minivaughanwest.ca/127.0.0.1#5335 +ipset=/minivaughanwest.ca/gfwlist +server=/hpsignage.com/127.0.0.1#5335 +ipset=/hpsignage.com/gfwlist +server=/javlands.net/127.0.0.1#5335 +ipset=/javlands.net/gfwlist +server=/ubisoftconnect.com/127.0.0.1#5335 +ipset=/ubisoftconnect.com/gfwlist +server=/coolinet.net/127.0.0.1#5335 +ipset=/coolinet.net/gfwlist +server=/azure-devices.net/127.0.0.1#5335 +ipset=/azure-devices.net/gfwlist +server=/imperiodefamosas.com/127.0.0.1#5335 +ipset=/imperiodefamosas.com/gfwlist +server=/voyeurstyle.com/127.0.0.1#5335 +ipset=/voyeurstyle.com/gfwlist +server=/shopee.cl/127.0.0.1#5335 +ipset=/shopee.cl/gfwlist +server=/shopdrebeats.com/127.0.0.1#5335 +ipset=/shopdrebeats.com/gfwlist +server=/theyxxx.com/127.0.0.1#5335 +ipset=/theyxxx.com/gfwlist +server=/ipodshop.com.au/127.0.0.1#5335 +ipset=/ipodshop.com.au/gfwlist +server=/horsecock.guru/127.0.0.1#5335 +ipset=/horsecock.guru/gfwlist +server=/heroku-charge.com/127.0.0.1#5335 +ipset=/heroku-charge.com/gfwlist +server=/uug22.com/127.0.0.1#5335 +ipset=/uug22.com/gfwlist +server=/microsoftsqlserver.com/127.0.0.1#5335 +ipset=/microsoftsqlserver.com/gfwlist +server=/matureporner.com/127.0.0.1#5335 +ipset=/matureporner.com/gfwlist +server=/vmwarehorizon.com/127.0.0.1#5335 +ipset=/vmwarehorizon.com/gfwlist +server=/hornywhores.net/127.0.0.1#5335 +ipset=/hornywhores.net/gfwlist +server=/verisign.pro/127.0.0.1#5335 +ipset=/verisign.pro/gfwlist +server=/foundationdb.org/127.0.0.1#5335 +ipset=/foundationdb.org/gfwlist +server=/porno365.net/127.0.0.1#5335 +ipset=/porno365.net/gfwlist +server=/amazon.es/127.0.0.1#5335 +ipset=/amazon.es/gfwlist +server=/matters.one/127.0.0.1#5335 +ipset=/matters.one/gfwlist +server=/volvotrucks.hr/127.0.0.1#5335 +ipset=/volvotrucks.hr/gfwlist +server=/alivevmax.com/127.0.0.1#5335 +ipset=/alivevmax.com/gfwlist +server=/geeksquad.net/127.0.0.1#5335 +ipset=/geeksquad.net/gfwlist +server=/instagramcn.com/127.0.0.1#5335 +ipset=/instagramcn.com/gfwlist +server=/itunes.org/127.0.0.1#5335 +ipset=/itunes.org/gfwlist +server=/mrssiren.com/127.0.0.1#5335 +ipset=/mrssiren.com/gfwlist +server=/reachtheworldonfacebook.com/127.0.0.1#5335 +ipset=/reachtheworldonfacebook.com/gfwlist +server=/pornburst.xxx/127.0.0.1#5335 +ipset=/pornburst.xxx/gfwlist +server=/nintendo.co.za/127.0.0.1#5335 +ipset=/nintendo.co.za/gfwlist +server=/whvuxtub.com/127.0.0.1#5335 +ipset=/whvuxtub.com/gfwlist +server=/fb.gg/127.0.0.1#5335 +ipset=/fb.gg/gfwlist +server=/720video.tv/127.0.0.1#5335 +ipset=/720video.tv/gfwlist +server=/commerceos.com/127.0.0.1#5335 +ipset=/commerceos.com/gfwlist +server=/spotifycodes.com/127.0.0.1#5335 +ipset=/spotifycodes.com/gfwlist +server=/gaysheaven.blogspot.com/127.0.0.1#5335 +ipset=/gaysheaven.blogspot.com/gfwlist +server=/poop-pee.online/127.0.0.1#5335 +ipset=/poop-pee.online/gfwlist +server=/minilondon.ca/127.0.0.1#5335 +ipset=/minilondon.ca/gfwlist +server=/google.ms/127.0.0.1#5335 +ipset=/google.ms/gfwlist +server=/nikeairrift.com/127.0.0.1#5335 +ipset=/nikeairrift.com/gfwlist +server=/ippstatic.com/127.0.0.1#5335 +ipset=/ippstatic.com/gfwlist +server=/cisco.mobi/127.0.0.1#5335 +ipset=/cisco.mobi/gfwlist +server=/girl-secret.com/127.0.0.1#5335 +ipset=/girl-secret.com/gfwlist +server=/bmwworld.tv/127.0.0.1#5335 +ipset=/bmwworld.tv/gfwlist +server=/tandfonline.com/127.0.0.1#5335 +ipset=/tandfonline.com/gfwlist +server=/bmw.com.ge/127.0.0.1#5335 +ipset=/bmw.com.ge/gfwlist +server=/ciscosoftware.com/127.0.0.1#5335 +ipset=/ciscosoftware.com/gfwlist +server=/muyzorras.com/127.0.0.1#5335 +ipset=/muyzorras.com/gfwlist +server=/healthreach.hk/127.0.0.1#5335 +ipset=/healthreach.hk/gfwlist +server=/overleaf.com/127.0.0.1#5335 +ipset=/overleaf.com/gfwlist +server=/gaypad.net/127.0.0.1#5335 +ipset=/gaypad.net/gfwlist +server=/intel.com.py/127.0.0.1#5335 +ipset=/intel.com.py/gfwlist +server=/ikea.co.id/127.0.0.1#5335 +ipset=/ikea.co.id/gfwlist +server=/runnike.com/127.0.0.1#5335 +ipset=/runnike.com/gfwlist +server=/wildcamporn.com/127.0.0.1#5335 +ipset=/wildcamporn.com/gfwlist +server=/foxnebraska.com/127.0.0.1#5335 +ipset=/foxnebraska.com/gfwlist +server=/verisign.com.cn/127.0.0.1#5335 +ipset=/verisign.com.cn/gfwlist +server=/plusporn.net/127.0.0.1#5335 +ipset=/plusporn.net/gfwlist +server=/gridaware.app/127.0.0.1#5335 +ipset=/gridaware.app/gfwlist +server=/divas.com.uy/127.0.0.1#5335 +ipset=/divas.com.uy/gfwlist +server=/primepornlist.com/127.0.0.1#5335 +ipset=/primepornlist.com/gfwlist +server=/geeksquadprotectionplan.org/127.0.0.1#5335 +ipset=/geeksquadprotectionplan.org/gfwlist +server=/mcdelivery.com.my/127.0.0.1#5335 +ipset=/mcdelivery.com.my/gfwlist +server=/zooxxxsexporn.red/127.0.0.1#5335 +ipset=/zooxxxsexporn.red/gfwlist +server=/pornhdvideos.tv/127.0.0.1#5335 +ipset=/pornhdvideos.tv/gfwlist +server=/bongacams.com/127.0.0.1#5335 +ipset=/bongacams.com/gfwlist +server=/thomsonreuters.com.sg/127.0.0.1#5335 +ipset=/thomsonreuters.com.sg/gfwlist +server=/beatsbydrediscountonline.net/127.0.0.1#5335 +ipset=/beatsbydrediscountonline.net/gfwlist +server=/instagramhilesi.org/127.0.0.1#5335 +ipset=/instagramhilesi.org/gfwlist +server=/gettyimages.ch/127.0.0.1#5335 +ipset=/gettyimages.ch/gfwlist +server=/fareastpornhub.com/127.0.0.1#5335 +ipset=/fareastpornhub.com/gfwlist +server=/begin-trade.com/127.0.0.1#5335 +ipset=/begin-trade.com/gfwlist +server=/chargenowusa.com/127.0.0.1#5335 +ipset=/chargenowusa.com/gfwlist +server=/strepsils.com.ar/127.0.0.1#5335 +ipset=/strepsils.com.ar/gfwlist +server=/verizon.com/127.0.0.1#5335 +ipset=/verizon.com/gfwlist +server=/judeporn.com/127.0.0.1#5335 +ipset=/judeporn.com/gfwlist +server=/monsterbeatsheadphones.net/127.0.0.1#5335 +ipset=/monsterbeatsheadphones.net/gfwlist +server=/miniso-bh.com/127.0.0.1#5335 +ipset=/miniso-bh.com/gfwlist +server=/cultoferotica.com/127.0.0.1#5335 +ipset=/cultoferotica.com/gfwlist +server=/pornoid.com/127.0.0.1#5335 +ipset=/pornoid.com/gfwlist +server=/datalore.io/127.0.0.1#5335 +ipset=/datalore.io/gfwlist +server=/fnmt.es/127.0.0.1#5335 +ipset=/fnmt.es/gfwlist +server=/thefacebook.com/127.0.0.1#5335 +ipset=/thefacebook.com/gfwlist +server=/newcastlenewslocal.com.au/127.0.0.1#5335 +ipset=/newcastlenewslocal.com.au/gfwlist +server=/enemas4fun.com/127.0.0.1#5335 +ipset=/enemas4fun.com/gfwlist +server=/privatebrowsingmyths.com/127.0.0.1#5335 +ipset=/privatebrowsingmyths.com/gfwlist +server=/alibabacloud.com.au/127.0.0.1#5335 +ipset=/alibabacloud.com.au/gfwlist +server=/stripskunk.com/127.0.0.1#5335 +ipset=/stripskunk.com/gfwlist +server=/intel.sv/127.0.0.1#5335 +ipset=/intel.sv/gfwlist +server=/geolytics.com/127.0.0.1#5335 +ipset=/geolytics.com/gfwlist +server=/dowjones.com/127.0.0.1#5335 +ipset=/dowjones.com/gfwlist +server=/herexxx.com/127.0.0.1#5335 +ipset=/herexxx.com/gfwlist +server=/elib.maruzen.co.jp/127.0.0.1#5335 +ipset=/elib.maruzen.co.jp/gfwlist +server=/ieeesystemscouncil.org/127.0.0.1#5335 +ipset=/ieeesystemscouncil.org/gfwlist +server=/nikeasia.com/127.0.0.1#5335 +ipset=/nikeasia.com/gfwlist +server=/gigaxvideos.com/127.0.0.1#5335 +ipset=/gigaxvideos.com/gfwlist +server=/inxporn.com/127.0.0.1#5335 +ipset=/inxporn.com/gfwlist +server=/vnware.net/127.0.0.1#5335 +ipset=/vnware.net/gfwlist +server=/20thcenturystudios.com.au/127.0.0.1#5335 +ipset=/20thcenturystudios.com.au/gfwlist +server=/classicnike.com/127.0.0.1#5335 +ipset=/classicnike.com/gfwlist +server=/flatpak.org/127.0.0.1#5335 +ipset=/flatpak.org/gfwlist +server=/photo-image.monster/127.0.0.1#5335 +ipset=/photo-image.monster/gfwlist +server=/xxx-hentai.blogspot.com/127.0.0.1#5335 +ipset=/xxx-hentai.blogspot.com/gfwlist +server=/spaceexplored.com/127.0.0.1#5335 +ipset=/spaceexplored.com/gfwlist +server=/powershellgallery.com/127.0.0.1#5335 +ipset=/powershellgallery.com/gfwlist +server=/clasporno.org/127.0.0.1#5335 +ipset=/clasporno.org/gfwlist +server=/movidius.net/127.0.0.1#5335 +ipset=/movidius.net/gfwlist +server=/firestonerewards.com/127.0.0.1#5335 +ipset=/firestonerewards.com/gfwlist +server=/ibookpartner.com/127.0.0.1#5335 +ipset=/ibookpartner.com/gfwlist +server=/fox29.com/127.0.0.1#5335 +ipset=/fox29.com/gfwlist +server=/yahoo.gl/127.0.0.1#5335 +ipset=/yahoo.gl/gfwlist +server=/minitoronto.ca/127.0.0.1#5335 +ipset=/minitoronto.ca/gfwlist +server=/53world.com/127.0.0.1#5335 +ipset=/53world.com/gfwlist +server=/beatsbydrecybermondaydeals2013.com/127.0.0.1#5335 +ipset=/beatsbydrecybermondaydeals2013.com/gfwlist +server=/hentaiathome.net/127.0.0.1#5335 +ipset=/hentaiathome.net/gfwlist +server=/bmw-me.com/127.0.0.1#5335 +ipset=/bmw-me.com/gfwlist +server=/nvidia.co.in/127.0.0.1#5335 +ipset=/nvidia.co.in/gfwlist +server=/nbcsports.com/127.0.0.1#5335 +ipset=/nbcsports.com/gfwlist +server=/paypal-online.net/127.0.0.1#5335 +ipset=/paypal-online.net/gfwlist +server=/situero.com/127.0.0.1#5335 +ipset=/situero.com/gfwlist +server=/tubevintageporn.com/127.0.0.1#5335 +ipset=/tubevintageporn.com/gfwlist +server=/mom-gfs.com/127.0.0.1#5335 +ipset=/mom-gfs.com/gfwlist +server=/steam.apac.qtlglb.com/127.0.0.1#5335 +ipset=/steam.apac.qtlglb.com/gfwlist +server=/xpoleuno.com/127.0.0.1#5335 +ipset=/xpoleuno.com/gfwlist +server=/cashpassportglobe.com/127.0.0.1#5335 +ipset=/cashpassportglobe.com/gfwlist +server=/nudistlog.com/127.0.0.1#5335 +ipset=/nudistlog.com/gfwlist +server=/globalsign.fr/127.0.0.1#5335 +ipset=/globalsign.fr/gfwlist +server=/titsandtugs.com/127.0.0.1#5335 +ipset=/titsandtugs.com/gfwlist +server=/porn300.com/127.0.0.1#5335 +ipset=/porn300.com/gfwlist +server=/paypal-biz.com/127.0.0.1#5335 +ipset=/paypal-biz.com/gfwlist +server=/google.mn/127.0.0.1#5335 +ipset=/google.mn/gfwlist +server=/pinkvelvetvault.com/127.0.0.1#5335 +ipset=/pinkvelvetvault.com/gfwlist +server=/minitakesthestates.com/127.0.0.1#5335 +ipset=/minitakesthestates.com/gfwlist +server=/cenkei.com/127.0.0.1#5335 +ipset=/cenkei.com/gfwlist +server=/bidvestbank.co.za/127.0.0.1#5335 +ipset=/bidvestbank.co.za/gfwlist +server=/pearson.co.jp/127.0.0.1#5335 +ipset=/pearson.co.jp/gfwlist +server=/foxsmallbusinesscenter.net/127.0.0.1#5335 +ipset=/foxsmallbusinesscenter.net/gfwlist +server=/bigtithitomi.com/127.0.0.1#5335 +ipset=/bigtithitomi.com/gfwlist +server=/vanish.ru/127.0.0.1#5335 +ipset=/vanish.ru/gfwlist +server=/hsex.tv/127.0.0.1#5335 +ipset=/hsex.tv/gfwlist +server=/facebok.com/127.0.0.1#5335 +ipset=/facebok.com/gfwlist +server=/travelex.ca/127.0.0.1#5335 +ipset=/travelex.ca/gfwlist +server=/dev.to/127.0.0.1#5335 +ipset=/dev.to/gfwlist +server=/teentube.pro/127.0.0.1#5335 +ipset=/teentube.pro/gfwlist +server=/intel.cr/127.0.0.1#5335 +ipset=/intel.cr/gfwlist +server=/roloflix.com/127.0.0.1#5335 +ipset=/roloflix.com/gfwlist +server=/pm.me/127.0.0.1#5335 +ipset=/pm.me/gfwlist +server=/liveauction.com/127.0.0.1#5335 +ipset=/liveauction.com/gfwlist +server=/d1k2us671qcoau.cloudfront.net/127.0.0.1#5335 +ipset=/d1k2us671qcoau.cloudfront.net/gfwlist +server=/hplargeformatremote.com/127.0.0.1#5335 +ipset=/hplargeformatremote.com/gfwlist +server=/ccpsx.com/127.0.0.1#5335 +ipset=/ccpsx.com/gfwlist +server=/timesmembership.com/127.0.0.1#5335 +ipset=/timesmembership.com/gfwlist +server=/mangoporn.net/127.0.0.1#5335 +ipset=/mangoporn.net/gfwlist +server=/shopbmwmotorcycles.com/127.0.0.1#5335 +ipset=/shopbmwmotorcycles.com/gfwlist +server=/canon.tj/127.0.0.1#5335 +ipset=/canon.tj/gfwlist +server=/rfa.org/127.0.0.1#5335 +ipset=/rfa.org/gfwlist +server=/blackhomeporn.com/127.0.0.1#5335 +ipset=/blackhomeporn.com/gfwlist +server=/interactive-examples.mdn.mozilla.net/127.0.0.1#5335 +ipset=/interactive-examples.mdn.mozilla.net/gfwlist +server=/amateursexpussy.com/127.0.0.1#5335 +ipset=/amateursexpussy.com/gfwlist +server=/aalah.me/127.0.0.1#5335 +ipset=/aalah.me/gfwlist +server=/1lib.tw/127.0.0.1#5335 +ipset=/1lib.tw/gfwlist +server=/mimei.store/127.0.0.1#5335 +ipset=/mimei.store/gfwlist +server=/leaksmodels.com/127.0.0.1#5335 +ipset=/leaksmodels.com/gfwlist +server=/google.me/127.0.0.1#5335 +ipset=/google.me/gfwlist +server=/momsgiveass.com/127.0.0.1#5335 +ipset=/momsgiveass.com/gfwlist +server=/cdn77.org/127.0.0.1#5335 +ipset=/cdn77.org/gfwlist +server=/sankie.net/127.0.0.1#5335 +ipset=/sankie.net/gfwlist +server=/vk.me/127.0.0.1#5335 +ipset=/vk.me/gfwlist +server=/asiansexdiary.com/127.0.0.1#5335 +ipset=/asiansexdiary.com/gfwlist +server=/ioe.com/127.0.0.1#5335 +ipset=/ioe.com/gfwlist +server=/needgayporn.com/127.0.0.1#5335 +ipset=/needgayporn.com/gfwlist +server=/google.com.do/127.0.0.1#5335 +ipset=/google.com.do/gfwlist +server=/babeimpact.com/127.0.0.1#5335 +ipset=/babeimpact.com/gfwlist +server=/sexxx.cfd/127.0.0.1#5335 +ipset=/sexxx.cfd/gfwlist +server=/faceboooik.com/127.0.0.1#5335 +ipset=/faceboooik.com/gfwlist +server=/visa.com.pe/127.0.0.1#5335 +ipset=/visa.com.pe/gfwlist +server=/antarvasnaclips.com/127.0.0.1#5335 +ipset=/antarvasnaclips.com/gfwlist +server=/tube2011.com/127.0.0.1#5335 +ipset=/tube2011.com/gfwlist +server=/beck-online.beck.de/127.0.0.1#5335 +ipset=/beck-online.beck.de/gfwlist +server=/applepaymerchantsupplies.info/127.0.0.1#5335 +ipset=/applepaymerchantsupplies.info/gfwlist +server=/dreamamateurs.com/127.0.0.1#5335 +ipset=/dreamamateurs.com/gfwlist +server=/tophd.xxx/127.0.0.1#5335 +ipset=/tophd.xxx/gfwlist +server=/drebyby.com/127.0.0.1#5335 +ipset=/drebyby.com/gfwlist +server=/mini-corporate-sales.com/127.0.0.1#5335 +ipset=/mini-corporate-sales.com/gfwlist +server=/sankei-shougakukai.jp/127.0.0.1#5335 +ipset=/sankei-shougakukai.jp/gfwlist +server=/sexyhomewives.com/127.0.0.1#5335 +ipset=/sexyhomewives.com/gfwlist +server=/truyentranh86.com/127.0.0.1#5335 +ipset=/truyentranh86.com/gfwlist +server=/tsescortsdirectory.com/127.0.0.1#5335 +ipset=/tsescortsdirectory.com/gfwlist +server=/attwirelesssolutions.com/127.0.0.1#5335 +ipset=/attwirelesssolutions.com/gfwlist +server=/highporn.net/127.0.0.1#5335 +ipset=/highporn.net/gfwlist +server=/babycondom.com/127.0.0.1#5335 +ipset=/babycondom.com/gfwlist +server=/factwire.org/127.0.0.1#5335 +ipset=/factwire.org/gfwlist +server=/cambro.tv/127.0.0.1#5335 +ipset=/cambro.tv/gfwlist +server=/o365weve.com/127.0.0.1#5335 +ipset=/o365weve.com/gfwlist +server=/momhomeporn.com/127.0.0.1#5335 +ipset=/momhomeporn.com/gfwlist +server=/payppal.com/127.0.0.1#5335 +ipset=/payppal.com/gfwlist +server=/hqbabes.com/127.0.0.1#5335 +ipset=/hqbabes.com/gfwlist +server=/b-ok.cc/127.0.0.1#5335 +ipset=/b-ok.cc/gfwlist +server=/volvopenta.us/127.0.0.1#5335 +ipset=/volvopenta.us/gfwlist +server=/myfoxmaine.com/127.0.0.1#5335 +ipset=/myfoxmaine.com/gfwlist +server=/skyoceanrescue.com/127.0.0.1#5335 +ipset=/skyoceanrescue.com/gfwlist +server=/xiuren.org/127.0.0.1#5335 +ipset=/xiuren.org/gfwlist +server=/nurofen.com/127.0.0.1#5335 +ipset=/nurofen.com/gfwlist +server=/visacarddesignlab.com/127.0.0.1#5335 +ipset=/visacarddesignlab.com/gfwlist +server=/bmwiventures.com/127.0.0.1#5335 +ipset=/bmwiventures.com/gfwlist +server=/durexloveclub.com/127.0.0.1#5335 +ipset=/durexloveclub.com/gfwlist +server=/woolitecarpet.com/127.0.0.1#5335 +ipset=/woolitecarpet.com/gfwlist +server=/dump.xxx/127.0.0.1#5335 +ipset=/dump.xxx/gfwlist +server=/bmw-motorrad-service-inclusive.com/127.0.0.1#5335 +ipset=/bmw-motorrad-service-inclusive.com/gfwlist +server=/bingsandbox.com/127.0.0.1#5335 +ipset=/bingsandbox.com/gfwlist +server=/amateurwifetits.com/127.0.0.1#5335 +ipset=/amateurwifetits.com/gfwlist +server=/youtube.ro/127.0.0.1#5335 +ipset=/youtube.ro/gfwlist +server=/thieme-connect.de/127.0.0.1#5335 +ipset=/thieme-connect.de/gfwlist +server=/bestfreetube.xxx/127.0.0.1#5335 +ipset=/bestfreetube.xxx/gfwlist +server=/hothomemade.com/127.0.0.1#5335 +ipset=/hothomemade.com/gfwlist +server=/medone-education.thieme.com/127.0.0.1#5335 +ipset=/medone-education.thieme.com/gfwlist +server=/thomsonreuters.ru/127.0.0.1#5335 +ipset=/thomsonreuters.ru/gfwlist +server=/pearsonenespanol.com/127.0.0.1#5335 +ipset=/pearsonenespanol.com/gfwlist +server=/inasian.club/127.0.0.1#5335 +ipset=/inasian.club/gfwlist +server=/asianpornjav.com/127.0.0.1#5335 +ipset=/asianpornjav.com/gfwlist +server=/ebay.nl/127.0.0.1#5335 +ipset=/ebay.nl/gfwlist +server=/directtvdeals.tv/127.0.0.1#5335 +ipset=/directtvdeals.tv/gfwlist +server=/blogspot.si/127.0.0.1#5335 +ipset=/blogspot.si/gfwlist +server=/ed21.cc/127.0.0.1#5335 +ipset=/ed21.cc/gfwlist +server=/softether.org/127.0.0.1#5335 +ipset=/softether.org/gfwlist +server=/awseducate.org/127.0.0.1#5335 +ipset=/awseducate.org/gfwlist +server=/facebookmarketing.info/127.0.0.1#5335 +ipset=/facebookmarketing.info/gfwlist +server=/youtube.nl/127.0.0.1#5335 +ipset=/youtube.nl/gfwlist +server=/iqq2.cc/127.0.0.1#5335 +ipset=/iqq2.cc/gfwlist +server=/googlee.com/127.0.0.1#5335 +ipset=/googlee.com/gfwlist +server=/yahoo.me/127.0.0.1#5335 +ipset=/yahoo.me/gfwlist +server=/google.cg/127.0.0.1#5335 +ipset=/google.cg/gfwlist +server=/videojs.com/127.0.0.1#5335 +ipset=/videojs.com/gfwlist +server=/lobstertube.com/127.0.0.1#5335 +ipset=/lobstertube.com/gfwlist +server=/visa.com.kz/127.0.0.1#5335 +ipset=/visa.com.kz/gfwlist +server=/forthebadge.com/127.0.0.1#5335 +ipset=/forthebadge.com/gfwlist +server=/rfi.fr/127.0.0.1#5335 +ipset=/rfi.fr/gfwlist +server=/fuxporn.com/127.0.0.1#5335 +ipset=/fuxporn.com/gfwlist +server=/youtube.lu/127.0.0.1#5335 +ipset=/youtube.lu/gfwlist +server=/currently.com/127.0.0.1#5335 +ipset=/currently.com/gfwlist +server=/veetarabia.com/127.0.0.1#5335 +ipset=/veetarabia.com/gfwlist +server=/akamaietpphishingtest.com/127.0.0.1#5335 +ipset=/akamaietpphishingtest.com/gfwlist +server=/free-strip-games.com/127.0.0.1#5335 +ipset=/free-strip-games.com/gfwlist +server=/businessinsider.com.au/127.0.0.1#5335 +ipset=/businessinsider.com.au/gfwlist +server=/babesandstars.com/127.0.0.1#5335 +ipset=/babesandstars.com/gfwlist +server=/facebookpoker.info/127.0.0.1#5335 +ipset=/facebookpoker.info/gfwlist +server=/microsoft.lv/127.0.0.1#5335 +ipset=/microsoft.lv/gfwlist +server=/dazn.com/127.0.0.1#5335 +ipset=/dazn.com/gfwlist +server=/sony.lu/127.0.0.1#5335 +ipset=/sony.lu/gfwlist +server=/sinchew.my/127.0.0.1#5335 +ipset=/sinchew.my/gfwlist +server=/mastercard.com.hk/127.0.0.1#5335 +ipset=/mastercard.com.hk/gfwlist +server=/nintendo.ch/127.0.0.1#5335 +ipset=/nintendo.ch/gfwlist +server=/lge.com/127.0.0.1#5335 +ipset=/lge.com/gfwlist +server=/volvotrucks.com.bn/127.0.0.1#5335 +ipset=/volvotrucks.com.bn/gfwlist +server=/dartlang.org/127.0.0.1#5335 +ipset=/dartlang.org/gfwlist +server=/visa.com.bo/127.0.0.1#5335 +ipset=/visa.com.bo/gfwlist +server=/nudevietnam.com/127.0.0.1#5335 +ipset=/nudevietnam.com/gfwlist +server=/alt1-mtalk.google.com/127.0.0.1#5335 +ipset=/alt1-mtalk.google.com/gfwlist +server=/wikifeet.com/127.0.0.1#5335 +ipset=/wikifeet.com/gfwlist +server=/exec-appointments.com/127.0.0.1#5335 +ipset=/exec-appointments.com/gfwlist +server=/ladies.com/127.0.0.1#5335 +ipset=/ladies.com/gfwlist +server=/strepsilsarabia.com/127.0.0.1#5335 +ipset=/strepsilsarabia.com/gfwlist +server=/fuckup.xxx/127.0.0.1#5335 +ipset=/fuckup.xxx/gfwlist +server=/sexhubhd.com/127.0.0.1#5335 +ipset=/sexhubhd.com/gfwlist +server=/sexo123.net/127.0.0.1#5335 +ipset=/sexo123.net/gfwlist +server=/pankwire.com/127.0.0.1#5335 +ipset=/pankwire.com/gfwlist +server=/foxuv.com/127.0.0.1#5335 +ipset=/foxuv.com/gfwlist +server=/macruby.org/127.0.0.1#5335 +ipset=/macruby.org/gfwlist +server=/fortawesome.com/127.0.0.1#5335 +ipset=/fortawesome.com/gfwlist +server=/ikea.com.ua/127.0.0.1#5335 +ipset=/ikea.com.ua/gfwlist +server=/isheppc.com/127.0.0.1#5335 +ipset=/isheppc.com/gfwlist +server=/handjobcumvideos.com/127.0.0.1#5335 +ipset=/handjobcumvideos.com/gfwlist +server=/headphonesbeatsbydre.com/127.0.0.1#5335 +ipset=/headphonesbeatsbydre.com/gfwlist +server=/dronedj.com/127.0.0.1#5335 +ipset=/dronedj.com/gfwlist +server=/myrimmingporn.com/127.0.0.1#5335 +ipset=/myrimmingporn.com/gfwlist +server=/bmw-businessdrive.com/127.0.0.1#5335 +ipset=/bmw-businessdrive.com/gfwlist +server=/cybertrust.ne.jp/127.0.0.1#5335 +ipset=/cybertrust.ne.jp/gfwlist +server=/azurecosmosdb.net/127.0.0.1#5335 +ipset=/azurecosmosdb.net/gfwlist +server=/farfetch-apps.com/127.0.0.1#5335 +ipset=/farfetch-apps.com/gfwlist +server=/anybunny.tv/127.0.0.1#5335 +ipset=/anybunny.tv/gfwlist +server=/gfashion.com/127.0.0.1#5335 +ipset=/gfashion.com/gfwlist +server=/fanhaodian.com/127.0.0.1#5335 +ipset=/fanhaodian.com/gfwlist +server=/seqing.one/127.0.0.1#5335 +ipset=/seqing.one/gfwlist +server=/mypornstarbook.net/127.0.0.1#5335 +ipset=/mypornstarbook.net/gfwlist +server=/corepublishingsolutions.com/127.0.0.1#5335 +ipset=/corepublishingsolutions.com/gfwlist +server=/exgfvideos.xxx/127.0.0.1#5335 +ipset=/exgfvideos.xxx/gfwlist +server=/buycheapbeatsbydreshop.com/127.0.0.1#5335 +ipset=/buycheapbeatsbydreshop.com/gfwlist +server=/shopee.com.co/127.0.0.1#5335 +ipset=/shopee.com.co/gfwlist +server=/oxyporn.com/127.0.0.1#5335 +ipset=/oxyporn.com/gfwlist +server=/ebay-online.com/127.0.0.1#5335 +ipset=/ebay-online.com/gfwlist +server=/allover30.com/127.0.0.1#5335 +ipset=/allover30.com/gfwlist +server=/ieee-tems.org/127.0.0.1#5335 +ipset=/ieee-tems.org/gfwlist +server=/auntymaza.com/127.0.0.1#5335 +ipset=/auntymaza.com/gfwlist +server=/nomadlandmovie.ch/127.0.0.1#5335 +ipset=/nomadlandmovie.ch/gfwlist +server=/applemusic.co/127.0.0.1#5335 +ipset=/applemusic.co/gfwlist +server=/un.org/127.0.0.1#5335 +ipset=/un.org/gfwlist +server=/itunesmatch.com/127.0.0.1#5335 +ipset=/itunesmatch.com/gfwlist +server=/crossfitfirestone.com/127.0.0.1#5335 +ipset=/crossfitfirestone.com/gfwlist +server=/intel.fi/127.0.0.1#5335 +ipset=/intel.fi/gfwlist +server=/xdir.vip/127.0.0.1#5335 +ipset=/xdir.vip/gfwlist +server=/paypalinc.com/127.0.0.1#5335 +ipset=/paypalinc.com/gfwlist +server=/mastercard.ae/127.0.0.1#5335 +ipset=/mastercard.ae/gfwlist +server=/mcd.com/127.0.0.1#5335 +ipset=/mcd.com/gfwlist +server=/babesmachine.com/127.0.0.1#5335 +ipset=/babesmachine.com/gfwlist +server=/xgroovy.com/127.0.0.1#5335 +ipset=/xgroovy.com/gfwlist +server=/hairydivas.com/127.0.0.1#5335 +ipset=/hairydivas.com/gfwlist +server=/applescript.info/127.0.0.1#5335 +ipset=/applescript.info/gfwlist +server=/pixhost.to/127.0.0.1#5335 +ipset=/pixhost.to/gfwlist +server=/yomilogi.com/127.0.0.1#5335 +ipset=/yomilogi.com/gfwlist +server=/polymer-project.org/127.0.0.1#5335 +ipset=/polymer-project.org/gfwlist +server=/crystalgunnsworld.com/127.0.0.1#5335 +ipset=/crystalgunnsworld.com/gfwlist +server=/xxgasm.com/127.0.0.1#5335 +ipset=/xxgasm.com/gfwlist +server=/indiancolleges.com/127.0.0.1#5335 +ipset=/indiancolleges.com/gfwlist +server=/clubsweethearts.com/127.0.0.1#5335 +ipset=/clubsweethearts.com/gfwlist +server=/bmw-connecteddrive.cz/127.0.0.1#5335 +ipset=/bmw-connecteddrive.cz/gfwlist +server=/webmproject.org/127.0.0.1#5335 +ipset=/webmproject.org/gfwlist +server=/frontiersin.org/127.0.0.1#5335 +ipset=/frontiersin.org/gfwlist +server=/seiron-sankei.com/127.0.0.1#5335 +ipset=/seiron-sankei.com/gfwlist +server=/microsoft.ru/127.0.0.1#5335 +ipset=/microsoft.ru/gfwlist +server=/ipad.wang/127.0.0.1#5335 +ipset=/ipad.wang/gfwlist +server=/coupangcdn.com/127.0.0.1#5335 +ipset=/coupangcdn.com/gfwlist +server=/translatewiki.net/127.0.0.1#5335 +ipset=/translatewiki.net/gfwlist +server=/minimarkham.ca/127.0.0.1#5335 +ipset=/minimarkham.ca/gfwlist +server=/initproducts.com/127.0.0.1#5335 +ipset=/initproducts.com/gfwlist +server=/windowsphone-int.com/127.0.0.1#5335 +ipset=/windowsphone-int.com/gfwlist +server=/wish.com/127.0.0.1#5335 +ipset=/wish.com/gfwlist +server=/babes34.pro/127.0.0.1#5335 +ipset=/babes34.pro/gfwlist +server=/visualstudio-staging.com/127.0.0.1#5335 +ipset=/visualstudio-staging.com/gfwlist +server=/omg.blog/127.0.0.1#5335 +ipset=/omg.blog/gfwlist +server=/pornexpress.net/127.0.0.1#5335 +ipset=/pornexpress.net/gfwlist +server=/whatisworkspaceone.com/127.0.0.1#5335 +ipset=/whatisworkspaceone.com/gfwlist +server=/monsterbeats-solo.com/127.0.0.1#5335 +ipset=/monsterbeats-solo.com/gfwlist +server=/vercel.blog/127.0.0.1#5335 +ipset=/vercel.blog/gfwlist +server=/alpherafinancialservices.es/127.0.0.1#5335 +ipset=/alpherafinancialservices.es/gfwlist +server=/tig-ol-bitties.live/127.0.0.1#5335 +ipset=/tig-ol-bitties.live/gfwlist +server=/epochtimes.com/127.0.0.1#5335 +ipset=/epochtimes.com/gfwlist +server=/yahoo.la/127.0.0.1#5335 +ipset=/yahoo.la/gfwlist +server=/fox4news.com/127.0.0.1#5335 +ipset=/fox4news.com/gfwlist +server=/poshtestgallery.cloudapp.net/127.0.0.1#5335 +ipset=/poshtestgallery.cloudapp.net/gfwlist +server=/sony.ua/127.0.0.1#5335 +ipset=/sony.ua/gfwlist +server=/modeloswebcambogota.com/127.0.0.1#5335 +ipset=/modeloswebcambogota.com/gfwlist +server=/drebeatshome.com/127.0.0.1#5335 +ipset=/drebeatshome.com/gfwlist +server=/babesaround.com/127.0.0.1#5335 +ipset=/babesaround.com/gfwlist +server=/jav2be.com/127.0.0.1#5335 +ipset=/jav2be.com/gfwlist +server=/tiava.com/127.0.0.1#5335 +ipset=/tiava.com/gfwlist +server=/scholar.google.co.cr/127.0.0.1#5335 +ipset=/scholar.google.co.cr/gfwlist +server=/erolabs.com/127.0.0.1#5335 +ipset=/erolabs.com/gfwlist +server=/handbagsoutletebay.com/127.0.0.1#5335 +ipset=/handbagsoutletebay.com/gfwlist +server=/ebay-stories.com/127.0.0.1#5335 +ipset=/ebay-stories.com/gfwlist +server=/bestbuygsm.com/127.0.0.1#5335 +ipset=/bestbuygsm.com/gfwlist +server=/builtfromebay.com/127.0.0.1#5335 +ipset=/builtfromebay.com/gfwlist +server=/dishworld.com/127.0.0.1#5335 +ipset=/dishworld.com/gfwlist +server=/reckittbenckiser.tv/127.0.0.1#5335 +ipset=/reckittbenckiser.tv/gfwlist +server=/amazonstudiosguilds.com/127.0.0.1#5335 +ipset=/amazonstudiosguilds.com/gfwlist +server=/monotypeimaging.com/127.0.0.1#5335 +ipset=/monotypeimaging.com/gfwlist +server=/freepornvideos.life/127.0.0.1#5335 +ipset=/freepornvideos.life/gfwlist +server=/godoc.org/127.0.0.1#5335 +ipset=/godoc.org/gfwlist +server=/chromecast.com/127.0.0.1#5335 +ipset=/chromecast.com/gfwlist +server=/instachecker.com/127.0.0.1#5335 +ipset=/instachecker.com/gfwlist +server=/crazyxxx3dworld.com/127.0.0.1#5335 +ipset=/crazyxxx3dworld.com/gfwlist +server=/coqnu.com/127.0.0.1#5335 +ipset=/coqnu.com/gfwlist +server=/ebscohost.com/127.0.0.1#5335 +ipset=/ebscohost.com/gfwlist +server=/cuckvideos.com/127.0.0.1#5335 +ipset=/cuckvideos.com/gfwlist +server=/asn-online.org/127.0.0.1#5335 +ipset=/asn-online.org/gfwlist +server=/appleone.website/127.0.0.1#5335 +ipset=/appleone.website/gfwlist +server=/theweek.in/127.0.0.1#5335 +ipset=/theweek.in/gfwlist +server=/jijiji.ca/127.0.0.1#5335 +ipset=/jijiji.ca/gfwlist +server=/disney.be/127.0.0.1#5335 +ipset=/disney.be/gfwlist +server=/intel.lt/127.0.0.1#5335 +ipset=/intel.lt/gfwlist +server=/voalingala.com/127.0.0.1#5335 +ipset=/voalingala.com/gfwlist +server=/paypaal.com/127.0.0.1#5335 +ipset=/paypaal.com/gfwlist +server=/thestationbymaker.com/127.0.0.1#5335 +ipset=/thestationbymaker.com/gfwlist +server=/adult3dcomics.com/127.0.0.1#5335 +ipset=/adult3dcomics.com/gfwlist +server=/bridgestone.com.tw/127.0.0.1#5335 +ipset=/bridgestone.com.tw/gfwlist +server=/ww9094.com/127.0.0.1#5335 +ipset=/ww9094.com/gfwlist +server=/needforspeeddriftkings.com/127.0.0.1#5335 +ipset=/needforspeeddriftkings.com/gfwlist +server=/tubegalore.com/127.0.0.1#5335 +ipset=/tubegalore.com/gfwlist +server=/svoboda.org/127.0.0.1#5335 +ipset=/svoboda.org/gfwlist +server=/video-one.com/127.0.0.1#5335 +ipset=/video-one.com/gfwlist +server=/javout.co/127.0.0.1#5335 +ipset=/javout.co/gfwlist +server=/mdn.mozit.cloud/127.0.0.1#5335 +ipset=/mdn.mozit.cloud/gfwlist +server=/fljmh1.com/127.0.0.1#5335 +ipset=/fljmh1.com/gfwlist +server=/huloo.tv/127.0.0.1#5335 +ipset=/huloo.tv/gfwlist +server=/av01.tv/127.0.0.1#5335 +ipset=/av01.tv/gfwlist +server=/cnn.io/127.0.0.1#5335 +ipset=/cnn.io/gfwlist +server=/dubaihotties.org/127.0.0.1#5335 +ipset=/dubaihotties.org/gfwlist +server=/wixanswers.com/127.0.0.1#5335 +ipset=/wixanswers.com/gfwlist +server=/chargenow.com/127.0.0.1#5335 +ipset=/chargenow.com/gfwlist +server=/realclearinvestigations.com/127.0.0.1#5335 +ipset=/realclearinvestigations.com/gfwlist +server=/myporno.cz/127.0.0.1#5335 +ipset=/myporno.cz/gfwlist +server=/nvidia.es/127.0.0.1#5335 +ipset=/nvidia.es/gfwlist +server=/ikea.mx/127.0.0.1#5335 +ipset=/ikea.mx/gfwlist +server=/xnxxcom.club/127.0.0.1#5335 +ipset=/xnxxcom.club/gfwlist +server=/cuckfilmswifefuck.com/127.0.0.1#5335 +ipset=/cuckfilmswifefuck.com/gfwlist +server=/sarajevopodopsadom.com/127.0.0.1#5335 +ipset=/sarajevopodopsadom.com/gfwlist +server=/googletraveladservices.com/127.0.0.1#5335 +ipset=/googletraveladservices.com/gfwlist +server=/onlyiphone5case.com/127.0.0.1#5335 +ipset=/onlyiphone5case.com/gfwlist +server=/pp6.info/127.0.0.1#5335 +ipset=/pp6.info/gfwlist +server=/bodgirls.com/127.0.0.1#5335 +ipset=/bodgirls.com/gfwlist +server=/xvideosjingxiang.com/127.0.0.1#5335 +ipset=/xvideosjingxiang.com/gfwlist +server=/intel.sn/127.0.0.1#5335 +ipset=/intel.sn/gfwlist +server=/desiresecrets.com/127.0.0.1#5335 +ipset=/desiresecrets.com/gfwlist +server=/ebayvakantiehuizen.com/127.0.0.1#5335 +ipset=/ebayvakantiehuizen.com/gfwlist +server=/binance.info/127.0.0.1#5335 +ipset=/binance.info/gfwlist +server=/nodejs.org/127.0.0.1#5335 +ipset=/nodejs.org/gfwlist +server=/celebsroulette.com/127.0.0.1#5335 +ipset=/celebsroulette.com/gfwlist +server=/daboja18.com/127.0.0.1#5335 +ipset=/daboja18.com/gfwlist +server=/scholar.google.com.pk/127.0.0.1#5335 +ipset=/scholar.google.com.pk/gfwlist +server=/hentaipornonly.com/127.0.0.1#5335 +ipset=/hentaipornonly.com/gfwlist +server=/miniso.co.tz/127.0.0.1#5335 +ipset=/miniso.co.tz/gfwlist +server=/sex-amateur-clips.com/127.0.0.1#5335 +ipset=/sex-amateur-clips.com/gfwlist +server=/microsoft.com/127.0.0.1#5335 +ipset=/microsoft.com/gfwlist +server=/erolabs.net/127.0.0.1#5335 +ipset=/erolabs.net/gfwlist +server=/the-m-festival.com/127.0.0.1#5335 +ipset=/the-m-festival.com/gfwlist +server=/osmfoundation.org/127.0.0.1#5335 +ipset=/osmfoundation.org/gfwlist +server=/paypal-communications.net/127.0.0.1#5335 +ipset=/paypal-communications.net/gfwlist +server=/scoop.sh/127.0.0.1#5335 +ipset=/scoop.sh/gfwlist +server=/9hentaiz.com/127.0.0.1#5335 +ipset=/9hentaiz.com/gfwlist +server=/sankei-digital.co.jp/127.0.0.1#5335 +ipset=/sankei-digital.co.jp/gfwlist +server=/ap.org/127.0.0.1#5335 +ipset=/ap.org/gfwlist +server=/nijioma.blog/127.0.0.1#5335 +ipset=/nijioma.blog/gfwlist +server=/xxx-porn-tube.com/127.0.0.1#5335 +ipset=/xxx-porn-tube.com/gfwlist +server=/oxfordpoliticstrove.com/127.0.0.1#5335 +ipset=/oxfordpoliticstrove.com/gfwlist +server=/mini.cz/127.0.0.1#5335 +ipset=/mini.cz/gfwlist +server=/homemadeamateur.com/127.0.0.1#5335 +ipset=/homemadeamateur.com/gfwlist +server=/electrek.co/127.0.0.1#5335 +ipset=/electrek.co/gfwlist +server=/bridgestone.co.in/127.0.0.1#5335 +ipset=/bridgestone.co.in/gfwlist +server=/paypalonline.net/127.0.0.1#5335 +ipset=/paypalonline.net/gfwlist +server=/pchomepay.com.tw/127.0.0.1#5335 +ipset=/pchomepay.com.tw/gfwlist +server=/ebayclassifieds.com/127.0.0.1#5335 +ipset=/ebayclassifieds.com/gfwlist +server=/akamaizercentral.com/127.0.0.1#5335 +ipset=/akamaizercentral.com/gfwlist +server=/youtube.com.om/127.0.0.1#5335 +ipset=/youtube.com.om/gfwlist +server=/monsterbeatsdrdrecheap.com/127.0.0.1#5335 +ipset=/monsterbeatsdrdrecheap.com/gfwlist +server=/mobilefacebook.com/127.0.0.1#5335 +ipset=/mobilefacebook.com/gfwlist +server=/intel.dk/127.0.0.1#5335 +ipset=/intel.dk/gfwlist +server=/pururin.to/127.0.0.1#5335 +ipset=/pururin.to/gfwlist +server=/javmodel.com/127.0.0.1#5335 +ipset=/javmodel.com/gfwlist +server=/doceapower.com/127.0.0.1#5335 +ipset=/doceapower.com/gfwlist +server=/eroticart-top100.com/127.0.0.1#5335 +ipset=/eroticart-top100.com/gfwlist +server=/miniyaletown.ca/127.0.0.1#5335 +ipset=/miniyaletown.ca/gfwlist +server=/volvotrucks.de/127.0.0.1#5335 +ipset=/volvotrucks.de/gfwlist +server=/alibabacloud.com.hk/127.0.0.1#5335 +ipset=/alibabacloud.com.hk/gfwlist +server=/ahpornogratuit.com/127.0.0.1#5335 +ipset=/ahpornogratuit.com/gfwlist +server=/applefinalcutproworld.org/127.0.0.1#5335 +ipset=/applefinalcutproworld.org/gfwlist +server=/tubebdsm.com/127.0.0.1#5335 +ipset=/tubebdsm.com/gfwlist +server=/worldcoinpay.com/127.0.0.1#5335 +ipset=/worldcoinpay.com/gfwlist +server=/nikeitalia.com/127.0.0.1#5335 +ipset=/nikeitalia.com/gfwlist +server=/moapi1.club/127.0.0.1#5335 +ipset=/moapi1.club/gfwlist +server=/ieeecss.org/127.0.0.1#5335 +ipset=/ieeecss.org/gfwlist +server=/xujan.com/127.0.0.1#5335 +ipset=/xujan.com/gfwlist +server=/wwe.com/127.0.0.1#5335 +ipset=/wwe.com/gfwlist +server=/cbsig.net/127.0.0.1#5335 +ipset=/cbsig.net/gfwlist +server=/fusker.xxx/127.0.0.1#5335 +ipset=/fusker.xxx/gfwlist +server=/neurology.org/127.0.0.1#5335 +ipset=/neurology.org/gfwlist +server=/0dzn.com/127.0.0.1#5335 +ipset=/0dzn.com/gfwlist +server=/thinkwithgoogle.com/127.0.0.1#5335 +ipset=/thinkwithgoogle.com/gfwlist +server=/friendfeed-api.com/127.0.0.1#5335 +ipset=/friendfeed-api.com/gfwlist +server=/masalaseen.net/127.0.0.1#5335 +ipset=/masalaseen.net/gfwlist +server=/thegay.com/127.0.0.1#5335 +ipset=/thegay.com/gfwlist +server=/careerjournal.com/127.0.0.1#5335 +ipset=/careerjournal.com/gfwlist +server=/sensualmothers.com/127.0.0.1#5335 +ipset=/sensualmothers.com/gfwlist +server=/beatselectronics.com/127.0.0.1#5335 +ipset=/beatselectronics.com/gfwlist +server=/buymeacoffee.com/127.0.0.1#5335 +ipset=/buymeacoffee.com/gfwlist +server=/bloombergview.com/127.0.0.1#5335 +ipset=/bloombergview.com/gfwlist +server=/duckduckgo.co.uk/127.0.0.1#5335 +ipset=/duckduckgo.co.uk/gfwlist +server=/gettyimages.co.uk/127.0.0.1#5335 +ipset=/gettyimages.co.uk/gfwlist +server=/h528.com/127.0.0.1#5335 +ipset=/h528.com/gfwlist +server=/skebetter.com/127.0.0.1#5335 +ipset=/skebetter.com/gfwlist +server=/beatsbydremall2013.com/127.0.0.1#5335 +ipset=/beatsbydremall2013.com/gfwlist +server=/link69.com/127.0.0.1#5335 +ipset=/link69.com/gfwlist +server=/freenetproject.org/127.0.0.1#5335 +ipset=/freenetproject.org/gfwlist +server=/certsign.ro/127.0.0.1#5335 +ipset=/certsign.ro/gfwlist +server=/asakonet.co.jp/127.0.0.1#5335 +ipset=/asakonet.co.jp/gfwlist +server=/blogspot.jp/127.0.0.1#5335 +ipset=/blogspot.jp/gfwlist +server=/desire-xx.supertop-100.com/127.0.0.1#5335 +ipset=/desire-xx.supertop-100.com/gfwlist +server=/sshs.xyz/127.0.0.1#5335 +ipset=/sshs.xyz/gfwlist +server=/porm.club/127.0.0.1#5335 +ipset=/porm.club/gfwlist +server=/cheap-beatsbydre.com/127.0.0.1#5335 +ipset=/cheap-beatsbydre.com/gfwlist +server=/2lib.org/127.0.0.1#5335 +ipset=/2lib.org/gfwlist +server=/hu1u.com/127.0.0.1#5335 +ipset=/hu1u.com/gfwlist +server=/taptotokyo.com/127.0.0.1#5335 +ipset=/taptotokyo.com/gfwlist +server=/actalis.com/127.0.0.1#5335 +ipset=/actalis.com/gfwlist +server=/bootysource.com/127.0.0.1#5335 +ipset=/bootysource.com/gfwlist +server=/teen-sexy.com/127.0.0.1#5335 +ipset=/teen-sexy.com/gfwlist +server=/dettol.be/127.0.0.1#5335 +ipset=/dettol.be/gfwlist +server=/doujins.com/127.0.0.1#5335 +ipset=/doujins.com/gfwlist +server=/midentsolutions.com/127.0.0.1#5335 +ipset=/midentsolutions.com/gfwlist +server=/bmw.co.ke/127.0.0.1#5335 +ipset=/bmw.co.ke/gfwlist +server=/xvideos-xxxx.com/127.0.0.1#5335 +ipset=/xvideos-xxxx.com/gfwlist +server=/sharpdaily.tw/127.0.0.1#5335 +ipset=/sharpdaily.tw/gfwlist +server=/thekarups.com/127.0.0.1#5335 +ipset=/thekarups.com/gfwlist +server=/4gtv.tv/127.0.0.1#5335 +ipset=/4gtv.tv/gfwlist +server=/amateurhousewifefuck.com/127.0.0.1#5335 +ipset=/amateurhousewifefuck.com/gfwlist +server=/beatsbydrefr.com/127.0.0.1#5335 +ipset=/beatsbydrefr.com/gfwlist +server=/8kpornvids.com/127.0.0.1#5335 +ipset=/8kpornvids.com/gfwlist +server=/theebayshop.com/127.0.0.1#5335 +ipset=/theebayshop.com/gfwlist +server=/visa.com.az/127.0.0.1#5335 +ipset=/visa.com.az/gfwlist +server=/nanonamad.com/127.0.0.1#5335 +ipset=/nanonamad.com/gfwlist +server=/onlineapplestore.com/127.0.0.1#5335 +ipset=/onlineapplestore.com/gfwlist +server=/amateurswingersmovies.com/127.0.0.1#5335 +ipset=/amateurswingersmovies.com/gfwlist +server=/paygonline.com/127.0.0.1#5335 +ipset=/paygonline.com/gfwlist +server=/rbdigitallab.com/127.0.0.1#5335 +ipset=/rbdigitallab.com/gfwlist +server=/yahoo.pl/127.0.0.1#5335 +ipset=/yahoo.pl/gfwlist +server=/adidas.com.sa/127.0.0.1#5335 +ipset=/adidas.com.sa/gfwlist +server=/oxfordfirstsource.com/127.0.0.1#5335 +ipset=/oxfordfirstsource.com/gfwlist +server=/facebookconnect.com/127.0.0.1#5335 +ipset=/facebookconnect.com/gfwlist +server=/thepornbest.com/127.0.0.1#5335 +ipset=/thepornbest.com/gfwlist +server=/disneymagicmoments.de/127.0.0.1#5335 +ipset=/disneymagicmoments.de/gfwlist +server=/bbycontent.com/127.0.0.1#5335 +ipset=/bbycontent.com/gfwlist +server=/bethesdagamestudios.com/127.0.0.1#5335 +ipset=/bethesdagamestudios.com/gfwlist +server=/uflash.tv/127.0.0.1#5335 +ipset=/uflash.tv/gfwlist +server=/slack-msgs.com/127.0.0.1#5335 +ipset=/slack-msgs.com/gfwlist +server=/youtube.sn/127.0.0.1#5335 +ipset=/youtube.sn/gfwlist +server=/blink.org/127.0.0.1#5335 +ipset=/blink.org/gfwlist +server=/googlestore.com/127.0.0.1#5335 +ipset=/googlestore.com/gfwlist +server=/av69.us/127.0.0.1#5335 +ipset=/av69.us/gfwlist +server=/trustdoc.ch/127.0.0.1#5335 +ipset=/trustdoc.ch/gfwlist +server=/nvidia.ru/127.0.0.1#5335 +ipset=/nvidia.ru/gfwlist +server=/likeseiyu.com/127.0.0.1#5335 +ipset=/likeseiyu.com/gfwlist +server=/libgen.rs/127.0.0.1#5335 +ipset=/libgen.rs/gfwlist +server=/peachy18.com/127.0.0.1#5335 +ipset=/peachy18.com/gfwlist +server=/selfloversworld.com/127.0.0.1#5335 +ipset=/selfloversworld.com/gfwlist +server=/videos4sale.com/127.0.0.1#5335 +ipset=/videos4sale.com/gfwlist +server=/minioakville.com/127.0.0.1#5335 +ipset=/minioakville.com/gfwlist +server=/bili888.com/127.0.0.1#5335 +ipset=/bili888.com/gfwlist +server=/ieee-ecce.org/127.0.0.1#5335 +ipset=/ieee-ecce.org/gfwlist +server=/dettol.co.nz/127.0.0.1#5335 +ipset=/dettol.co.nz/gfwlist +server=/gitstar.net/127.0.0.1#5335 +ipset=/gitstar.net/gfwlist +server=/eff.org/127.0.0.1#5335 +ipset=/eff.org/gfwlist +server=/faceboom.com/127.0.0.1#5335 +ipset=/faceboom.com/gfwlist +server=/cartoonregistry.com/127.0.0.1#5335 +ipset=/cartoonregistry.com/gfwlist +server=/nintendo.ru/127.0.0.1#5335 +ipset=/nintendo.ru/gfwlist +server=/makebettercode.com/127.0.0.1#5335 +ipset=/makebettercode.com/gfwlist +server=/veet.se/127.0.0.1#5335 +ipset=/veet.se/gfwlist +server=/fox6now.com/127.0.0.1#5335 +ipset=/fox6now.com/gfwlist +server=/archivx.to/127.0.0.1#5335 +ipset=/archivx.to/gfwlist +server=/thegayoffice.com/127.0.0.1#5335 +ipset=/thegayoffice.com/gfwlist +server=/aaagradeheadphones.com/127.0.0.1#5335 +ipset=/aaagradeheadphones.com/gfwlist +server=/discordmerch.com/127.0.0.1#5335 +ipset=/discordmerch.com/gfwlist +server=/blogspot.kr/127.0.0.1#5335 +ipset=/blogspot.kr/gfwlist +server=/truyenhentai.xyz/127.0.0.1#5335 +ipset=/truyenhentai.xyz/gfwlist +server=/vk.cc/127.0.0.1#5335 +ipset=/vk.cc/gfwlist +server=/dailyporn.club/127.0.0.1#5335 +ipset=/dailyporn.club/gfwlist +server=/braeburncapital.com/127.0.0.1#5335 +ipset=/braeburncapital.com/gfwlist +server=/fbrell.com/127.0.0.1#5335 +ipset=/fbrell.com/gfwlist +server=/amateurpornsexvideos.com/127.0.0.1#5335 +ipset=/amateurpornsexvideos.com/gfwlist +server=/blogspot.se/127.0.0.1#5335 +ipset=/blogspot.se/gfwlist +server=/uun93.com/127.0.0.1#5335 +ipset=/uun93.com/gfwlist +server=/zaobao.com/127.0.0.1#5335 +ipset=/zaobao.com/gfwlist +server=/buyoculus.com/127.0.0.1#5335 +ipset=/buyoculus.com/gfwlist +server=/bmwstep.com/127.0.0.1#5335 +ipset=/bmwstep.com/gfwlist +server=/greatretroporn.com/127.0.0.1#5335 +ipset=/greatretroporn.com/gfwlist +server=/bravotube.net/127.0.0.1#5335 +ipset=/bravotube.net/gfwlist +server=/hanime.me/127.0.0.1#5335 +ipset=/hanime.me/gfwlist +server=/jobmarket.com.hk/127.0.0.1#5335 +ipset=/jobmarket.com.hk/gfwlist +server=/applefruity.com/127.0.0.1#5335 +ipset=/applefruity.com/gfwlist +server=/visa.hu/127.0.0.1#5335 +ipset=/visa.hu/gfwlist +server=/videoskaseros.com/127.0.0.1#5335 +ipset=/videoskaseros.com/gfwlist +server=/paypalcommunity.net/127.0.0.1#5335 +ipset=/paypalcommunity.net/gfwlist +server=/paypal-viewpoints.net/127.0.0.1#5335 +ipset=/paypal-viewpoints.net/gfwlist +server=/newdrediscount.com/127.0.0.1#5335 +ipset=/newdrediscount.com/gfwlist +server=/pchomeonline.com.tw/127.0.0.1#5335 +ipset=/pchomeonline.com.tw/gfwlist +server=/gog.com/127.0.0.1#5335 +ipset=/gog.com/gfwlist +server=/akamaietpmalwaretest.com/127.0.0.1#5335 +ipset=/akamaietpmalwaretest.com/gfwlist +server=/volvotrucks.hu/127.0.0.1#5335 +ipset=/volvotrucks.hu/gfwlist +server=/blogspot.cv/127.0.0.1#5335 +ipset=/blogspot.cv/gfwlist +server=/festinhasbrasil.com/127.0.0.1#5335 +ipset=/festinhasbrasil.com/gfwlist +server=/miniso.ua/127.0.0.1#5335 +ipset=/miniso.ua/gfwlist +server=/adidas.co.uk/127.0.0.1#5335 +ipset=/adidas.co.uk/gfwlist +server=/instangram.com/127.0.0.1#5335 +ipset=/instangram.com/gfwlist +server=/bestpornsites.guide/127.0.0.1#5335 +ipset=/bestpornsites.guide/gfwlist +server=/internet.org/127.0.0.1#5335 +ipset=/internet.org/gfwlist +server=/besthandjobporn.com/127.0.0.1#5335 +ipset=/besthandjobporn.com/gfwlist +server=/ikea.sa/127.0.0.1#5335 +ipset=/ikea.sa/gfwlist +server=/housing.com/127.0.0.1#5335 +ipset=/housing.com/gfwlist +server=/nudebeachpussy.com/127.0.0.1#5335 +ipset=/nudebeachpussy.com/gfwlist +server=/intel.bh/127.0.0.1#5335 +ipset=/intel.bh/gfwlist +server=/microsoft.cat/127.0.0.1#5335 +ipset=/microsoft.cat/gfwlist +server=/pvue1.com/127.0.0.1#5335 +ipset=/pvue1.com/gfwlist +server=/thomsonreuters.co.nz/127.0.0.1#5335 +ipset=/thomsonreuters.co.nz/gfwlist +server=/ebay.in/127.0.0.1#5335 +ipset=/ebay.in/gfwlist +server=/s8ds5gfm.xyz/127.0.0.1#5335 +ipset=/s8ds5gfm.xyz/gfwlist +server=/minimontroyal.ca/127.0.0.1#5335 +ipset=/minimontroyal.ca/gfwlist +server=/usvimosquitoproject.com/127.0.0.1#5335 +ipset=/usvimosquitoproject.com/gfwlist +server=/bmw-connecteddrive.lv/127.0.0.1#5335 +ipset=/bmw-connecteddrive.lv/gfwlist +server=/firestonedrivestore.com/127.0.0.1#5335 +ipset=/firestonedrivestore.com/gfwlist +server=/miniso-np.com/127.0.0.1#5335 +ipset=/miniso-np.com/gfwlist +server=/xxxv.mobi/127.0.0.1#5335 +ipset=/xxxv.mobi/gfwlist +server=/enteentegeh.de/127.0.0.1#5335 +ipset=/enteentegeh.de/gfwlist +server=/homefuckingmovies.com/127.0.0.1#5335 +ipset=/homefuckingmovies.com/gfwlist +server=/casquebeatsenligne.com/127.0.0.1#5335 +ipset=/casquebeatsenligne.com/gfwlist +server=/playcover.io/127.0.0.1#5335 +ipset=/playcover.io/gfwlist +server=/battlebreakers.com/127.0.0.1#5335 +ipset=/battlebreakers.com/gfwlist +server=/pornos.live/127.0.0.1#5335 +ipset=/pornos.live/gfwlist +server=/vrsexgames.biz/127.0.0.1#5335 +ipset=/vrsexgames.biz/gfwlist +server=/onenote.net/127.0.0.1#5335 +ipset=/onenote.net/gfwlist +server=/oldhornymilfs.com/127.0.0.1#5335 +ipset=/oldhornymilfs.com/gfwlist +server=/ok.xxx/127.0.0.1#5335 +ipset=/ok.xxx/gfwlist +server=/paypal-login.us/127.0.0.1#5335 +ipset=/paypal-login.us/gfwlist +server=/bing.com/127.0.0.1#5335 +ipset=/bing.com/gfwlist +server=/desktopmovies.org/127.0.0.1#5335 +ipset=/desktopmovies.org/gfwlist +server=/facebookcredits.info/127.0.0.1#5335 +ipset=/facebookcredits.info/gfwlist +server=/nab.com.au/127.0.0.1#5335 +ipset=/nab.com.au/gfwlist +server=/applestore.me/127.0.0.1#5335 +ipset=/applestore.me/gfwlist +server=/gravatar.com/127.0.0.1#5335 +ipset=/gravatar.com/gfwlist +server=/farfetch.com/127.0.0.1#5335 +ipset=/farfetch.com/gfwlist +server=/giantessbooru.com/127.0.0.1#5335 +ipset=/giantessbooru.com/gfwlist +server=/920share.com/127.0.0.1#5335 +ipset=/920share.com/gfwlist +server=/intel.co.jp/127.0.0.1#5335 +ipset=/intel.co.jp/gfwlist +server=/persianepochtimes.com/127.0.0.1#5335 +ipset=/persianepochtimes.com/gfwlist +server=/ync.ne.jp/127.0.0.1#5335 +ipset=/ync.ne.jp/gfwlist +server=/mybestbuyclaims.com/127.0.0.1#5335 +ipset=/mybestbuyclaims.com/gfwlist +server=/gsrc.io/127.0.0.1#5335 +ipset=/gsrc.io/gfwlist +server=/paypalnetwork.net/127.0.0.1#5335 +ipset=/paypalnetwork.net/gfwlist +server=/intel.ng/127.0.0.1#5335 +ipset=/intel.ng/gfwlist +server=/powerbi.com/127.0.0.1#5335 +ipset=/powerbi.com/gfwlist +server=/httpfacebook.com/127.0.0.1#5335 +ipset=/httpfacebook.com/gfwlist +server=/beatsbydresale-uk.com/127.0.0.1#5335 +ipset=/beatsbydresale-uk.com/gfwlist +server=/lolita.bet/127.0.0.1#5335 +ipset=/lolita.bet/gfwlist +server=/applfe.com/127.0.0.1#5335 +ipset=/applfe.com/gfwlist +server=/bmw.com.kh/127.0.0.1#5335 +ipset=/bmw.com.kh/gfwlist +server=/jsdelivr.net/127.0.0.1#5335 +ipset=/jsdelivr.net/gfwlist +server=/pornmovies2.me/127.0.0.1#5335 +ipset=/pornmovies2.me/gfwlist +server=/youtube.com.ve/127.0.0.1#5335 +ipset=/youtube.com.ve/gfwlist +server=/a-teenz.com/127.0.0.1#5335 +ipset=/a-teenz.com/gfwlist +server=/whatsapp-plus.me/127.0.0.1#5335 +ipset=/whatsapp-plus.me/gfwlist +server=/nikeshoes-store.com/127.0.0.1#5335 +ipset=/nikeshoes-store.com/gfwlist +server=/scat-japan.com/127.0.0.1#5335 +ipset=/scat-japan.com/gfwlist +server=/nvidia.ro/127.0.0.1#5335 +ipset=/nvidia.ro/gfwlist +server=/saffrontech.com/127.0.0.1#5335 +ipset=/saffrontech.com/gfwlist +server=/appleworldwidedeveloper.sc.omtrdc.net/127.0.0.1#5335 +ipset=/appleworldwidedeveloper.sc.omtrdc.net/gfwlist +server=/puretaboo.com/127.0.0.1#5335 +ipset=/puretaboo.com/gfwlist +server=/bustyarianna.com/127.0.0.1#5335 +ipset=/bustyarianna.com/gfwlist +server=/freindfeed.com/127.0.0.1#5335 +ipset=/freindfeed.com/gfwlist +server=/avstar1.com/127.0.0.1#5335 +ipset=/avstar1.com/gfwlist +server=/ieee-npss.org/127.0.0.1#5335 +ipset=/ieee-npss.org/gfwlist +server=/intel.co.uk/127.0.0.1#5335 +ipset=/intel.co.uk/gfwlist +server=/intel.ec/127.0.0.1#5335 +ipset=/intel.ec/gfwlist +server=/pornocd.ru/127.0.0.1#5335 +ipset=/pornocd.ru/gfwlist +server=/pokemonwifi.net/127.0.0.1#5335 +ipset=/pokemonwifi.net/gfwlist +server=/blogspot.com.mt/127.0.0.1#5335 +ipset=/blogspot.com.mt/gfwlist +server=/hentairules.net/127.0.0.1#5335 +ipset=/hentairules.net/gfwlist +server=/duckduckgo.mx/127.0.0.1#5335 +ipset=/duckduckgo.mx/gfwlist +server=/hp-printing.com/127.0.0.1#5335 +ipset=/hp-printing.com/gfwlist +server=/da-files.com/127.0.0.1#5335 +ipset=/da-files.com/gfwlist +server=/ieee-ras.org/127.0.0.1#5335 +ipset=/ieee-ras.org/gfwlist +server=/canada-beatsbydre.com/127.0.0.1#5335 +ipset=/canada-beatsbydre.com/gfwlist +server=/ftadviser.com/127.0.0.1#5335 +ipset=/ftadviser.com/gfwlist +server=/mini.sk/127.0.0.1#5335 +ipset=/mini.sk/gfwlist +server=/velocloud.com/127.0.0.1#5335 +ipset=/velocloud.com/gfwlist +server=/donttrack.us/127.0.0.1#5335 +ipset=/donttrack.us/gfwlist +server=/microsoftlatamaitour.com/127.0.0.1#5335 +ipset=/microsoftlatamaitour.com/gfwlist +server=/bmwsfl.net/127.0.0.1#5335 +ipset=/bmwsfl.net/gfwlist +server=/foxsports.com.ec/127.0.0.1#5335 +ipset=/foxsports.com.ec/gfwlist +server=/officialheadphone.com/127.0.0.1#5335 +ipset=/officialheadphone.com/gfwlist +server=/older.tube/127.0.0.1#5335 +ipset=/older.tube/gfwlist +server=/52hyse.com/127.0.0.1#5335 +ipset=/52hyse.com/gfwlist +server=/youtube.dk/127.0.0.1#5335 +ipset=/youtube.dk/gfwlist +server=/azure-sphere.com/127.0.0.1#5335 +ipset=/azure-sphere.com/gfwlist +server=/twca.com.tw/127.0.0.1#5335 +ipset=/twca.com.tw/gfwlist +server=/hotporn.today/127.0.0.1#5335 +ipset=/hotporn.today/gfwlist +server=/sony.com.co/127.0.0.1#5335 +ipset=/sony.com.co/gfwlist +server=/signalusers.org/127.0.0.1#5335 +ipset=/signalusers.org/gfwlist +server=/sankei.jp/127.0.0.1#5335 +ipset=/sankei.jp/gfwlist +server=/foxdoua.com/127.0.0.1#5335 +ipset=/foxdoua.com/gfwlist +server=/nicesshop.net/127.0.0.1#5335 +ipset=/nicesshop.net/gfwlist +server=/businesscatalyst.com/127.0.0.1#5335 +ipset=/businesscatalyst.com/gfwlist +server=/wmfusercontent.org/127.0.0.1#5335 +ipset=/wmfusercontent.org/gfwlist +server=/on.cc/127.0.0.1#5335 +ipset=/on.cc/gfwlist +server=/disneyjunior.com/127.0.0.1#5335 +ipset=/disneyjunior.com/gfwlist +server=/nikeshoeswon.com/127.0.0.1#5335 +ipset=/nikeshoeswon.com/gfwlist +server=/cuckoldinterracialwife.com/127.0.0.1#5335 +ipset=/cuckoldinterracialwife.com/gfwlist +server=/zeebioskop.com/127.0.0.1#5335 +ipset=/zeebioskop.com/gfwlist +server=/foxon.com/127.0.0.1#5335 +ipset=/foxon.com/gfwlist +server=/interactivesex.xxx/127.0.0.1#5335 +ipset=/interactivesex.xxx/gfwlist +server=/durex.com.pe/127.0.0.1#5335 +ipset=/durex.com.pe/gfwlist +server=/manporn.xxx/127.0.0.1#5335 +ipset=/manporn.xxx/gfwlist +server=/bustyinescudna.com/127.0.0.1#5335 +ipset=/bustyinescudna.com/gfwlist +server=/youtubeeducation.com/127.0.0.1#5335 +ipset=/youtubeeducation.com/gfwlist +server=/google.at/127.0.0.1#5335 +ipset=/google.at/gfwlist +server=/windows8.hk/127.0.0.1#5335 +ipset=/windows8.hk/gfwlist +server=/amsterdamluxescort.com/127.0.0.1#5335 +ipset=/amsterdamluxescort.com/gfwlist +server=/youtubefanfest.com/127.0.0.1#5335 +ipset=/youtubefanfest.com/gfwlist +server=/bloomberglabs.com/127.0.0.1#5335 +ipset=/bloomberglabs.com/gfwlist +server=/visadigitalconcierge.com/127.0.0.1#5335 +ipset=/visadigitalconcierge.com/gfwlist +server=/bestbuy-int.com/127.0.0.1#5335 +ipset=/bestbuy-int.com/gfwlist +server=/pinterest.co.at/127.0.0.1#5335 +ipset=/pinterest.co.at/gfwlist +server=/hpinkjet.com/127.0.0.1#5335 +ipset=/hpinkjet.com/gfwlist +server=/xplr.co/127.0.0.1#5335 +ipset=/xplr.co/gfwlist +server=/directvoffercodes.com/127.0.0.1#5335 +ipset=/directvoffercodes.com/gfwlist +server=/quip-cdn.com/127.0.0.1#5335 +ipset=/quip-cdn.com/gfwlist +server=/beth.games/127.0.0.1#5335 +ipset=/beth.games/gfwlist +server=/xn--r8jwklh769hk43amcfoyl3z3a.com/127.0.0.1#5335 +ipset=/xn--r8jwklh769hk43amcfoyl3z3a.com/gfwlist +server=/ipfs.eternum.io/127.0.0.1#5335 +ipset=/ipfs.eternum.io/gfwlist +server=/pornhail.com/127.0.0.1#5335 +ipset=/pornhail.com/gfwlist +server=/xbx.lv/127.0.0.1#5335 +ipset=/xbx.lv/gfwlist +server=/faceobook.com/127.0.0.1#5335 +ipset=/faceobook.com/gfwlist +server=/newsxtend.com.au/127.0.0.1#5335 +ipset=/newsxtend.com.au/gfwlist +server=/brave.com/127.0.0.1#5335 +ipset=/brave.com/gfwlist +server=/friendfeed-media.com/127.0.0.1#5335 +ipset=/friendfeed-media.com/gfwlist +server=/ikea.fr/127.0.0.1#5335 +ipset=/ikea.fr/gfwlist +server=/whichav.video/127.0.0.1#5335 +ipset=/whichav.video/gfwlist +server=/beatssbyaustralia.com/127.0.0.1#5335 +ipset=/beatssbyaustralia.com/gfwlist +server=/xnxx3.com/127.0.0.1#5335 +ipset=/xnxx3.com/gfwlist +server=/qualcomm.de/127.0.0.1#5335 +ipset=/qualcomm.de/gfwlist +server=/managed-pki.ch/127.0.0.1#5335 +ipset=/managed-pki.ch/gfwlist +server=/newsfeed.com/127.0.0.1#5335 +ipset=/newsfeed.com/gfwlist +server=/xxxpornozinho.blog.br/127.0.0.1#5335 +ipset=/xxxpornozinho.blog.br/gfwlist +server=/freeadultgames.tv/127.0.0.1#5335 +ipset=/freeadultgames.tv/gfwlist +server=/onbeatsbydresale.com/127.0.0.1#5335 +ipset=/onbeatsbydresale.com/gfwlist +server=/nikkei4946.com/127.0.0.1#5335 +ipset=/nikkei4946.com/gfwlist +server=/firestonecomercial.com.ar/127.0.0.1#5335 +ipset=/firestonecomercial.com.ar/gfwlist +server=/telekom.com/127.0.0.1#5335 +ipset=/telekom.com/gfwlist +server=/twitterflightschool.com/127.0.0.1#5335 +ipset=/twitterflightschool.com/gfwlist +server=/certificat2.com/127.0.0.1#5335 +ipset=/certificat2.com/gfwlist +server=/geilegratisporno.com/127.0.0.1#5335 +ipset=/geilegratisporno.com/gfwlist +server=/amazon.de/127.0.0.1#5335 +ipset=/amazon.de/gfwlist +server=/faceboak.com/127.0.0.1#5335 +ipset=/faceboak.com/gfwlist +server=/limelight.com/127.0.0.1#5335 +ipset=/limelight.com/gfwlist +server=/nikefirm.com/127.0.0.1#5335 +ipset=/nikefirm.com/gfwlist +server=/airsextube.com/127.0.0.1#5335 +ipset=/airsextube.com/gfwlist +server=/appspot.com/127.0.0.1#5335 +ipset=/appspot.com/gfwlist +server=/pornxvideos.tv/127.0.0.1#5335 +ipset=/pornxvideos.tv/gfwlist +server=/videos6.com/127.0.0.1#5335 +ipset=/videos6.com/gfwlist +server=/748av.com/127.0.0.1#5335 +ipset=/748av.com/gfwlist +server=/disney.sg/127.0.0.1#5335 +ipset=/disney.sg/gfwlist +server=/intellinuxwireless.net/127.0.0.1#5335 +ipset=/intellinuxwireless.net/gfwlist +server=/1drv.ms/127.0.0.1#5335 +ipset=/1drv.ms/gfwlist +server=/h-top.supertop-100.com/127.0.0.1#5335 +ipset=/h-top.supertop-100.com/gfwlist +server=/typography.com/127.0.0.1#5335 +ipset=/typography.com/gfwlist +server=/peepholecam.com/127.0.0.1#5335 +ipset=/peepholecam.com/gfwlist +server=/atandt.com/127.0.0.1#5335 +ipset=/atandt.com/gfwlist +server=/ieee-isto.org/127.0.0.1#5335 +ipset=/ieee-isto.org/gfwlist +server=/intellinuxgraphics.com/127.0.0.1#5335 +ipset=/intellinuxgraphics.com/gfwlist +server=/ikea.com.tr/127.0.0.1#5335 +ipset=/ikea.com.tr/gfwlist +server=/findsav.com/127.0.0.1#5335 +ipset=/findsav.com/gfwlist +server=/alotporn.com/127.0.0.1#5335 +ipset=/alotporn.com/gfwlist +server=/bmw-museum.net/127.0.0.1#5335 +ipset=/bmw-museum.net/gfwlist +server=/alphera.es/127.0.0.1#5335 +ipset=/alphera.es/gfwlist +server=/beatsbydrecybermondaydeals2013.net/127.0.0.1#5335 +ipset=/beatsbydrecybermondaydeals2013.net/gfwlist +server=/bloombergtax.com/127.0.0.1#5335 +ipset=/bloombergtax.com/gfwlist +server=/sexdollsshow.com/127.0.0.1#5335 +ipset=/sexdollsshow.com/gfwlist +server=/jav4you.org/127.0.0.1#5335 +ipset=/jav4you.org/gfwlist +server=/panoramio.com/127.0.0.1#5335 +ipset=/panoramio.com/gfwlist +server=/fasttrackreadysupport.com/127.0.0.1#5335 +ipset=/fasttrackreadysupport.com/gfwlist +server=/socrec.org/127.0.0.1#5335 +ipset=/socrec.org/gfwlist +server=/bmwondemandusa.com/127.0.0.1#5335 +ipset=/bmwondemandusa.com/gfwlist +server=/reconjet.com/127.0.0.1#5335 +ipset=/reconjet.com/gfwlist +server=/mini-connected.no/127.0.0.1#5335 +ipset=/mini-connected.no/gfwlist +server=/ebay.com.my/127.0.0.1#5335 +ipset=/ebay.com.my/gfwlist +server=/drdrebeats-chen.com/127.0.0.1#5335 +ipset=/drdrebeats-chen.com/gfwlist +server=/hot-sex-photos.com/127.0.0.1#5335 +ipset=/hot-sex-photos.com/gfwlist +server=/yahoo.tg/127.0.0.1#5335 +ipset=/yahoo.tg/gfwlist +server=/fine-art-nude.org/127.0.0.1#5335 +ipset=/fine-art-nude.org/gfwlist +server=/gayroom.com/127.0.0.1#5335 +ipset=/gayroom.com/gfwlist +server=/fuckingawesome.com/127.0.0.1#5335 +ipset=/fuckingawesome.com/gfwlist +server=/darknaija.com/127.0.0.1#5335 +ipset=/darknaija.com/gfwlist +server=/fappeningbook.com/127.0.0.1#5335 +ipset=/fappeningbook.com/gfwlist +server=/gamboporn.com/127.0.0.1#5335 +ipset=/gamboporn.com/gfwlist +server=/bmwwholesaleconnect.com/127.0.0.1#5335 +ipset=/bmwwholesaleconnect.com/gfwlist +server=/nyaa.net/127.0.0.1#5335 +ipset=/nyaa.net/gfwlist +server=/b3boos.com/127.0.0.1#5335 +ipset=/b3boos.com/gfwlist +server=/xvidios.blog/127.0.0.1#5335 +ipset=/xvidios.blog/gfwlist +server=/akamaized.net/127.0.0.1#5335 +ipset=/akamaized.net/gfwlist +server=/spotifyforbrands.com/127.0.0.1#5335 +ipset=/spotifyforbrands.com/gfwlist +server=/u9a9.com/127.0.0.1#5335 +ipset=/u9a9.com/gfwlist +server=/elifesciences.org/127.0.0.1#5335 +ipset=/elifesciences.org/gfwlist +server=/volvobuses.no/127.0.0.1#5335 +ipset=/volvobuses.no/gfwlist +server=/nike-air-max.com/127.0.0.1#5335 +ipset=/nike-air-max.com/gfwlist +server=/vod-abematv.akamaized.net/127.0.0.1#5335 +ipset=/vod-abematv.akamaized.net/gfwlist +server=/evropaelire.org/127.0.0.1#5335 +ipset=/evropaelire.org/gfwlist +server=/sinchew.com.my/127.0.0.1#5335 +ipset=/sinchew.com.my/gfwlist +server=/ayudanintendo.com/127.0.0.1#5335 +ipset=/ayudanintendo.com/gfwlist +server=/omoplanet.com/127.0.0.1#5335 +ipset=/omoplanet.com/gfwlist +server=/sony.cl/127.0.0.1#5335 +ipset=/sony.cl/gfwlist +server=/pikabu.monster/127.0.0.1#5335 +ipset=/pikabu.monster/gfwlist +server=/nikkei.com/127.0.0.1#5335 +ipset=/nikkei.com/gfwlist +server=/mature-amateur-sex.com/127.0.0.1#5335 +ipset=/mature-amateur-sex.com/gfwlist +server=/mortein.com.pk/127.0.0.1#5335 +ipset=/mortein.com.pk/gfwlist +server=/bmwasia.com/127.0.0.1#5335 +ipset=/bmwasia.com/gfwlist +server=/appleaustralia.com/127.0.0.1#5335 +ipset=/appleaustralia.com/gfwlist +server=/youngteenhomeporn.com/127.0.0.1#5335 +ipset=/youngteenhomeporn.com/gfwlist +server=/bmw-connecteddrive.lu/127.0.0.1#5335 +ipset=/bmw-connecteddrive.lu/gfwlist +server=/flirtmoms.com/127.0.0.1#5335 +ipset=/flirtmoms.com/gfwlist +server=/my9nj.com/127.0.0.1#5335 +ipset=/my9nj.com/gfwlist +server=/nikeliuxiang.com/127.0.0.1#5335 +ipset=/nikeliuxiang.com/gfwlist +server=/mastercardadvisors.com/127.0.0.1#5335 +ipset=/mastercardadvisors.com/gfwlist +server=/scholar.google.no/127.0.0.1#5335 +ipset=/scholar.google.no/gfwlist +server=/r18av.com/127.0.0.1#5335 +ipset=/r18av.com/gfwlist +server=/vanish.com.pe/127.0.0.1#5335 +ipset=/vanish.com.pe/gfwlist +server=/orgasm.com/127.0.0.1#5335 +ipset=/orgasm.com/gfwlist +server=/youtube.ba/127.0.0.1#5335 +ipset=/youtube.ba/gfwlist +server=/elpube-scat-movies.blogspot.com/127.0.0.1#5335 +ipset=/elpube-scat-movies.blogspot.com/gfwlist +server=/hulutv.com/127.0.0.1#5335 +ipset=/hulutv.com/gfwlist +server=/gnom-cham.com/127.0.0.1#5335 +ipset=/gnom-cham.com/gfwlist +server=/ibonedyourmom.com/127.0.0.1#5335 +ipset=/ibonedyourmom.com/gfwlist +server=/pornocarioca.com/127.0.0.1#5335 +ipset=/pornocarioca.com/gfwlist +server=/addthisedge.com/127.0.0.1#5335 +ipset=/addthisedge.com/gfwlist +server=/pearsoned.co.nz/127.0.0.1#5335 +ipset=/pearsoned.co.nz/gfwlist +server=/manga-mill.com/127.0.0.1#5335 +ipset=/manga-mill.com/gfwlist +server=/nvidia.co.at/127.0.0.1#5335 +ipset=/nvidia.co.at/gfwlist +server=/andysparis.com/127.0.0.1#5335 +ipset=/andysparis.com/gfwlist +server=/alpherafs.my/127.0.0.1#5335 +ipset=/alpherafs.my/gfwlist +server=/imac.co/127.0.0.1#5335 +ipset=/imac.co/gfwlist +server=/icloud.si/127.0.0.1#5335 +ipset=/icloud.si/gfwlist +server=/redd.it/127.0.0.1#5335 +ipset=/redd.it/gfwlist +server=/litv.tv/127.0.0.1#5335 +ipset=/litv.tv/gfwlist +server=/thesims.com/127.0.0.1#5335 +ipset=/thesims.com/gfwlist +server=/apple.pt/127.0.0.1#5335 +ipset=/apple.pt/gfwlist +server=/netarabic.com/127.0.0.1#5335 +ipset=/netarabic.com/gfwlist +server=/rootsigning.com/127.0.0.1#5335 +ipset=/rootsigning.com/gfwlist +server=/lovesexbody.com/127.0.0.1#5335 +ipset=/lovesexbody.com/gfwlist +server=/airmay.com/127.0.0.1#5335 +ipset=/airmay.com/gfwlist +server=/avstar8.com/127.0.0.1#5335 +ipset=/avstar8.com/gfwlist +server=/firmaprofesional.com/127.0.0.1#5335 +ipset=/firmaprofesional.com/gfwlist +server=/arxiv.org/127.0.0.1#5335 +ipset=/arxiv.org/gfwlist +server=/arabianchicks.com/127.0.0.1#5335 +ipset=/arabianchicks.com/gfwlist +server=/siege-amazon.com/127.0.0.1#5335 +ipset=/siege-amazon.com/gfwlist +server=/nixos.org/127.0.0.1#5335 +ipset=/nixos.org/gfwlist +server=/javhd3x.com/127.0.0.1#5335 +ipset=/javhd3x.com/gfwlist +server=/pornotree.com/127.0.0.1#5335 +ipset=/pornotree.com/gfwlist +server=/1xbet.co.ke/127.0.0.1#5335 +ipset=/1xbet.co.ke/gfwlist +server=/bmw.co.za/127.0.0.1#5335 +ipset=/bmw.co.za/gfwlist +server=/khayannpyar.blogspot.com/127.0.0.1#5335 +ipset=/khayannpyar.blogspot.com/gfwlist +server=/ptt.cc/127.0.0.1#5335 +ipset=/ptt.cc/gfwlist +server=/heroku.co/127.0.0.1#5335 +ipset=/heroku.co/gfwlist +server=/da3dsoul.dev/127.0.0.1#5335 +ipset=/da3dsoul.dev/gfwlist +server=/verisign.hk/127.0.0.1#5335 +ipset=/verisign.hk/gfwlist +server=/fbidb.io/127.0.0.1#5335 +ipset=/fbidb.io/gfwlist +server=/cartoonscity.com/127.0.0.1#5335 +ipset=/cartoonscity.com/gfwlist +server=/vanish.se/127.0.0.1#5335 +ipset=/vanish.se/gfwlist +server=/faronics.kayako.com/127.0.0.1#5335 +ipset=/faronics.kayako.com/gfwlist +server=/xn--p8j9a0d9c9a.xn--q9jyb4c/127.0.0.1#5335 +ipset=/xn--p8j9a0d9c9a.xn--q9jyb4c/gfwlist +server=/bestporntube.me/127.0.0.1#5335 +ipset=/bestporntube.me/gfwlist +server=/javfull.net/127.0.0.1#5335 +ipset=/javfull.net/gfwlist +server=/topcoder.com/127.0.0.1#5335 +ipset=/topcoder.com/gfwlist +server=/miniusaservice.com/127.0.0.1#5335 +ipset=/miniusaservice.com/gfwlist +server=/recoiljs.org/127.0.0.1#5335 +ipset=/recoiljs.org/gfwlist +server=/meraki-go.com/127.0.0.1#5335 +ipset=/meraki-go.com/gfwlist +server=/faceebok.com/127.0.0.1#5335 +ipset=/faceebok.com/gfwlist +server=/steamstatic.com/127.0.0.1#5335 +ipset=/steamstatic.com/gfwlist +server=/repsils.no/127.0.0.1#5335 +ipset=/repsils.no/gfwlist +server=/yahoo.ch/127.0.0.1#5335 +ipset=/yahoo.ch/gfwlist +server=/intel.se/127.0.0.1#5335 +ipset=/intel.se/gfwlist +server=/foxsports.com.py/127.0.0.1#5335 +ipset=/foxsports.com.py/gfwlist +server=/api.news/127.0.0.1#5335 +ipset=/api.news/gfwlist +server=/mendeley.com/127.0.0.1#5335 +ipset=/mendeley.com/gfwlist +server=/wixmp.com/127.0.0.1#5335 +ipset=/wixmp.com/gfwlist +server=/ciscolivehls-i.akamaihd.net/127.0.0.1#5335 +ipset=/ciscolivehls-i.akamaihd.net/gfwlist +server=/applf.com/127.0.0.1#5335 +ipset=/applf.com/gfwlist +server=/futanarihq.com/127.0.0.1#5335 +ipset=/futanarihq.com/gfwlist +server=/jmcomic.moe/127.0.0.1#5335 +ipset=/jmcomic.moe/gfwlist +server=/ipleadership.org/127.0.0.1#5335 +ipset=/ipleadership.org/gfwlist +server=/babepedia.com/127.0.0.1#5335 +ipset=/babepedia.com/gfwlist +server=/slotbitches.com/127.0.0.1#5335 +ipset=/slotbitches.com/gfwlist +server=/ikea.com.ro/127.0.0.1#5335 +ipset=/ikea.com.ro/gfwlist +server=/112263.com/127.0.0.1#5335 +ipset=/112263.com/gfwlist +server=/volvotruckcenter.be/127.0.0.1#5335 +ipset=/volvotruckcenter.be/gfwlist +server=/ura-akiba.jp/127.0.0.1#5335 +ipset=/ura-akiba.jp/gfwlist +server=/tfhub.dev/127.0.0.1#5335 +ipset=/tfhub.dev/gfwlist +server=/bmw-welt.com/127.0.0.1#5335 +ipset=/bmw-welt.com/gfwlist +server=/bmwpittsburgh.com/127.0.0.1#5335 +ipset=/bmwpittsburgh.com/gfwlist +server=/jinmantiankong.com/127.0.0.1#5335 +ipset=/jinmantiankong.com/gfwlist +server=/xxxsexzoo.com/127.0.0.1#5335 +ipset=/xxxsexzoo.com/gfwlist +server=/venmo.s3.amazonaws.com/127.0.0.1#5335 +ipset=/venmo.s3.amazonaws.com/gfwlist +server=/xnxxsexclips.com/127.0.0.1#5335 +ipset=/xnxxsexclips.com/gfwlist +server=/dojindb.net/127.0.0.1#5335 +ipset=/dojindb.net/gfwlist +server=/tbib.org/127.0.0.1#5335 +ipset=/tbib.org/gfwlist +server=/mobile.de/127.0.0.1#5335 +ipset=/mobile.de/gfwlist +server=/blogspot.ie/127.0.0.1#5335 +ipset=/blogspot.ie/gfwlist +server=/freehdvideos.xxx/127.0.0.1#5335 +ipset=/freehdvideos.xxx/gfwlist +server=/alphabet.co.za/127.0.0.1#5335 +ipset=/alphabet.co.za/gfwlist +server=/xxxvideo.world/127.0.0.1#5335 +ipset=/xxxvideo.world/gfwlist +server=/donkeykongcountryreturns.com/127.0.0.1#5335 +ipset=/donkeykongcountryreturns.com/gfwlist +server=/2beatsdre.com/127.0.0.1#5335 +ipset=/2beatsdre.com/gfwlist +server=/3d-comics.com/127.0.0.1#5335 +ipset=/3d-comics.com/gfwlist +server=/camgirlvideos.org/127.0.0.1#5335 +ipset=/camgirlvideos.org/gfwlist +server=/duckduckgo.dk/127.0.0.1#5335 +ipset=/duckduckgo.dk/gfwlist +server=/onestore.ms/127.0.0.1#5335 +ipset=/onestore.ms/gfwlist +server=/watchmyexgf.net/127.0.0.1#5335 +ipset=/watchmyexgf.net/gfwlist +server=/heinonline.org/127.0.0.1#5335 +ipset=/heinonline.org/gfwlist +server=/ddg.gg/127.0.0.1#5335 +ipset=/ddg.gg/gfwlist +server=/macbook.tw/127.0.0.1#5335 +ipset=/macbook.tw/gfwlist +server=/ixnxx.tv/127.0.0.1#5335 +ipset=/ixnxx.tv/gfwlist +server=/what-fan.net/127.0.0.1#5335 +ipset=/what-fan.net/gfwlist +server=/ebayjewelry.com/127.0.0.1#5335 +ipset=/ebayjewelry.com/gfwlist +server=/onsaletrend.com/127.0.0.1#5335 +ipset=/onsaletrend.com/gfwlist +server=/hmd.site/127.0.0.1#5335 +ipset=/hmd.site/gfwlist +server=/dgwav.com/127.0.0.1#5335 +ipset=/dgwav.com/gfwlist +server=/facebookland.com/127.0.0.1#5335 +ipset=/facebookland.com/gfwlist +server=/db.tt/127.0.0.1#5335 +ipset=/db.tt/gfwlist +server=/bmw-motorrad.pa/127.0.0.1#5335 +ipset=/bmw-motorrad.pa/gfwlist +server=/getcomposer.org/127.0.0.1#5335 +ipset=/getcomposer.org/gfwlist +server=/akamai-platform-internal.net/127.0.0.1#5335 +ipset=/akamai-platform-internal.net/gfwlist +server=/sego8.xyz/127.0.0.1#5335 +ipset=/sego8.xyz/gfwlist +server=/airwick.si/127.0.0.1#5335 +ipset=/airwick.si/gfwlist +server=/bmwjamaica.com/127.0.0.1#5335 +ipset=/bmwjamaica.com/gfwlist +server=/pornozona.tv/127.0.0.1#5335 +ipset=/pornozona.tv/gfwlist +server=/comodo.net/127.0.0.1#5335 +ipset=/comodo.net/gfwlist +server=/githubapp.com/127.0.0.1#5335 +ipset=/githubapp.com/gfwlist +server=/usatodaynetworkservice.com/127.0.0.1#5335 +ipset=/usatodaynetworkservice.com/gfwlist +server=/apple.co.th/127.0.0.1#5335 +ipset=/apple.co.th/gfwlist +server=/javwide.tv/127.0.0.1#5335 +ipset=/javwide.tv/gfwlist +server=/haitenjp.com/127.0.0.1#5335 +ipset=/haitenjp.com/gfwlist +server=/visaluxuryhotelcollection.com.br/127.0.0.1#5335 +ipset=/visaluxuryhotelcollection.com.br/gfwlist +server=/volvobuses.mx/127.0.0.1#5335 +ipset=/volvobuses.mx/gfwlist +server=/topyoungporn.com/127.0.0.1#5335 +ipset=/topyoungporn.com/gfwlist +server=/shopifystatus.com/127.0.0.1#5335 +ipset=/shopifystatus.com/gfwlist +server=/danmarkbeatsbydrdre.com/127.0.0.1#5335 +ipset=/danmarkbeatsbydrdre.com/gfwlist +server=/oxfordaasc.com/127.0.0.1#5335 +ipset=/oxfordaasc.com/gfwlist +server=/thepornlinks.com/127.0.0.1#5335 +ipset=/thepornlinks.com/gfwlist +server=/snapseed.com/127.0.0.1#5335 +ipset=/snapseed.com/gfwlist +server=/tictoc.video/127.0.0.1#5335 +ipset=/tictoc.video/gfwlist +server=/vmtestdrive.com/127.0.0.1#5335 +ipset=/vmtestdrive.com/gfwlist +server=/volvotrucks.mn/127.0.0.1#5335 +ipset=/volvotrucks.mn/gfwlist +server=/gogocdn.net/127.0.0.1#5335 +ipset=/gogocdn.net/gfwlist +server=/comodoca.com/127.0.0.1#5335 +ipset=/comodoca.com/gfwlist +server=/ipadpro.buzz/127.0.0.1#5335 +ipset=/ipadpro.buzz/gfwlist +server=/hulu.com/127.0.0.1#5335 +ipset=/hulu.com/gfwlist +server=/bmw-mountains.com/127.0.0.1#5335 +ipset=/bmw-mountains.com/gfwlist +server=/google.com.sl/127.0.0.1#5335 +ipset=/google.com.sl/gfwlist +server=/wwwfacebook.com/127.0.0.1#5335 +ipset=/wwwfacebook.com/gfwlist +server=/adultgameson.com/127.0.0.1#5335 +ipset=/adultgameson.com/gfwlist +server=/myfoxatlanta.com/127.0.0.1#5335 +ipset=/myfoxatlanta.com/gfwlist +server=/beatspaschers.net/127.0.0.1#5335 +ipset=/beatspaschers.net/gfwlist +server=/stackoverflow.email/127.0.0.1#5335 +ipset=/stackoverflow.email/gfwlist +server=/lysol.net/127.0.0.1#5335 +ipset=/lysol.net/gfwlist +server=/spankwire.com/127.0.0.1#5335 +ipset=/spankwire.com/gfwlist +server=/nurofen.at/127.0.0.1#5335 +ipset=/nurofen.at/gfwlist +server=/facebooik.com/127.0.0.1#5335 +ipset=/facebooik.com/gfwlist +server=/spankmonster.com/127.0.0.1#5335 +ipset=/spankmonster.com/gfwlist +server=/miniso.co/127.0.0.1#5335 +ipset=/miniso.co/gfwlist +server=/businessinsider.co.za/127.0.0.1#5335 +ipset=/businessinsider.co.za/gfwlist +server=/brazzers-porno.online/127.0.0.1#5335 +ipset=/brazzers-porno.online/gfwlist +server=/sportstream.com/127.0.0.1#5335 +ipset=/sportstream.com/gfwlist +server=/yourdailypornvideos.ws/127.0.0.1#5335 +ipset=/yourdailypornvideos.ws/gfwlist +server=/facebook-hardware.com/127.0.0.1#5335 +ipset=/facebook-hardware.com/gfwlist +server=/sexandsplash.com/127.0.0.1#5335 +ipset=/sexandsplash.com/gfwlist +server=/realcleareducation.com/127.0.0.1#5335 +ipset=/realcleareducation.com/gfwlist +server=/shopee.co.id/127.0.0.1#5335 +ipset=/shopee.co.id/gfwlist +server=/fishmpegs.com/127.0.0.1#5335 +ipset=/fishmpegs.com/gfwlist +server=/submityourflicks.com/127.0.0.1#5335 +ipset=/submityourflicks.com/gfwlist +server=/ieee-edusociety.org/127.0.0.1#5335 +ipset=/ieee-edusociety.org/gfwlist +server=/bloomberg.cn/127.0.0.1#5335 +ipset=/bloomberg.cn/gfwlist +server=/redtube.com/127.0.0.1#5335 +ipset=/redtube.com/gfwlist +server=/clearlinux.org/127.0.0.1#5335 +ipset=/clearlinux.org/gfwlist +server=/tweetdeck.com/127.0.0.1#5335 +ipset=/tweetdeck.com/gfwlist +server=/connectcommerce.tv/127.0.0.1#5335 +ipset=/connectcommerce.tv/gfwlist +server=/aboutamazon.eu/127.0.0.1#5335 +ipset=/aboutamazon.eu/gfwlist +server=/picacn.xyz/127.0.0.1#5335 +ipset=/picacn.xyz/gfwlist +server=/yibaochina.com/127.0.0.1#5335 +ipset=/yibaochina.com/gfwlist +server=/hentaidude.com/127.0.0.1#5335 +ipset=/hentaidude.com/gfwlist +server=/gostorego.com/127.0.0.1#5335 +ipset=/gostorego.com/gfwlist +server=/intel.com.pe/127.0.0.1#5335 +ipset=/intel.com.pe/gfwlist +server=/waskucity.com/127.0.0.1#5335 +ipset=/waskucity.com/gfwlist +server=/apple-expo.eu/127.0.0.1#5335 +ipset=/apple-expo.eu/gfwlist +server=/4chan.org/127.0.0.1#5335 +ipset=/4chan.org/gfwlist +server=/discoveryplus.com/127.0.0.1#5335 +ipset=/discoveryplus.com/gfwlist +server=/paypal-sptam.com/127.0.0.1#5335 +ipset=/paypal-sptam.com/gfwlist +server=/feacbook.com/127.0.0.1#5335 +ipset=/feacbook.com/gfwlist +server=/amp.dev/127.0.0.1#5335 +ipset=/amp.dev/gfwlist +server=/xxxifuck.com/127.0.0.1#5335 +ipset=/xxxifuck.com/gfwlist +server=/nikepress.com/127.0.0.1#5335 +ipset=/nikepress.com/gfwlist +server=/nintendo3ds.com/127.0.0.1#5335 +ipset=/nintendo3ds.com/gfwlist +server=/hentaixxxvids.com/127.0.0.1#5335 +ipset=/hentaixxxvids.com/gfwlist +server=/spreadprivacy.com/127.0.0.1#5335 +ipset=/spreadprivacy.com/gfwlist +server=/shadbase.com/127.0.0.1#5335 +ipset=/shadbase.com/gfwlist +server=/zishy.com/127.0.0.1#5335 +ipset=/zishy.com/gfwlist +server=/dailytelegraph.com.au/127.0.0.1#5335 +ipset=/dailytelegraph.com.au/gfwlist +server=/insider.com/127.0.0.1#5335 +ipset=/insider.com/gfwlist +server=/hqtrannytube.com/127.0.0.1#5335 +ipset=/hqtrannytube.com/gfwlist +server=/41maonn.com/127.0.0.1#5335 +ipset=/41maonn.com/gfwlist +server=/furaffinity.net/127.0.0.1#5335 +ipset=/furaffinity.net/gfwlist +server=/hentai.game/127.0.0.1#5335 +ipset=/hentai.game/gfwlist +server=/bmw-connected-drive.com/127.0.0.1#5335 +ipset=/bmw-connected-drive.com/gfwlist +server=/kamisama-maeda-lab.com/127.0.0.1#5335 +ipset=/kamisama-maeda-lab.com/gfwlist +server=/yahoo.bt/127.0.0.1#5335 +ipset=/yahoo.bt/gfwlist +server=/microsoft.vn/127.0.0.1#5335 +ipset=/microsoft.vn/gfwlist +server=/mojang.com/127.0.0.1#5335 +ipset=/mojang.com/gfwlist +server=/naughtytugs.com/127.0.0.1#5335 +ipset=/naughtytugs.com/gfwlist +server=/perverttube.com/127.0.0.1#5335 +ipset=/perverttube.com/gfwlist +server=/pearsonclinical.no/127.0.0.1#5335 +ipset=/pearsonclinical.no/gfwlist +server=/instagda.com/127.0.0.1#5335 +ipset=/instagda.com/gfwlist +server=/thestandard.com.hk/127.0.0.1#5335 +ipset=/thestandard.com.hk/gfwlist +server=/twittercommunity.com/127.0.0.1#5335 +ipset=/twittercommunity.com/gfwlist +server=/youtube.md/127.0.0.1#5335 +ipset=/youtube.md/gfwlist +server=/whychooseview.com/127.0.0.1#5335 +ipset=/whychooseview.com/gfwlist +server=/amazon-adsystem.com/127.0.0.1#5335 +ipset=/amazon-adsystem.com/gfwlist +server=/penisbot.com/127.0.0.1#5335 +ipset=/penisbot.com/gfwlist +server=/uverse.com/127.0.0.1#5335 +ipset=/uverse.com/gfwlist +server=/nataliefiore.com/127.0.0.1#5335 +ipset=/nataliefiore.com/gfwlist +server=/bmw.com.bd/127.0.0.1#5335 +ipset=/bmw.com.bd/gfwlist +server=/shemalebestlabel.com/127.0.0.1#5335 +ipset=/shemalebestlabel.com/gfwlist +server=/microsoftstore.com.hk/127.0.0.1#5335 +ipset=/microsoftstore.com.hk/gfwlist +server=/imoviestage.com/127.0.0.1#5335 +ipset=/imoviestage.com/gfwlist +server=/oraclefoundation.org/127.0.0.1#5335 +ipset=/oraclefoundation.org/gfwlist +server=/amateurgalore.net/127.0.0.1#5335 +ipset=/amateurgalore.net/gfwlist +server=/epochtimes.com.sg/127.0.0.1#5335 +ipset=/epochtimes.com.sg/gfwlist +server=/minivictoria.com/127.0.0.1#5335 +ipset=/minivictoria.com/gfwlist +server=/shopifycloud.com/127.0.0.1#5335 +ipset=/shopifycloud.com/gfwlist +server=/icloud.ro/127.0.0.1#5335 +ipset=/icloud.ro/gfwlist +server=/attcenter.com/127.0.0.1#5335 +ipset=/attcenter.com/gfwlist +server=/canon-cmos-sensors.com/127.0.0.1#5335 +ipset=/canon-cmos-sensors.com/gfwlist +server=/xvideosbrasileiro.net/127.0.0.1#5335 +ipset=/xvideosbrasileiro.net/gfwlist +server=/ebaytrading.com/127.0.0.1#5335 +ipset=/ebaytrading.com/gfwlist +server=/pornolaba.mobi/127.0.0.1#5335 +ipset=/pornolaba.mobi/gfwlist +server=/calgon.fr/127.0.0.1#5335 +ipset=/calgon.fr/gfwlist +server=/visa.fi/127.0.0.1#5335 +ipset=/visa.fi/gfwlist +server=/kscisco.com/127.0.0.1#5335 +ipset=/kscisco.com/gfwlist +server=/akamaientrypoint.net/127.0.0.1#5335 +ipset=/akamaientrypoint.net/gfwlist +server=/bidorbuyindia.com/127.0.0.1#5335 +ipset=/bidorbuyindia.com/gfwlist +server=/vanishstains.com/127.0.0.1#5335 +ipset=/vanishstains.com/gfwlist +server=/sportswomenoftheyear.co.uk/127.0.0.1#5335 +ipset=/sportswomenoftheyear.co.uk/gfwlist +server=/dyncdn.me/127.0.0.1#5335 +ipset=/dyncdn.me/gfwlist +server=/holdemstripem.com/127.0.0.1#5335 +ipset=/holdemstripem.com/gfwlist +server=/material.io/127.0.0.1#5335 +ipset=/material.io/gfwlist +server=/vagina.nl/127.0.0.1#5335 +ipset=/vagina.nl/gfwlist +server=/camwhoria.com/127.0.0.1#5335 +ipset=/camwhoria.com/gfwlist +server=/eachpay.com/127.0.0.1#5335 +ipset=/eachpay.com/gfwlist +server=/cloudflarestatus.com/127.0.0.1#5335 +ipset=/cloudflarestatus.com/gfwlist +server=/jizzbunker.com/127.0.0.1#5335 +ipset=/jizzbunker.com/gfwlist +server=/superstation.com.tw/127.0.0.1#5335 +ipset=/superstation.com.tw/gfwlist +server=/newmonsterbeatsheadphones.com/127.0.0.1#5335 +ipset=/newmonsterbeatsheadphones.com/gfwlist +server=/acgwr.com/127.0.0.1#5335 +ipset=/acgwr.com/gfwlist +server=/intel.gl/127.0.0.1#5335 +ipset=/intel.gl/gfwlist +server=/canon.ch/127.0.0.1#5335 +ipset=/canon.ch/gfwlist +server=/piapp.com.tw/127.0.0.1#5335 +ipset=/piapp.com.tw/gfwlist +server=/redporn.xxx/127.0.0.1#5335 +ipset=/redporn.xxx/gfwlist +server=/sex-for-work.com/127.0.0.1#5335 +ipset=/sex-for-work.com/gfwlist +server=/mastercardconnect.com/127.0.0.1#5335 +ipset=/mastercardconnect.com/gfwlist +server=/getporn.tv/127.0.0.1#5335 +ipset=/getporn.tv/gfwlist +server=/scholar.google.com.ec/127.0.0.1#5335 +ipset=/scholar.google.com.ec/gfwlist +server=/gotblop.com/127.0.0.1#5335 +ipset=/gotblop.com/gfwlist +server=/freesexyindians.org/127.0.0.1#5335 +ipset=/freesexyindians.org/gfwlist +server=/playboy.com/127.0.0.1#5335 +ipset=/playboy.com/gfwlist +server=/nimg.jp/127.0.0.1#5335 +ipset=/nimg.jp/gfwlist +server=/thieme-connect.com/127.0.0.1#5335 +ipset=/thieme-connect.com/gfwlist +server=/nvidia.com.ua/127.0.0.1#5335 +ipset=/nvidia.com.ua/gfwlist +server=/apple.se/127.0.0.1#5335 +ipset=/apple.se/gfwlist +server=/nikeshoesretro.com/127.0.0.1#5335 +ipset=/nikeshoesretro.com/gfwlist +server=/osiri-suki-club.com/127.0.0.1#5335 +ipset=/osiri-suki-club.com/gfwlist +server=/nikeresponsibility.com/127.0.0.1#5335 +ipset=/nikeresponsibility.com/gfwlist +server=/bmw-motorrad.com.hr/127.0.0.1#5335 +ipset=/bmw-motorrad.com.hr/gfwlist +server=/pearsonassessment.de/127.0.0.1#5335 +ipset=/pearsonassessment.de/gfwlist +server=/mysinchew.com/127.0.0.1#5335 +ipset=/mysinchew.com/gfwlist +server=/kindle4rss.com/127.0.0.1#5335 +ipset=/kindle4rss.com/gfwlist +server=/yourbrain.com/127.0.0.1#5335 +ipset=/yourbrain.com/gfwlist +server=/cloudfunctions.net/127.0.0.1#5335 +ipset=/cloudfunctions.net/gfwlist +server=/veet.com.my/127.0.0.1#5335 +ipset=/veet.com.my/gfwlist +server=/appleimac.com/127.0.0.1#5335 +ipset=/appleimac.com/gfwlist +server=/cgkate.jinvod.com/127.0.0.1#5335 +ipset=/cgkate.jinvod.com/gfwlist +server=/nikeairmaxshoes.com/127.0.0.1#5335 +ipset=/nikeairmaxshoes.com/gfwlist +server=/opentgc.com/127.0.0.1#5335 +ipset=/opentgc.com/gfwlist +server=/slackhq.com/127.0.0.1#5335 +ipset=/slackhq.com/gfwlist +server=/wowstars.com/127.0.0.1#5335 +ipset=/wowstars.com/gfwlist +server=/steamunlocked.net/127.0.0.1#5335 +ipset=/steamunlocked.net/gfwlist +server=/beatsone.net/127.0.0.1#5335 +ipset=/beatsone.net/gfwlist +server=/sexy-older-women.com/127.0.0.1#5335 +ipset=/sexy-older-women.com/gfwlist +server=/joiasmr.com/127.0.0.1#5335 +ipset=/joiasmr.com/gfwlist +server=/dailymail.com/127.0.0.1#5335 +ipset=/dailymail.com/gfwlist +server=/bmw-connecteddrive.ee/127.0.0.1#5335 +ipset=/bmw-connecteddrive.ee/gfwlist +server=/widgets.stripst.com/127.0.0.1#5335 +ipset=/widgets.stripst.com/gfwlist +server=/breakdown.me/127.0.0.1#5335 +ipset=/breakdown.me/gfwlist +server=/stimorolsex.com/127.0.0.1#5335 +ipset=/stimorolsex.com/gfwlist +server=/xxxvirtualworld.com/127.0.0.1#5335 +ipset=/xxxvirtualworld.com/gfwlist +server=/whyfacebook.com/127.0.0.1#5335 +ipset=/whyfacebook.com/gfwlist +server=/facebookphonenumber.net/127.0.0.1#5335 +ipset=/facebookphonenumber.net/gfwlist +server=/canon.lt/127.0.0.1#5335 +ipset=/canon.lt/gfwlist +server=/drebeats-australia.com/127.0.0.1#5335 +ipset=/drebeats-australia.com/gfwlist +server=/hpmini.com/127.0.0.1#5335 +ipset=/hpmini.com/gfwlist +server=/besttube4you.com/127.0.0.1#5335 +ipset=/besttube4you.com/gfwlist +server=/supercoach.com.au/127.0.0.1#5335 +ipset=/supercoach.com.au/gfwlist +server=/mastercard.com.tw/127.0.0.1#5335 +ipset=/mastercard.com.tw/gfwlist +server=/netflixdnstest3.com/127.0.0.1#5335 +ipset=/netflixdnstest3.com/gfwlist +server=/funnyfacebook.org/127.0.0.1#5335 +ipset=/funnyfacebook.org/gfwlist +server=/bitbucket.io/127.0.0.1#5335 +ipset=/bitbucket.io/gfwlist +server=/ebay68.com/127.0.0.1#5335 +ipset=/ebay68.com/gfwlist +server=/blogspot.co.il/127.0.0.1#5335 +ipset=/blogspot.co.il/gfwlist +server=/scorevideos.com/127.0.0.1#5335 +ipset=/scorevideos.com/gfwlist +server=/3dsexy.net/127.0.0.1#5335 +ipset=/3dsexy.net/gfwlist +server=/softbank.jp/127.0.0.1#5335 +ipset=/softbank.jp/gfwlist +server=/adultbay.org/127.0.0.1#5335 +ipset=/adultbay.org/gfwlist +server=/google.ws/127.0.0.1#5335 +ipset=/google.ws/gfwlist +server=/xxbay.com/127.0.0.1#5335 +ipset=/xxbay.com/gfwlist +server=/meetsmartbook.com/127.0.0.1#5335 +ipset=/meetsmartbook.com/gfwlist +server=/vhxqa3.com/127.0.0.1#5335 +ipset=/vhxqa3.com/gfwlist +server=/gateway.dev/127.0.0.1#5335 +ipset=/gateway.dev/gfwlist +server=/foxsports2.com/127.0.0.1#5335 +ipset=/foxsports2.com/gfwlist +server=/recode.net/127.0.0.1#5335 +ipset=/recode.net/gfwlist +server=/dexterhorn.com/127.0.0.1#5335 +ipset=/dexterhorn.com/gfwlist +server=/nfsworld.com/127.0.0.1#5335 +ipset=/nfsworld.com/gfwlist +server=/volvotrucks.ru/127.0.0.1#5335 +ipset=/volvotrucks.ru/gfwlist +server=/ecchinohentai.ru/127.0.0.1#5335 +ipset=/ecchinohentai.ru/gfwlist +server=/lldns.net/127.0.0.1#5335 +ipset=/lldns.net/gfwlist +server=/cosplay-jav.com/127.0.0.1#5335 +ipset=/cosplay-jav.com/gfwlist +server=/sublimedirectory.com/127.0.0.1#5335 +ipset=/sublimedirectory.com/gfwlist +server=/starbucks.com.kz/127.0.0.1#5335 +ipset=/starbucks.com.kz/gfwlist +server=/mastercard.bg/127.0.0.1#5335 +ipset=/mastercard.bg/gfwlist +server=/dubai-escort-list.com/127.0.0.1#5335 +ipset=/dubai-escort-list.com/gfwlist +server=/thenewporn.com/127.0.0.1#5335 +ipset=/thenewporn.com/gfwlist +server=/windowscommunity.net/127.0.0.1#5335 +ipset=/windowscommunity.net/gfwlist +server=/logitechg.com.cn/127.0.0.1#5335 +ipset=/logitechg.com.cn/gfwlist +server=/woflthenewsstation.com/127.0.0.1#5335 +ipset=/woflthenewsstation.com/gfwlist +server=/beatsbysdrdres.com/127.0.0.1#5335 +ipset=/beatsbysdrdres.com/gfwlist +server=/epochtimes.co.kr/127.0.0.1#5335 +ipset=/epochtimes.co.kr/gfwlist +server=/bmw.ly/127.0.0.1#5335 +ipset=/bmw.ly/gfwlist +server=/vintageamateurporn.com/127.0.0.1#5335 +ipset=/vintageamateurporn.com/gfwlist +server=/jsdelivr.com/127.0.0.1#5335 +ipset=/jsdelivr.com/gfwlist +server=/sexvr.com/127.0.0.1#5335 +ipset=/sexvr.com/gfwlist +server=/bmwproductnews.com/127.0.0.1#5335 +ipset=/bmwproductnews.com/gfwlist +server=/spotify.com/127.0.0.1#5335 +ipset=/spotify.com/gfwlist +server=/blogspot.pe/127.0.0.1#5335 +ipset=/blogspot.pe/gfwlist +server=/vod360.net/127.0.0.1#5335 +ipset=/vod360.net/gfwlist +server=/cisco.com/127.0.0.1#5335 +ipset=/cisco.com/gfwlist +server=/myfreecams.com/127.0.0.1#5335 +ipset=/myfreecams.com/gfwlist +server=/linuxfromscratch.org/127.0.0.1#5335 +ipset=/linuxfromscratch.org/gfwlist +server=/bmw-connecteddrive.com.kw/127.0.0.1#5335 +ipset=/bmw-connecteddrive.com.kw/gfwlist +server=/dettol.hu/127.0.0.1#5335 +ipset=/dettol.hu/gfwlist +server=/buypass.no/127.0.0.1#5335 +ipset=/buypass.no/gfwlist +server=/4greedy.com/127.0.0.1#5335 +ipset=/4greedy.com/gfwlist +server=/device-manager.us/127.0.0.1#5335 +ipset=/device-manager.us/gfwlist +server=/abema.tv/127.0.0.1#5335 +ipset=/abema.tv/gfwlist +server=/biggggg.com/127.0.0.1#5335 +ipset=/biggggg.com/gfwlist +server=/poopee-puke.com/127.0.0.1#5335 +ipset=/poopee-puke.com/gfwlist +server=/hackfacebookid.com/127.0.0.1#5335 +ipset=/hackfacebookid.com/gfwlist +server=/sony.com.hn/127.0.0.1#5335 +ipset=/sony.com.hn/gfwlist +server=/amateurwivesvideos.com/127.0.0.1#5335 +ipset=/amateurwivesvideos.com/gfwlist +server=/cios.org/127.0.0.1#5335 +ipset=/cios.org/gfwlist +server=/inlethd.com/127.0.0.1#5335 +ipset=/inlethd.com/gfwlist +server=/ytimg.com/127.0.0.1#5335 +ipset=/ytimg.com/gfwlist +server=/zohopublic.com/127.0.0.1#5335 +ipset=/zohopublic.com/gfwlist +server=/transarmuito.com/127.0.0.1#5335 +ipset=/transarmuito.com/gfwlist +server=/javmost.xyz/127.0.0.1#5335 +ipset=/javmost.xyz/gfwlist +server=/pornimg.xyz/127.0.0.1#5335 +ipset=/pornimg.xyz/gfwlist +server=/bandag.com/127.0.0.1#5335 +ipset=/bandag.com/gfwlist +server=/rbsgr.com/127.0.0.1#5335 +ipset=/rbsgr.com/gfwlist +server=/nailedhard.com/127.0.0.1#5335 +ipset=/nailedhard.com/gfwlist +server=/itcanwait.com/127.0.0.1#5335 +ipset=/itcanwait.com/gfwlist +server=/bmw.com.mx/127.0.0.1#5335 +ipset=/bmw.com.mx/gfwlist +server=/bridgestonewx.com/127.0.0.1#5335 +ipset=/bridgestonewx.com/gfwlist +server=/questvisual.com/127.0.0.1#5335 +ipset=/questvisual.com/gfwlist +server=/avmoo.com/127.0.0.1#5335 +ipset=/avmoo.com/gfwlist +server=/thevirtualsexreview.com/127.0.0.1#5335 +ipset=/thevirtualsexreview.com/gfwlist +server=/paypal-gpplus.com/127.0.0.1#5335 +ipset=/paypal-gpplus.com/gfwlist +server=/bitflyer.jp/127.0.0.1#5335 +ipset=/bitflyer.jp/gfwlist +server=/pinterest.se/127.0.0.1#5335 +ipset=/pinterest.se/gfwlist +server=/technics.com/127.0.0.1#5335 +ipset=/technics.com/gfwlist +server=/azuredns-prd.org/127.0.0.1#5335 +ipset=/azuredns-prd.org/gfwlist +server=/spicybigtits.com/127.0.0.1#5335 +ipset=/spicybigtits.com/gfwlist +server=/wix-code.com/127.0.0.1#5335 +ipset=/wix-code.com/gfwlist +server=/nikedunks.net/127.0.0.1#5335 +ipset=/nikedunks.net/gfwlist +server=/netflixinvestor.com/127.0.0.1#5335 +ipset=/netflixinvestor.com/gfwlist +server=/hentainhaven.com/127.0.0.1#5335 +ipset=/hentainhaven.com/gfwlist +server=/scatolo-guromania.com/127.0.0.1#5335 +ipset=/scatolo-guromania.com/gfwlist +server=/tvb.com.au/127.0.0.1#5335 +ipset=/tvb.com.au/gfwlist +server=/harpercollins.co.in/127.0.0.1#5335 +ipset=/harpercollins.co.in/gfwlist +server=/adwords-community.com/127.0.0.1#5335 +ipset=/adwords-community.com/gfwlist +server=/redtubepremium.com/127.0.0.1#5335 +ipset=/redtubepremium.com/gfwlist +server=/fuckcuck.com/127.0.0.1#5335 +ipset=/fuckcuck.com/gfwlist +server=/scholar.google.com.br/127.0.0.1#5335 +ipset=/scholar.google.com.br/gfwlist +server=/nicovideo.jp/127.0.0.1#5335 +ipset=/nicovideo.jp/gfwlist +server=/facebooki.com/127.0.0.1#5335 +ipset=/facebooki.com/gfwlist +server=/ikea.eg/127.0.0.1#5335 +ipset=/ikea.eg/gfwlist +server=/scoretv.tv/127.0.0.1#5335 +ipset=/scoretv.tv/gfwlist +server=/bmw-connecteddrive.ca/127.0.0.1#5335 +ipset=/bmw-connecteddrive.ca/gfwlist +server=/bmw-motorrad.com.au/127.0.0.1#5335 +ipset=/bmw-motorrad.com.au/gfwlist +server=/kinkyfamily.com/127.0.0.1#5335 +ipset=/kinkyfamily.com/gfwlist +server=/crazylivecams.com/127.0.0.1#5335 +ipset=/crazylivecams.com/gfwlist +server=/streamingdisney.net/127.0.0.1#5335 +ipset=/streamingdisney.net/gfwlist +server=/hentaiprno.com/127.0.0.1#5335 +ipset=/hentaiprno.com/gfwlist +server=/nextdigital.com.tw/127.0.0.1#5335 +ipset=/nextdigital.com.tw/gfwlist +server=/fuckingfreemovies.com/127.0.0.1#5335 +ipset=/fuckingfreemovies.com/gfwlist +server=/uber-assets.com/127.0.0.1#5335 +ipset=/uber-assets.com/gfwlist +server=/adultdeepfakes.com/127.0.0.1#5335 +ipset=/adultdeepfakes.com/gfwlist +server=/mingkyaa.com/127.0.0.1#5335 +ipset=/mingkyaa.com/gfwlist +server=/dropboxmail.com/127.0.0.1#5335 +ipset=/dropboxmail.com/gfwlist +server=/topface.com/127.0.0.1#5335 +ipset=/topface.com/gfwlist +server=/ftchinese.com/127.0.0.1#5335 +ipset=/ftchinese.com/gfwlist +server=/intel.bs/127.0.0.1#5335 +ipset=/intel.bs/gfwlist +server=/cosmosdb.info/127.0.0.1#5335 +ipset=/cosmosdb.info/gfwlist +server=/inteliotmarketplace.com/127.0.0.1#5335 +ipset=/inteliotmarketplace.com/gfwlist +server=/xxxhub123.com/127.0.0.1#5335 +ipset=/xxxhub123.com/gfwlist +server=/eighteen-store18x.jp/127.0.0.1#5335 +ipset=/eighteen-store18x.jp/gfwlist +server=/adsenseformobileapps.com/127.0.0.1#5335 +ipset=/adsenseformobileapps.com/gfwlist +server=/hoge.7jp.info/127.0.0.1#5335 +ipset=/hoge.7jp.info/gfwlist +server=/pa9pal.com/127.0.0.1#5335 +ipset=/pa9pal.com/gfwlist +server=/paypalhere.com/127.0.0.1#5335 +ipset=/paypalhere.com/gfwlist +server=/estudiopenthouse.com/127.0.0.1#5335 +ipset=/estudiopenthouse.com/gfwlist +server=/nudevista.link/127.0.0.1#5335 +ipset=/nudevista.link/gfwlist +server=/sexy-torrents.com/127.0.0.1#5335 +ipset=/sexy-torrents.com/gfwlist +server=/pornkro.com/127.0.0.1#5335 +ipset=/pornkro.com/gfwlist +server=/ninpu.cyou/127.0.0.1#5335 +ipset=/ninpu.cyou/gfwlist +server=/animedao-tv.com/127.0.0.1#5335 +ipset=/animedao-tv.com/gfwlist +server=/asiangfvideos.com/127.0.0.1#5335 +ipset=/asiangfvideos.com/gfwlist +server=/tophdsex.com/127.0.0.1#5335 +ipset=/tophdsex.com/gfwlist +server=/mini.it/127.0.0.1#5335 +ipset=/mini.it/gfwlist +server=/hpcampus.com/127.0.0.1#5335 +ipset=/hpcampus.com/gfwlist +server=/youtube.com.hr/127.0.0.1#5335 +ipset=/youtube.com.hr/gfwlist +server=/bigbigchannel.com.hk/127.0.0.1#5335 +ipset=/bigbigchannel.com.hk/gfwlist +server=/arcgisonline.com/127.0.0.1#5335 +ipset=/arcgisonline.com/gfwlist +server=/doctor-videos.com/127.0.0.1#5335 +ipset=/doctor-videos.com/gfwlist +server=/pornsearchengine.com/127.0.0.1#5335 +ipset=/pornsearchengine.com/gfwlist +server=/steam.ru.qtlglb.com/127.0.0.1#5335 +ipset=/steam.ru.qtlglb.com/gfwlist +server=/onlycartoonsex.com/127.0.0.1#5335 +ipset=/onlycartoonsex.com/gfwlist +server=/ntdvn.com/127.0.0.1#5335 +ipset=/ntdvn.com/gfwlist +server=/raspbian.org/127.0.0.1#5335 +ipset=/raspbian.org/gfwlist +server=/playoverwatch.com/127.0.0.1#5335 +ipset=/playoverwatch.com/gfwlist +server=/tsuradou.noonvob.com/127.0.0.1#5335 +ipset=/tsuradou.noonvob.com/gfwlist +server=/mini-dubai.com/127.0.0.1#5335 +ipset=/mini-dubai.com/gfwlist +server=/durex.com.sg/127.0.0.1#5335 +ipset=/durex.com.sg/gfwlist +server=/garena.tw/127.0.0.1#5335 +ipset=/garena.tw/gfwlist +server=/canon.com.al/127.0.0.1#5335 +ipset=/canon.com.al/gfwlist +server=/ilife.eu/127.0.0.1#5335 +ipset=/ilife.eu/gfwlist +server=/pornxp.com/127.0.0.1#5335 +ipset=/pornxp.com/gfwlist +server=/google.co.mz/127.0.0.1#5335 +ipset=/google.co.mz/gfwlist +server=/pretty-ass.xyz/127.0.0.1#5335 +ipset=/pretty-ass.xyz/gfwlist +server=/bmwbikes.com/127.0.0.1#5335 +ipset=/bmwbikes.com/gfwlist +server=/sling.com/127.0.0.1#5335 +ipset=/sling.com/gfwlist +server=/monstershopcheapbeats.net/127.0.0.1#5335 +ipset=/monstershopcheapbeats.net/gfwlist +server=/shopee.in/127.0.0.1#5335 +ipset=/shopee.in/gfwlist +server=/quicktake.video/127.0.0.1#5335 +ipset=/quicktake.video/gfwlist +server=/gamebeforethegame.com/127.0.0.1#5335 +ipset=/gamebeforethegame.com/gfwlist +server=/apple.sg/127.0.0.1#5335 +ipset=/apple.sg/gfwlist +server=/akamaietpcompromisedmalwaretest.com/127.0.0.1#5335 +ipset=/akamaietpcompromisedmalwaretest.com/gfwlist +server=/cell.com/127.0.0.1#5335 +ipset=/cell.com/gfwlist +server=/dell.com/127.0.0.1#5335 +ipset=/dell.com/gfwlist +server=/garena.co.id/127.0.0.1#5335 +ipset=/garena.co.id/gfwlist +server=/sex4arabxxx.com/127.0.0.1#5335 +ipset=/sex4arabxxx.com/gfwlist +server=/ebsco.com/127.0.0.1#5335 +ipset=/ebsco.com/gfwlist +server=/whatsapp-plus.info/127.0.0.1#5335 +ipset=/whatsapp-plus.info/gfwlist +server=/itools.info/127.0.0.1#5335 +ipset=/itools.info/gfwlist +server=/trannytube.tv/127.0.0.1#5335 +ipset=/trannytube.tv/gfwlist +server=/pornicom.com/127.0.0.1#5335 +ipset=/pornicom.com/gfwlist +server=/slinginternational.com/127.0.0.1#5335 +ipset=/slinginternational.com/gfwlist +server=/pinterest.co/127.0.0.1#5335 +ipset=/pinterest.co/gfwlist +server=/theporndude.cc/127.0.0.1#5335 +ipset=/theporndude.cc/gfwlist +server=/cilk.com/127.0.0.1#5335 +ipset=/cilk.com/gfwlist +server=/cuckoldinterracialporn.com/127.0.0.1#5335 +ipset=/cuckoldinterracialporn.com/gfwlist +server=/clinicalkey.com/127.0.0.1#5335 +ipset=/clinicalkey.com/gfwlist +server=/nurxxx.mobi/127.0.0.1#5335 +ipset=/nurxxx.mobi/gfwlist +server=/volvotrucks.cz/127.0.0.1#5335 +ipset=/volvotrucks.cz/gfwlist +server=/intel.mp/127.0.0.1#5335 +ipset=/intel.mp/gfwlist +server=/starbucks.vn/127.0.0.1#5335 +ipset=/starbucks.vn/gfwlist +server=/freexxx.best/127.0.0.1#5335 +ipset=/freexxx.best/gfwlist +server=/edge.steam-dns.top.comcast.net/127.0.0.1#5335 +ipset=/edge.steam-dns.top.comcast.net/gfwlist +server=/sony.co.kr/127.0.0.1#5335 +ipset=/sony.co.kr/gfwlist +server=/nenitas.club/127.0.0.1#5335 +ipset=/nenitas.club/gfwlist +server=/roshy.tv/127.0.0.1#5335 +ipset=/roshy.tv/gfwlist +server=/vkuserlive.net/127.0.0.1#5335 +ipset=/vkuserlive.net/gfwlist +server=/moviesneek.com/127.0.0.1#5335 +ipset=/moviesneek.com/gfwlist +server=/zoohun.com/127.0.0.1#5335 +ipset=/zoohun.com/gfwlist +server=/lsawards.com/127.0.0.1#5335 +ipset=/lsawards.com/gfwlist +server=/z5.app/127.0.0.1#5335 +ipset=/z5.app/gfwlist +server=/bejeweledstars.com/127.0.0.1#5335 +ipset=/bejeweledstars.com/gfwlist +server=/momomall.com.tw/127.0.0.1#5335 +ipset=/momomall.com.tw/gfwlist +server=/grannygetsafacial.com/127.0.0.1#5335 +ipset=/grannygetsafacial.com/gfwlist +server=/binancezh.cc/127.0.0.1#5335 +ipset=/binancezh.cc/gfwlist +server=/newlineporn.com/127.0.0.1#5335 +ipset=/newlineporn.com/gfwlist +server=/plos.org/127.0.0.1#5335 +ipset=/plos.org/gfwlist +server=/3lib.net/127.0.0.1#5335 +ipset=/3lib.net/gfwlist +server=/scholar.google.com.uy/127.0.0.1#5335 +ipset=/scholar.google.com.uy/gfwlist +server=/hackday.com.au/127.0.0.1#5335 +ipset=/hackday.com.au/gfwlist +server=/miniso.ie/127.0.0.1#5335 +ipset=/miniso.ie/gfwlist +server=/volvopenta.fr/127.0.0.1#5335 +ipset=/volvopenta.fr/gfwlist +server=/hanime.xxx/127.0.0.1#5335 +ipset=/hanime.xxx/gfwlist +server=/aoaou.iillii.net/127.0.0.1#5335 +ipset=/aoaou.iillii.net/gfwlist +server=/picasaweb.org/127.0.0.1#5335 +ipset=/picasaweb.org/gfwlist +server=/nikeaustralia.com/127.0.0.1#5335 +ipset=/nikeaustralia.com/gfwlist +server=/firestonecomercial.com.co/127.0.0.1#5335 +ipset=/firestonecomercial.com.co/gfwlist +server=/bookstagram.com/127.0.0.1#5335 +ipset=/bookstagram.com/gfwlist +server=/vanish.com.hr/127.0.0.1#5335 +ipset=/vanish.com.hr/gfwlist +server=/intel.rw/127.0.0.1#5335 +ipset=/intel.rw/gfwlist +server=/marketwatch.com/127.0.0.1#5335 +ipset=/marketwatch.com/gfwlist +server=/bmwmass.net/127.0.0.1#5335 +ipset=/bmwmass.net/gfwlist +server=/hotcandyland.com/127.0.0.1#5335 +ipset=/hotcandyland.com/gfwlist +server=/oculus-china.com/127.0.0.1#5335 +ipset=/oculus-china.com/gfwlist +server=/twitpic.com/127.0.0.1#5335 +ipset=/twitpic.com/gfwlist +server=/ebaybenefits.com/127.0.0.1#5335 +ipset=/ebaybenefits.com/gfwlist +server=/google.vu/127.0.0.1#5335 +ipset=/google.vu/gfwlist +server=/casimages.com/127.0.0.1#5335 +ipset=/casimages.com/gfwlist +server=/xcams.com/127.0.0.1#5335 +ipset=/xcams.com/gfwlist +server=/webhosting.com/127.0.0.1#5335 +ipset=/webhosting.com/gfwlist +server=/pubmatic.com/127.0.0.1#5335 +ipset=/pubmatic.com/gfwlist +server=/xvideo.run/127.0.0.1#5335 +ipset=/xvideo.run/gfwlist +server=/myavok.com/127.0.0.1#5335 +ipset=/myavok.com/gfwlist +server=/erothots.co/127.0.0.1#5335 +ipset=/erothots.co/gfwlist +server=/cartoonpornonly.com/127.0.0.1#5335 +ipset=/cartoonpornonly.com/gfwlist +server=/beatsfranceofficiel.com/127.0.0.1#5335 +ipset=/beatsfranceofficiel.com/gfwlist +server=/azuremarketplace.microsoft.com/127.0.0.1#5335 +ipset=/azuremarketplace.microsoft.com/gfwlist +server=/sissy.eu.org/127.0.0.1#5335 +ipset=/sissy.eu.org/gfwlist +server=/scholar.google.co.za/127.0.0.1#5335 +ipset=/scholar.google.co.za/gfwlist +server=/gaystream.pw/127.0.0.1#5335 +ipset=/gaystream.pw/gfwlist +server=/indienudes.com/127.0.0.1#5335 +ipset=/indienudes.com/gfwlist +server=/x99av.com/127.0.0.1#5335 +ipset=/x99av.com/gfwlist +server=/uuk28.com/127.0.0.1#5335 +ipset=/uuk28.com/gfwlist +server=/nflxvideo.net/127.0.0.1#5335 +ipset=/nflxvideo.net/gfwlist +server=/myhulu.com/127.0.0.1#5335 +ipset=/myhulu.com/gfwlist +server=/bmwchampionship.com/127.0.0.1#5335 +ipset=/bmwchampionship.com/gfwlist +server=/nuuporn.com/127.0.0.1#5335 +ipset=/nuuporn.com/gfwlist +server=/pornspark.com/127.0.0.1#5335 +ipset=/pornspark.com/gfwlist +server=/wsj.com/127.0.0.1#5335 +ipset=/wsj.com/gfwlist +server=/facebookflow.com/127.0.0.1#5335 +ipset=/facebookflow.com/gfwlist +server=/volvotrucks.my/127.0.0.1#5335 +ipset=/volvotrucks.my/gfwlist +server=/facebook.se/127.0.0.1#5335 +ipset=/facebook.se/gfwlist +server=/enfa.com.vn/127.0.0.1#5335 +ipset=/enfa.com.vn/gfwlist +server=/vmworld2013.com/127.0.0.1#5335 +ipset=/vmworld2013.com/gfwlist +server=/aventertainments.com/127.0.0.1#5335 +ipset=/aventertainments.com/gfwlist +server=/12diasderegalosdeitunes.co/127.0.0.1#5335 +ipset=/12diasderegalosdeitunes.co/gfwlist +server=/fleshlyx.com/127.0.0.1#5335 +ipset=/fleshlyx.com/gfwlist +server=/sora6.com/127.0.0.1#5335 +ipset=/sora6.com/gfwlist +server=/bmw-ottawa.ca/127.0.0.1#5335 +ipset=/bmw-ottawa.ca/gfwlist +server=/draftjs.org/127.0.0.1#5335 +ipset=/draftjs.org/gfwlist +server=/youtube.com.jm/127.0.0.1#5335 +ipset=/youtube.com.jm/gfwlist +server=/hbogo.eu/127.0.0.1#5335 +ipset=/hbogo.eu/gfwlist +server=/gogo-load.com/127.0.0.1#5335 +ipset=/gogo-load.com/gfwlist +server=/mcdindonesia.com/127.0.0.1#5335 +ipset=/mcdindonesia.com/gfwlist +server=/icegaytube.tv/127.0.0.1#5335 +ipset=/icegaytube.tv/gfwlist +server=/mailonsunday.co.uk/127.0.0.1#5335 +ipset=/mailonsunday.co.uk/gfwlist +server=/amerikiskhma.com/127.0.0.1#5335 +ipset=/amerikiskhma.com/gfwlist +server=/icloudos.net/127.0.0.1#5335 +ipset=/icloudos.net/gfwlist +server=/nikey.com/127.0.0.1#5335 +ipset=/nikey.com/gfwlist +server=/sciencemag.org/127.0.0.1#5335 +ipset=/sciencemag.org/gfwlist +server=/brandeasygo.com/127.0.0.1#5335 +ipset=/brandeasygo.com/gfwlist +server=/nintendo.com.pt/127.0.0.1#5335 +ipset=/nintendo.com.pt/gfwlist +server=/faketaxi.com/127.0.0.1#5335 +ipset=/faketaxi.com/gfwlist +server=/home-made-porn-movies.com/127.0.0.1#5335 +ipset=/home-made-porn-movies.com/gfwlist +server=/firestone.com.co/127.0.0.1#5335 +ipset=/firestone.com.co/gfwlist +server=/tesla.services/127.0.0.1#5335 +ipset=/tesla.services/gfwlist +server=/epochshop.com/127.0.0.1#5335 +ipset=/epochshop.com/gfwlist +server=/easypic.com/127.0.0.1#5335 +ipset=/easypic.com/gfwlist +server=/ebaystyle.com/127.0.0.1#5335 +ipset=/ebaystyle.com/gfwlist +server=/mansionglobal.com/127.0.0.1#5335 +ipset=/mansionglobal.com/gfwlist +server=/pridetube.com/127.0.0.1#5335 +ipset=/pridetube.com/gfwlist +server=/livemodels.co/127.0.0.1#5335 +ipset=/livemodels.co/gfwlist +server=/veet.com.ar/127.0.0.1#5335 +ipset=/veet.com.ar/gfwlist +server=/hentai.io/127.0.0.1#5335 +ipset=/hentai.io/gfwlist +server=/ceskeporno.cz/127.0.0.1#5335 +ipset=/ceskeporno.cz/gfwlist +server=/youtube.be/127.0.0.1#5335 +ipset=/youtube.be/gfwlist +server=/prostate-exam-info.com/127.0.0.1#5335 +ipset=/prostate-exam-info.com/gfwlist +server=/vfsco.fr/127.0.0.1#5335 +ipset=/vfsco.fr/gfwlist +server=/gemini.yahoo.com/127.0.0.1#5335 +ipset=/gemini.yahoo.com/gfwlist +server=/aadmv.com/127.0.0.1#5335 +ipset=/aadmv.com/gfwlist +server=/youtube.hr/127.0.0.1#5335 +ipset=/youtube.hr/gfwlist +server=/pornlist18.com/127.0.0.1#5335 +ipset=/pornlist18.com/gfwlist +server=/beatsbydreaustralia-sale.com/127.0.0.1#5335 +ipset=/beatsbydreaustralia-sale.com/gfwlist +server=/macruby.com/127.0.0.1#5335 +ipset=/macruby.com/gfwlist +server=/xgirls.webcam/127.0.0.1#5335 +ipset=/xgirls.webcam/gfwlist +server=/dogfartnetwork.com/127.0.0.1#5335 +ipset=/dogfartnetwork.com/gfwlist +server=/kutjeporno.com/127.0.0.1#5335 +ipset=/kutjeporno.com/gfwlist +server=/sexmummy.com/127.0.0.1#5335 +ipset=/sexmummy.com/gfwlist +server=/secure-paypal.info/127.0.0.1#5335 +ipset=/secure-paypal.info/gfwlist +server=/fast.com/127.0.0.1#5335 +ipset=/fast.com/gfwlist +server=/hkgpao.com/127.0.0.1#5335 +ipset=/hkgpao.com/gfwlist +server=/instanttelegram.com/127.0.0.1#5335 +ipset=/instanttelegram.com/gfwlist +server=/xvideos.co/127.0.0.1#5335 +ipset=/xvideos.co/gfwlist +server=/yiqilai99.cn/127.0.0.1#5335 +ipset=/yiqilai99.cn/gfwlist +server=/igcdn.com/127.0.0.1#5335 +ipset=/igcdn.com/gfwlist +server=/vanitaonline.com/127.0.0.1#5335 +ipset=/vanitaonline.com/gfwlist +server=/avday.tv/127.0.0.1#5335 +ipset=/avday.tv/gfwlist +server=/justmysocks4.net/127.0.0.1#5335 +ipset=/justmysocks4.net/gfwlist +server=/xboxone.com/127.0.0.1#5335 +ipset=/xboxone.com/gfwlist +server=/yt.be/127.0.0.1#5335 +ipset=/yt.be/gfwlist +server=/stepmom.one/127.0.0.1#5335 +ipset=/stepmom.one/gfwlist +server=/vanish.pl/127.0.0.1#5335 +ipset=/vanish.pl/gfwlist +server=/scholar.google.com.do/127.0.0.1#5335 +ipset=/scholar.google.com.do/gfwlist +server=/darwinsourcecode.com/127.0.0.1#5335 +ipset=/darwinsourcecode.com/gfwlist +server=/blogspot.ca/127.0.0.1#5335 +ipset=/blogspot.ca/gfwlist +server=/sponichi.co.jp/127.0.0.1#5335 +ipset=/sponichi.co.jp/gfwlist +server=/musclegirlflix.com/127.0.0.1#5335 +ipset=/musclegirlflix.com/gfwlist +server=/seagroup.com/127.0.0.1#5335 +ipset=/seagroup.com/gfwlist +server=/nikekid.com/127.0.0.1#5335 +ipset=/nikekid.com/gfwlist +server=/bmwsports.com/127.0.0.1#5335 +ipset=/bmwsports.com/gfwlist +server=/czechlesbians.com/127.0.0.1#5335 +ipset=/czechlesbians.com/gfwlist +server=/amazon.com.mx/127.0.0.1#5335 +ipset=/amazon.com.mx/gfwlist +server=/catcert.cat/127.0.0.1#5335 +ipset=/catcert.cat/gfwlist +server=/nextjs.org/127.0.0.1#5335 +ipset=/nextjs.org/gfwlist +server=/jerkofftocelebs.com/127.0.0.1#5335 +ipset=/jerkofftocelebs.com/gfwlist +server=/topartporn.com/127.0.0.1#5335 +ipset=/topartporn.com/gfwlist +server=/rbe996.com/127.0.0.1#5335 +ipset=/rbe996.com/gfwlist +server=/e-szigno.hu/127.0.0.1#5335 +ipset=/e-szigno.hu/gfwlist +server=/lustylist.com/127.0.0.1#5335 +ipset=/lustylist.com/gfwlist +server=/cuckoldwifesex.com/127.0.0.1#5335 +ipset=/cuckoldwifesex.com/gfwlist +server=/beatbydreuk2014.com/127.0.0.1#5335 +ipset=/beatbydreuk2014.com/gfwlist +server=/visa.com.ar/127.0.0.1#5335 +ipset=/visa.com.ar/gfwlist +server=/twavking.com/127.0.0.1#5335 +ipset=/twavking.com/gfwlist +server=/bmj.com/127.0.0.1#5335 +ipset=/bmj.com/gfwlist +server=/alfera.com.hk/127.0.0.1#5335 +ipset=/alfera.com.hk/gfwlist +server=/tube-sex-videos.com/127.0.0.1#5335 +ipset=/tube-sex-videos.com/gfwlist +server=/helixstudios.net/127.0.0.1#5335 +ipset=/helixstudios.net/gfwlist +server=/heroero.com/127.0.0.1#5335 +ipset=/heroero.com/gfwlist +server=/oxfordclinicalpsych.com/127.0.0.1#5335 +ipset=/oxfordclinicalpsych.com/gfwlist +server=/meilleurpornos.com/127.0.0.1#5335 +ipset=/meilleurpornos.com/gfwlist +server=/ikea.com.tw/127.0.0.1#5335 +ipset=/ikea.com.tw/gfwlist +server=/pearson.co.in/127.0.0.1#5335 +ipset=/pearson.co.in/gfwlist +server=/sucksex.com/127.0.0.1#5335 +ipset=/sucksex.com/gfwlist +server=/pppds.com/127.0.0.1#5335 +ipset=/pppds.com/gfwlist +server=/bcicdn.com/127.0.0.1#5335 +ipset=/bcicdn.com/gfwlist +server=/brandelectronic.com/127.0.0.1#5335 +ipset=/brandelectronic.com/gfwlist +server=/pearsonvue.net/127.0.0.1#5335 +ipset=/pearsonvue.net/gfwlist +server=/nurumassage.net/127.0.0.1#5335 +ipset=/nurumassage.net/gfwlist +server=/mingshengbao.com/127.0.0.1#5335 +ipset=/mingshengbao.com/gfwlist +server=/transcamslive.com/127.0.0.1#5335 +ipset=/transcamslive.com/gfwlist +server=/2013beatsbydrdreshop.com/127.0.0.1#5335 +ipset=/2013beatsbydrdreshop.com/gfwlist +server=/onedrive.co/127.0.0.1#5335 +ipset=/onedrive.co/gfwlist +server=/tubepornlist.com/127.0.0.1#5335 +ipset=/tubepornlist.com/gfwlist +server=/instamgram.com/127.0.0.1#5335 +ipset=/instamgram.com/gfwlist +server=/spankingtube.com/127.0.0.1#5335 +ipset=/spankingtube.com/gfwlist +server=/myamateurgirls.net/127.0.0.1#5335 +ipset=/myamateurgirls.net/gfwlist +server=/google.sk/127.0.0.1#5335 +ipset=/google.sk/gfwlist +server=/cartoonporno.xxx/127.0.0.1#5335 +ipset=/cartoonporno.xxx/gfwlist +server=/hentaiz.cc/127.0.0.1#5335 +ipset=/hentaiz.cc/gfwlist +server=/fbcdn-a.akamaihd.net/127.0.0.1#5335 +ipset=/fbcdn-a.akamaihd.net/gfwlist +server=/simply-hentai.com/127.0.0.1#5335 +ipset=/simply-hentai.com/gfwlist +server=/krymr.com/127.0.0.1#5335 +ipset=/krymr.com/gfwlist +server=/youtube.gr/127.0.0.1#5335 +ipset=/youtube.gr/gfwlist +server=/attbelieves.com/127.0.0.1#5335 +ipset=/attbelieves.com/gfwlist +server=/sony-semicon.co.jp/127.0.0.1#5335 +ipset=/sony-semicon.co.jp/gfwlist +server=/pobl-content.com/127.0.0.1#5335 +ipset=/pobl-content.com/gfwlist +server=/volvotrucks.kr/127.0.0.1#5335 +ipset=/volvotrucks.kr/gfwlist +server=/mini-windsor.com/127.0.0.1#5335 +ipset=/mini-windsor.com/gfwlist +server=/hoes.com/127.0.0.1#5335 +ipset=/hoes.com/gfwlist +server=/facebookmail.com/127.0.0.1#5335 +ipset=/facebookmail.com/gfwlist +server=/netflixdnstest8.com/127.0.0.1#5335 +ipset=/netflixdnstest8.com/gfwlist +server=/niceporn.tv/127.0.0.1#5335 +ipset=/niceporn.tv/gfwlist +server=/ubnw.net/127.0.0.1#5335 +ipset=/ubnw.net/gfwlist +server=/vfsco.cl/127.0.0.1#5335 +ipset=/vfsco.cl/gfwlist +server=/sekswebsite.nl/127.0.0.1#5335 +ipset=/sekswebsite.nl/gfwlist +server=/cloudproxy.app/127.0.0.1#5335 +ipset=/cloudproxy.app/gfwlist +server=/daftsex-hd.com/127.0.0.1#5335 +ipset=/daftsex-hd.com/gfwlist +server=/mjv-art.org/127.0.0.1#5335 +ipset=/mjv-art.org/gfwlist +server=/marketing-cloud.com/127.0.0.1#5335 +ipset=/marketing-cloud.com/gfwlist +server=/yahoo.ro/127.0.0.1#5335 +ipset=/yahoo.ro/gfwlist +server=/netsolssl.com/127.0.0.1#5335 +ipset=/netsolssl.com/gfwlist +server=/motherporn.ovh/127.0.0.1#5335 +ipset=/motherporn.ovh/gfwlist +server=/malayalamanorama.com/127.0.0.1#5335 +ipset=/malayalamanorama.com/gfwlist +server=/apple.co.jp/127.0.0.1#5335 +ipset=/apple.co.jp/gfwlist +server=/ebayinc.com/127.0.0.1#5335 +ipset=/ebayinc.com/gfwlist +server=/licdn.com/127.0.0.1#5335 +ipset=/licdn.com/gfwlist +server=/yourwifemymeat.com/127.0.0.1#5335 +ipset=/yourwifemymeat.com/gfwlist +server=/vanish.co.id/127.0.0.1#5335 +ipset=/vanish.co.id/gfwlist +server=/alldrawingshere.com/127.0.0.1#5335 +ipset=/alldrawingshere.com/gfwlist +server=/ckcdn.com/127.0.0.1#5335 +ipset=/ckcdn.com/gfwlist +server=/ppe.lawyer/127.0.0.1#5335 +ipset=/ppe.lawyer/gfwlist +server=/gradeuptube.com/127.0.0.1#5335 +ipset=/gradeuptube.com/gfwlist +server=/xvideosnovinhas.com/127.0.0.1#5335 +ipset=/xvideosnovinhas.com/gfwlist +server=/cryptocompare.com/127.0.0.1#5335 +ipset=/cryptocompare.com/gfwlist +server=/18-teen-xxx.com/127.0.0.1#5335 +ipset=/18-teen-xxx.com/gfwlist +server=/avstar.me/127.0.0.1#5335 +ipset=/avstar.me/gfwlist +server=/zhengjian.org/127.0.0.1#5335 +ipset=/zhengjian.org/gfwlist +server=/fuck6teen.com/127.0.0.1#5335 +ipset=/fuck6teen.com/gfwlist +server=/40somethingmag.com/127.0.0.1#5335 +ipset=/40somethingmag.com/gfwlist +server=/yahoo.com.ag/127.0.0.1#5335 +ipset=/yahoo.com.ag/gfwlist +server=/brazzfan.com/127.0.0.1#5335 +ipset=/brazzfan.com/gfwlist +server=/epoch.org.il/127.0.0.1#5335 +ipset=/epoch.org.il/gfwlist +server=/faceboob.com/127.0.0.1#5335 +ipset=/faceboob.com/gfwlist +server=/myatos.net/127.0.0.1#5335 +ipset=/myatos.net/gfwlist +server=/getpocket.com/127.0.0.1#5335 +ipset=/getpocket.com/gfwlist +server=/landofhope.tv/127.0.0.1#5335 +ipset=/landofhope.tv/gfwlist +server=/pornktube.com/127.0.0.1#5335 +ipset=/pornktube.com/gfwlist +server=/mininanaimo.com/127.0.0.1#5335 +ipset=/mininanaimo.com/gfwlist +server=/freecartoons.biz/127.0.0.1#5335 +ipset=/freecartoons.biz/gfwlist +server=/rarbgto.org/127.0.0.1#5335 +ipset=/rarbgto.org/gfwlist +server=/pinksporn.com/127.0.0.1#5335 +ipset=/pinksporn.com/gfwlist +server=/sexjk.com/127.0.0.1#5335 +ipset=/sexjk.com/gfwlist +server=/xnxx-sex-tube.com/127.0.0.1#5335 +ipset=/xnxx-sex-tube.com/gfwlist +server=/volvobuses.co.nz/127.0.0.1#5335 +ipset=/volvobuses.co.nz/gfwlist +server=/aboutyourmini.com/127.0.0.1#5335 +ipset=/aboutyourmini.com/gfwlist +server=/wetnhorny.com/127.0.0.1#5335 +ipset=/wetnhorny.com/gfwlist +server=/vrporncat.com/127.0.0.1#5335 +ipset=/vrporncat.com/gfwlist +server=/ubisoft-uplay-savegames.s3.amazonaws.com/127.0.0.1#5335 +ipset=/ubisoft-uplay-savegames.s3.amazonaws.com/gfwlist +server=/xsvod.xyz/127.0.0.1#5335 +ipset=/xsvod.xyz/gfwlist +server=/disco-api.com/127.0.0.1#5335 +ipset=/disco-api.com/gfwlist +server=/nikestore.com.au/127.0.0.1#5335 +ipset=/nikestore.com.au/gfwlist +server=/pageview.mobi/127.0.0.1#5335 +ipset=/pageview.mobi/gfwlist +server=/ptt3.cc/127.0.0.1#5335 +ipset=/ptt3.cc/gfwlist +server=/feook.com/127.0.0.1#5335 +ipset=/feook.com/gfwlist +server=/google.td/127.0.0.1#5335 +ipset=/google.td/gfwlist +server=/voa.gov/127.0.0.1#5335 +ipset=/voa.gov/gfwlist +server=/vmwidm-ads.com/127.0.0.1#5335 +ipset=/vmwidm-ads.com/gfwlist +server=/sexgamesbox.com/127.0.0.1#5335 +ipset=/sexgamesbox.com/gfwlist +server=/masseffectarchives.com/127.0.0.1#5335 +ipset=/masseffectarchives.com/gfwlist +server=/fmcebook.com/127.0.0.1#5335 +ipset=/fmcebook.com/gfwlist +server=/xn--czrs0t4phtr3a.cn/127.0.0.1#5335 +ipset=/xn--czrs0t4phtr3a.cn/gfwlist +server=/fbworkmail.com/127.0.0.1#5335 +ipset=/fbworkmail.com/gfwlist +server=/sb.sb/127.0.0.1#5335 +ipset=/sb.sb/gfwlist +server=/cheapbeatsbydreoutlet-nz.com/127.0.0.1#5335 +ipset=/cheapbeatsbydreoutlet-nz.com/gfwlist +server=/azurecomcdn.net/127.0.0.1#5335 +ipset=/azurecomcdn.net/gfwlist +server=/ebaynyc.com/127.0.0.1#5335 +ipset=/ebaynyc.com/gfwlist +server=/japanesebeauties.net/127.0.0.1#5335 +ipset=/japanesebeauties.net/gfwlist +server=/staxus.com/127.0.0.1#5335 +ipset=/staxus.com/gfwlist +server=/volvotrucks.hk/127.0.0.1#5335 +ipset=/volvotrucks.hk/gfwlist +server=/discord.design/127.0.0.1#5335 +ipset=/discord.design/gfwlist +server=/pinterest.de/127.0.0.1#5335 +ipset=/pinterest.de/gfwlist +server=/stacyvandenbergboobs.com/127.0.0.1#5335 +ipset=/stacyvandenbergboobs.com/gfwlist +server=/ikea.in/127.0.0.1#5335 +ipset=/ikea.in/gfwlist +server=/ip.sb/127.0.0.1#5335 +ipset=/ip.sb/gfwlist +server=/codeberg.org/127.0.0.1#5335 +ipset=/codeberg.org/gfwlist +server=/westlaw.com/127.0.0.1#5335 +ipset=/westlaw.com/gfwlist +server=/phun.org/127.0.0.1#5335 +ipset=/phun.org/gfwlist +server=/atdmt2.com/127.0.0.1#5335 +ipset=/atdmt2.com/gfwlist +server=/visaeurope.si/127.0.0.1#5335 +ipset=/visaeurope.si/gfwlist +server=/girlsway.com/127.0.0.1#5335 +ipset=/girlsway.com/gfwlist +server=/epochtimes.it/127.0.0.1#5335 +ipset=/epochtimes.it/gfwlist +server=/pacifickitchenandhome.com/127.0.0.1#5335 +ipset=/pacifickitchenandhome.com/gfwlist +server=/mplstudios.com/127.0.0.1#5335 +ipset=/mplstudios.com/gfwlist +server=/mgo-images.com/127.0.0.1#5335 +ipset=/mgo-images.com/gfwlist +server=/lettherebeporn.com/127.0.0.1#5335 +ipset=/lettherebeporn.com/gfwlist +server=/theshoppingexpresslane.net/127.0.0.1#5335 +ipset=/theshoppingexpresslane.net/gfwlist +server=/jitsi.org/127.0.0.1#5335 +ipset=/jitsi.org/gfwlist +server=/miniwholesaleconnect.com/127.0.0.1#5335 +ipset=/miniwholesaleconnect.com/gfwlist +server=/paypal-referral.com/127.0.0.1#5335 +ipset=/paypal-referral.com/gfwlist +server=/badjojo.com/127.0.0.1#5335 +ipset=/badjojo.com/gfwlist +server=/binancezh.be/127.0.0.1#5335 +ipset=/binancezh.be/gfwlist +server=/moviesfree4u.xyz/127.0.0.1#5335 +ipset=/moviesfree4u.xyz/gfwlist +server=/bbycastatic.ca/127.0.0.1#5335 +ipset=/bbycastatic.ca/gfwlist +server=/app-dynamics.com/127.0.0.1#5335 +ipset=/app-dynamics.com/gfwlist +server=/freepornhentaigames.com/127.0.0.1#5335 +ipset=/freepornhentaigames.com/gfwlist +server=/bmwgroup-classic-heart.com/127.0.0.1#5335 +ipset=/bmwgroup-classic-heart.com/gfwlist +server=/github.com/127.0.0.1#5335 +ipset=/github.com/gfwlist +server=/appledarwin.com/127.0.0.1#5335 +ipset=/appledarwin.com/gfwlist +server=/beatsheadphonesusamall.com/127.0.0.1#5335 +ipset=/beatsheadphonesusamall.com/gfwlist +server=/ind.sh/127.0.0.1#5335 +ipset=/ind.sh/gfwlist +server=/cuckoldporntube.com/127.0.0.1#5335 +ipset=/cuckoldporntube.com/gfwlist +server=/agzy1.com/127.0.0.1#5335 +ipset=/agzy1.com/gfwlist +server=/thenextweb.com/127.0.0.1#5335 +ipset=/thenextweb.com/gfwlist +server=/bridgestonetyre.com.my/127.0.0.1#5335 +ipset=/bridgestonetyre.com.my/gfwlist +server=/milfslesbian.com/127.0.0.1#5335 +ipset=/milfslesbian.com/gfwlist +server=/pornoboard.net/127.0.0.1#5335 +ipset=/pornoboard.net/gfwlist +server=/ibradome.com/127.0.0.1#5335 +ipset=/ibradome.com/gfwlist +server=/fuckthathussy.com/127.0.0.1#5335 +ipset=/fuckthathussy.com/gfwlist +server=/sexmerci.com/127.0.0.1#5335 +ipset=/sexmerci.com/gfwlist +server=/opentranslatorstothings.org/127.0.0.1#5335 +ipset=/opentranslatorstothings.org/gfwlist +server=/collective99.com/127.0.0.1#5335 +ipset=/collective99.com/gfwlist +server=/thenationalpulse.com/127.0.0.1#5335 +ipset=/thenationalpulse.com/gfwlist +server=/bmia.org/127.0.0.1#5335 +ipset=/bmia.org/gfwlist +server=/huffingtonpost.co.uk/127.0.0.1#5335 +ipset=/huffingtonpost.co.uk/gfwlist +server=/adultsexgame.biz/127.0.0.1#5335 +ipset=/adultsexgame.biz/gfwlist +server=/minilaval.com/127.0.0.1#5335 +ipset=/minilaval.com/gfwlist +server=/visa.com.kh/127.0.0.1#5335 +ipset=/visa.com.kh/gfwlist +server=/horse-cum.net/127.0.0.1#5335 +ipset=/horse-cum.net/gfwlist +server=/visa.nl/127.0.0.1#5335 +ipset=/visa.nl/gfwlist +server=/fox38corpuschristi.com/127.0.0.1#5335 +ipset=/fox38corpuschristi.com/gfwlist +server=/bwh8.net/127.0.0.1#5335 +ipset=/bwh8.net/gfwlist +server=/practicalmoneyskills.ca/127.0.0.1#5335 +ipset=/practicalmoneyskills.ca/gfwlist +server=/kktv.com.tw/127.0.0.1#5335 +ipset=/kktv.com.tw/gfwlist +server=/hentaifc.com/127.0.0.1#5335 +ipset=/hentaifc.com/gfwlist +server=/crececonebay.com/127.0.0.1#5335 +ipset=/crececonebay.com/gfwlist +server=/zteman.net/127.0.0.1#5335 +ipset=/zteman.net/gfwlist +server=/javplatform.com/127.0.0.1#5335 +ipset=/javplatform.com/gfwlist +server=/instafollower.com/127.0.0.1#5335 +ipset=/instafollower.com/gfwlist +server=/beastiegals.com/127.0.0.1#5335 +ipset=/beastiegals.com/gfwlist +server=/intel.cz/127.0.0.1#5335 +ipset=/intel.cz/gfwlist +server=/applemalaysia.com.my/127.0.0.1#5335 +ipset=/applemalaysia.com.my/gfwlist +server=/disneymusicpromotion.com/127.0.0.1#5335 +ipset=/disneymusicpromotion.com/gfwlist +server=/applestore.ph/127.0.0.1#5335 +ipset=/applestore.ph/gfwlist +server=/pages.dev/127.0.0.1#5335 +ipset=/pages.dev/gfwlist +server=/paypal-apac.com/127.0.0.1#5335 +ipset=/paypal-apac.com/gfwlist +server=/paypal-center.com/127.0.0.1#5335 +ipset=/paypal-center.com/gfwlist +server=/iamremarkable.org/127.0.0.1#5335 +ipset=/iamremarkable.org/gfwlist +server=/pornshare.biz/127.0.0.1#5335 +ipset=/pornshare.biz/gfwlist +server=/adobecontent.io/127.0.0.1#5335 +ipset=/adobecontent.io/gfwlist +server=/airwick.ch/127.0.0.1#5335 +ipset=/airwick.ch/gfwlist +server=/ubuntu.net/127.0.0.1#5335 +ipset=/ubuntu.net/gfwlist +server=/etheadphones.com/127.0.0.1#5335 +ipset=/etheadphones.com/gfwlist +server=/fbfeedback.com/127.0.0.1#5335 +ipset=/fbfeedback.com/gfwlist +server=/langsuirs.com/127.0.0.1#5335 +ipset=/langsuirs.com/gfwlist +server=/microsoft.tv/127.0.0.1#5335 +ipset=/microsoft.tv/gfwlist +server=/faseboox.com/127.0.0.1#5335 +ipset=/faseboox.com/gfwlist +server=/img4.uk/127.0.0.1#5335 +ipset=/img4.uk/gfwlist +server=/pictoa.com/127.0.0.1#5335 +ipset=/pictoa.com/gfwlist +server=/jav24.com/127.0.0.1#5335 +ipset=/jav24.com/gfwlist +server=/beastysexlinks.com/127.0.0.1#5335 +ipset=/beastysexlinks.com/gfwlist +server=/calgon.ru/127.0.0.1#5335 +ipset=/calgon.ru/gfwlist +server=/scitation.org/127.0.0.1#5335 +ipset=/scitation.org/gfwlist +server=/sexykittenporn.com/127.0.0.1#5335 +ipset=/sexykittenporn.com/gfwlist +server=/hentai.name/127.0.0.1#5335 +ipset=/hentai.name/gfwlist +server=/latinaabuse.com/127.0.0.1#5335 +ipset=/latinaabuse.com/gfwlist +server=/onlysiterip.com/127.0.0.1#5335 +ipset=/onlysiterip.com/gfwlist +server=/volvobuses.us/127.0.0.1#5335 +ipset=/volvobuses.us/gfwlist +server=/herokucharge.com/127.0.0.1#5335 +ipset=/herokucharge.com/gfwlist +server=/nikereuseashoe.com/127.0.0.1#5335 +ipset=/nikereuseashoe.com/gfwlist +server=/bmw-motorrad.gr/127.0.0.1#5335 +ipset=/bmw-motorrad.gr/gfwlist +server=/bmw-konzernarchiv.de/127.0.0.1#5335 +ipset=/bmw-konzernarchiv.de/gfwlist +server=/ashemaletv.com/127.0.0.1#5335 +ipset=/ashemaletv.com/gfwlist +server=/4porn.com/127.0.0.1#5335 +ipset=/4porn.com/gfwlist +server=/mingpaovan.com/127.0.0.1#5335 +ipset=/mingpaovan.com/gfwlist +server=/itunesradio.tw/127.0.0.1#5335 +ipset=/itunesradio.tw/gfwlist +server=/cixp.net/127.0.0.1#5335 +ipset=/cixp.net/gfwlist +server=/htyj-bj.com/127.0.0.1#5335 +ipset=/htyj-bj.com/gfwlist +server=/wikidot.com/127.0.0.1#5335 +ipset=/wikidot.com/gfwlist +server=/sshs.club/127.0.0.1#5335 +ipset=/sshs.club/gfwlist +server=/x1337x.eu/127.0.0.1#5335 +ipset=/x1337x.eu/gfwlist +server=/firestone.co.cr/127.0.0.1#5335 +ipset=/firestone.co.cr/gfwlist +server=/intel.nz/127.0.0.1#5335 +ipset=/intel.nz/gfwlist +server=/atube.xxx/127.0.0.1#5335 +ipset=/atube.xxx/gfwlist +server=/intel.com.ec/127.0.0.1#5335 +ipset=/intel.com.ec/gfwlist +server=/pascherbeatsmonster.com/127.0.0.1#5335 +ipset=/pascherbeatsmonster.com/gfwlist +server=/wholekidsfoundation.org/127.0.0.1#5335 +ipset=/wholekidsfoundation.org/gfwlist +server=/parse.com/127.0.0.1#5335 +ipset=/parse.com/gfwlist +server=/organicmaps.app/127.0.0.1#5335 +ipset=/organicmaps.app/gfwlist +server=/doeda.com/127.0.0.1#5335 +ipset=/doeda.com/gfwlist +server=/instastyle.tv/127.0.0.1#5335 +ipset=/instastyle.tv/gfwlist +server=/ruby-lang.org/127.0.0.1#5335 +ipset=/ruby-lang.org/gfwlist +server=/cmmedia.com.tw/127.0.0.1#5335 +ipset=/cmmedia.com.tw/gfwlist +server=/google.gm/127.0.0.1#5335 +ipset=/google.gm/gfwlist +server=/linear-abematv.akamaized.net/127.0.0.1#5335 +ipset=/linear-abematv.akamaized.net/gfwlist +server=/fetishbank.net/127.0.0.1#5335 +ipset=/fetishbank.net/gfwlist +server=/fightforux.com/127.0.0.1#5335 +ipset=/fightforux.com/gfwlist +server=/pwmnet.com/127.0.0.1#5335 +ipset=/pwmnet.com/gfwlist +server=/jerkmate.com/127.0.0.1#5335 +ipset=/jerkmate.com/gfwlist +server=/fox7austin.com/127.0.0.1#5335 +ipset=/fox7austin.com/gfwlist +server=/scala-lang.org/127.0.0.1#5335 +ipset=/scala-lang.org/gfwlist +server=/disneyinflight.com/127.0.0.1#5335 +ipset=/disneyinflight.com/gfwlist +server=/gamesstack.com/127.0.0.1#5335 +ipset=/gamesstack.com/gfwlist +server=/volvotrucks.co.bw/127.0.0.1#5335 +ipset=/volvotrucks.co.bw/gfwlist +server=/tiberiumalliances.com/127.0.0.1#5335 +ipset=/tiberiumalliances.com/gfwlist +server=/kaamuu.com/127.0.0.1#5335 +ipset=/kaamuu.com/gfwlist +server=/commandandconquer.com/127.0.0.1#5335 +ipset=/commandandconquer.com/gfwlist +server=/finish.bg/127.0.0.1#5335 +ipset=/finish.bg/gfwlist +server=/vporn.com/127.0.0.1#5335 +ipset=/vporn.com/gfwlist +server=/bmw.com.ar/127.0.0.1#5335 +ipset=/bmw.com.ar/gfwlist +server=/intel.co.cr/127.0.0.1#5335 +ipset=/intel.co.cr/gfwlist +server=/kechtube.com/127.0.0.1#5335 +ipset=/kechtube.com/gfwlist +server=/dreamforce.com/127.0.0.1#5335 +ipset=/dreamforce.com/gfwlist +server=/beatsbydresstudio.com/127.0.0.1#5335 +ipset=/beatsbydresstudio.com/gfwlist +server=/2beeg.me/127.0.0.1#5335 +ipset=/2beeg.me/gfwlist +server=/google.com/127.0.0.1#5335 +ipset=/google.com/gfwlist +server=/imzog.com/127.0.0.1#5335 +ipset=/imzog.com/gfwlist +server=/swegold.com/127.0.0.1#5335 +ipset=/swegold.com/gfwlist +server=/sexyfucking.ru/127.0.0.1#5335 +ipset=/sexyfucking.ru/gfwlist +server=/sensualgirls.org/127.0.0.1#5335 +ipset=/sensualgirls.org/gfwlist +server=/bululusexdoll.com/127.0.0.1#5335 +ipset=/bululusexdoll.com/gfwlist +server=/ebaycourse.com/127.0.0.1#5335 +ipset=/ebaycourse.com/gfwlist +server=/intel.sx/127.0.0.1#5335 +ipset=/intel.sx/gfwlist +server=/12diasderegalosdeitunes.co.ni/127.0.0.1#5335 +ipset=/12diasderegalosdeitunes.co.ni/gfwlist +server=/vanish.co.za/127.0.0.1#5335 +ipset=/vanish.co.za/gfwlist +server=/alfera.com.my/127.0.0.1#5335 +ipset=/alfera.com.my/gfwlist +server=/youtube.no/127.0.0.1#5335 +ipset=/youtube.no/gfwlist +server=/woolite.com/127.0.0.1#5335 +ipset=/woolite.com/gfwlist +server=/businessweekmag.com/127.0.0.1#5335 +ipset=/businessweekmag.com/gfwlist +server=/fox23.com/127.0.0.1#5335 +ipset=/fox23.com/gfwlist +server=/huobitoken.com/127.0.0.1#5335 +ipset=/huobitoken.com/gfwlist +server=/thepornmap.com/127.0.0.1#5335 +ipset=/thepornmap.com/gfwlist +server=/pokemonhome.com/127.0.0.1#5335 +ipset=/pokemonhome.com/gfwlist +server=/77maott.com/127.0.0.1#5335 +ipset=/77maott.com/gfwlist +server=/volvotrucks.lv/127.0.0.1#5335 +ipset=/volvotrucks.lv/gfwlist +server=/modeltv.com/127.0.0.1#5335 +ipset=/modeltv.com/gfwlist +server=/jpg4.pw/127.0.0.1#5335 +ipset=/jpg4.pw/gfwlist +server=/facegbook.com/127.0.0.1#5335 +ipset=/facegbook.com/gfwlist +server=/bmw-plant-munich.com/127.0.0.1#5335 +ipset=/bmw-plant-munich.com/gfwlist +server=/appleone.film/127.0.0.1#5335 +ipset=/appleone.film/gfwlist +server=/mini-georgia.com/127.0.0.1#5335 +ipset=/mini-georgia.com/gfwlist +server=/fundraisingwithfacebook.com/127.0.0.1#5335 +ipset=/fundraisingwithfacebook.com/gfwlist +server=/hpfeedback.com/127.0.0.1#5335 +ipset=/hpfeedback.com/gfwlist +server=/leagueoflegends.net/127.0.0.1#5335 +ipset=/leagueoflegends.net/gfwlist +server=/xxx-ways.com/127.0.0.1#5335 +ipset=/xxx-ways.com/gfwlist +server=/youtube.al/127.0.0.1#5335 +ipset=/youtube.al/gfwlist +server=/fetishes.cam/127.0.0.1#5335 +ipset=/fetishes.cam/gfwlist +server=/webex.ca/127.0.0.1#5335 +ipset=/webex.ca/gfwlist +server=/primevideo.cc/127.0.0.1#5335 +ipset=/primevideo.cc/gfwlist +server=/streamporn.cc/127.0.0.1#5335 +ipset=/streamporn.cc/gfwlist +server=/lecoin.cc/127.0.0.1#5335 +ipset=/lecoin.cc/gfwlist +server=/ebay.de/127.0.0.1#5335 +ipset=/ebay.de/gfwlist +server=/ameblo.jp/127.0.0.1#5335 +ipset=/ameblo.jp/gfwlist +server=/miniso.pe/127.0.0.1#5335 +ipset=/miniso.pe/gfwlist +server=/servicetalk.io/127.0.0.1#5335 +ipset=/servicetalk.io/gfwlist +server=/facebooklogin.com/127.0.0.1#5335 +ipset=/facebooklogin.com/gfwlist +server=/unityads.unity3d.com/127.0.0.1#5335 +ipset=/unityads.unity3d.com/gfwlist +server=/beatsbydreinexpensive.com/127.0.0.1#5335 +ipset=/beatsbydreinexpensive.com/gfwlist +server=/softbank-telecom.net/127.0.0.1#5335 +ipset=/softbank-telecom.net/gfwlist +server=/ikea.com.de/127.0.0.1#5335 +ipset=/ikea.com.de/gfwlist +server=/2bit8.com/127.0.0.1#5335 +ipset=/2bit8.com/gfwlist +server=/rb-crisis.com/127.0.0.1#5335 +ipset=/rb-crisis.com/gfwlist +server=/uug25.com/127.0.0.1#5335 +ipset=/uug25.com/gfwlist +server=/alphabet.eu/127.0.0.1#5335 +ipset=/alphabet.eu/gfwlist +server=/porn.to/127.0.0.1#5335 +ipset=/porn.to/gfwlist +server=/vpornvideos.com/127.0.0.1#5335 +ipset=/vpornvideos.com/gfwlist +server=/drunk6.com/127.0.0.1#5335 +ipset=/drunk6.com/gfwlist +server=/vimeo-staging.com/127.0.0.1#5335 +ipset=/vimeo-staging.com/gfwlist +server=/fbinc.com/127.0.0.1#5335 +ipset=/fbinc.com/gfwlist +server=/dkk37.com/127.0.0.1#5335 +ipset=/dkk37.com/gfwlist +server=/pinterest.kr/127.0.0.1#5335 +ipset=/pinterest.kr/gfwlist +server=/vjmedia.com.hk/127.0.0.1#5335 +ipset=/vjmedia.com.hk/gfwlist +server=/taose.tv/127.0.0.1#5335 +ipset=/taose.tv/gfwlist +server=/bridgestone-plt-eng.com/127.0.0.1#5335 +ipset=/bridgestone-plt-eng.com/gfwlist +server=/miniso.ma/127.0.0.1#5335 +ipset=/miniso.ma/gfwlist +server=/dirtyleague.com/127.0.0.1#5335 +ipset=/dirtyleague.com/gfwlist +server=/javmenu.com/127.0.0.1#5335 +ipset=/javmenu.com/gfwlist +server=/getdirect.tv/127.0.0.1#5335 +ipset=/getdirect.tv/gfwlist +server=/steampipe-kr.akamaized.net/127.0.0.1#5335 +ipset=/steampipe-kr.akamaized.net/gfwlist +server=/adobeaemcloud.com/127.0.0.1#5335 +ipset=/adobeaemcloud.com/gfwlist +server=/paypal.com/127.0.0.1#5335 +ipset=/paypal.com/gfwlist +server=/crosswalk-project.net/127.0.0.1#5335 +ipset=/crosswalk-project.net/gfwlist +server=/nikecloud.com/127.0.0.1#5335 +ipset=/nikecloud.com/gfwlist +server=/easportsworld.com/127.0.0.1#5335 +ipset=/easportsworld.com/gfwlist +server=/starbuckspoq.com/127.0.0.1#5335 +ipset=/starbuckspoq.com/gfwlist +server=/binancezh.mobi/127.0.0.1#5335 +ipset=/binancezh.mobi/gfwlist +server=/twinprime.com/127.0.0.1#5335 +ipset=/twinprime.com/gfwlist +server=/179na.com/127.0.0.1#5335 +ipset=/179na.com/gfwlist +server=/adidas.be/127.0.0.1#5335 +ipset=/adidas.be/gfwlist +server=/googleventures.com/127.0.0.1#5335 +ipset=/googleventures.com/gfwlist +server=/camvideos.org/127.0.0.1#5335 +ipset=/camvideos.org/gfwlist +server=/beatsheadphonesforcheap.net/127.0.0.1#5335 +ipset=/beatsheadphonesforcheap.net/gfwlist +server=/tubetop69.com/127.0.0.1#5335 +ipset=/tubetop69.com/gfwlist +server=/cloudinsights.com/127.0.0.1#5335 +ipset=/cloudinsights.com/gfwlist +server=/joysporn.com/127.0.0.1#5335 +ipset=/joysporn.com/gfwlist +server=/bmwvalueservice.com/127.0.0.1#5335 +ipset=/bmwvalueservice.com/gfwlist +server=/visa.com.vc/127.0.0.1#5335 +ipset=/visa.com.vc/gfwlist +server=/finish.co.za/127.0.0.1#5335 +ipset=/finish.co.za/gfwlist +server=/incestvidz.com/127.0.0.1#5335 +ipset=/incestvidz.com/gfwlist +server=/beatsbydresales.us/127.0.0.1#5335 +ipset=/beatsbydresales.us/gfwlist +server=/openresty.org/127.0.0.1#5335 +ipset=/openresty.org/gfwlist +server=/canon.pt/127.0.0.1#5335 +ipset=/canon.pt/gfwlist +server=/canon.fi/127.0.0.1#5335 +ipset=/canon.fi/gfwlist +server=/globalsign.ch/127.0.0.1#5335 +ipset=/globalsign.ch/gfwlist +server=/artstor.org/127.0.0.1#5335 +ipset=/artstor.org/gfwlist +server=/thefoxnation.com/127.0.0.1#5335 +ipset=/thefoxnation.com/gfwlist +server=/3pornstarmovies.com/127.0.0.1#5335 +ipset=/3pornstarmovies.com/gfwlist +server=/jmcomic1.me/127.0.0.1#5335 +ipset=/jmcomic1.me/gfwlist +server=/ieeefoundation.org/127.0.0.1#5335 +ipset=/ieeefoundation.org/gfwlist +server=/pornjk.com/127.0.0.1#5335 +ipset=/pornjk.com/gfwlist +server=/baterias-hp.com/127.0.0.1#5335 +ipset=/baterias-hp.com/gfwlist +server=/ipad.de/127.0.0.1#5335 +ipset=/ipad.de/gfwlist +server=/xn--x-qeu1ji09tzlg.net/127.0.0.1#5335 +ipset=/xn--x-qeu1ji09tzlg.net/gfwlist +server=/porno.org.in/127.0.0.1#5335 +ipset=/porno.org.in/gfwlist +server=/miniso-nz.com/127.0.0.1#5335 +ipset=/miniso-nz.com/gfwlist +server=/worldscientific.com/127.0.0.1#5335 +ipset=/worldscientific.com/gfwlist +server=/mypornadviser.com/127.0.0.1#5335 +ipset=/mypornadviser.com/gfwlist +server=/bmw-motorrad.rs/127.0.0.1#5335 +ipset=/bmw-motorrad.rs/gfwlist +server=/bestbuycanadaltd.ca/127.0.0.1#5335 +ipset=/bestbuycanadaltd.ca/gfwlist +server=/ebay.jp/127.0.0.1#5335 +ipset=/ebay.jp/gfwlist +server=/momon-ga.com/127.0.0.1#5335 +ipset=/momon-ga.com/gfwlist +server=/x.co/127.0.0.1#5335 +ipset=/x.co/gfwlist +server=/pornultras.com/127.0.0.1#5335 +ipset=/pornultras.com/gfwlist +server=/t.co/127.0.0.1#5335 +ipset=/t.co/gfwlist +server=/uun98.com/127.0.0.1#5335 +ipset=/uun98.com/gfwlist +server=/netacad.net/127.0.0.1#5335 +ipset=/netacad.net/gfwlist +server=/couplecam.co.uk/127.0.0.1#5335 +ipset=/couplecam.co.uk/gfwlist +server=/placesdocs.com/127.0.0.1#5335 +ipset=/placesdocs.com/gfwlist +server=/vimeogoods.com/127.0.0.1#5335 +ipset=/vimeogoods.com/gfwlist +server=/dropboxforums.com/127.0.0.1#5335 +ipset=/dropboxforums.com/gfwlist +server=/g.co/127.0.0.1#5335 +ipset=/g.co/gfwlist +server=/lolfanart.net/127.0.0.1#5335 +ipset=/lolfanart.net/gfwlist +server=/pixiv.me/127.0.0.1#5335 +ipset=/pixiv.me/gfwlist +server=/iphoto.wang/127.0.0.1#5335 +ipset=/iphoto.wang/gfwlist +server=/nasty.singles/127.0.0.1#5335 +ipset=/nasty.singles/gfwlist +server=/bmw.az/127.0.0.1#5335 +ipset=/bmw.az/gfwlist +server=/lihksnap.com/127.0.0.1#5335 +ipset=/lihksnap.com/gfwlist +server=/ck101.com/127.0.0.1#5335 +ipset=/ck101.com/gfwlist +server=/bestbuytradein.com/127.0.0.1#5335 +ipset=/bestbuytradein.com/gfwlist +server=/paypalcorp.com/127.0.0.1#5335 +ipset=/paypalcorp.com/gfwlist +server=/wtfpeople.com/127.0.0.1#5335 +ipset=/wtfpeople.com/gfwlist +server=/developer.microsoft.com/127.0.0.1#5335 +ipset=/developer.microsoft.com/gfwlist +server=/selectanescort.com/127.0.0.1#5335 +ipset=/selectanescort.com/gfwlist +server=/vector.im/127.0.0.1#5335 +ipset=/vector.im/gfwlist +server=/dgg.gg/127.0.0.1#5335 +ipset=/dgg.gg/gfwlist +server=/adgoogle.net/127.0.0.1#5335 +ipset=/adgoogle.net/gfwlist +server=/oath.com/127.0.0.1#5335 +ipset=/oath.com/gfwlist +server=/thepornbin.com/127.0.0.1#5335 +ipset=/thepornbin.com/gfwlist +server=/thetranny.com/127.0.0.1#5335 +ipset=/thetranny.com/gfwlist +server=/alphabet.co.uk/127.0.0.1#5335 +ipset=/alphabet.co.uk/gfwlist +server=/thesun.ie/127.0.0.1#5335 +ipset=/thesun.ie/gfwlist +server=/frprn.com/127.0.0.1#5335 +ipset=/frprn.com/gfwlist +server=/tufos.com.br/127.0.0.1#5335 +ipset=/tufos.com.br/gfwlist +server=/hdporncomics.com/127.0.0.1#5335 +ipset=/hdporncomics.com/gfwlist +server=/intel.gs/127.0.0.1#5335 +ipset=/intel.gs/gfwlist +server=/cups.org/127.0.0.1#5335 +ipset=/cups.org/gfwlist +server=/opera.com/127.0.0.1#5335 +ipset=/opera.com/gfwlist +server=/applestore.ch/127.0.0.1#5335 +ipset=/applestore.ch/gfwlist +server=/monsterdrebeats-usa.com/127.0.0.1#5335 +ipset=/monsterdrebeats-usa.com/gfwlist +server=/freessl.com/127.0.0.1#5335 +ipset=/freessl.com/gfwlist +server=/postegro.it/127.0.0.1#5335 +ipset=/postegro.it/gfwlist +server=/75m.co/127.0.0.1#5335 +ipset=/75m.co/gfwlist +server=/freewechat.com/127.0.0.1#5335 +ipset=/freewechat.com/gfwlist +server=/atubex.com/127.0.0.1#5335 +ipset=/atubex.com/gfwlist +server=/thehentaiworld.com/127.0.0.1#5335 +ipset=/thehentaiworld.com/gfwlist +server=/mini.com.ph/127.0.0.1#5335 +ipset=/mini.com.ph/gfwlist +server=/johren.net/127.0.0.1#5335 +ipset=/johren.net/gfwlist +server=/shopifycdn.com/127.0.0.1#5335 +ipset=/shopifycdn.com/gfwlist +server=/hdzog.com/127.0.0.1#5335 +ipset=/hdzog.com/gfwlist +server=/fqcebook.com/127.0.0.1#5335 +ipset=/fqcebook.com/gfwlist +server=/edgedatg.com/127.0.0.1#5335 +ipset=/edgedatg.com/gfwlist +server=/freepornhdonlinegay.com/127.0.0.1#5335 +ipset=/freepornhdonlinegay.com/gfwlist +server=/dealtree.org/127.0.0.1#5335 +ipset=/dealtree.org/gfwlist +server=/ohgratisporrfilm.com/127.0.0.1#5335 +ipset=/ohgratisporrfilm.com/gfwlist +server=/manhuntdaily.com/127.0.0.1#5335 +ipset=/manhuntdaily.com/gfwlist +server=/att-rsvp.com/127.0.0.1#5335 +ipset=/att-rsvp.com/gfwlist +server=/bmw-connecteddrive.jp/127.0.0.1#5335 +ipset=/bmw-connecteddrive.jp/gfwlist +server=/v2ph.com/127.0.0.1#5335 +ipset=/v2ph.com/gfwlist +server=/porzo.com/127.0.0.1#5335 +ipset=/porzo.com/gfwlist +server=/app-measurement.com/127.0.0.1#5335 +ipset=/app-measurement.com/gfwlist +server=/beatsforme.com/127.0.0.1#5335 +ipset=/beatsforme.com/gfwlist +server=/typesquare.com/127.0.0.1#5335 +ipset=/typesquare.com/gfwlist +server=/ashemaletube.com/127.0.0.1#5335 +ipset=/ashemaletube.com/gfwlist +server=/azureiotsolutions.com/127.0.0.1#5335 +ipset=/azureiotsolutions.com/gfwlist +server=/shywifeswap.com/127.0.0.1#5335 +ipset=/shywifeswap.com/gfwlist +server=/applw.com/127.0.0.1#5335 +ipset=/applw.com/gfwlist +server=/airwick.pt/127.0.0.1#5335 +ipset=/airwick.pt/gfwlist +server=/snapstore.io/127.0.0.1#5335 +ipset=/snapstore.io/gfwlist +server=/clickedu.co.uk/127.0.0.1#5335 +ipset=/clickedu.co.uk/gfwlist +server=/firebaseio.com/127.0.0.1#5335 +ipset=/firebaseio.com/gfwlist +server=/mastercard.com.ng/127.0.0.1#5335 +ipset=/mastercard.com.ng/gfwlist +server=/hpwsn.com/127.0.0.1#5335 +ipset=/hpwsn.com/gfwlist +server=/acgdv.com/127.0.0.1#5335 +ipset=/acgdv.com/gfwlist +server=/geotrust.com/127.0.0.1#5335 +ipset=/geotrust.com/gfwlist +server=/cheapbeatsie.com/127.0.0.1#5335 +ipset=/cheapbeatsie.com/gfwlist +server=/mortein.com.au/127.0.0.1#5335 +ipset=/mortein.com.au/gfwlist +server=/starbucks.co.th/127.0.0.1#5335 +ipset=/starbucks.co.th/gfwlist +server=/realclearreligion.org/127.0.0.1#5335 +ipset=/realclearreligion.org/gfwlist +server=/eroelog.com/127.0.0.1#5335 +ipset=/eroelog.com/gfwlist +server=/publichealthdepartment.info/127.0.0.1#5335 +ipset=/publichealthdepartment.info/gfwlist +server=/ebayrtm.com/127.0.0.1#5335 +ipset=/ebayrtm.com/gfwlist +server=/guccimuseo.com/127.0.0.1#5335 +ipset=/guccimuseo.com/gfwlist +server=/businessweekly.com.tw/127.0.0.1#5335 +ipset=/businessweekly.com.tw/gfwlist +server=/intel.re/127.0.0.1#5335 +ipset=/intel.re/gfwlist +server=/apple.uk/127.0.0.1#5335 +ipset=/apple.uk/gfwlist +server=/passion.com/127.0.0.1#5335 +ipset=/passion.com/gfwlist +server=/good-gay.com/127.0.0.1#5335 +ipset=/good-gay.com/gfwlist +server=/google.hn/127.0.0.1#5335 +ipset=/google.hn/gfwlist +server=/news.com.au/127.0.0.1#5335 +ipset=/news.com.au/gfwlist +server=/hongkongfp.com/127.0.0.1#5335 +ipset=/hongkongfp.com/gfwlist +server=/geeksquadwebroot.org/127.0.0.1#5335 +ipset=/geeksquadwebroot.org/gfwlist +server=/imagefap.com/127.0.0.1#5335 +ipset=/imagefap.com/gfwlist +server=/google.com.uy/127.0.0.1#5335 +ipset=/google.com.uy/gfwlist +server=/foxsportsnetmilwaukee.com/127.0.0.1#5335 +ipset=/foxsportsnetmilwaukee.com/gfwlist +server=/mikuexpo.com/127.0.0.1#5335 +ipset=/mikuexpo.com/gfwlist +server=/intel.ph/127.0.0.1#5335 +ipset=/intel.ph/gfwlist +server=/matrix.to/127.0.0.1#5335 +ipset=/matrix.to/gfwlist +server=/alhs.xyz/127.0.0.1#5335 +ipset=/alhs.xyz/gfwlist +server=/hpmarketplace.com/127.0.0.1#5335 +ipset=/hpmarketplace.com/gfwlist +server=/nicomanga.jp/127.0.0.1#5335 +ipset=/nicomanga.jp/gfwlist +server=/tubelombia.net/127.0.0.1#5335 +ipset=/tubelombia.net/gfwlist +server=/thecandidbay.com/127.0.0.1#5335 +ipset=/thecandidbay.com/gfwlist +server=/igaychat.com/127.0.0.1#5335 +ipset=/igaychat.com/gfwlist +server=/epochweek.com/127.0.0.1#5335 +ipset=/epochweek.com/gfwlist +server=/mingpao.com/127.0.0.1#5335 +ipset=/mingpao.com/gfwlist +server=/comicsporno.es/127.0.0.1#5335 +ipset=/comicsporno.es/gfwlist +server=/awflapp.top/127.0.0.1#5335 +ipset=/awflapp.top/gfwlist +server=/hentaidude.xxx/127.0.0.1#5335 +ipset=/hentaidude.xxx/gfwlist +server=/aspnetcdn.com/127.0.0.1#5335 +ipset=/aspnetcdn.com/gfwlist +server=/faronics.tech/127.0.0.1#5335 +ipset=/faronics.tech/gfwlist +server=/12diasderegalosdeitunes.com.ve/127.0.0.1#5335 +ipset=/12diasderegalosdeitunes.com.ve/gfwlist +server=/applesurveys.com/127.0.0.1#5335 +ipset=/applesurveys.com/gfwlist +server=/minimoncton.ca/127.0.0.1#5335 +ipset=/minimoncton.ca/gfwlist +server=/gettyimages.no/127.0.0.1#5335 +ipset=/gettyimages.no/gfwlist +server=/acrobat.com/127.0.0.1#5335 +ipset=/acrobat.com/gfwlist +server=/czechstreets.com/127.0.0.1#5335 +ipset=/czechstreets.com/gfwlist +server=/tmsnrt.rs/127.0.0.1#5335 +ipset=/tmsnrt.rs/gfwlist +server=/hotmovs.com/127.0.0.1#5335 +ipset=/hotmovs.com/gfwlist +server=/ashleysageellison.com/127.0.0.1#5335 +ipset=/ashleysageellison.com/gfwlist +server=/ocsp-responder.com/127.0.0.1#5335 +ipset=/ocsp-responder.com/gfwlist +server=/myanmar-porn.com/127.0.0.1#5335 +ipset=/myanmar-porn.com/gfwlist +server=/sexmutant.com/127.0.0.1#5335 +ipset=/sexmutant.com/gfwlist +server=/pokemonbw.com/127.0.0.1#5335 +ipset=/pokemonbw.com/gfwlist +server=/sexbq.com/127.0.0.1#5335 +ipset=/sexbq.com/gfwlist +server=/vmwarestuff.com/127.0.0.1#5335 +ipset=/vmwarestuff.com/gfwlist +server=/bmwcharitygolf.com/127.0.0.1#5335 +ipset=/bmwcharitygolf.com/gfwlist +server=/men18.net/127.0.0.1#5335 +ipset=/men18.net/gfwlist +server=/machotube.tv/127.0.0.1#5335 +ipset=/machotube.tv/gfwlist +server=/dellcdn.com/127.0.0.1#5335 +ipset=/dellcdn.com/gfwlist +server=/parastorage.com/127.0.0.1#5335 +ipset=/parastorage.com/gfwlist +server=/applenewsformat.com/127.0.0.1#5335 +ipset=/applenewsformat.com/gfwlist +server=/pokemonchampionships.com/127.0.0.1#5335 +ipset=/pokemonchampionships.com/gfwlist +server=/putinho.net/127.0.0.1#5335 +ipset=/putinho.net/gfwlist +server=/itsbetterwhenyouwinit.com/127.0.0.1#5335 +ipset=/itsbetterwhenyouwinit.com/gfwlist +server=/51mh.app/127.0.0.1#5335 +ipset=/51mh.app/gfwlist +server=/porn91.org/127.0.0.1#5335 +ipset=/porn91.org/gfwlist +server=/appleappstore.net/127.0.0.1#5335 +ipset=/appleappstore.net/gfwlist +server=/corbinfisher.com/127.0.0.1#5335 +ipset=/corbinfisher.com/gfwlist +server=/incestflix.com/127.0.0.1#5335 +ipset=/incestflix.com/gfwlist +server=/bighead.group/127.0.0.1#5335 +ipset=/bighead.group/gfwlist +server=/trixhentai.com/127.0.0.1#5335 +ipset=/trixhentai.com/gfwlist +server=/xnalgas.com/127.0.0.1#5335 +ipset=/xnalgas.com/gfwlist +server=/umass.edu/127.0.0.1#5335 +ipset=/umass.edu/gfwlist +server=/rakuten.co.jp/127.0.0.1#5335 +ipset=/rakuten.co.jp/gfwlist +server=/google.li/127.0.0.1#5335 +ipset=/google.li/gfwlist +server=/adobesigncdn.com/127.0.0.1#5335 +ipset=/adobesigncdn.com/gfwlist +server=/verisign.se/127.0.0.1#5335 +ipset=/verisign.se/gfwlist +server=/ideal-teens.com/127.0.0.1#5335 +ipset=/ideal-teens.com/gfwlist +server=/monsterbeatsbydrdrestudio.com/127.0.0.1#5335 +ipset=/monsterbeatsbydrdrestudio.com/gfwlist +server=/javscatsex.com/127.0.0.1#5335 +ipset=/javscatsex.com/gfwlist +server=/dtvce.com/127.0.0.1#5335 +ipset=/dtvce.com/gfwlist +server=/cs4hs.com/127.0.0.1#5335 +ipset=/cs4hs.com/gfwlist +server=/mm9c63ae.xyz/127.0.0.1#5335 +ipset=/mm9c63ae.xyz/gfwlist +server=/microsoftstore.com/127.0.0.1#5335 +ipset=/microsoftstore.com/gfwlist +server=/bandpage.com/127.0.0.1#5335 +ipset=/bandpage.com/gfwlist +server=/prothots.com/127.0.0.1#5335 +ipset=/prothots.com/gfwlist +server=/heroesofdragonage.com/127.0.0.1#5335 +ipset=/heroesofdragonage.com/gfwlist +server=/chengjuanseo.com/127.0.0.1#5335 +ipset=/chengjuanseo.com/gfwlist +server=/pornjav.org/127.0.0.1#5335 +ipset=/pornjav.org/gfwlist +server=/darivoa.com/127.0.0.1#5335 +ipset=/darivoa.com/gfwlist +server=/myhomemadesex.com/127.0.0.1#5335 +ipset=/myhomemadesex.com/gfwlist +server=/foxsports-newyork.com/127.0.0.1#5335 +ipset=/foxsports-newyork.com/gfwlist +server=/18qt.com/127.0.0.1#5335 +ipset=/18qt.com/gfwlist +server=/bmw-motorrad-motorsport.com/127.0.0.1#5335 +ipset=/bmw-motorrad-motorsport.com/gfwlist +server=/nature.com/127.0.0.1#5335 +ipset=/nature.com/gfwlist +server=/huluspain.com/127.0.0.1#5335 +ipset=/huluspain.com/gfwlist +server=/golang.com/127.0.0.1#5335 +ipset=/golang.com/gfwlist +server=/ebayenterprise.tv/127.0.0.1#5335 +ipset=/ebayenterprise.tv/gfwlist +server=/sankei.co.jp/127.0.0.1#5335 +ipset=/sankei.co.jp/gfwlist +server=/emojipedia.org/127.0.0.1#5335 +ipset=/emojipedia.org/gfwlist +server=/facebool.info/127.0.0.1#5335 +ipset=/facebool.info/gfwlist +server=/privacytools.io/127.0.0.1#5335 +ipset=/privacytools.io/gfwlist +server=/jiayoulu.com/127.0.0.1#5335 +ipset=/jiayoulu.com/gfwlist +server=/miniso.jp/127.0.0.1#5335 +ipset=/miniso.jp/gfwlist +server=/ebaysweden.com/127.0.0.1#5335 +ipset=/ebaysweden.com/gfwlist +server=/pearsonclinical.be/127.0.0.1#5335 +ipset=/pearsonclinical.be/gfwlist +server=/wal.co/127.0.0.1#5335 +ipset=/wal.co/gfwlist +server=/sony.ro/127.0.0.1#5335 +ipset=/sony.ro/gfwlist +server=/blackshemalevideo.com/127.0.0.1#5335 +ipset=/blackshemalevideo.com/gfwlist +server=/xbooru.com/127.0.0.1#5335 +ipset=/xbooru.com/gfwlist +server=/globalsign.es/127.0.0.1#5335 +ipset=/globalsign.es/gfwlist +server=/directvatlantaga.com/127.0.0.1#5335 +ipset=/directvatlantaga.com/gfwlist +server=/enemarotica.com/127.0.0.1#5335 +ipset=/enemarotica.com/gfwlist +server=/hbomax.com/127.0.0.1#5335 +ipset=/hbomax.com/gfwlist +server=/xboxlive.com/127.0.0.1#5335 +ipset=/xboxlive.com/gfwlist +server=/visaeverywhereshop.com/127.0.0.1#5335 +ipset=/visaeverywhereshop.com/gfwlist +server=/riotcdn.net/127.0.0.1#5335 +ipset=/riotcdn.net/gfwlist +server=/sankei-call.jp/127.0.0.1#5335 +ipset=/sankei-call.jp/gfwlist +server=/drebeatssite.com/127.0.0.1#5335 +ipset=/drebeatssite.com/gfwlist +server=/pleasuremore.com/127.0.0.1#5335 +ipset=/pleasuremore.com/gfwlist +server=/3789av.com/127.0.0.1#5335 +ipset=/3789av.com/gfwlist +server=/2789av.com/127.0.0.1#5335 +ipset=/2789av.com/gfwlist +server=/britsexcash.com/127.0.0.1#5335 +ipset=/britsexcash.com/gfwlist +server=/pornreactor.cc/127.0.0.1#5335 +ipset=/pornreactor.cc/gfwlist +server=/veet.tv/127.0.0.1#5335 +ipset=/veet.tv/gfwlist +server=/iproperty.com.sg/127.0.0.1#5335 +ipset=/iproperty.com.sg/gfwlist +server=/bmw-auslieferungszentrum.com/127.0.0.1#5335 +ipset=/bmw-auslieferungszentrum.com/gfwlist +server=/visadns.com/127.0.0.1#5335 +ipset=/visadns.com/gfwlist +server=/feedherfuckher.com/127.0.0.1#5335 +ipset=/feedherfuckher.com/gfwlist +server=/fgirl.ch/127.0.0.1#5335 +ipset=/fgirl.ch/gfwlist +server=/softbankhawksstore.jp/127.0.0.1#5335 +ipset=/softbankhawksstore.jp/gfwlist +server=/pearsonclinical.se/127.0.0.1#5335 +ipset=/pearsonclinical.se/gfwlist +server=/heartbreakers.info/127.0.0.1#5335 +ipset=/heartbreakers.info/gfwlist +server=/ikea.bg/127.0.0.1#5335 +ipset=/ikea.bg/gfwlist +server=/volvobuses.hu/127.0.0.1#5335 +ipset=/volvobuses.hu/gfwlist +server=/wiifit.com/127.0.0.1#5335 +ipset=/wiifit.com/gfwlist +server=/samsungqbe.com/127.0.0.1#5335 +ipset=/samsungqbe.com/gfwlist +server=/bzazi.com/127.0.0.1#5335 +ipset=/bzazi.com/gfwlist +server=/x-artvideo.net/127.0.0.1#5335 +ipset=/x-artvideo.net/gfwlist +server=/yandex.pl/127.0.0.1#5335 +ipset=/yandex.pl/gfwlist +server=/wikia.org/127.0.0.1#5335 +ipset=/wikia.org/gfwlist +server=/bidong9.com/127.0.0.1#5335 +ipset=/bidong9.com/gfwlist +server=/sandisk.co.kr/127.0.0.1#5335 +ipset=/sandisk.co.kr/gfwlist +server=/veporno.net/127.0.0.1#5335 +ipset=/veporno.net/gfwlist +server=/darwinsource.org/127.0.0.1#5335 +ipset=/darwinsource.org/gfwlist +server=/ciscoconnectcloud.com/127.0.0.1#5335 +ipset=/ciscoconnectcloud.com/gfwlist +server=/avmoo.click/127.0.0.1#5335 +ipset=/avmoo.click/gfwlist +server=/sae.org/127.0.0.1#5335 +ipset=/sae.org/gfwlist +server=/chatwhores.com/127.0.0.1#5335 +ipset=/chatwhores.com/gfwlist +server=/meetyourdevices.com/127.0.0.1#5335 +ipset=/meetyourdevices.com/gfwlist +server=/visa.sk/127.0.0.1#5335 +ipset=/visa.sk/gfwlist +server=/mini.com.bn/127.0.0.1#5335 +ipset=/mini.com.bn/gfwlist +server=/facebookphoto.com/127.0.0.1#5335 +ipset=/facebookphoto.com/gfwlist +server=/mywaytopay.net/127.0.0.1#5335 +ipset=/mywaytopay.net/gfwlist +server=/jpav.us/127.0.0.1#5335 +ipset=/jpav.us/gfwlist +server=/clearasil.us/127.0.0.1#5335 +ipset=/clearasil.us/gfwlist +server=/just.xxx/127.0.0.1#5335 +ipset=/just.xxx/gfwlist +server=/naturalvoices.com/127.0.0.1#5335 +ipset=/naturalvoices.com/gfwlist +server=/freegaypornhdtube.com/127.0.0.1#5335 +ipset=/freegaypornhdtube.com/gfwlist +server=/google.sm/127.0.0.1#5335 +ipset=/google.sm/gfwlist +server=/vilavpn6.xyz/127.0.0.1#5335 +ipset=/vilavpn6.xyz/gfwlist +server=/xxbb9.com/127.0.0.1#5335 +ipset=/xxbb9.com/gfwlist +server=/youtube.com.gt/127.0.0.1#5335 +ipset=/youtube.com.gt/gfwlist +server=/applepodcasts.com/127.0.0.1#5335 +ipset=/applepodcasts.com/gfwlist +server=/google.com.eg/127.0.0.1#5335 +ipset=/google.com.eg/gfwlist +server=/ebalovo.com/127.0.0.1#5335 +ipset=/ebalovo.com/gfwlist +server=/thieme.de/127.0.0.1#5335 +ipset=/thieme.de/gfwlist +server=/openjsf.org/127.0.0.1#5335 +ipset=/openjsf.org/gfwlist +server=/youassporn.com/127.0.0.1#5335 +ipset=/youassporn.com/gfwlist +server=/85st.com/127.0.0.1#5335 +ipset=/85st.com/gfwlist +server=/binance.net/127.0.0.1#5335 +ipset=/binance.net/gfwlist +server=/projectmurphy.net/127.0.0.1#5335 +ipset=/projectmurphy.net/gfwlist +server=/paypal-mobilemoney.com/127.0.0.1#5335 +ipset=/paypal-mobilemoney.com/gfwlist +server=/goldgay.tv/127.0.0.1#5335 +ipset=/goldgay.tv/gfwlist +server=/google.ci/127.0.0.1#5335 +ipset=/google.ci/gfwlist +server=/duckduckgo.uk/127.0.0.1#5335 +ipset=/duckduckgo.uk/gfwlist +server=/bdsm.com/127.0.0.1#5335 +ipset=/bdsm.com/gfwlist +server=/frostbite.com/127.0.0.1#5335 +ipset=/frostbite.com/gfwlist +server=/justporno.tv/127.0.0.1#5335 +ipset=/justporno.tv/gfwlist +server=/googlevideo.com/127.0.0.1#5335 +ipset=/googlevideo.com/gfwlist +server=/dacebook.com/127.0.0.1#5335 +ipset=/dacebook.com/gfwlist +server=/thecuckold.com/127.0.0.1#5335 +ipset=/thecuckold.com/gfwlist +server=/bmw-i-pure-impulse.com/127.0.0.1#5335 +ipset=/bmw-i-pure-impulse.com/gfwlist +server=/simonsgirls.com/127.0.0.1#5335 +ipset=/simonsgirls.com/gfwlist +server=/mysdn.net/127.0.0.1#5335 +ipset=/mysdn.net/gfwlist +server=/mailhealth.com/127.0.0.1#5335 +ipset=/mailhealth.com/gfwlist +server=/gacebook.com/127.0.0.1#5335 +ipset=/gacebook.com/gfwlist +server=/facebook.com/127.0.0.1#5335 +ipset=/facebook.com/gfwlist +server=/skysportsonline.com/127.0.0.1#5335 +ipset=/skysportsonline.com/gfwlist +server=/hp3dprinter.com/127.0.0.1#5335 +ipset=/hp3dprinter.com/gfwlist +server=/iphone.es/127.0.0.1#5335 +ipset=/iphone.es/gfwlist +server=/nichepornsite.com/127.0.0.1#5335 +ipset=/nichepornsite.com/gfwlist +server=/bmw.co.nz/127.0.0.1#5335 +ipset=/bmw.co.nz/gfwlist +server=/bitstamp.net/127.0.0.1#5335 +ipset=/bitstamp.net/gfwlist +server=/microsoft.se/127.0.0.1#5335 +ipset=/microsoft.se/gfwlist +server=/ieee.ca/127.0.0.1#5335 +ipset=/ieee.ca/gfwlist +server=/wireshark.org/127.0.0.1#5335 +ipset=/wireshark.org/gfwlist +server=/bmw-motorrad.lu/127.0.0.1#5335 +ipset=/bmw-motorrad.lu/gfwlist +server=/redditmedia.com/127.0.0.1#5335 +ipset=/redditmedia.com/gfwlist +server=/nationalgeographicpartners.com/127.0.0.1#5335 +ipset=/nationalgeographicpartners.com/gfwlist +server=/applestore.com.pl/127.0.0.1#5335 +ipset=/applestore.com.pl/gfwlist +server=/foxla.com/127.0.0.1#5335 +ipset=/foxla.com/gfwlist +server=/paypal-labs.com/127.0.0.1#5335 +ipset=/paypal-labs.com/gfwlist +server=/conscrypt.com/127.0.0.1#5335 +ipset=/conscrypt.com/gfwlist +server=/rebates.jp/127.0.0.1#5335 +ipset=/rebates.jp/gfwlist +server=/guruofporn.com/127.0.0.1#5335 +ipset=/guruofporn.com/gfwlist +server=/sony.com.ec/127.0.0.1#5335 +ipset=/sony.com.ec/gfwlist +server=/pimg.tw/127.0.0.1#5335 +ipset=/pimg.tw/gfwlist +server=/pornuj.cz/127.0.0.1#5335 +ipset=/pornuj.cz/gfwlist +server=/hipaa6020.com/127.0.0.1#5335 +ipset=/hipaa6020.com/gfwlist +server=/xxvids.net/127.0.0.1#5335 +ipset=/xxvids.net/gfwlist +server=/dot-mac.de/127.0.0.1#5335 +ipset=/dot-mac.de/gfwlist +server=/nytcn.me/127.0.0.1#5335 +ipset=/nytcn.me/gfwlist +server=/foxstudiolot.com/127.0.0.1#5335 +ipset=/foxstudiolot.com/gfwlist +server=/speybay.com/127.0.0.1#5335 +ipset=/speybay.com/gfwlist +server=/rbc007.com/127.0.0.1#5335 +ipset=/rbc007.com/gfwlist +server=/directtv-dish.com/127.0.0.1#5335 +ipset=/directtv-dish.com/gfwlist +server=/hentaivn.la/127.0.0.1#5335 +ipset=/hentaivn.la/gfwlist +server=/dl-iphone.com/127.0.0.1#5335 +ipset=/dl-iphone.com/gfwlist +server=/thefind.com/127.0.0.1#5335 +ipset=/thefind.com/gfwlist +server=/gamcore.com/127.0.0.1#5335 +ipset=/gamcore.com/gfwlist +server=/bridgestoneperformancemedia.net/127.0.0.1#5335 +ipset=/bridgestoneperformancemedia.net/gfwlist +server=/vmwarevmc.com/127.0.0.1#5335 +ipset=/vmwarevmc.com/gfwlist +server=/gogoanime.vc/127.0.0.1#5335 +ipset=/gogoanime.vc/gfwlist +server=/vfsco.de/127.0.0.1#5335 +ipset=/vfsco.de/gfwlist +server=/hentai4manga.com/127.0.0.1#5335 +ipset=/hentai4manga.com/gfwlist +server=/freebsd.org/127.0.0.1#5335 +ipset=/freebsd.org/gfwlist +server=/sonorousporn.com/127.0.0.1#5335 +ipset=/sonorousporn.com/gfwlist +server=/qualcomm.co.jp/127.0.0.1#5335 +ipset=/qualcomm.co.jp/gfwlist +server=/ruten.com.tw/127.0.0.1#5335 +ipset=/ruten.com.tw/gfwlist +server=/factograph.info/127.0.0.1#5335 +ipset=/factograph.info/gfwlist +server=/verisign.com.tw/127.0.0.1#5335 +ipset=/verisign.com.tw/gfwlist +server=/yahoo.co.ve/127.0.0.1#5335 +ipset=/yahoo.co.ve/gfwlist +server=/wikia.nocookie.net/127.0.0.1#5335 +ipset=/wikia.nocookie.net/gfwlist +server=/bmw.nl/127.0.0.1#5335 +ipset=/bmw.nl/gfwlist +server=/bloombergarcade.com/127.0.0.1#5335 +ipset=/bloombergarcade.com/gfwlist +server=/google.cv/127.0.0.1#5335 +ipset=/google.cv/gfwlist +server=/minisoindia.com/127.0.0.1#5335 +ipset=/minisoindia.com/gfwlist +server=/vaultify.com/127.0.0.1#5335 +ipset=/vaultify.com/gfwlist +server=/appdynamics.fr/127.0.0.1#5335 +ipset=/appdynamics.fr/gfwlist +server=/mastercard.ua/127.0.0.1#5335 +ipset=/mastercard.ua/gfwlist +server=/uug27.com/127.0.0.1#5335 +ipset=/uug27.com/gfwlist +server=/crosswalk-project.com/127.0.0.1#5335 +ipset=/crosswalk-project.com/gfwlist +server=/bmwusaservice.com/127.0.0.1#5335 +ipset=/bmwusaservice.com/gfwlist +server=/grannylovesbbc.com/127.0.0.1#5335 +ipset=/grannylovesbbc.com/gfwlist +server=/volvo.com/127.0.0.1#5335 +ipset=/volvo.com/gfwlist +server=/xfuckonline.com/127.0.0.1#5335 +ipset=/xfuckonline.com/gfwlist +server=/bmw.ee/127.0.0.1#5335 +ipset=/bmw.ee/gfwlist +server=/inhumanity.com/127.0.0.1#5335 +ipset=/inhumanity.com/gfwlist +server=/click-url.com/127.0.0.1#5335 +ipset=/click-url.com/gfwlist +server=/bnef.com/127.0.0.1#5335 +ipset=/bnef.com/gfwlist +server=/pycon.org/127.0.0.1#5335 +ipset=/pycon.org/gfwlist +server=/firstanalvideos.com/127.0.0.1#5335 +ipset=/firstanalvideos.com/gfwlist +server=/beatsbydrecheaponlinesales.com/127.0.0.1#5335 +ipset=/beatsbydrecheaponlinesales.com/gfwlist +server=/pinterest.mx/127.0.0.1#5335 +ipset=/pinterest.mx/gfwlist +server=/justdoit.us/127.0.0.1#5335 +ipset=/justdoit.us/gfwlist +server=/rentaride.de/127.0.0.1#5335 +ipset=/rentaride.de/gfwlist +server=/m-power.com/127.0.0.1#5335 +ipset=/m-power.com/gfwlist +server=/dowjoneson.com/127.0.0.1#5335 +ipset=/dowjoneson.com/gfwlist +server=/seehorsepenis.com/127.0.0.1#5335 +ipset=/seehorsepenis.com/gfwlist +server=/foxtel.com/127.0.0.1#5335 +ipset=/foxtel.com/gfwlist +server=/zapper.fi/127.0.0.1#5335 +ipset=/zapper.fi/gfwlist +server=/pros.ee/127.0.0.1#5335 +ipset=/pros.ee/gfwlist +server=/strepsils.ch/127.0.0.1#5335 +ipset=/strepsils.ch/gfwlist +server=/nudedxxx.com/127.0.0.1#5335 +ipset=/nudedxxx.com/gfwlist +server=/hotstarext.com/127.0.0.1#5335 +ipset=/hotstarext.com/gfwlist +server=/realclearmarkets.com/127.0.0.1#5335 +ipset=/realclearmarkets.com/gfwlist +server=/lnkd.in/127.0.0.1#5335 +ipset=/lnkd.in/gfwlist +server=/paylike.com/127.0.0.1#5335 +ipset=/paylike.com/gfwlist +server=/custombeatsforcheap.com/127.0.0.1#5335 +ipset=/custombeatsforcheap.com/gfwlist +server=/epochmall.com/127.0.0.1#5335 +ipset=/epochmall.com/gfwlist +server=/lolibus.top/127.0.0.1#5335 +ipset=/lolibus.top/gfwlist +server=/videopress.com/127.0.0.1#5335 +ipset=/videopress.com/gfwlist +server=/fanfox.net/127.0.0.1#5335 +ipset=/fanfox.net/gfwlist +server=/bmwofannapolis.com/127.0.0.1#5335 +ipset=/bmwofannapolis.com/gfwlist +server=/powersunitedvr.com/127.0.0.1#5335 +ipset=/powersunitedvr.com/gfwlist +server=/ieee-cas.org/127.0.0.1#5335 +ipset=/ieee-cas.org/gfwlist +server=/startupschool.org/127.0.0.1#5335 +ipset=/startupschool.org/gfwlist +server=/paypal-retail.com/127.0.0.1#5335 +ipset=/paypal-retail.com/gfwlist +server=/needforspeedeliminator.com/127.0.0.1#5335 +ipset=/needforspeedeliminator.com/gfwlist +server=/terk.nl/127.0.0.1#5335 +ipset=/terk.nl/gfwlist +server=/netflav1.com/127.0.0.1#5335 +ipset=/netflav1.com/gfwlist +server=/panasonic.jp/127.0.0.1#5335 +ipset=/panasonic.jp/gfwlist +server=/yahoo.ge/127.0.0.1#5335 +ipset=/yahoo.ge/gfwlist +server=/petardas.xxx/127.0.0.1#5335 +ipset=/petardas.xxx/gfwlist +server=/telegram.space/127.0.0.1#5335 +ipset=/telegram.space/gfwlist +server=/youtube.com.sv/127.0.0.1#5335 +ipset=/youtube.com.sv/gfwlist +server=/ahsexfilme.com/127.0.0.1#5335 +ipset=/ahsexfilme.com/gfwlist +server=/beatsbydresalesonline-australia.com/127.0.0.1#5335 +ipset=/beatsbydresalesonline-australia.com/gfwlist +server=/beatsbydresingapores.com/127.0.0.1#5335 +ipset=/beatsbydresingapores.com/gfwlist +server=/epochtimes.eu/127.0.0.1#5335 +ipset=/epochtimes.eu/gfwlist +server=/bmw-yachtsport.com/127.0.0.1#5335 +ipset=/bmw-yachtsport.com/gfwlist +server=/bmw.in/127.0.0.1#5335 +ipset=/bmw.in/gfwlist +server=/microsoftlatamholiday.com/127.0.0.1#5335 +ipset=/microsoftlatamholiday.com/gfwlist +server=/visa.ro/127.0.0.1#5335 +ipset=/visa.ro/gfwlist +server=/adultgamesportal.com/127.0.0.1#5335 +ipset=/adultgamesportal.com/gfwlist +server=/tubeshemales.com/127.0.0.1#5335 +ipset=/tubeshemales.com/gfwlist +server=/apple.hr/127.0.0.1#5335 +ipset=/apple.hr/gfwlist +server=/google.mu/127.0.0.1#5335 +ipset=/google.mu/gfwlist +server=/hdabla.net/127.0.0.1#5335 +ipset=/hdabla.net/gfwlist +server=/playhearthstone.com/127.0.0.1#5335 +ipset=/playhearthstone.com/gfwlist +server=/howtohackfacebook-account.com/127.0.0.1#5335 +ipset=/howtohackfacebook-account.com/gfwlist +server=/bmw.com.mt/127.0.0.1#5335 +ipset=/bmw.com.mt/gfwlist +server=/hamsterfucktube.com/127.0.0.1#5335 +ipset=/hamsterfucktube.com/gfwlist +server=/beatscustomblackfriday.com/127.0.0.1#5335 +ipset=/beatscustomblackfriday.com/gfwlist +server=/17mimei.com/127.0.0.1#5335 +ipset=/17mimei.com/gfwlist +server=/aoc.cat/127.0.0.1#5335 +ipset=/aoc.cat/gfwlist +server=/777tv.net/127.0.0.1#5335 +ipset=/777tv.net/gfwlist +server=/beatsbydre-studio.com/127.0.0.1#5335 +ipset=/beatsbydre-studio.com/gfwlist +server=/bitly.com/127.0.0.1#5335 +ipset=/bitly.com/gfwlist +server=/bnetshopus.akamaized.net/127.0.0.1#5335 +ipset=/bnetshopus.akamaized.net/gfwlist +server=/foxrichmond.com/127.0.0.1#5335 +ipset=/foxrichmond.com/gfwlist +server=/collectionofbestporn.com/127.0.0.1#5335 +ipset=/collectionofbestporn.com/gfwlist +server=/yahoo.vg/127.0.0.1#5335 +ipset=/yahoo.vg/gfwlist +server=/avstar09.me/127.0.0.1#5335 +ipset=/avstar09.me/gfwlist +server=/miitomo.com/127.0.0.1#5335 +ipset=/miitomo.com/gfwlist +server=/aibaobei.me/127.0.0.1#5335 +ipset=/aibaobei.me/gfwlist +server=/hentaiero.net/127.0.0.1#5335 +ipset=/hentaiero.net/gfwlist +server=/carebay.com/127.0.0.1#5335 +ipset=/carebay.com/gfwlist +server=/speedtest.com.hk/127.0.0.1#5335 +ipset=/speedtest.com.hk/gfwlist +server=/loanbuilder.com/127.0.0.1#5335 +ipset=/loanbuilder.com/gfwlist +server=/bmw-motorrad.com.mx/127.0.0.1#5335 +ipset=/bmw-motorrad.com.mx/gfwlist +server=/javjack.com/127.0.0.1#5335 +ipset=/javjack.com/gfwlist +server=/linkshit.com/127.0.0.1#5335 +ipset=/linkshit.com/gfwlist +server=/do.co/127.0.0.1#5335 +ipset=/do.co/gfwlist +server=/ethereum.org/127.0.0.1#5335 +ipset=/ethereum.org/gfwlist +server=/whatsappbrand.com/127.0.0.1#5335 +ipset=/whatsappbrand.com/gfwlist +server=/nativeincolour.com.au/127.0.0.1#5335 +ipset=/nativeincolour.com.au/gfwlist +server=/nbcuniversal.com/127.0.0.1#5335 +ipset=/nbcuniversal.com/gfwlist +server=/pinterest.jp/127.0.0.1#5335 +ipset=/pinterest.jp/gfwlist +server=/ebayanunsios.net/127.0.0.1#5335 +ipset=/ebayanunsios.net/gfwlist +server=/trustcor.com/127.0.0.1#5335 +ipset=/trustcor.com/gfwlist +server=/dinotube.com/127.0.0.1#5335 +ipset=/dinotube.com/gfwlist +server=/freefacebookads.net/127.0.0.1#5335 +ipset=/freefacebookads.net/gfwlist +server=/icloud.se/127.0.0.1#5335 +ipset=/icloud.se/gfwlist +server=/surface.com/127.0.0.1#5335 +ipset=/surface.com/gfwlist +server=/applepaycash.net/127.0.0.1#5335 +ipset=/applepaycash.net/gfwlist +server=/freebs.com/127.0.0.1#5335 +ipset=/freebs.com/gfwlist +server=/line-scdn.net/127.0.0.1#5335 +ipset=/line-scdn.net/gfwlist +server=/bitbank.cc/127.0.0.1#5335 +ipset=/bitbank.cc/gfwlist +server=/gaybf.com/127.0.0.1#5335 +ipset=/gaybf.com/gfwlist +server=/rabbitscams.com/127.0.0.1#5335 +ipset=/rabbitscams.com/gfwlist +server=/telegram-porn.com/127.0.0.1#5335 +ipset=/telegram-porn.com/gfwlist +server=/hentai69.life/127.0.0.1#5335 +ipset=/hentai69.life/gfwlist +server=/nextmag.com.tw/127.0.0.1#5335 +ipset=/nextmag.com.tw/gfwlist +server=/xxxnxx.me/127.0.0.1#5335 +ipset=/xxxnxx.me/gfwlist +server=/splatoon2tournament.com/127.0.0.1#5335 +ipset=/splatoon2tournament.com/gfwlist +server=/tvbanywhere.com.sg/127.0.0.1#5335 +ipset=/tvbanywhere.com.sg/gfwlist +server=/paypa1.org/127.0.0.1#5335 +ipset=/paypa1.org/gfwlist +server=/alterauserforum.com/127.0.0.1#5335 +ipset=/alterauserforum.com/gfwlist +server=/battlefieldv.com/127.0.0.1#5335 +ipset=/battlefieldv.com/gfwlist +server=/livingyourambition.com/127.0.0.1#5335 +ipset=/livingyourambition.com/gfwlist +server=/zoho.eu/127.0.0.1#5335 +ipset=/zoho.eu/gfwlist +server=/drmgmggyi-mm.blogspot.com/127.0.0.1#5335 +ipset=/drmgmggyi-mm.blogspot.com/gfwlist +server=/mysimsracing.com/127.0.0.1#5335 +ipset=/mysimsracing.com/gfwlist +server=/gr-assets.com/127.0.0.1#5335 +ipset=/gr-assets.com/gfwlist +server=/ehtracker.org/127.0.0.1#5335 +ipset=/ehtracker.org/gfwlist +server=/hpdreamcolor.com/127.0.0.1#5335 +ipset=/hpdreamcolor.com/gfwlist +server=/googlecode.com/127.0.0.1#5335 +ipset=/googlecode.com/gfwlist +server=/huffingtonpost.de/127.0.0.1#5335 +ipset=/huffingtonpost.de/gfwlist +server=/travelex.com.om/127.0.0.1#5335 +ipset=/travelex.com.om/gfwlist +server=/disney.pl/127.0.0.1#5335 +ipset=/disney.pl/gfwlist +server=/xda-developers.com/127.0.0.1#5335 +ipset=/xda-developers.com/gfwlist +server=/nan-net.com/127.0.0.1#5335 +ipset=/nan-net.com/gfwlist +server=/hentaiz.co/127.0.0.1#5335 +ipset=/hentaiz.co/gfwlist +server=/termux.dev/127.0.0.1#5335 +ipset=/termux.dev/gfwlist +server=/pingxiangpuer.com/127.0.0.1#5335 +ipset=/pingxiangpuer.com/gfwlist +server=/amazonpay.in/127.0.0.1#5335 +ipset=/amazonpay.in/gfwlist +server=/truebeachporn.com/127.0.0.1#5335 +ipset=/truebeachporn.com/gfwlist +server=/ebayit.com/127.0.0.1#5335 +ipset=/ebayit.com/gfwlist +server=/volvotrucks.am/127.0.0.1#5335 +ipset=/volvotrucks.am/gfwlist +server=/youjizz.sex/127.0.0.1#5335 +ipset=/youjizz.sex/gfwlist +server=/tribler.org/127.0.0.1#5335 +ipset=/tribler.org/gfwlist +server=/bmw-grouparchives.com/127.0.0.1#5335 +ipset=/bmw-grouparchives.com/gfwlist +server=/zencoder.com/127.0.0.1#5335 +ipset=/zencoder.com/gfwlist +server=/freedomplatform.tv/127.0.0.1#5335 +ipset=/freedomplatform.tv/gfwlist +server=/ninemediaroom.com.au/127.0.0.1#5335 +ipset=/ninemediaroom.com.au/gfwlist +server=/dilcdn.com/127.0.0.1#5335 +ipset=/dilcdn.com/gfwlist +server=/bbgwatch.com/127.0.0.1#5335 +ipset=/bbgwatch.com/gfwlist +server=/billpoint.info/127.0.0.1#5335 +ipset=/billpoint.info/gfwlist +server=/blogspot.co.nz/127.0.0.1#5335 +ipset=/blogspot.co.nz/gfwlist +server=/enfamil.es/127.0.0.1#5335 +ipset=/enfamil.es/gfwlist +server=/aorus.com/127.0.0.1#5335 +ipset=/aorus.com/gfwlist +server=/ohentai.org/127.0.0.1#5335 +ipset=/ohentai.org/gfwlist +server=/ebay-25-assets.s3-us-west-1.amazonaws.com/127.0.0.1#5335 +ipset=/ebay-25-assets.s3-us-west-1.amazonaws.com/gfwlist +server=/mastercard.es/127.0.0.1#5335 +ipset=/mastercard.es/gfwlist +server=/login-paypal.info/127.0.0.1#5335 +ipset=/login-paypal.info/gfwlist +server=/nudistic.com/127.0.0.1#5335 +ipset=/nudistic.com/gfwlist +server=/huffingtonpost.com/127.0.0.1#5335 +ipset=/huffingtonpost.com/gfwlist +server=/fontshop.com/127.0.0.1#5335 +ipset=/fontshop.com/gfwlist +server=/cnivogue.com.au/127.0.0.1#5335 +ipset=/cnivogue.com.au/gfwlist +server=/turbogvideos.com/127.0.0.1#5335 +ipset=/turbogvideos.com/gfwlist +server=/elgaronline.com/127.0.0.1#5335 +ipset=/elgaronline.com/gfwlist +server=/ikea.com.sg/127.0.0.1#5335 +ipset=/ikea.com.sg/gfwlist +server=/erovizor.ru/127.0.0.1#5335 +ipset=/erovizor.ru/gfwlist +server=/141hongkong.com/127.0.0.1#5335 +ipset=/141hongkong.com/gfwlist +server=/adobess.com/127.0.0.1#5335 +ipset=/adobess.com/gfwlist +server=/mcdelivery.co.kr/127.0.0.1#5335 +ipset=/mcdelivery.co.kr/gfwlist +server=/leakedmeat.com/127.0.0.1#5335 +ipset=/leakedmeat.com/gfwlist +server=/facvebook.com/127.0.0.1#5335 +ipset=/facvebook.com/gfwlist +server=/bmw-authority-vehicles.com/127.0.0.1#5335 +ipset=/bmw-authority-vehicles.com/gfwlist +server=/amerikaninsesi.org/127.0.0.1#5335 +ipset=/amerikaninsesi.org/gfwlist +server=/connectionslearning.com/127.0.0.1#5335 +ipset=/connectionslearning.com/gfwlist +server=/satan18av.com/127.0.0.1#5335 +ipset=/satan18av.com/gfwlist +server=/rssing.com/127.0.0.1#5335 +ipset=/rssing.com/gfwlist +server=/ikea.pl/127.0.0.1#5335 +ipset=/ikea.pl/gfwlist +server=/mini-tahiti.com/127.0.0.1#5335 +ipset=/mini-tahiti.com/gfwlist +server=/gputechconf.com/127.0.0.1#5335 +ipset=/gputechconf.com/gfwlist +server=/shopbmwusa.com/127.0.0.1#5335 +ipset=/shopbmwusa.com/gfwlist +server=/wawatv.net/127.0.0.1#5335 +ipset=/wawatv.net/gfwlist +server=/towerauction.com/127.0.0.1#5335 +ipset=/towerauction.com/gfwlist +server=/hdouban2.com/127.0.0.1#5335 +ipset=/hdouban2.com/gfwlist +server=/fury.help/127.0.0.1#5335 +ipset=/fury.help/gfwlist +server=/azureiotcentral.com/127.0.0.1#5335 +ipset=/azureiotcentral.com/gfwlist +server=/spektral.cc/127.0.0.1#5335 +ipset=/spektral.cc/gfwlist +server=/workplace.com/127.0.0.1#5335 +ipset=/workplace.com/gfwlist +server=/canon.com.by/127.0.0.1#5335 +ipset=/canon.com.by/gfwlist +server=/manhunt.net/127.0.0.1#5335 +ipset=/manhunt.net/gfwlist +server=/google.ps/127.0.0.1#5335 +ipset=/google.ps/gfwlist +server=/bootyliciousmag.com/127.0.0.1#5335 +ipset=/bootyliciousmag.com/gfwlist +server=/xxxtubeasian.net/127.0.0.1#5335 +ipset=/xxxtubeasian.net/gfwlist +server=/enfagrow.com.ph/127.0.0.1#5335 +ipset=/enfagrow.com.ph/gfwlist +server=/akamai-platform.net/127.0.0.1#5335 +ipset=/akamai-platform.net/gfwlist +server=/youtube.com.bo/127.0.0.1#5335 +ipset=/youtube.com.bo/gfwlist +server=/vpro.com/127.0.0.1#5335 +ipset=/vpro.com/gfwlist +server=/intel.ae/127.0.0.1#5335 +ipset=/intel.ae/gfwlist +server=/itsfuck.com/127.0.0.1#5335 +ipset=/itsfuck.com/gfwlist +server=/bumpshare.com/127.0.0.1#5335 +ipset=/bumpshare.com/gfwlist +server=/tukif.com/127.0.0.1#5335 +ipset=/tukif.com/gfwlist +server=/sony.com.ar/127.0.0.1#5335 +ipset=/sony.com.ar/gfwlist +server=/fi11tv1.com/127.0.0.1#5335 +ipset=/fi11tv1.com/gfwlist +server=/pinterest.pt/127.0.0.1#5335 +ipset=/pinterest.pt/gfwlist +server=/scholarpedia.org/127.0.0.1#5335 +ipset=/scholarpedia.org/gfwlist +server=/visa.co.za/127.0.0.1#5335 +ipset=/visa.co.za/gfwlist +server=/censorship.ai/127.0.0.1#5335 +ipset=/censorship.ai/gfwlist +server=/futureshop.ca/127.0.0.1#5335 +ipset=/futureshop.ca/gfwlist +server=/srebrenica360.com/127.0.0.1#5335 +ipset=/srebrenica360.com/gfwlist +server=/visaluxuryhotels.com/127.0.0.1#5335 +ipset=/visaluxuryhotels.com/gfwlist +server=/nudekenya.com/127.0.0.1#5335 +ipset=/nudekenya.com/gfwlist +server=/hpsoftware.com/127.0.0.1#5335 +ipset=/hpsoftware.com/gfwlist +server=/blogspot.com.au/127.0.0.1#5335 +ipset=/blogspot.com.au/gfwlist +server=/minisothailand.com/127.0.0.1#5335 +ipset=/minisothailand.com/gfwlist +server=/w.wiki/127.0.0.1#5335 +ipset=/w.wiki/gfwlist +server=/localbitcoinschain.com/127.0.0.1#5335 +ipset=/localbitcoinschain.com/gfwlist +server=/gbluebooks.blogspot.com/127.0.0.1#5335 +ipset=/gbluebooks.blogspot.com/gfwlist +server=/nudematurewomenpics.com/127.0.0.1#5335 +ipset=/nudematurewomenpics.com/gfwlist +server=/newisiknowledge.com/127.0.0.1#5335 +ipset=/newisiknowledge.com/gfwlist +server=/edninfo.com/127.0.0.1#5335 +ipset=/edninfo.com/gfwlist +server=/vaginacontest.com/127.0.0.1#5335 +ipset=/vaginacontest.com/gfwlist +server=/intheknow.com.au/127.0.0.1#5335 +ipset=/intheknow.com.au/gfwlist +server=/maddenchampionship.com/127.0.0.1#5335 +ipset=/maddenchampionship.com/gfwlist +server=/beatsblackfridaydeals.net/127.0.0.1#5335 +ipset=/beatsblackfridaydeals.net/gfwlist +server=/starbucksforlife.com/127.0.0.1#5335 +ipset=/starbucksforlife.com/gfwlist +server=/doclercdn.com/127.0.0.1#5335 +ipset=/doclercdn.com/gfwlist +server=/vanish.no/127.0.0.1#5335 +ipset=/vanish.no/gfwlist +server=/google.co.bw/127.0.0.1#5335 +ipset=/google.co.bw/gfwlist +server=/microsoftreactor.net/127.0.0.1#5335 +ipset=/microsoftreactor.net/gfwlist +server=/themoviedb.org/127.0.0.1#5335 +ipset=/themoviedb.org/gfwlist +server=/volvosaatio.fi/127.0.0.1#5335 +ipset=/volvosaatio.fi/gfwlist +server=/dettol.co.ke/127.0.0.1#5335 +ipset=/dettol.co.ke/gfwlist +server=/akamai-regression.net/127.0.0.1#5335 +ipset=/akamai-regression.net/gfwlist +server=/hardsextube.com/127.0.0.1#5335 +ipset=/hardsextube.com/gfwlist +server=/xnxx2.it/127.0.0.1#5335 +ipset=/xnxx2.it/gfwlist +server=/thomsonreuters.co.uk/127.0.0.1#5335 +ipset=/thomsonreuters.co.uk/gfwlist +server=/entermediadb.org/127.0.0.1#5335 +ipset=/entermediadb.org/gfwlist +server=/gettyimages.nl/127.0.0.1#5335 +ipset=/gettyimages.nl/gfwlist +server=/shadowsocks.org/127.0.0.1#5335 +ipset=/shadowsocks.org/gfwlist +server=/deepmind.com/127.0.0.1#5335 +ipset=/deepmind.com/gfwlist +server=/yandex.tj/127.0.0.1#5335 +ipset=/yandex.tj/gfwlist +server=/steezylist.com/127.0.0.1#5335 +ipset=/steezylist.com/gfwlist +server=/iamakamai.com/127.0.0.1#5335 +ipset=/iamakamai.com/gfwlist +server=/directvonline.com/127.0.0.1#5335 +ipset=/directvonline.com/gfwlist +server=/faceboobok.com/127.0.0.1#5335 +ipset=/faceboobok.com/gfwlist +server=/blogspot.co.ke/127.0.0.1#5335 +ipset=/blogspot.co.ke/gfwlist +server=/linemobile.com/127.0.0.1#5335 +ipset=/linemobile.com/gfwlist +server=/fulanax.com/127.0.0.1#5335 +ipset=/fulanax.com/gfwlist +server=/femjoy.com/127.0.0.1#5335 +ipset=/femjoy.com/gfwlist +server=/azure-mobile.net/127.0.0.1#5335 +ipset=/azure-mobile.net/gfwlist +server=/bestbuyus.com/127.0.0.1#5335 +ipset=/bestbuyus.com/gfwlist +server=/oppainorakuen.com/127.0.0.1#5335 +ipset=/oppainorakuen.com/gfwlist +server=/cheapbeatsbydrestudioutlet.com/127.0.0.1#5335 +ipset=/cheapbeatsbydrestudioutlet.com/gfwlist +server=/softbankmobile.net/127.0.0.1#5335 +ipset=/softbankmobile.net/gfwlist +server=/bloombergapps.com/127.0.0.1#5335 +ipset=/bloombergapps.com/gfwlist +server=/manototv.com/127.0.0.1#5335 +ipset=/manototv.com/gfwlist +server=/allfinegirls.com/127.0.0.1#5335 +ipset=/allfinegirls.com/gfwlist +server=/sing68.com/127.0.0.1#5335 +ipset=/sing68.com/gfwlist +server=/zavat.pw/127.0.0.1#5335 +ipset=/zavat.pw/gfwlist +server=/fanatical.com/127.0.0.1#5335 +ipset=/fanatical.com/gfwlist +server=/billpoint.tv/127.0.0.1#5335 +ipset=/billpoint.tv/gfwlist +server=/hotzxgirl.com/127.0.0.1#5335 +ipset=/hotzxgirl.com/gfwlist +server=/onlineteenhub.com/127.0.0.1#5335 +ipset=/onlineteenhub.com/gfwlist +server=/btt804.com/127.0.0.1#5335 +ipset=/btt804.com/gfwlist +server=/gumtree.sg/127.0.0.1#5335 +ipset=/gumtree.sg/gfwlist +server=/volvogroup.kr/127.0.0.1#5335 +ipset=/volvogroup.kr/gfwlist +server=/custombeatsny.com/127.0.0.1#5335 +ipset=/custombeatsny.com/gfwlist +server=/visaitalia.com/127.0.0.1#5335 +ipset=/visaitalia.com/gfwlist +server=/beatsbydre-chen.com/127.0.0.1#5335 +ipset=/beatsbydre-chen.com/gfwlist +server=/monstercasquebeatspascher.net/127.0.0.1#5335 +ipset=/monstercasquebeatspascher.net/gfwlist +server=/microsoftiotcentral.com/127.0.0.1#5335 +ipset=/microsoftiotcentral.com/gfwlist +server=/hotstunners.com/127.0.0.1#5335 +ipset=/hotstunners.com/gfwlist +server=/theman.in/127.0.0.1#5335 +ipset=/theman.in/gfwlist +server=/visa.com.hn/127.0.0.1#5335 +ipset=/visa.com.hn/gfwlist +server=/fireside.fm/127.0.0.1#5335 +ipset=/fireside.fm/gfwlist +server=/sandisk.com/127.0.0.1#5335 +ipset=/sandisk.com/gfwlist +server=/foxest.com/127.0.0.1#5335 +ipset=/foxest.com/gfwlist +server=/mature-porn-flix.com/127.0.0.1#5335 +ipset=/mature-porn-flix.com/gfwlist +server=/verilylifesciences.com/127.0.0.1#5335 +ipset=/verilylifesciences.com/gfwlist +server=/monstersbeatbydres.com/127.0.0.1#5335 +ipset=/monstersbeatbydres.com/gfwlist +server=/drdrebeatsdesale.com/127.0.0.1#5335 +ipset=/drdrebeatsdesale.com/gfwlist +server=/momsyoungboys.net/127.0.0.1#5335 +ipset=/momsyoungboys.net/gfwlist +server=/niketraining.com/127.0.0.1#5335 +ipset=/niketraining.com/gfwlist +server=/ebay.co.za/127.0.0.1#5335 +ipset=/ebay.co.za/gfwlist +server=/minilaval.ca/127.0.0.1#5335 +ipset=/minilaval.ca/gfwlist +server=/amateurmommymovies.com/127.0.0.1#5335 +ipset=/amateurmommymovies.com/gfwlist +server=/scholar.google.cz/127.0.0.1#5335 +ipset=/scholar.google.cz/gfwlist +server=/hcomicbook.com/127.0.0.1#5335 +ipset=/hcomicbook.com/gfwlist +server=/hentaivn.de/127.0.0.1#5335 +ipset=/hentaivn.de/gfwlist +server=/moeimg.net/127.0.0.1#5335 +ipset=/moeimg.net/gfwlist +server=/observable.net/127.0.0.1#5335 +ipset=/observable.net/gfwlist +server=/porn34.me/127.0.0.1#5335 +ipset=/porn34.me/gfwlist +server=/oldje.com/127.0.0.1#5335 +ipset=/oldje.com/gfwlist +server=/xiaoyaoge.xyz/127.0.0.1#5335 +ipset=/xiaoyaoge.xyz/gfwlist +server=/verisign.com/127.0.0.1#5335 +ipset=/verisign.com/gfwlist +server=/ebayla.org/127.0.0.1#5335 +ipset=/ebayla.org/gfwlist +server=/ntdtv.jp/127.0.0.1#5335 +ipset=/ntdtv.jp/gfwlist +server=/google.bs/127.0.0.1#5335 +ipset=/google.bs/gfwlist +server=/avgod.club/127.0.0.1#5335 +ipset=/avgod.club/gfwlist +server=/z5.com/127.0.0.1#5335 +ipset=/z5.com/gfwlist +server=/ikea.dk/127.0.0.1#5335 +ipset=/ikea.dk/gfwlist +server=/sony.co.nz/127.0.0.1#5335 +ipset=/sony.co.nz/gfwlist +server=/cnnpolitics.com/127.0.0.1#5335 +ipset=/cnnpolitics.com/gfwlist +server=/google.com.na/127.0.0.1#5335 +ipset=/google.com.na/gfwlist +server=/zoo-tube8.com/127.0.0.1#5335 +ipset=/zoo-tube8.com/gfwlist +server=/book4you.org/127.0.0.1#5335 +ipset=/book4you.org/gfwlist +server=/foxrad.io/127.0.0.1#5335 +ipset=/foxrad.io/gfwlist +server=/teslazta.net/127.0.0.1#5335 +ipset=/teslazta.net/gfwlist +server=/books.com.tw/127.0.0.1#5335 +ipset=/books.com.tw/gfwlist +server=/bmwworld.net/127.0.0.1#5335 +ipset=/bmwworld.net/gfwlist +server=/googleadapis.com/127.0.0.1#5335 +ipset=/googleadapis.com/gfwlist +server=/alt5-mtalk.google.com/127.0.0.1#5335 +ipset=/alt5-mtalk.google.com/gfwlist +server=/facebookvacation.com/127.0.0.1#5335 +ipset=/facebookvacation.com/gfwlist +server=/mastercard.pl/127.0.0.1#5335 +ipset=/mastercard.pl/gfwlist +server=/bekijkporno.nl/127.0.0.1#5335 +ipset=/bekijkporno.nl/gfwlist +server=/citas-para-mayoresde50.ec/127.0.0.1#5335 +ipset=/citas-para-mayoresde50.ec/gfwlist +server=/codivorexxx.com/127.0.0.1#5335 +ipset=/codivorexxx.com/gfwlist +server=/h0930.com/127.0.0.1#5335 +ipset=/h0930.com/gfwlist +server=/yandex.fi/127.0.0.1#5335 +ipset=/yandex.fi/gfwlist +server=/nerdnudes.com/127.0.0.1#5335 +ipset=/nerdnudes.com/gfwlist +server=/worldsfastestgamer.net/127.0.0.1#5335 +ipset=/worldsfastestgamer.net/gfwlist +server=/postimages.org/127.0.0.1#5335 +ipset=/postimages.org/gfwlist +server=/jable.tv/127.0.0.1#5335 +ipset=/jable.tv/gfwlist +server=/netflixdnstest1.com/127.0.0.1#5335 +ipset=/netflixdnstest1.com/gfwlist +server=/bingworld.com/127.0.0.1#5335 +ipset=/bingworld.com/gfwlist +server=/pornhub-deutsch.net/127.0.0.1#5335 +ipset=/pornhub-deutsch.net/gfwlist +server=/pokemonletsgopikachu.com/127.0.0.1#5335 +ipset=/pokemonletsgopikachu.com/gfwlist +server=/antarvasnax.com/127.0.0.1#5335 +ipset=/antarvasnax.com/gfwlist +server=/instagmania.com/127.0.0.1#5335 +ipset=/instagmania.com/gfwlist +server=/stlouisbmw.net/127.0.0.1#5335 +ipset=/stlouisbmw.net/gfwlist +server=/bokepvidz.com/127.0.0.1#5335 +ipset=/bokepvidz.com/gfwlist +server=/asproex.com/127.0.0.1#5335 +ipset=/asproex.com/gfwlist +server=/bandcamp.com/127.0.0.1#5335 +ipset=/bandcamp.com/gfwlist +server=/nudeteen.org/127.0.0.1#5335 +ipset=/nudeteen.org/gfwlist +server=/google.com.cy/127.0.0.1#5335 +ipset=/google.com.cy/gfwlist +server=/veet.com.pk/127.0.0.1#5335 +ipset=/veet.com.pk/gfwlist +server=/bmw-connecteddrive.co.uk/127.0.0.1#5335 +ipset=/bmw-connecteddrive.co.uk/gfwlist +server=/tvbanywhere.com/127.0.0.1#5335 +ipset=/tvbanywhere.com/gfwlist +server=/pashtovoa.com/127.0.0.1#5335 +ipset=/pashtovoa.com/gfwlist +server=/swisssigner.com/127.0.0.1#5335 +ipset=/swisssigner.com/gfwlist +server=/applepremiumreseller.com.au/127.0.0.1#5335 +ipset=/applepremiumreseller.com.au/gfwlist +server=/myfavoritearcade.com/127.0.0.1#5335 +ipset=/myfavoritearcade.com/gfwlist +server=/vaultify.info/127.0.0.1#5335 +ipset=/vaultify.info/gfwlist +server=/6asianporn.com/127.0.0.1#5335 +ipset=/6asianporn.com/gfwlist +server=/ieee-region6.org/127.0.0.1#5335 +ipset=/ieee-region6.org/gfwlist +server=/zee5.com/127.0.0.1#5335 +ipset=/zee5.com/gfwlist +server=/japanknowledge.com/127.0.0.1#5335 +ipset=/japanknowledge.com/gfwlist +server=/facebooik.org/127.0.0.1#5335 +ipset=/facebooik.org/gfwlist +server=/javtube.net/127.0.0.1#5335 +ipset=/javtube.net/gfwlist +server=/iphone.host/127.0.0.1#5335 +ipset=/iphone.host/gfwlist +server=/foxnews.cc/127.0.0.1#5335 +ipset=/foxnews.cc/gfwlist +server=/youtube.co/127.0.0.1#5335 +ipset=/youtube.co/gfwlist +server=/cbsi.live.ott.irdeto.com/127.0.0.1#5335 +ipset=/cbsi.live.ott.irdeto.com/gfwlist +server=/kkfcc03.com/127.0.0.1#5335 +ipset=/kkfcc03.com/gfwlist +server=/shakethesnake.com/127.0.0.1#5335 +ipset=/shakethesnake.com/gfwlist +server=/redwap.me/127.0.0.1#5335 +ipset=/redwap.me/gfwlist +server=/tiava1.com/127.0.0.1#5335 +ipset=/tiava1.com/gfwlist +server=/skokka.com/127.0.0.1#5335 +ipset=/skokka.com/gfwlist +server=/volvotruckcenter.fi/127.0.0.1#5335 +ipset=/volvotruckcenter.fi/gfwlist +server=/pearsoneducationbooks.com/127.0.0.1#5335 +ipset=/pearsoneducationbooks.com/gfwlist +server=/hpuniversity.info/127.0.0.1#5335 +ipset=/hpuniversity.info/gfwlist +server=/xboyvids.com/127.0.0.1#5335 +ipset=/xboyvids.com/gfwlist +server=/dcard.tw/127.0.0.1#5335 +ipset=/dcard.tw/gfwlist +server=/blogspot.co.za/127.0.0.1#5335 +ipset=/blogspot.co.za/gfwlist +server=/battlefield5.com/127.0.0.1#5335 +ipset=/battlefield5.com/gfwlist +server=/xxxaporn.com/127.0.0.1#5335 +ipset=/xxxaporn.com/gfwlist +server=/youtube.soy/127.0.0.1#5335 +ipset=/youtube.soy/gfwlist +server=/itsoc.org/127.0.0.1#5335 +ipset=/itsoc.org/gfwlist +server=/craigslist.org/127.0.0.1#5335 +ipset=/craigslist.org/gfwlist +server=/sahabatsetiasmartone.com/127.0.0.1#5335 +ipset=/sahabatsetiasmartone.com/gfwlist +server=/applepay.com.tw/127.0.0.1#5335 +ipset=/applepay.com.tw/gfwlist +server=/asianxxxjoy.com/127.0.0.1#5335 +ipset=/asianxxxjoy.com/gfwlist +server=/reneerossvideos.com/127.0.0.1#5335 +ipset=/reneerossvideos.com/gfwlist +server=/directtv-deals.tv/127.0.0.1#5335 +ipset=/directtv-deals.tv/gfwlist +server=/genshinimpact.com/127.0.0.1#5335 +ipset=/genshinimpact.com/gfwlist +server=/porn2012.com/127.0.0.1#5335 +ipset=/porn2012.com/gfwlist +server=/facewook.com/127.0.0.1#5335 +ipset=/facewook.com/gfwlist +server=/fullxxxmovies.net/127.0.0.1#5335 +ipset=/fullxxxmovies.net/gfwlist +server=/directvdeals.com/127.0.0.1#5335 +ipset=/directvdeals.com/gfwlist +server=/epochtimes.de/127.0.0.1#5335 +ipset=/epochtimes.de/gfwlist +server=/manhuabika.com/127.0.0.1#5335 +ipset=/manhuabika.com/gfwlist +server=/paypal-database.com/127.0.0.1#5335 +ipset=/paypal-database.com/gfwlist +server=/pinterest.com.bo/127.0.0.1#5335 +ipset=/pinterest.com.bo/gfwlist +server=/paypalme.com/127.0.0.1#5335 +ipset=/paypalme.com/gfwlist +server=/news.co.uk/127.0.0.1#5335 +ipset=/news.co.uk/gfwlist +server=/o365weve-ppe.com/127.0.0.1#5335 +ipset=/o365weve-ppe.com/gfwlist +server=/cosmosdb.net/127.0.0.1#5335 +ipset=/cosmosdb.net/gfwlist +server=/beatsbydre-us.com/127.0.0.1#5335 +ipset=/beatsbydre-us.com/gfwlist +server=/wii-u.com/127.0.0.1#5335 +ipset=/wii-u.com/gfwlist +server=/bmw-motorrad.com/127.0.0.1#5335 +ipset=/bmw-motorrad.com/gfwlist +server=/12diasderegalosdeitunes.gt/127.0.0.1#5335 +ipset=/12diasderegalosdeitunes.gt/gfwlist +server=/faphdporn.com/127.0.0.1#5335 +ipset=/faphdporn.com/gfwlist +server=/stackpath.com/127.0.0.1#5335 +ipset=/stackpath.com/gfwlist +server=/theaffairs.com/127.0.0.1#5335 +ipset=/theaffairs.com/gfwlist +server=/encuentroscasualesoecuador.com/127.0.0.1#5335 +ipset=/encuentroscasualesoecuador.com/gfwlist +server=/bmw.co.jp/127.0.0.1#5335 +ipset=/bmw.co.jp/gfwlist +server=/instagtram.com/127.0.0.1#5335 +ipset=/instagtram.com/gfwlist +server=/airwick.ro/127.0.0.1#5335 +ipset=/airwick.ro/gfwlist +server=/javtasty.com/127.0.0.1#5335 +ipset=/javtasty.com/gfwlist +server=/vimeocdn.com/127.0.0.1#5335 +ipset=/vimeocdn.com/gfwlist +server=/bluehatnights.com/127.0.0.1#5335 +ipset=/bluehatnights.com/gfwlist +server=/myvodafone.com.au/127.0.0.1#5335 +ipset=/myvodafone.com.au/gfwlist +server=/piwheels.org/127.0.0.1#5335 +ipset=/piwheels.org/gfwlist +server=/monsterbeatsbydrefactory.com/127.0.0.1#5335 +ipset=/monsterbeatsbydrefactory.com/gfwlist +server=/apibay.org/127.0.0.1#5335 +ipset=/apibay.org/gfwlist +server=/ehgt.org/127.0.0.1#5335 +ipset=/ehgt.org/gfwlist +server=/disneymagicmoments.it/127.0.0.1#5335 +ipset=/disneymagicmoments.it/gfwlist +server=/doujinnomori.com/127.0.0.1#5335 +ipset=/doujinnomori.com/gfwlist +server=/visa.com.ru/127.0.0.1#5335 +ipset=/visa.com.ru/gfwlist +server=/goldnikeclub.com/127.0.0.1#5335 +ipset=/goldnikeclub.com/gfwlist +server=/6-ar.com/127.0.0.1#5335 +ipset=/6-ar.com/gfwlist +server=/ebayvietnam.net/127.0.0.1#5335 +ipset=/ebayvietnam.net/gfwlist +server=/digitalid.ch/127.0.0.1#5335 +ipset=/digitalid.ch/gfwlist +server=/akamai-thailand.com/127.0.0.1#5335 +ipset=/akamai-thailand.com/gfwlist +server=/xhamster.xxx/127.0.0.1#5335 +ipset=/xhamster.xxx/gfwlist +server=/bestbuy.ca/127.0.0.1#5335 +ipset=/bestbuy.ca/gfwlist +server=/cherry-tale.com/127.0.0.1#5335 +ipset=/cherry-tale.com/gfwlist +server=/disney.in/127.0.0.1#5335 +ipset=/disney.in/gfwlist +server=/canon.fr/127.0.0.1#5335 +ipset=/canon.fr/gfwlist +server=/youtube.si/127.0.0.1#5335 +ipset=/youtube.si/gfwlist +server=/faproulette.online/127.0.0.1#5335 +ipset=/faproulette.online/gfwlist +server=/go-disneyworldgo.com/127.0.0.1#5335 +ipset=/go-disneyworldgo.com/gfwlist +server=/directvinternet.com/127.0.0.1#5335 +ipset=/directvinternet.com/gfwlist +server=/facebokok.com/127.0.0.1#5335 +ipset=/facebokok.com/gfwlist +server=/ikea.cz/127.0.0.1#5335 +ipset=/ikea.cz/gfwlist +server=/sundanceignite2016.com/127.0.0.1#5335 +ipset=/sundanceignite2016.com/gfwlist +server=/gemfury.com/127.0.0.1#5335 +ipset=/gemfury.com/gfwlist +server=/bmw-connecteddrive.sg/127.0.0.1#5335 +ipset=/bmw-connecteddrive.sg/gfwlist +server=/geforce.com/127.0.0.1#5335 +ipset=/geforce.com/gfwlist +server=/dtv2009offers.com/127.0.0.1#5335 +ipset=/dtv2009offers.com/gfwlist +server=/nexcat.com/127.0.0.1#5335 +ipset=/nexcat.com/gfwlist +server=/nowjav.com/127.0.0.1#5335 +ipset=/nowjav.com/gfwlist +server=/bridgestonerapiddelivery.com/127.0.0.1#5335 +ipset=/bridgestonerapiddelivery.com/gfwlist +server=/wal-mart.com/127.0.0.1#5335 +ipset=/wal-mart.com/gfwlist +server=/c-spanvideo.org/127.0.0.1#5335 +ipset=/c-spanvideo.org/gfwlist +server=/99thz.cc/127.0.0.1#5335 +ipset=/99thz.cc/gfwlist +server=/bmw.com.pa/127.0.0.1#5335 +ipset=/bmw.com.pa/gfwlist +server=/singtaola.com/127.0.0.1#5335 +ipset=/singtaola.com/gfwlist +server=/128100.xyz/127.0.0.1#5335 +ipset=/128100.xyz/gfwlist +server=/empornium.site/127.0.0.1#5335 +ipset=/empornium.site/gfwlist +server=/novinhabucetuda.com/127.0.0.1#5335 +ipset=/novinhabucetuda.com/gfwlist +server=/wwwdecide.com/127.0.0.1#5335 +ipset=/wwwdecide.com/gfwlist +server=/apornvideo.com/127.0.0.1#5335 +ipset=/apornvideo.com/gfwlist +server=/uun86.com/127.0.0.1#5335 +ipset=/uun86.com/gfwlist +server=/nflxsearch.net/127.0.0.1#5335 +ipset=/nflxsearch.net/gfwlist +server=/esp32.com/127.0.0.1#5335 +ipset=/esp32.com/gfwlist +server=/hoyoverse.com/127.0.0.1#5335 +ipset=/hoyoverse.com/gfwlist +server=/pornluxme.com/127.0.0.1#5335 +ipset=/pornluxme.com/gfwlist +server=/vimeoondemand.com/127.0.0.1#5335 +ipset=/vimeoondemand.com/gfwlist +server=/binancezh.pro/127.0.0.1#5335 +ipset=/binancezh.pro/gfwlist +server=/cherryasia.com/127.0.0.1#5335 +ipset=/cherryasia.com/gfwlist +server=/facebookportal.com/127.0.0.1#5335 +ipset=/facebookportal.com/gfwlist +server=/ecapi-pchome.cdn.hinet.net/127.0.0.1#5335 +ipset=/ecapi-pchome.cdn.hinet.net/gfwlist +server=/pornotime.net/127.0.0.1#5335 +ipset=/pornotime.net/gfwlist +server=/playcover.workers.dev/127.0.0.1#5335 +ipset=/playcover.workers.dev/gfwlist +server=/eromanga-cafe.com/127.0.0.1#5335 +ipset=/eromanga-cafe.com/gfwlist +server=/monsterbydrebeat.com/127.0.0.1#5335 +ipset=/monsterbydrebeat.com/gfwlist +server=/leaguehighschool.com/127.0.0.1#5335 +ipset=/leaguehighschool.com/gfwlist +server=/dettol.pt/127.0.0.1#5335 +ipset=/dettol.pt/gfwlist +server=/veet.com/127.0.0.1#5335 +ipset=/veet.com/gfwlist +server=/explorespanking.com/127.0.0.1#5335 +ipset=/explorespanking.com/gfwlist +server=/spore.com/127.0.0.1#5335 +ipset=/spore.com/gfwlist +server=/dot.net/127.0.0.1#5335 +ipset=/dot.net/gfwlist +server=/viacomcbs.com/127.0.0.1#5335 +ipset=/viacomcbs.com/gfwlist +server=/youtubego.co.in/127.0.0.1#5335 +ipset=/youtubego.co.in/gfwlist +server=/mini-connected.ch/127.0.0.1#5335 +ipset=/mini-connected.ch/gfwlist +server=/strepsils.ru/127.0.0.1#5335 +ipset=/strepsils.ru/gfwlist +server=/kk.stream/127.0.0.1#5335 +ipset=/kk.stream/gfwlist +server=/designeriphonescases.com/127.0.0.1#5335 +ipset=/designeriphonescases.com/gfwlist +server=/porn-star.com/127.0.0.1#5335 +ipset=/porn-star.com/gfwlist +server=/onlinexxxgames.com/127.0.0.1#5335 +ipset=/onlinexxxgames.com/gfwlist +server=/shotwithgeforce.com/127.0.0.1#5335 +ipset=/shotwithgeforce.com/gfwlist +server=/mcdonalds.com.hk/127.0.0.1#5335 +ipset=/mcdonalds.com.hk/gfwlist +server=/heyzo.com/127.0.0.1#5335 +ipset=/heyzo.com/gfwlist +server=/hpcodewarsbcn.com/127.0.0.1#5335 +ipset=/hpcodewarsbcn.com/gfwlist +server=/dmm-extension.com/127.0.0.1#5335 +ipset=/dmm-extension.com/gfwlist +server=/windowsupdate.com/127.0.0.1#5335 +ipset=/windowsupdate.com/gfwlist +server=/akamaiphillipines.net/127.0.0.1#5335 +ipset=/akamaiphillipines.net/gfwlist +server=/visa-atm.com/127.0.0.1#5335 +ipset=/visa-atm.com/gfwlist +server=/pornbozz.com/127.0.0.1#5335 +ipset=/pornbozz.com/gfwlist +server=/linegame.jp/127.0.0.1#5335 +ipset=/linegame.jp/gfwlist +server=/xn--gogl-1nd42e.com/127.0.0.1#5335 +ipset=/xn--gogl-1nd42e.com/gfwlist +server=/bmw.com.mo/127.0.0.1#5335 +ipset=/bmw.com.mo/gfwlist +server=/bdawnvr.xyz/127.0.0.1#5335 +ipset=/bdawnvr.xyz/gfwlist +server=/bloomberglaw.com/127.0.0.1#5335 +ipset=/bloomberglaw.com/gfwlist +server=/qualcomm.com/127.0.0.1#5335 +ipset=/qualcomm.com/gfwlist +server=/scoreuniverse.com/127.0.0.1#5335 +ipset=/scoreuniverse.com/gfwlist +server=/czechmassage.com/127.0.0.1#5335 +ipset=/czechmassage.com/gfwlist +server=/attexperts.com/127.0.0.1#5335 +ipset=/attexperts.com/gfwlist +server=/soundofhope.org/127.0.0.1#5335 +ipset=/soundofhope.org/gfwlist +server=/swissign.com/127.0.0.1#5335 +ipset=/swissign.com/gfwlist +server=/dndbeyond.com/127.0.0.1#5335 +ipset=/dndbeyond.com/gfwlist +server=/thawte.de/127.0.0.1#5335 +ipset=/thawte.de/gfwlist +server=/picpost.com/127.0.0.1#5335 +ipset=/picpost.com/gfwlist +server=/animalzoosex.me/127.0.0.1#5335 +ipset=/animalzoosex.me/gfwlist +server=/motionpictureser.com/127.0.0.1#5335 +ipset=/motionpictureser.com/gfwlist +server=/shopee.sg/127.0.0.1#5335 +ipset=/shopee.sg/gfwlist +server=/bloombergspace.com/127.0.0.1#5335 +ipset=/bloombergspace.com/gfwlist +server=/lghvacstory.com/127.0.0.1#5335 +ipset=/lghvacstory.com/gfwlist +server=/instagram-press.com/127.0.0.1#5335 +ipset=/instagram-press.com/gfwlist +server=/theepochtimessubscribe.com/127.0.0.1#5335 +ipset=/theepochtimessubscribe.com/gfwlist +server=/pleasurebabe.com/127.0.0.1#5335 +ipset=/pleasurebabe.com/gfwlist +server=/tube2012.com/127.0.0.1#5335 +ipset=/tube2012.com/gfwlist +server=/unlocklimitlesslearning.com/127.0.0.1#5335 +ipset=/unlocklimitlesslearning.com/gfwlist +server=/anm.co.uk/127.0.0.1#5335 +ipset=/anm.co.uk/gfwlist +server=/newsensations.com/127.0.0.1#5335 +ipset=/newsensations.com/gfwlist +server=/hulugo.com/127.0.0.1#5335 +ipset=/hulugo.com/gfwlist +server=/nubileset.com/127.0.0.1#5335 +ipset=/nubileset.com/gfwlist +server=/pornachi.com/127.0.0.1#5335 +ipset=/pornachi.com/gfwlist +server=/verhentai.tv/127.0.0.1#5335 +ipset=/verhentai.tv/gfwlist +server=/shoptraivip.com/127.0.0.1#5335 +ipset=/shoptraivip.com/gfwlist +server=/anibooru.com/127.0.0.1#5335 +ipset=/anibooru.com/gfwlist +server=/scholar.google.com.sv/127.0.0.1#5335 +ipset=/scholar.google.com.sv/gfwlist +server=/archlinux.org/127.0.0.1#5335 +ipset=/archlinux.org/gfwlist +server=/every1dns.net/127.0.0.1#5335 +ipset=/every1dns.net/gfwlist +server=/zoozhamster.com/127.0.0.1#5335 +ipset=/zoozhamster.com/gfwlist +server=/googel.com/127.0.0.1#5335 +ipset=/googel.com/gfwlist +server=/binance.me/127.0.0.1#5335 +ipset=/binance.me/gfwlist +server=/pre-bmwgroup.jobs/127.0.0.1#5335 +ipset=/pre-bmwgroup.jobs/gfwlist +server=/freeuseporn.com/127.0.0.1#5335 +ipset=/freeuseporn.com/gfwlist +server=/nbabot.net/127.0.0.1#5335 +ipset=/nbabot.net/gfwlist +server=/hentaifromhell.org/127.0.0.1#5335 +ipset=/hentaifromhell.org/gfwlist +server=/aboutporno.net/127.0.0.1#5335 +ipset=/aboutporno.net/gfwlist +server=/sourcingforebay.tv/127.0.0.1#5335 +ipset=/sourcingforebay.tv/gfwlist +server=/hketgroup.com/127.0.0.1#5335 +ipset=/hketgroup.com/gfwlist +server=/91qk41rf.com/127.0.0.1#5335 +ipset=/91qk41rf.com/gfwlist +server=/nintendo.at/127.0.0.1#5335 +ipset=/nintendo.at/gfwlist +server=/sldolls.com/127.0.0.1#5335 +ipset=/sldolls.com/gfwlist +server=/speeddreamride.com/127.0.0.1#5335 +ipset=/speeddreamride.com/gfwlist +server=/disney.my/127.0.0.1#5335 +ipset=/disney.my/gfwlist +server=/hdouga.com/127.0.0.1#5335 +ipset=/hdouga.com/gfwlist +server=/instagranm.com/127.0.0.1#5335 +ipset=/instagranm.com/gfwlist +server=/hellven.net/127.0.0.1#5335 +ipset=/hellven.net/gfwlist +server=/bridgestone.co.th/127.0.0.1#5335 +ipset=/bridgestone.co.th/gfwlist +server=/amazonworkdocs.com/127.0.0.1#5335 +ipset=/amazonworkdocs.com/gfwlist +server=/ghettotube.com/127.0.0.1#5335 +ipset=/ghettotube.com/gfwlist +server=/useplannr.com/127.0.0.1#5335 +ipset=/useplannr.com/gfwlist +server=/disney.se/127.0.0.1#5335 +ipset=/disney.se/gfwlist +server=/fontexplorerx.com/127.0.0.1#5335 +ipset=/fontexplorerx.com/gfwlist +server=/yahoo.si/127.0.0.1#5335 +ipset=/yahoo.si/gfwlist +server=/fescebook.com/127.0.0.1#5335 +ipset=/fescebook.com/gfwlist +server=/arabgirls.us/127.0.0.1#5335 +ipset=/arabgirls.us/gfwlist +server=/eroterest.net/127.0.0.1#5335 +ipset=/eroterest.net/gfwlist +server=/justnudepic.com/127.0.0.1#5335 +ipset=/justnudepic.com/gfwlist +server=/nikeairmaxs.com/127.0.0.1#5335 +ipset=/nikeairmaxs.com/gfwlist +server=/fox35orlando.com/127.0.0.1#5335 +ipset=/fox35orlando.com/gfwlist +server=/seksmet.nl/127.0.0.1#5335 +ipset=/seksmet.nl/gfwlist +server=/visa.pt/127.0.0.1#5335 +ipset=/visa.pt/gfwlist +server=/celebgramme.com/127.0.0.1#5335 +ipset=/celebgramme.com/gfwlist +server=/d2mrry2to5rg.com/127.0.0.1#5335 +ipset=/d2mrry2to5rg.com/gfwlist +server=/ebayoncampus.com/127.0.0.1#5335 +ipset=/ebayoncampus.com/gfwlist +server=/sankei-eiga.co.jp/127.0.0.1#5335 +ipset=/sankei-eiga.co.jp/gfwlist +server=/renminbao.com/127.0.0.1#5335 +ipset=/renminbao.com/gfwlist +server=/youtrannytube.com/127.0.0.1#5335 +ipset=/youtrannytube.com/gfwlist +server=/vmwgcomms.com/127.0.0.1#5335 +ipset=/vmwgcomms.com/gfwlist +server=/vidmpreview.com/127.0.0.1#5335 +ipset=/vidmpreview.com/gfwlist +server=/finehub.com/127.0.0.1#5335 +ipset=/finehub.com/gfwlist +server=/nyt.net/127.0.0.1#5335 +ipset=/nyt.net/gfwlist +server=/curseforge.com/127.0.0.1#5335 +ipset=/curseforge.com/gfwlist +server=/francemail.com/127.0.0.1#5335 +ipset=/francemail.com/gfwlist +server=/nutaku.net/127.0.0.1#5335 +ipset=/nutaku.net/gfwlist +server=/vfsco.se/127.0.0.1#5335 +ipset=/vfsco.se/gfwlist +server=/04647.club/127.0.0.1#5335 +ipset=/04647.club/gfwlist +server=/miniworkshop.com/127.0.0.1#5335 +ipset=/miniworkshop.com/gfwlist +server=/nike-org.com/127.0.0.1#5335 +ipset=/nike-org.com/gfwlist +server=/paypal-business.org/127.0.0.1#5335 +ipset=/paypal-business.org/gfwlist +server=/bmw.com.ph/127.0.0.1#5335 +ipset=/bmw.com.ph/gfwlist +server=/bookclubcorner.com/127.0.0.1#5335 +ipset=/bookclubcorner.com/gfwlist +server=/xnxx4porn.com/127.0.0.1#5335 +ipset=/xnxx4porn.com/gfwlist +server=/eurobabeindex.com/127.0.0.1#5335 +ipset=/eurobabeindex.com/gfwlist +server=/braintreeps.com/127.0.0.1#5335 +ipset=/braintreeps.com/gfwlist +server=/siterips.org/127.0.0.1#5335 +ipset=/siterips.org/gfwlist +server=/drebeats-singapore.net/127.0.0.1#5335 +ipset=/drebeats-singapore.net/gfwlist +server=/czechhunter.com/127.0.0.1#5335 +ipset=/czechhunter.com/gfwlist +server=/bili999.com/127.0.0.1#5335 +ipset=/bili999.com/gfwlist +server=/volvotrucks.sg/127.0.0.1#5335 +ipset=/volvotrucks.sg/gfwlist +server=/vct.news/127.0.0.1#5335 +ipset=/vct.news/gfwlist +server=/cashbycashapp.com/127.0.0.1#5335 +ipset=/cashbycashapp.com/gfwlist +server=/beats-headphones.us/127.0.0.1#5335 +ipset=/beats-headphones.us/gfwlist +server=/alphera.co.in/127.0.0.1#5335 +ipset=/alphera.co.in/gfwlist +server=/shegods.com/127.0.0.1#5335 +ipset=/shegods.com/gfwlist +server=/webex.co.uk/127.0.0.1#5335 +ipset=/webex.co.uk/gfwlist +server=/driverxxx.com/127.0.0.1#5335 +ipset=/driverxxx.com/gfwlist +server=/youtube.hu/127.0.0.1#5335 +ipset=/youtube.hu/gfwlist +server=/alphabet.asia/127.0.0.1#5335 +ipset=/alphabet.asia/gfwlist +server=/claravenger.com/127.0.0.1#5335 +ipset=/claravenger.com/gfwlist +server=/epicbrowser.com/127.0.0.1#5335 +ipset=/epicbrowser.com/gfwlist +server=/beatsbydrdres.com/127.0.0.1#5335 +ipset=/beatsbydrdres.com/gfwlist +server=/beatsbydreboxingdayca.com/127.0.0.1#5335 +ipset=/beatsbydreboxingdayca.com/gfwlist +server=/youtube.co.jp/127.0.0.1#5335 +ipset=/youtube.co.jp/gfwlist +server=/admob.com/127.0.0.1#5335 +ipset=/admob.com/gfwlist +server=/paypal-plaza.com/127.0.0.1#5335 +ipset=/paypal-plaza.com/gfwlist +server=/alterauserforums.com/127.0.0.1#5335 +ipset=/alterauserforums.com/gfwlist +server=/vfsco.com.br/127.0.0.1#5335 +ipset=/vfsco.com.br/gfwlist +server=/cfwives.com/127.0.0.1#5335 +ipset=/cfwives.com/gfwlist +server=/rbbusinessshop.com/127.0.0.1#5335 +ipset=/rbbusinessshop.com/gfwlist +server=/steamgames.com/127.0.0.1#5335 +ipset=/steamgames.com/gfwlist +server=/aziani.com/127.0.0.1#5335 +ipset=/aziani.com/gfwlist +server=/youpornxvideos.net/127.0.0.1#5335 +ipset=/youpornxvideos.net/gfwlist +server=/bmw.tt/127.0.0.1#5335 +ipset=/bmw.tt/gfwlist +server=/directvlosangeles.com/127.0.0.1#5335 +ipset=/directvlosangeles.com/gfwlist +server=/javgrown.com/127.0.0.1#5335 +ipset=/javgrown.com/gfwlist +server=/sonypicturesanimation.com/127.0.0.1#5335 +ipset=/sonypicturesanimation.com/gfwlist +server=/canon-emea.com/127.0.0.1#5335 +ipset=/canon-emea.com/gfwlist +server=/escortgirls.be/127.0.0.1#5335 +ipset=/escortgirls.be/gfwlist +server=/faceboot.com/127.0.0.1#5335 +ipset=/faceboot.com/gfwlist +server=/gopivotal.com/127.0.0.1#5335 +ipset=/gopivotal.com/gfwlist +server=/tvmedia.net.au/127.0.0.1#5335 +ipset=/tvmedia.net.au/gfwlist +server=/geeksquad.com/127.0.0.1#5335 +ipset=/geeksquad.com/gfwlist +server=/time.gov/127.0.0.1#5335 +ipset=/time.gov/gfwlist +server=/amplifyframework.com/127.0.0.1#5335 +ipset=/amplifyframework.com/gfwlist +server=/licensebuttons.net/127.0.0.1#5335 +ipset=/licensebuttons.net/gfwlist +server=/scolle.net/127.0.0.1#5335 +ipset=/scolle.net/gfwlist +server=/microsoft365.com/127.0.0.1#5335 +ipset=/microsoft365.com/gfwlist +server=/pypl.tv/127.0.0.1#5335 +ipset=/pypl.tv/gfwlist +server=/zeenews-fonts.s3.amazonaws.com/127.0.0.1#5335 +ipset=/zeenews-fonts.s3.amazonaws.com/gfwlist +server=/groupfun.com/127.0.0.1#5335 +ipset=/groupfun.com/gfwlist +server=/paypalbeacon.com/127.0.0.1#5335 +ipset=/paypalbeacon.com/gfwlist +server=/mray.club/127.0.0.1#5335 +ipset=/mray.club/gfwlist +server=/pornoweb.hu/127.0.0.1#5335 +ipset=/pornoweb.hu/gfwlist +server=/4pig.com/127.0.0.1#5335 +ipset=/4pig.com/gfwlist +server=/zoig.com/127.0.0.1#5335 +ipset=/zoig.com/gfwlist +server=/pokemonvgc.com/127.0.0.1#5335 +ipset=/pokemonvgc.com/gfwlist +server=/booking.com/127.0.0.1#5335 +ipset=/booking.com/gfwlist +server=/intel.sy/127.0.0.1#5335 +ipset=/intel.sy/gfwlist +server=/paypal-signin.us/127.0.0.1#5335 +ipset=/paypal-signin.us/gfwlist +server=/yuraku.8v8.be/127.0.0.1#5335 +ipset=/yuraku.8v8.be/gfwlist +server=/foxsportssupports.com/127.0.0.1#5335 +ipset=/foxsportssupports.com/gfwlist +server=/yahoo.com.om/127.0.0.1#5335 +ipset=/yahoo.com.om/gfwlist +server=/google.dk/127.0.0.1#5335 +ipset=/google.dk/gfwlist +server=/globaledu.org/127.0.0.1#5335 +ipset=/globaledu.org/gfwlist +server=/veet.com.sg/127.0.0.1#5335 +ipset=/veet.com.sg/gfwlist +server=/wealth.com.tw/127.0.0.1#5335 +ipset=/wealth.com.tw/gfwlist +server=/downloadpass.com/127.0.0.1#5335 +ipset=/downloadpass.com/gfwlist +server=/global-sci.org/127.0.0.1#5335 +ipset=/global-sci.org/gfwlist +server=/paragon.com/127.0.0.1#5335 +ipset=/paragon.com/gfwlist +server=/bangkokstreetwhores.com/127.0.0.1#5335 +ipset=/bangkokstreetwhores.com/gfwlist +server=/genshin-porn.com/127.0.0.1#5335 +ipset=/genshin-porn.com/gfwlist +server=/mastercard.com.ph/127.0.0.1#5335 +ipset=/mastercard.com.ph/gfwlist +server=/shopee.com/127.0.0.1#5335 +ipset=/shopee.com/gfwlist +server=/123sex.top/127.0.0.1#5335 +ipset=/123sex.top/gfwlist +server=/sonydesign.com/127.0.0.1#5335 +ipset=/sonydesign.com/gfwlist +server=/myconstructionworld.net/127.0.0.1#5335 +ipset=/myconstructionworld.net/gfwlist +server=/celebforum.co/127.0.0.1#5335 +ipset=/celebforum.co/gfwlist +server=/streamable.com/127.0.0.1#5335 +ipset=/streamable.com/gfwlist +server=/foxkansas.com/127.0.0.1#5335 +ipset=/foxkansas.com/gfwlist +server=/fbcdn.com/127.0.0.1#5335 +ipset=/fbcdn.com/gfwlist +server=/retrohomevideos.com/127.0.0.1#5335 +ipset=/retrohomevideos.com/gfwlist +server=/wearehairy.com/127.0.0.1#5335 +ipset=/wearehairy.com/gfwlist +server=/dcard.io/127.0.0.1#5335 +ipset=/dcard.io/gfwlist +server=/youtube.sa/127.0.0.1#5335 +ipset=/youtube.sa/gfwlist +server=/21hub.com/127.0.0.1#5335 +ipset=/21hub.com/gfwlist +server=/foxlexington.com/127.0.0.1#5335 +ipset=/foxlexington.com/gfwlist +server=/lindylist.org/127.0.0.1#5335 +ipset=/lindylist.org/gfwlist +server=/dvh30n.vip/127.0.0.1#5335 +ipset=/dvh30n.vip/gfwlist +server=/property.com.au/127.0.0.1#5335 +ipset=/property.com.au/gfwlist +server=/pussy3dporn.com/127.0.0.1#5335 +ipset=/pussy3dporn.com/gfwlist +server=/gcolle.net/127.0.0.1#5335 +ipset=/gcolle.net/gfwlist +server=/paypal.info/127.0.0.1#5335 +ipset=/paypal.info/gfwlist +server=/xuite.net/127.0.0.1#5335 +ipset=/xuite.net/gfwlist +server=/google.ne/127.0.0.1#5335 +ipset=/google.ne/gfwlist +server=/rethink.net/127.0.0.1#5335 +ipset=/rethink.net/gfwlist +server=/tinyurl.com/127.0.0.1#5335 +ipset=/tinyurl.com/gfwlist +server=/trikepatrol.com/127.0.0.1#5335 +ipset=/trikepatrol.com/gfwlist +server=/ettrade.com.hk/127.0.0.1#5335 +ipset=/ettrade.com.hk/gfwlist +server=/volvotrucks.tm/127.0.0.1#5335 +ipset=/volvotrucks.tm/gfwlist +server=/aacrjournals.org/127.0.0.1#5335 +ipset=/aacrjournals.org/gfwlist +server=/gmoney.org/127.0.0.1#5335 +ipset=/gmoney.org/gfwlist +server=/youtube.com.pk/127.0.0.1#5335 +ipset=/youtube.com.pk/gfwlist +server=/fox46charlotte.com/127.0.0.1#5335 +ipset=/fox46charlotte.com/gfwlist +server=/apple-store.wang/127.0.0.1#5335 +ipset=/apple-store.wang/gfwlist +server=/phprcdn.com/127.0.0.1#5335 +ipset=/phprcdn.com/gfwlist +server=/sagepub.com/127.0.0.1#5335 +ipset=/sagepub.com/gfwlist +server=/onlyhomemadeanal.com/127.0.0.1#5335 +ipset=/onlyhomemadeanal.com/gfwlist +server=/direectv.com/127.0.0.1#5335 +ipset=/direectv.com/gfwlist +server=/durex.co.nz/127.0.0.1#5335 +ipset=/durex.co.nz/gfwlist +server=/meitula.net/127.0.0.1#5335 +ipset=/meitula.net/gfwlist +server=/flyflv.com/127.0.0.1#5335 +ipset=/flyflv.com/gfwlist +server=/api-p.videomarket.jp/127.0.0.1#5335 +ipset=/api-p.videomarket.jp/gfwlist +server=/applestore.qa/127.0.0.1#5335 +ipset=/applestore.qa/gfwlist +server=/strepsils.co.kr/127.0.0.1#5335 +ipset=/strepsils.co.kr/gfwlist +server=/mini101.ca/127.0.0.1#5335 +ipset=/mini101.ca/gfwlist +server=/area51.to/127.0.0.1#5335 +ipset=/area51.to/gfwlist +server=/minimotoringschool.com/127.0.0.1#5335 +ipset=/minimotoringschool.com/gfwlist +server=/bbthat.com/127.0.0.1#5335 +ipset=/bbthat.com/gfwlist +server=/freejavporn.mobi/127.0.0.1#5335 +ipset=/freejavporn.mobi/gfwlist +server=/huanyuju.com/127.0.0.1#5335 +ipset=/huanyuju.com/gfwlist +server=/chobit.cc/127.0.0.1#5335 +ipset=/chobit.cc/gfwlist +server=/huluinstantmessenger.com/127.0.0.1#5335 +ipset=/huluinstantmessenger.com/gfwlist +server=/gameuxmasterguide.com/127.0.0.1#5335 +ipset=/gameuxmasterguide.com/gfwlist +server=/alphabet.lu/127.0.0.1#5335 +ipset=/alphabet.lu/gfwlist +server=/mastercard.be/127.0.0.1#5335 +ipset=/mastercard.be/gfwlist +server=/foxnewsgo.tv/127.0.0.1#5335 +ipset=/foxnewsgo.tv/gfwlist +server=/ipodtouch.co/127.0.0.1#5335 +ipset=/ipodtouch.co/gfwlist +server=/tjsbfj.com/127.0.0.1#5335 +ipset=/tjsbfj.com/gfwlist +server=/markzuckerberg.com/127.0.0.1#5335 +ipset=/markzuckerberg.com/gfwlist +server=/visa.tc/127.0.0.1#5335 +ipset=/visa.tc/gfwlist +server=/totalmateria.com/127.0.0.1#5335 +ipset=/totalmateria.com/gfwlist +server=/dnaspaces.io/127.0.0.1#5335 +ipset=/dnaspaces.io/gfwlist +server=/bmw.co.uk/127.0.0.1#5335 +ipset=/bmw.co.uk/gfwlist +server=/angle.com.tw/127.0.0.1#5335 +ipset=/angle.com.tw/gfwlist +server=/facebook-pmdcenter.net/127.0.0.1#5335 +ipset=/facebook-pmdcenter.net/gfwlist +server=/nvidia.com.ve/127.0.0.1#5335 +ipset=/nvidia.com.ve/gfwlist +server=/nicoseiga.jp/127.0.0.1#5335 +ipset=/nicoseiga.jp/gfwlist +server=/durex.com.hr/127.0.0.1#5335 +ipset=/durex.com.hr/gfwlist +server=/69story.com/127.0.0.1#5335 +ipset=/69story.com/gfwlist +server=/microsoftonline-p.com/127.0.0.1#5335 +ipset=/microsoftonline-p.com/gfwlist +server=/aliveitsm.com/127.0.0.1#5335 +ipset=/aliveitsm.com/gfwlist +server=/coova.com/127.0.0.1#5335 +ipset=/coova.com/gfwlist +server=/ipod.es/127.0.0.1#5335 +ipset=/ipod.es/gfwlist +server=/leagueoflegends.ca/127.0.0.1#5335 +ipset=/leagueoflegends.ca/gfwlist +server=/examroom.info/127.0.0.1#5335 +ipset=/examroom.info/gfwlist +server=/nintendo.net/127.0.0.1#5335 +ipset=/nintendo.net/gfwlist +server=/linseysworld.com/127.0.0.1#5335 +ipset=/linseysworld.com/gfwlist +server=/veet.cl/127.0.0.1#5335 +ipset=/veet.cl/gfwlist +server=/pornsos.com/127.0.0.1#5335 +ipset=/pornsos.com/gfwlist +server=/kingcomix.com/127.0.0.1#5335 +ipset=/kingcomix.com/gfwlist +server=/volvotrucks.co.ao/127.0.0.1#5335 +ipset=/volvotrucks.co.ao/gfwlist +server=/beegfree.com/127.0.0.1#5335 +ipset=/beegfree.com/gfwlist +server=/fleshbot.com/127.0.0.1#5335 +ipset=/fleshbot.com/gfwlist +server=/bsw.co.jp/127.0.0.1#5335 +ipset=/bsw.co.jp/gfwlist +server=/freepornpreview.net/127.0.0.1#5335 +ipset=/freepornpreview.net/gfwlist +server=/hothdsex.xxx/127.0.0.1#5335 +ipset=/hothdsex.xxx/gfwlist +server=/horseporn.tv/127.0.0.1#5335 +ipset=/horseporn.tv/gfwlist +server=/imagecurl.org/127.0.0.1#5335 +ipset=/imagecurl.org/gfwlist +server=/floppy-tits.com/127.0.0.1#5335 +ipset=/floppy-tits.com/gfwlist +server=/mastercard.cz/127.0.0.1#5335 +ipset=/mastercard.cz/gfwlist +server=/volvogroup.fr/127.0.0.1#5335 +ipset=/volvogroup.fr/gfwlist +server=/881903.com/127.0.0.1#5335 +ipset=/881903.com/gfwlist +server=/webcams.tv/127.0.0.1#5335 +ipset=/webcams.tv/gfwlist +server=/contactossexoecuador.com/127.0.0.1#5335 +ipset=/contactossexoecuador.com/gfwlist +server=/bbystatic.com/127.0.0.1#5335 +ipset=/bbystatic.com/gfwlist +server=/netflixdnstest9.com/127.0.0.1#5335 +ipset=/netflixdnstest9.com/gfwlist +server=/suruga-ya.jp/127.0.0.1#5335 +ipset=/suruga-ya.jp/gfwlist +server=/girlssexxxx.com/127.0.0.1#5335 +ipset=/girlssexxxx.com/gfwlist +server=/sony.be/127.0.0.1#5335 +ipset=/sony.be/gfwlist +server=/bmw-saudiarabia.com/127.0.0.1#5335 +ipset=/bmw-saudiarabia.com/gfwlist +server=/ero-anime.net/127.0.0.1#5335 +ipset=/ero-anime.net/gfwlist +server=/intel.af/127.0.0.1#5335 +ipset=/intel.af/gfwlist +server=/whoreasianporn.com/127.0.0.1#5335 +ipset=/whoreasianporn.com/gfwlist +server=/qualcomm.co.uk/127.0.0.1#5335 +ipset=/qualcomm.co.uk/gfwlist +server=/cheapbeatsbydrestudioedition.com/127.0.0.1#5335 +ipset=/cheapbeatsbydrestudioedition.com/gfwlist +server=/maddenseason.net/127.0.0.1#5335 +ipset=/maddenseason.net/gfwlist +server=/verisign.vn/127.0.0.1#5335 +ipset=/verisign.vn/gfwlist +server=/wildfreevideos.com/127.0.0.1#5335 +ipset=/wildfreevideos.com/gfwlist +server=/intel.com.my/127.0.0.1#5335 +ipset=/intel.com.my/gfwlist +server=/yahoo.com.mt/127.0.0.1#5335 +ipset=/yahoo.com.mt/gfwlist +server=/spiceworksstatic.com/127.0.0.1#5335 +ipset=/spiceworksstatic.com/gfwlist +server=/uhairy.com/127.0.0.1#5335 +ipset=/uhairy.com/gfwlist +server=/pricelesshongkong.com/127.0.0.1#5335 +ipset=/pricelesshongkong.com/gfwlist +server=/hkteducation.com/127.0.0.1#5335 +ipset=/hkteducation.com/gfwlist +server=/mini.kz/127.0.0.1#5335 +ipset=/mini.kz/gfwlist +server=/justindianporn.me/127.0.0.1#5335 +ipset=/justindianporn.me/gfwlist +server=/google.com.af/127.0.0.1#5335 +ipset=/google.com.af/gfwlist +server=/paypalonline.org/127.0.0.1#5335 +ipset=/paypalonline.org/gfwlist +server=/rea.io/127.0.0.1#5335 +ipset=/rea.io/gfwlist +server=/bmwcolorado.com/127.0.0.1#5335 +ipset=/bmwcolorado.com/gfwlist +server=/financialadvisoriq.com/127.0.0.1#5335 +ipset=/financialadvisoriq.com/gfwlist +server=/instantssl.com/127.0.0.1#5335 +ipset=/instantssl.com/gfwlist +server=/strepsils.com.hk/127.0.0.1#5335 +ipset=/strepsils.com.hk/gfwlist +server=/teen-girl.net/127.0.0.1#5335 +ipset=/teen-girl.net/gfwlist +server=/iwara.tv/127.0.0.1#5335 +ipset=/iwara.tv/gfwlist +server=/nudewomenpics.net/127.0.0.1#5335 +ipset=/nudewomenpics.net/gfwlist +server=/facebook.design/127.0.0.1#5335 +ipset=/facebook.design/gfwlist +server=/mini.com.uy/127.0.0.1#5335 +ipset=/mini.com.uy/gfwlist +server=/illusion.jp/127.0.0.1#5335 +ipset=/illusion.jp/gfwlist +server=/i-scmp.com/127.0.0.1#5335 +ipset=/i-scmp.com/gfwlist +server=/kindteenporn.com/127.0.0.1#5335 +ipset=/kindteenporn.com/gfwlist +server=/ikea.co.kr/127.0.0.1#5335 +ipset=/ikea.co.kr/gfwlist +server=/volvotrucks.gr/127.0.0.1#5335 +ipset=/volvotrucks.gr/gfwlist +server=/hentaiknight.com/127.0.0.1#5335 +ipset=/hentaiknight.com/gfwlist +server=/foxplus.com/127.0.0.1#5335 +ipset=/foxplus.com/gfwlist +server=/adult3dtoons.com/127.0.0.1#5335 +ipset=/adult3dtoons.com/gfwlist +server=/hkcsl.com/127.0.0.1#5335 +ipset=/hkcsl.com/gfwlist +server=/nurofen.it/127.0.0.1#5335 +ipset=/nurofen.it/gfwlist +server=/instagramn.com/127.0.0.1#5335 +ipset=/instagramn.com/gfwlist +server=/dafahao.com/127.0.0.1#5335 +ipset=/dafahao.com/gfwlist +server=/zerohedge.com/127.0.0.1#5335 +ipset=/zerohedge.com/gfwlist +server=/adobe-aemassets-value.com/127.0.0.1#5335 +ipset=/adobe-aemassets-value.com/gfwlist +server=/login-account.net/127.0.0.1#5335 +ipset=/login-account.net/gfwlist +server=/tubetria.mobi/127.0.0.1#5335 +ipset=/tubetria.mobi/gfwlist +server=/gaysitessearch.cc/127.0.0.1#5335 +ipset=/gaysitessearch.cc/gfwlist +server=/nikeselling.com/127.0.0.1#5335 +ipset=/nikeselling.com/gfwlist +server=/satnym.com/127.0.0.1#5335 +ipset=/satnym.com/gfwlist +server=/flow.dev/127.0.0.1#5335 +ipset=/flow.dev/gfwlist +server=/beats-deal.com/127.0.0.1#5335 +ipset=/beats-deal.com/gfwlist +server=/bigdickorgasm.com/127.0.0.1#5335 +ipset=/bigdickorgasm.com/gfwlist +server=/linefriends.com/127.0.0.1#5335 +ipset=/linefriends.com/gfwlist +server=/yourcolonoscopy.com/127.0.0.1#5335 +ipset=/yourcolonoscopy.com/gfwlist +server=/comodo.com/127.0.0.1#5335 +ipset=/comodo.com/gfwlist +server=/beatsmusic.wang/127.0.0.1#5335 +ipset=/beatsmusic.wang/gfwlist +server=/powerbook.eu/127.0.0.1#5335 +ipset=/powerbook.eu/gfwlist +server=/bmwoftulsa.com/127.0.0.1#5335 +ipset=/bmwoftulsa.com/gfwlist +server=/wkap.nl/127.0.0.1#5335 +ipset=/wkap.nl/gfwlist +server=/blogspot.cf/127.0.0.1#5335 +ipset=/blogspot.cf/gfwlist +server=/paypal.com.sg/127.0.0.1#5335 +ipset=/paypal.com.sg/gfwlist +server=/ebaymotorsblog.com/127.0.0.1#5335 +ipset=/ebaymotorsblog.com/gfwlist +server=/youtube.com.bd/127.0.0.1#5335 +ipset=/youtube.com.bd/gfwlist +server=/knoxemm.com/127.0.0.1#5335 +ipset=/knoxemm.com/gfwlist +server=/wdc.com/127.0.0.1#5335 +ipset=/wdc.com/gfwlist +server=/beats-seller.com/127.0.0.1#5335 +ipset=/beats-seller.com/gfwlist +server=/voyeurhit.com/127.0.0.1#5335 +ipset=/voyeurhit.com/gfwlist +server=/mrlivecam.com/127.0.0.1#5335 +ipset=/mrlivecam.com/gfwlist +server=/appcloud.com/127.0.0.1#5335 +ipset=/appcloud.com/gfwlist +server=/mini.hu/127.0.0.1#5335 +ipset=/mini.hu/gfwlist +server=/discord.gifts/127.0.0.1#5335 +ipset=/discord.gifts/gfwlist +server=/els-cdn.com/127.0.0.1#5335 +ipset=/els-cdn.com/gfwlist +server=/visceralgames.com/127.0.0.1#5335 +ipset=/visceralgames.com/gfwlist +server=/volvotrucks.com.tw/127.0.0.1#5335 +ipset=/volvotrucks.com.tw/gfwlist +server=/chinapress.com.my/127.0.0.1#5335 +ipset=/chinapress.com.my/gfwlist +server=/dettol.cz/127.0.0.1#5335 +ipset=/dettol.cz/gfwlist +server=/paypal-activate.info/127.0.0.1#5335 +ipset=/paypal-activate.info/gfwlist +server=/bmw.se/127.0.0.1#5335 +ipset=/bmw.se/gfwlist +server=/nike-us.com/127.0.0.1#5335 +ipset=/nike-us.com/gfwlist +server=/appstore.my/127.0.0.1#5335 +ipset=/appstore.my/gfwlist +server=/ebay.it/127.0.0.1#5335 +ipset=/ebay.it/gfwlist +server=/iza.ne.jp/127.0.0.1#5335 +ipset=/iza.ne.jp/gfwlist +server=/adguard-vpn.com/127.0.0.1#5335 +ipset=/adguard-vpn.com/gfwlist +server=/scmp.com/127.0.0.1#5335 +ipset=/scmp.com/gfwlist +server=/voanouvel.com/127.0.0.1#5335 +ipset=/voanouvel.com/gfwlist +server=/f3b7q2p3.ssl.hwcdn.net/127.0.0.1#5335 +ipset=/f3b7q2p3.ssl.hwcdn.net/gfwlist +server=/goragay.com/127.0.0.1#5335 +ipset=/goragay.com/gfwlist +server=/abc.com/127.0.0.1#5335 +ipset=/abc.com/gfwlist +server=/bbc.com/127.0.0.1#5335 +ipset=/bbc.com/gfwlist +server=/shopping-days.net/127.0.0.1#5335 +ipset=/shopping-days.net/gfwlist +server=/naaktevrouwenporno.com/127.0.0.1#5335 +ipset=/naaktevrouwenporno.com/gfwlist +server=/mypearsonshop.mx/127.0.0.1#5335 +ipset=/mypearsonshop.mx/gfwlist +server=/tailwindtraders.com/127.0.0.1#5335 +ipset=/tailwindtraders.com/gfwlist +server=/paypalcredit.com/127.0.0.1#5335 +ipset=/paypalcredit.com/gfwlist +server=/pinterest.co.in/127.0.0.1#5335 +ipset=/pinterest.co.in/gfwlist +server=/blogspot.com.es/127.0.0.1#5335 +ipset=/blogspot.com.es/gfwlist +server=/videolan.org/127.0.0.1#5335 +ipset=/videolan.org/gfwlist +server=/nbc.com/127.0.0.1#5335 +ipset=/nbc.com/gfwlist +server=/facebookgraphsearch.info/127.0.0.1#5335 +ipset=/facebookgraphsearch.info/gfwlist +server=/nurofengel.com/127.0.0.1#5335 +ipset=/nurofengel.com/gfwlist +server=/bmw-motorrad.hu/127.0.0.1#5335 +ipset=/bmw-motorrad.hu/gfwlist +server=/av234567.com/127.0.0.1#5335 +ipset=/av234567.com/gfwlist +server=/89.com/127.0.0.1#5335 +ipset=/89.com/gfwlist +server=/girlstryanal.com/127.0.0.1#5335 +ipset=/girlstryanal.com/gfwlist +server=/beats-dre-us.com/127.0.0.1#5335 +ipset=/beats-dre-us.com/gfwlist +server=/darwinsource.com/127.0.0.1#5335 +ipset=/darwinsource.com/gfwlist +server=/travelex.com.my/127.0.0.1#5335 +ipset=/travelex.com.my/gfwlist +server=/sexbookecuador.com/127.0.0.1#5335 +ipset=/sexbookecuador.com/gfwlist +server=/topvids.net/127.0.0.1#5335 +ipset=/topvids.net/gfwlist +server=/vmwarecertificationvideos.com/127.0.0.1#5335 +ipset=/vmwarecertificationvideos.com/gfwlist +server=/miniusatires.com/127.0.0.1#5335 +ipset=/miniusatires.com/gfwlist +server=/pleasefuck.org/127.0.0.1#5335 +ipset=/pleasefuck.org/gfwlist +server=/paypalshopping.com/127.0.0.1#5335 +ipset=/paypalshopping.com/gfwlist +server=/canon.me/127.0.0.1#5335 +ipset=/canon.me/gfwlist +server=/battle.net/127.0.0.1#5335 +ipset=/battle.net/gfwlist +server=/scnshop.cc/127.0.0.1#5335 +ipset=/scnshop.cc/gfwlist +server=/baicaonetwork.com/127.0.0.1#5335 +ipset=/baicaonetwork.com/gfwlist +server=/intel.mx/127.0.0.1#5335 +ipset=/intel.mx/gfwlist +server=/hdjavonline.com/127.0.0.1#5335 +ipset=/hdjavonline.com/gfwlist +server=/yahoo.com.bo/127.0.0.1#5335 +ipset=/yahoo.com.bo/gfwlist +server=/ogp.me/127.0.0.1#5335 +ipset=/ogp.me/gfwlist +server=/dumpxxx.net/127.0.0.1#5335 +ipset=/dumpxxx.net/gfwlist +server=/fjlkajhgfa.top/127.0.0.1#5335 +ipset=/fjlkajhgfa.top/gfwlist +server=/youtube.co.ma/127.0.0.1#5335 +ipset=/youtube.co.ma/gfwlist +server=/firestone.cl/127.0.0.1#5335 +ipset=/firestone.cl/gfwlist +server=/usatoday.com/127.0.0.1#5335 +ipset=/usatoday.com/gfwlist +server=/18av.mm-cg.com/127.0.0.1#5335 +ipset=/18av.mm-cg.com/gfwlist +server=/pearson.pl/127.0.0.1#5335 +ipset=/pearson.pl/gfwlist +server=/yahoo.dj/127.0.0.1#5335 +ipset=/yahoo.dj/gfwlist +server=/teeztube.com/127.0.0.1#5335 +ipset=/teeztube.com/gfwlist +server=/xxxsexanal.com/127.0.0.1#5335 +ipset=/xxxsexanal.com/gfwlist +server=/launchpadlibrarian.org/127.0.0.1#5335 +ipset=/launchpadlibrarian.org/gfwlist +server=/directvcookevilletn.com/127.0.0.1#5335 +ipset=/directvcookevilletn.com/gfwlist +server=/e-bay.net/127.0.0.1#5335 +ipset=/e-bay.net/gfwlist +server=/adultgamesapk.com/127.0.0.1#5335 +ipset=/adultgamesapk.com/gfwlist +server=/ikea.com.cy/127.0.0.1#5335 +ipset=/ikea.com.cy/gfwlist +server=/amazon.jp/127.0.0.1#5335 +ipset=/amazon.jp/gfwlist +server=/womenwill.in/127.0.0.1#5335 +ipset=/womenwill.in/gfwlist +server=/mastercard.co.th/127.0.0.1#5335 +ipset=/mastercard.co.th/gfwlist +server=/pchome.com.tw/127.0.0.1#5335 +ipset=/pchome.com.tw/gfwlist +server=/feacboo.com/127.0.0.1#5335 +ipset=/feacboo.com/gfwlist +server=/sesenovel.com/127.0.0.1#5335 +ipset=/sesenovel.com/gfwlist +server=/tagapie.com.tw/127.0.0.1#5335 +ipset=/tagapie.com.tw/gfwlist +server=/clipseksi.com/127.0.0.1#5335 +ipset=/clipseksi.com/gfwlist +server=/collaboraoffice.com/127.0.0.1#5335 +ipset=/collaboraoffice.com/gfwlist +server=/thawte.com/127.0.0.1#5335 +ipset=/thawte.com/gfwlist +server=/dealsbeatsblackfriday.com/127.0.0.1#5335 +ipset=/dealsbeatsblackfriday.com/gfwlist +server=/youtube.pr/127.0.0.1#5335 +ipset=/youtube.pr/gfwlist +server=/sehuatang.net/127.0.0.1#5335 +ipset=/sehuatang.net/gfwlist +server=/hentaikey.com/127.0.0.1#5335 +ipset=/hentaikey.com/gfwlist +server=/zaobao.com.sg/127.0.0.1#5335 +ipset=/zaobao.com.sg/gfwlist +server=/bmw.is/127.0.0.1#5335 +ipset=/bmw.is/gfwlist +server=/elephanttube.com/127.0.0.1#5335 +ipset=/elephanttube.com/gfwlist +server=/bidbay.com/127.0.0.1#5335 +ipset=/bidbay.com/gfwlist +server=/yamoon.club/127.0.0.1#5335 +ipset=/yamoon.club/gfwlist +server=/voaafaanoromoo.com/127.0.0.1#5335 +ipset=/voaafaanoromoo.com/gfwlist +server=/mings-fashion.com/127.0.0.1#5335 +ipset=/mings-fashion.com/gfwlist +server=/latamvmwareforum.com/127.0.0.1#5335 +ipset=/latamvmwareforum.com/gfwlist +server=/marvelsuperheroseptember.com/127.0.0.1#5335 +ipset=/marvelsuperheroseptember.com/gfwlist +server=/nintendonetwork.net/127.0.0.1#5335 +ipset=/nintendonetwork.net/gfwlist +server=/bmwmotorrad.com.au/127.0.0.1#5335 +ipset=/bmwmotorrad.com.au/gfwlist +server=/javsex.asia/127.0.0.1#5335 +ipset=/javsex.asia/gfwlist +server=/sexxxxfilms.com/127.0.0.1#5335 +ipset=/sexxxxfilms.com/gfwlist +server=/facdbook.com/127.0.0.1#5335 +ipset=/facdbook.com/gfwlist +server=/youtube.ua/127.0.0.1#5335 +ipset=/youtube.ua/gfwlist +server=/hdporn1080.net/127.0.0.1#5335 +ipset=/hdporn1080.net/gfwlist +server=/heydouga.com/127.0.0.1#5335 +ipset=/heydouga.com/gfwlist +server=/ecchi.xxx/127.0.0.1#5335 +ipset=/ecchi.xxx/gfwlist +server=/khanacademy.org/127.0.0.1#5335 +ipset=/khanacademy.org/gfwlist +server=/bigdick.com/127.0.0.1#5335 +ipset=/bigdick.com/gfwlist +server=/facebook-ebook.com/127.0.0.1#5335 +ipset=/facebook-ebook.com/gfwlist +server=/cloudflarestream.com/127.0.0.1#5335 +ipset=/cloudflarestream.com/gfwlist +server=/ethereum.foundation/127.0.0.1#5335 +ipset=/ethereum.foundation/gfwlist +server=/eromanga-hentai.com/127.0.0.1#5335 +ipset=/eromanga-hentai.com/gfwlist +server=/ebay-inc.org/127.0.0.1#5335 +ipset=/ebay-inc.org/gfwlist +server=/telekom.de/127.0.0.1#5335 +ipset=/telekom.de/gfwlist +server=/slashdot.org/127.0.0.1#5335 +ipset=/slashdot.org/gfwlist +server=/mktroute.com/127.0.0.1#5335 +ipset=/mktroute.com/gfwlist +server=/taleofthenight.com/127.0.0.1#5335 +ipset=/taleofthenight.com/gfwlist +server=/playsexgames.xxx/127.0.0.1#5335 +ipset=/playsexgames.xxx/gfwlist +server=/battlefieldheroes.com/127.0.0.1#5335 +ipset=/battlefieldheroes.com/gfwlist +server=/ebaymainstreet.com/127.0.0.1#5335 +ipset=/ebaymainstreet.com/gfwlist +server=/cqcorea.com/127.0.0.1#5335 +ipset=/cqcorea.com/gfwlist +server=/bustykellykay.com/127.0.0.1#5335 +ipset=/bustykellykay.com/gfwlist +server=/whorevintagesex.com/127.0.0.1#5335 +ipset=/whorevintagesex.com/gfwlist +server=/pivotalinitiative.com/127.0.0.1#5335 +ipset=/pivotalinitiative.com/gfwlist +server=/cheapbeats.us/127.0.0.1#5335 +ipset=/cheapbeats.us/gfwlist +server=/novostrong.com/127.0.0.1#5335 +ipset=/novostrong.com/gfwlist +server=/yahoo.at/127.0.0.1#5335 +ipset=/yahoo.at/gfwlist +server=/archlinuxarm.org/127.0.0.1#5335 +ipset=/archlinuxarm.org/gfwlist +server=/bluemix.com/127.0.0.1#5335 +ipset=/bluemix.com/gfwlist +server=/91gay.me/127.0.0.1#5335 +ipset=/91gay.me/gfwlist +server=/superuser.com/127.0.0.1#5335 +ipset=/superuser.com/gfwlist +server=/vfsco.sk/127.0.0.1#5335 +ipset=/vfsco.sk/gfwlist +server=/yourporndump.com/127.0.0.1#5335 +ipset=/yourporndump.com/gfwlist +server=/mini.com.mk/127.0.0.1#5335 +ipset=/mini.com.mk/gfwlist +server=/genitourinaryexam.com/127.0.0.1#5335 +ipset=/genitourinaryexam.com/gfwlist +server=/qatarescortsvip.com/127.0.0.1#5335 +ipset=/qatarescortsvip.com/gfwlist +server=/shopee.id/127.0.0.1#5335 +ipset=/shopee.id/gfwlist +server=/pearson-studium.ch/127.0.0.1#5335 +ipset=/pearson-studium.ch/gfwlist +server=/8kcosplay.com/127.0.0.1#5335 +ipset=/8kcosplay.com/gfwlist +server=/bmw-abudhabi.com/127.0.0.1#5335 +ipset=/bmw-abudhabi.com/gfwlist +server=/momoshop.com.tw/127.0.0.1#5335 +ipset=/momoshop.com.tw/gfwlist +server=/directvconnect.com/127.0.0.1#5335 +ipset=/directvconnect.com/gfwlist +server=/serverlesslibrary.net/127.0.0.1#5335 +ipset=/serverlesslibrary.net/gfwlist +server=/afappyending.com/127.0.0.1#5335 +ipset=/afappyending.com/gfwlist +server=/msunlimitedcloudsummit.com/127.0.0.1#5335 +ipset=/msunlimitedcloudsummit.com/gfwlist +server=/sagernet.org/127.0.0.1#5335 +ipset=/sagernet.org/gfwlist +server=/dykycl.com/127.0.0.1#5335 +ipset=/dykycl.com/gfwlist +server=/babosas.com/127.0.0.1#5335 +ipset=/babosas.com/gfwlist +server=/bridgestone.com.sg/127.0.0.1#5335 +ipset=/bridgestone.com.sg/gfwlist +server=/xvideo.com/127.0.0.1#5335 +ipset=/xvideo.com/gfwlist +server=/ladyboygold.com/127.0.0.1#5335 +ipset=/ladyboygold.com/gfwlist +server=/gockhuatviet.com/127.0.0.1#5335 +ipset=/gockhuatviet.com/gfwlist +server=/sm.ms/127.0.0.1#5335 +ipset=/sm.ms/gfwlist +server=/bmwsummerschool.com/127.0.0.1#5335 +ipset=/bmwsummerschool.com/gfwlist +server=/simgbb.com/127.0.0.1#5335 +ipset=/simgbb.com/gfwlist +server=/mushymush.tv/127.0.0.1#5335 +ipset=/mushymush.tv/gfwlist +server=/fuzokudx.com/127.0.0.1#5335 +ipset=/fuzokudx.com/gfwlist +server=/buckbuild.com/127.0.0.1#5335 +ipset=/buckbuild.com/gfwlist +server=/gelbooru.me/127.0.0.1#5335 +ipset=/gelbooru.me/gfwlist +server=/windowsmarketplace.com/127.0.0.1#5335 +ipset=/windowsmarketplace.com/gfwlist +server=/dojin-dl.com/127.0.0.1#5335 +ipset=/dojin-dl.com/gfwlist +server=/agendaweek.com/127.0.0.1#5335 +ipset=/agendaweek.com/gfwlist +server=/mastercard.at/127.0.0.1#5335 +ipset=/mastercard.at/gfwlist +server=/vodafone.com.tr/127.0.0.1#5335 +ipset=/vodafone.com.tr/gfwlist +server=/nikeinstock.com/127.0.0.1#5335 +ipset=/nikeinstock.com/gfwlist +server=/met-nude.com/127.0.0.1#5335 +ipset=/met-nude.com/gfwlist +server=/carstagram.com/127.0.0.1#5335 +ipset=/carstagram.com/gfwlist +server=/lojaiphone.com.br/127.0.0.1#5335 +ipset=/lojaiphone.com.br/gfwlist +server=/bangbros.com/127.0.0.1#5335 +ipset=/bangbros.com/gfwlist +server=/binancezh.kim/127.0.0.1#5335 +ipset=/binancezh.kim/gfwlist +server=/jamanetwork.com/127.0.0.1#5335 +ipset=/jamanetwork.com/gfwlist +server=/chinadigitaltimes.net/127.0.0.1#5335 +ipset=/chinadigitaltimes.net/gfwlist +server=/xxxmovies.pro/127.0.0.1#5335 +ipset=/xxxmovies.pro/gfwlist +server=/kindle.jp/127.0.0.1#5335 +ipset=/kindle.jp/gfwlist +server=/bmwhk.com/127.0.0.1#5335 +ipset=/bmwhk.com/gfwlist +server=/binancezh.biz/127.0.0.1#5335 +ipset=/binancezh.biz/gfwlist +server=/wariowarediy.com/127.0.0.1#5335 +ipset=/wariowarediy.com/gfwlist +server=/xzone.to/127.0.0.1#5335 +ipset=/xzone.to/gfwlist +server=/sony.pt/127.0.0.1#5335 +ipset=/sony.pt/gfwlist +server=/crates.io/127.0.0.1#5335 +ipset=/crates.io/gfwlist +server=/xxxtubenote.com/127.0.0.1#5335 +ipset=/xxxtubenote.com/gfwlist +server=/perfectshemales.com/127.0.0.1#5335 +ipset=/perfectshemales.com/gfwlist +server=/homephoneplus.com/127.0.0.1#5335 +ipset=/homephoneplus.com/gfwlist +server=/wordpress.org/127.0.0.1#5335 +ipset=/wordpress.org/gfwlist +server=/paypass.net/127.0.0.1#5335 +ipset=/paypass.net/gfwlist +server=/eaplay.com/127.0.0.1#5335 +ipset=/eaplay.com/gfwlist +server=/globalsign.com.au/127.0.0.1#5335 +ipset=/globalsign.com.au/gfwlist +server=/bitwarden.com/127.0.0.1#5335 +ipset=/bitwarden.com/gfwlist +server=/xx-map.com/127.0.0.1#5335 +ipset=/xx-map.com/gfwlist +server=/facebooklogin.info/127.0.0.1#5335 +ipset=/facebooklogin.info/gfwlist +server=/dice.se/127.0.0.1#5335 +ipset=/dice.se/gfwlist +server=/milfzr.com/127.0.0.1#5335 +ipset=/milfzr.com/gfwlist +server=/getzola.org/127.0.0.1#5335 +ipset=/getzola.org/gfwlist +server=/elsevier-ae.com/127.0.0.1#5335 +ipset=/elsevier-ae.com/gfwlist +server=/sublimetext.com/127.0.0.1#5335 +ipset=/sublimetext.com/gfwlist +server=/paypal-activate.com/127.0.0.1#5335 +ipset=/paypal-activate.com/gfwlist +server=/xxx-blog.to/127.0.0.1#5335 +ipset=/xxx-blog.to/gfwlist +server=/ero-comic-hunter.net/127.0.0.1#5335 +ipset=/ero-comic-hunter.net/gfwlist +server=/beatsbydreofficialdanmark.com/127.0.0.1#5335 +ipset=/beatsbydreofficialdanmark.com/gfwlist +server=/shopmonsterbeats.com/127.0.0.1#5335 +ipset=/shopmonsterbeats.com/gfwlist +server=/hentai0.com/127.0.0.1#5335 +ipset=/hentai0.com/gfwlist +server=/enemainformation.com/127.0.0.1#5335 +ipset=/enemainformation.com/gfwlist +server=/pearson-anaya.com/127.0.0.1#5335 +ipset=/pearson-anaya.com/gfwlist +server=/ilife.wang/127.0.0.1#5335 +ipset=/ilife.wang/gfwlist +server=/directv-4-you.com/127.0.0.1#5335 +ipset=/directv-4-you.com/gfwlist +server=/ingka.dev/127.0.0.1#5335 +ipset=/ingka.dev/gfwlist +server=/dropbox.com/127.0.0.1#5335 +ipset=/dropbox.com/gfwlist +server=/comeav.com/127.0.0.1#5335 +ipset=/comeav.com/gfwlist +server=/flic.kr/127.0.0.1#5335 +ipset=/flic.kr/gfwlist +server=/ipod.is/127.0.0.1#5335 +ipset=/ipod.is/gfwlist +server=/youtube.com.sg/127.0.0.1#5335 +ipset=/youtube.com.sg/gfwlist +server=/ssl-images-amazon.com/127.0.0.1#5335 +ipset=/ssl-images-amazon.com/gfwlist +server=/apple-pay.rs/127.0.0.1#5335 +ipset=/apple-pay.rs/gfwlist +server=/malayporn.space/127.0.0.1#5335 +ipset=/malayporn.space/gfwlist +server=/hentai-top100.supertop-100.com/127.0.0.1#5335 +ipset=/hentai-top100.supertop-100.com/gfwlist +server=/verizonenterprise.com/127.0.0.1#5335 +ipset=/verizonenterprise.com/gfwlist +server=/xattractive.com/127.0.0.1#5335 +ipset=/xattractive.com/gfwlist +server=/xo.com/127.0.0.1#5335 +ipset=/xo.com/gfwlist +server=/bmwmotorrad.com.sg/127.0.0.1#5335 +ipset=/bmwmotorrad.com.sg/gfwlist +server=/meadjohnson.net/127.0.0.1#5335 +ipset=/meadjohnson.net/gfwlist +server=/uo.com/127.0.0.1#5335 +ipset=/uo.com/gfwlist +server=/jayspov.net/127.0.0.1#5335 +ipset=/jayspov.net/gfwlist +server=/appleinsider.com/127.0.0.1#5335 +ipset=/appleinsider.com/gfwlist +server=/squarefoot.com.hk/127.0.0.1#5335 +ipset=/squarefoot.com.hk/gfwlist +server=/youtube.com.tr/127.0.0.1#5335 +ipset=/youtube.com.tr/gfwlist +server=/beatsshopstore.com/127.0.0.1#5335 +ipset=/beatsshopstore.com/gfwlist +server=/topxxxpornvids.com/127.0.0.1#5335 +ipset=/topxxxpornvids.com/gfwlist +server=/serviporno.com/127.0.0.1#5335 +ipset=/serviporno.com/gfwlist +server=/pornloser.com/127.0.0.1#5335 +ipset=/pornloser.com/gfwlist +server=/dulceecuador.com/127.0.0.1#5335 +ipset=/dulceecuador.com/gfwlist +server=/go.com/127.0.0.1#5335 +ipset=/go.com/gfwlist +server=/hbfile.net/127.0.0.1#5335 +ipset=/hbfile.net/gfwlist +server=/venmo.com/127.0.0.1#5335 +ipset=/venmo.com/gfwlist +server=/marketodesigner.com/127.0.0.1#5335 +ipset=/marketodesigner.com/gfwlist +server=/tidalhifi.com/127.0.0.1#5335 +ipset=/tidalhifi.com/gfwlist +server=/bazel.build/127.0.0.1#5335 +ipset=/bazel.build/gfwlist +server=/wp.com/127.0.0.1#5335 +ipset=/wp.com/gfwlist +server=/bbc-anal.com/127.0.0.1#5335 +ipset=/bbc-anal.com/gfwlist +server=/googlecapital.com/127.0.0.1#5335 +ipset=/googlecapital.com/gfwlist +server=/hp.com/127.0.0.1#5335 +ipset=/hp.com/gfwlist +server=/dreprofy.com/127.0.0.1#5335 +ipset=/dreprofy.com/gfwlist +server=/mastercard.fr/127.0.0.1#5335 +ipset=/mastercard.fr/gfwlist +server=/iphone.wang/127.0.0.1#5335 +ipset=/iphone.wang/gfwlist +server=/amateure-xtreme.com/127.0.0.1#5335 +ipset=/amateure-xtreme.com/gfwlist +server=/milfhunter.com/127.0.0.1#5335 +ipset=/milfhunter.com/gfwlist +server=/nypostreprints.com/127.0.0.1#5335 +ipset=/nypostreprints.com/gfwlist +server=/wixstatic.com/127.0.0.1#5335 +ipset=/wixstatic.com/gfwlist +server=/womenwill.com/127.0.0.1#5335 +ipset=/womenwill.com/gfwlist +server=/whosthehost.com/127.0.0.1#5335 +ipset=/whosthehost.com/gfwlist +server=/coreduo.com/127.0.0.1#5335 +ipset=/coreduo.com/gfwlist +server=/aboutamazon.com/127.0.0.1#5335 +ipset=/aboutamazon.com/gfwlist +server=/beatshopuk.com/127.0.0.1#5335 +ipset=/beatshopuk.com/gfwlist +server=/hqxxxmovies.com/127.0.0.1#5335 +ipset=/hqxxxmovies.com/gfwlist +server=/spicystory.net/127.0.0.1#5335 +ipset=/spicystory.net/gfwlist +server=/googledanmark.com/127.0.0.1#5335 +ipset=/googledanmark.com/gfwlist +server=/youtube.gt/127.0.0.1#5335 +ipset=/youtube.gt/gfwlist +server=/hm.com/127.0.0.1#5335 +ipset=/hm.com/gfwlist +server=/adobetechcommdemo.com/127.0.0.1#5335 +ipset=/adobetechcommdemo.com/gfwlist +server=/hulustream.com/127.0.0.1#5335 +ipset=/hulustream.com/gfwlist +server=/default.exp-tas.com/127.0.0.1#5335 +ipset=/default.exp-tas.com/gfwlist +server=/deluxe.com.hk/127.0.0.1#5335 +ipset=/deluxe.com.hk/gfwlist +server=/javcc.com/127.0.0.1#5335 +ipset=/javcc.com/gfwlist +server=/volvobuses.hk/127.0.0.1#5335 +ipset=/volvobuses.hk/gfwlist +server=/cochranelibrary.com/127.0.0.1#5335 +ipset=/cochranelibrary.com/gfwlist +server=/kenya4.com/127.0.0.1#5335 +ipset=/kenya4.com/gfwlist +server=/itunesparty.com/127.0.0.1#5335 +ipset=/itunesparty.com/gfwlist +server=/underhentai.net/127.0.0.1#5335 +ipset=/underhentai.net/gfwlist +server=/bitchesgirls.com/127.0.0.1#5335 +ipset=/bitchesgirls.com/gfwlist +server=/beatspromotions.com/127.0.0.1#5335 +ipset=/beatspromotions.com/gfwlist +server=/wwwitunes.com/127.0.0.1#5335 +ipset=/wwwitunes.com/gfwlist +server=/dev-guardianapis.com/127.0.0.1#5335 +ipset=/dev-guardianapis.com/gfwlist +server=/54647.online/127.0.0.1#5335 +ipset=/54647.online/gfwlist +server=/momspornvideos.com/127.0.0.1#5335 +ipset=/momspornvideos.com/gfwlist +server=/avstar09.com/127.0.0.1#5335 +ipset=/avstar09.com/gfwlist +server=/nintendo.dk/127.0.0.1#5335 +ipset=/nintendo.dk/gfwlist +server=/newestbeatsbydre.com/127.0.0.1#5335 +ipset=/newestbeatsbydre.com/gfwlist +server=/primemomsex.com/127.0.0.1#5335 +ipset=/primemomsex.com/gfwlist +server=/tryboobs.com/127.0.0.1#5335 +ipset=/tryboobs.com/gfwlist +server=/hulurussia.com/127.0.0.1#5335 +ipset=/hulurussia.com/gfwlist +server=/bangkokbangers.com/127.0.0.1#5335 +ipset=/bangkokbangers.com/gfwlist +server=/coinbase.com/127.0.0.1#5335 +ipset=/coinbase.com/gfwlist +server=/realclearpolicy.com/127.0.0.1#5335 +ipset=/realclearpolicy.com/gfwlist +server=/cloudflareok.com/127.0.0.1#5335 +ipset=/cloudflareok.com/gfwlist +server=/sandisk.in/127.0.0.1#5335 +ipset=/sandisk.in/gfwlist +server=/pki-posta.ch/127.0.0.1#5335 +ipset=/pki-posta.ch/gfwlist +server=/esri.com/127.0.0.1#5335 +ipset=/esri.com/gfwlist +server=/foxnewsaroundtheworld.com/127.0.0.1#5335 +ipset=/foxnewsaroundtheworld.com/gfwlist +server=/thecompaqstore.com/127.0.0.1#5335 +ipset=/thecompaqstore.com/gfwlist +server=/apple-enews.com/127.0.0.1#5335 +ipset=/apple-enews.com/gfwlist +server=/approvedusedbmw.com/127.0.0.1#5335 +ipset=/approvedusedbmw.com/gfwlist +server=/100bucksbabes.com/127.0.0.1#5335 +ipset=/100bucksbabes.com/gfwlist +server=/rexxx.org/127.0.0.1#5335 +ipset=/rexxx.org/gfwlist +server=/gravitytank.com/127.0.0.1#5335 +ipset=/gravitytank.com/gfwlist +server=/javdove.com/127.0.0.1#5335 +ipset=/javdove.com/gfwlist +server=/deutsch-sexfilme.com/127.0.0.1#5335 +ipset=/deutsch-sexfilme.com/gfwlist +server=/rt.com/127.0.0.1#5335 +ipset=/rt.com/gfwlist +server=/razersupport.com/127.0.0.1#5335 +ipset=/razersupport.com/gfwlist +server=/youngpornhd.com/127.0.0.1#5335 +ipset=/youngpornhd.com/gfwlist +server=/instagram-engineering.com/127.0.0.1#5335 +ipset=/instagram-engineering.com/gfwlist +server=/amp.akamaized.net/127.0.0.1#5335 +ipset=/amp.akamaized.net/gfwlist +server=/funnyordie.com/127.0.0.1#5335 +ipset=/funnyordie.com/gfwlist +server=/ft.com/127.0.0.1#5335 +ipset=/ft.com/gfwlist +server=/akamai-thailand.net/127.0.0.1#5335 +ipset=/akamai-thailand.net/gfwlist +server=/cambridgedigital.net/127.0.0.1#5335 +ipset=/cambridgedigital.net/gfwlist +server=/ebay.us/127.0.0.1#5335 +ipset=/ebay.us/gfwlist +server=/ieee-pes.org/127.0.0.1#5335 +ipset=/ieee-pes.org/gfwlist +server=/tsumino.com/127.0.0.1#5335 +ipset=/tsumino.com/gfwlist +server=/badteenspunished.com/127.0.0.1#5335 +ipset=/badteenspunished.com/gfwlist +server=/sony.com.au/127.0.0.1#5335 +ipset=/sony.com.au/gfwlist +server=/siteripz.com/127.0.0.1#5335 +ipset=/siteripz.com/gfwlist +server=/sexuria.com/127.0.0.1#5335 +ipset=/sexuria.com/gfwlist +server=/dezyred.com/127.0.0.1#5335 +ipset=/dezyred.com/gfwlist +server=/beats-sale.com/127.0.0.1#5335 +ipset=/beats-sale.com/gfwlist +server=/pornhat.one/127.0.0.1#5335 +ipset=/pornhat.one/gfwlist +server=/thenewslens.com/127.0.0.1#5335 +ipset=/thenewslens.com/gfwlist +server=/nikebuy.com/127.0.0.1#5335 +ipset=/nikebuy.com/gfwlist +server=/applemx-icloud.com/127.0.0.1#5335 +ipset=/applemx-icloud.com/gfwlist +server=/tr.com/127.0.0.1#5335 +ipset=/tr.com/gfwlist +server=/electronjs.org/127.0.0.1#5335 +ipset=/electronjs.org/gfwlist +server=/uusextoy.com/127.0.0.1#5335 +ipset=/uusextoy.com/gfwlist +server=/google.com.sv/127.0.0.1#5335 +ipset=/google.com.sv/gfwlist +server=/porntoplinks.com/127.0.0.1#5335 +ipset=/porntoplinks.com/gfwlist +server=/proton.me/127.0.0.1#5335 +ipset=/proton.me/gfwlist +server=/faasbook.com/127.0.0.1#5335 +ipset=/faasbook.com/gfwlist +server=/dogfart.com/127.0.0.1#5335 +ipset=/dogfart.com/gfwlist +server=/xvideos2.com/127.0.0.1#5335 +ipset=/xvideos2.com/gfwlist +server=/amazon.sg/127.0.0.1#5335 +ipset=/amazon.sg/gfwlist +server=/nflxext.com/127.0.0.1#5335 +ipset=/nflxext.com/gfwlist +server=/lupoporno.com/127.0.0.1#5335 +ipset=/lupoporno.com/gfwlist +server=/vodafone.co.uk/127.0.0.1#5335 +ipset=/vodafone.co.uk/gfwlist +server=/xgaytube.tv/127.0.0.1#5335 +ipset=/xgaytube.tv/gfwlist +server=/asianthumbs.org/127.0.0.1#5335 +ipset=/asianthumbs.org/gfwlist +server=/ikea.lv/127.0.0.1#5335 +ipset=/ikea.lv/gfwlist +server=/thzu.cc/127.0.0.1#5335 +ipset=/thzu.cc/gfwlist +server=/atscaleconference.com/127.0.0.1#5335 +ipset=/atscaleconference.com/gfwlist +server=/sexdollpornhd.com/127.0.0.1#5335 +ipset=/sexdollpornhd.com/gfwlist +server=/cherrypai.com/127.0.0.1#5335 +ipset=/cherrypai.com/gfwlist +server=/visa.es/127.0.0.1#5335 +ipset=/visa.es/gfwlist +server=/eworld.com/127.0.0.1#5335 +ipset=/eworld.com/gfwlist +server=/meuhentai.com/127.0.0.1#5335 +ipset=/meuhentai.com/gfwlist +server=/auricularesbeatsbaratosshop.com/127.0.0.1#5335 +ipset=/auricularesbeatsbaratosshop.com/gfwlist +server=/3d-xxx.com/127.0.0.1#5335 +ipset=/3d-xxx.com/gfwlist +server=/applestore.cm/127.0.0.1#5335 +ipset=/applestore.cm/gfwlist +server=/dw.com/127.0.0.1#5335 +ipset=/dw.com/gfwlist +server=/hentai-gif-anime.com/127.0.0.1#5335 +ipset=/hentai-gif-anime.com/gfwlist +server=/patreon.com/127.0.0.1#5335 +ipset=/patreon.com/gfwlist +server=/travelex.com.hk/127.0.0.1#5335 +ipset=/travelex.com.hk/gfwlist +server=/eroticbeautyhub.com/127.0.0.1#5335 +ipset=/eroticbeautyhub.com/gfwlist +server=/voaindonesia.com/127.0.0.1#5335 +ipset=/voaindonesia.com/gfwlist +server=/ebayforeclosure.org/127.0.0.1#5335 +ipset=/ebayforeclosure.org/gfwlist +server=/paypal-security.net/127.0.0.1#5335 +ipset=/paypal-security.net/gfwlist +server=/manoto1.tv/127.0.0.1#5335 +ipset=/manoto1.tv/gfwlist +server=/webpkgcache.com/127.0.0.1#5335 +ipset=/webpkgcache.com/gfwlist +server=/yourdirtymind.com/127.0.0.1#5335 +ipset=/yourdirtymind.com/gfwlist +server=/quicktime.com/127.0.0.1#5335 +ipset=/quicktime.com/gfwlist +server=/pornpics.com/127.0.0.1#5335 +ipset=/pornpics.com/gfwlist +server=/volvobuses.sg/127.0.0.1#5335 +ipset=/volvobuses.sg/gfwlist +server=/ikea.ae/127.0.0.1#5335 +ipset=/ikea.ae/gfwlist +server=/europalibera.org/127.0.0.1#5335 +ipset=/europalibera.org/gfwlist +server=/google.co.ma/127.0.0.1#5335 +ipset=/google.co.ma/gfwlist +server=/starbucks.ie/127.0.0.1#5335 +ipset=/starbucks.ie/gfwlist +server=/veetbangladesh.com/127.0.0.1#5335 +ipset=/veetbangladesh.com/gfwlist +server=/ysm.yahoo.com/127.0.0.1#5335 +ipset=/ysm.yahoo.com/gfwlist +server=/disneyarena.com/127.0.0.1#5335 +ipset=/disneyarena.com/gfwlist +server=/globalvoicesonline.org/127.0.0.1#5335 +ipset=/globalvoicesonline.org/gfwlist +server=/hentaifreak.org/127.0.0.1#5335 +ipset=/hentaifreak.org/gfwlist +server=/pricelesssurprises.com/127.0.0.1#5335 +ipset=/pricelesssurprises.com/gfwlist +server=/quiz.directory/127.0.0.1#5335 +ipset=/quiz.directory/gfwlist +server=/lesbian8.com/127.0.0.1#5335 +ipset=/lesbian8.com/gfwlist +server=/sandisk.co.jp/127.0.0.1#5335 +ipset=/sandisk.co.jp/gfwlist +server=/bmw.sk/127.0.0.1#5335 +ipset=/bmw.sk/gfwlist +server=/skillshare.com/127.0.0.1#5335 +ipset=/skillshare.com/gfwlist +server=/sony-olympus-medical.com/127.0.0.1#5335 +ipset=/sony-olympus-medical.com/gfwlist +server=/fuckgames.xxx/127.0.0.1#5335 +ipset=/fuckgames.xxx/gfwlist +server=/zoo-porno.biz/127.0.0.1#5335 +ipset=/zoo-porno.biz/gfwlist +server=/simplyipod.com/127.0.0.1#5335 +ipset=/simplyipod.com/gfwlist +server=/newhampshirebmw.com/127.0.0.1#5335 +ipset=/newhampshirebmw.com/gfwlist +server=/xxxindianporn2.com/127.0.0.1#5335 +ipset=/xxxindianporn2.com/gfwlist +server=/girlfriendgalleries.net/127.0.0.1#5335 +ipset=/girlfriendgalleries.net/gfwlist +server=/hpsupport.com/127.0.0.1#5335 +ipset=/hpsupport.com/gfwlist +server=/bellotube.com/127.0.0.1#5335 +ipset=/bellotube.com/gfwlist +server=/voyeurweb.com/127.0.0.1#5335 +ipset=/voyeurweb.com/gfwlist +server=/fox247.com/127.0.0.1#5335 +ipset=/fox247.com/gfwlist +server=/gv.com/127.0.0.1#5335 +ipset=/gv.com/gfwlist +server=/hdporn92.com/127.0.0.1#5335 +ipset=/hdporn92.com/gfwlist +server=/gaymaletube.com/127.0.0.1#5335 +ipset=/gaymaletube.com/gfwlist +server=/ebayfashion.net/127.0.0.1#5335 +ipset=/ebayfashion.net/gfwlist +server=/fuckableteens.net/127.0.0.1#5335 +ipset=/fuckableteens.net/gfwlist +server=/projectvoyeur.com/127.0.0.1#5335 +ipset=/projectvoyeur.com/gfwlist +server=/google.co.cr/127.0.0.1#5335 +ipset=/google.co.cr/gfwlist +server=/youtube.com.tw/127.0.0.1#5335 +ipset=/youtube.com.tw/gfwlist +server=/excitebots.com/127.0.0.1#5335 +ipset=/excitebots.com/gfwlist +server=/visaconciergelac.com/127.0.0.1#5335 +ipset=/visaconciergelac.com/gfwlist +server=/facebookswagstore.com/127.0.0.1#5335 +ipset=/facebookswagstore.com/gfwlist +server=/mybukkakeporn.com/127.0.0.1#5335 +ipset=/mybukkakeporn.com/gfwlist +server=/static-nike.com/127.0.0.1#5335 +ipset=/static-nike.com/gfwlist +server=/nikestares.com/127.0.0.1#5335 +ipset=/nikestares.com/gfwlist +server=/instagram-brand.com/127.0.0.1#5335 +ipset=/instagram-brand.com/gfwlist +server=/fbreg.com/127.0.0.1#5335 +ipset=/fbreg.com/gfwlist +server=/twitterstat.us/127.0.0.1#5335 +ipset=/twitterstat.us/gfwlist +server=/elpornoamateur.com/127.0.0.1#5335 +ipset=/elpornoamateur.com/gfwlist +server=/easynike.com/127.0.0.1#5335 +ipset=/easynike.com/gfwlist +server=/finevids.xxx/127.0.0.1#5335 +ipset=/finevids.xxx/gfwlist +server=/pinterest.pe/127.0.0.1#5335 +ipset=/pinterest.pe/gfwlist +server=/foxnewsgo.org/127.0.0.1#5335 +ipset=/foxnewsgo.org/gfwlist +server=/sex.cam/127.0.0.1#5335 +ipset=/sex.cam/gfwlist +server=/purextc.com/127.0.0.1#5335 +ipset=/purextc.com/gfwlist +server=/yoursigmoidoscopy.com/127.0.0.1#5335 +ipset=/yoursigmoidoscopy.com/gfwlist +server=/familystrokes.com/127.0.0.1#5335 +ipset=/familystrokes.com/gfwlist +server=/bmw-motorrad.co.id/127.0.0.1#5335 +ipset=/bmw-motorrad.co.id/gfwlist +server=/slackcertified.com/127.0.0.1#5335 +ipset=/slackcertified.com/gfwlist +server=/x-art.com/127.0.0.1#5335 +ipset=/x-art.com/gfwlist +server=/pricelessbeijing.com/127.0.0.1#5335 +ipset=/pricelessbeijing.com/gfwlist +server=/ebaymall.com/127.0.0.1#5335 +ipset=/ebaymall.com/gfwlist +server=/xn--qoq462m.com/127.0.0.1#5335 +ipset=/xn--qoq462m.com/gfwlist +server=/hentaicloud.com/127.0.0.1#5335 +ipset=/hentaicloud.com/gfwlist +server=/mucinexprofessional.com/127.0.0.1#5335 +ipset=/mucinexprofessional.com/gfwlist +server=/yahoo.cm/127.0.0.1#5335 +ipset=/yahoo.cm/gfwlist +server=/fau11.com/127.0.0.1#5335 +ipset=/fau11.com/gfwlist +server=/littleasians.com/127.0.0.1#5335 +ipset=/littleasians.com/gfwlist +server=/hanime1.me/127.0.0.1#5335 +ipset=/hanime1.me/gfwlist +server=/statsmakemecry.com/127.0.0.1#5335 +ipset=/statsmakemecry.com/gfwlist +server=/jorropo.net/127.0.0.1#5335 +ipset=/jorropo.net/gfwlist +server=/billpointnewzealand.com/127.0.0.1#5335 +ipset=/billpointnewzealand.com/gfwlist +server=/gfw.report/127.0.0.1#5335 +ipset=/gfw.report/gfwlist +server=/opensourceinsight.dev/127.0.0.1#5335 +ipset=/opensourceinsight.dev/gfwlist +server=/avatargarenanow-a.akamaihd.net/127.0.0.1#5335 +ipset=/avatargarenanow-a.akamaihd.net/gfwlist +server=/duck.com/127.0.0.1#5335 +ipset=/duck.com/gfwlist +server=/fuck.com/127.0.0.1#5335 +ipset=/fuck.com/gfwlist +server=/starcraft.com/127.0.0.1#5335 +ipset=/starcraft.com/gfwlist +server=/instgram.com/127.0.0.1#5335 +ipset=/instgram.com/gfwlist +server=/netlify.com/127.0.0.1#5335 +ipset=/netlify.com/gfwlist +server=/streamlatina.com/127.0.0.1#5335 +ipset=/streamlatina.com/gfwlist +server=/pornvideos.casa/127.0.0.1#5335 +ipset=/pornvideos.casa/gfwlist +server=/javwide.com/127.0.0.1#5335 +ipset=/javwide.com/gfwlist +server=/facebookhome.cc/127.0.0.1#5335 +ipset=/facebookhome.cc/gfwlist +server=/syzbj36.xyz/127.0.0.1#5335 +ipset=/syzbj36.xyz/gfwlist +server=/apple-expo.com/127.0.0.1#5335 +ipset=/apple-expo.com/gfwlist +server=/akamaitechnologies.com/127.0.0.1#5335 +ipset=/akamaitechnologies.com/gfwlist +server=/tubegold.xxx/127.0.0.1#5335 +ipset=/tubegold.xxx/gfwlist +server=/facesbooc.com/127.0.0.1#5335 +ipset=/facesbooc.com/gfwlist +server=/youtube.sg/127.0.0.1#5335 +ipset=/youtube.sg/gfwlist +server=/vanish.ie/127.0.0.1#5335 +ipset=/vanish.ie/gfwlist +server=/swoosh.com/127.0.0.1#5335 +ipset=/swoosh.com/gfwlist +server=/javscat.net/127.0.0.1#5335 +ipset=/javscat.net/gfwlist +server=/apple.hamburg/127.0.0.1#5335 +ipset=/apple.hamburg/gfwlist +server=/sex.xxx/127.0.0.1#5335 +ipset=/sex.xxx/gfwlist +server=/bitcoin.org/127.0.0.1#5335 +ipset=/bitcoin.org/gfwlist +server=/img-prod-cms-rt-microsoft-com.akamaized.net/127.0.0.1#5335 +ipset=/img-prod-cms-rt-microsoft-com.akamaized.net/gfwlist +server=/linemyshop.com/127.0.0.1#5335 +ipset=/linemyshop.com/gfwlist +server=/disneysubscription.com/127.0.0.1#5335 +ipset=/disneysubscription.com/gfwlist +server=/get.dev/127.0.0.1#5335 +ipset=/get.dev/gfwlist +server=/pornofrog.com/127.0.0.1#5335 +ipset=/pornofrog.com/gfwlist +server=/go-lang.org/127.0.0.1#5335 +ipset=/go-lang.org/gfwlist +server=/tutanota.com/127.0.0.1#5335 +ipset=/tutanota.com/gfwlist +server=/bmw-connecteddrive.my/127.0.0.1#5335 +ipset=/bmw-connecteddrive.my/gfwlist +server=/mini.com.gr/127.0.0.1#5335 +ipset=/mini.com.gr/gfwlist +server=/5lml.com/127.0.0.1#5335 +ipset=/5lml.com/gfwlist +server=/avinin.com/127.0.0.1#5335 +ipset=/avinin.com/gfwlist +server=/familysexsimulator.com/127.0.0.1#5335 +ipset=/familysexsimulator.com/gfwlist +server=/wired.com/127.0.0.1#5335 +ipset=/wired.com/gfwlist +server=/buzzav.com/127.0.0.1#5335 +ipset=/buzzav.com/gfwlist +server=/dettol.com.sg/127.0.0.1#5335 +ipset=/dettol.com.sg/gfwlist +server=/intel.az/127.0.0.1#5335 +ipset=/intel.az/gfwlist +server=/hpservices.com/127.0.0.1#5335 +ipset=/hpservices.com/gfwlist +server=/zeriamerikes.com/127.0.0.1#5335 +ipset=/zeriamerikes.com/gfwlist +server=/fragrancebay.com/127.0.0.1#5335 +ipset=/fragrancebay.com/gfwlist +server=/starbuckssummergame.ca/127.0.0.1#5335 +ipset=/starbuckssummergame.ca/gfwlist +server=/minilondon.co/127.0.0.1#5335 +ipset=/minilondon.co/gfwlist +server=/ads.youtube.com/127.0.0.1#5335 +ipset=/ads.youtube.com/gfwlist +server=/pixinsight.com.tw/127.0.0.1#5335 +ipset=/pixinsight.com.tw/gfwlist +server=/atlasonepoint.com/127.0.0.1#5335 +ipset=/atlasonepoint.com/gfwlist +server=/billpoint.us/127.0.0.1#5335 +ipset=/billpoint.us/gfwlist +server=/holaporno.xxx/127.0.0.1#5335 +ipset=/holaporno.xxx/gfwlist +server=/nijinchu.com/127.0.0.1#5335 +ipset=/nijinchu.com/gfwlist +server=/btt904.com/127.0.0.1#5335 +ipset=/btt904.com/gfwlist +server=/s-msft.com/127.0.0.1#5335 +ipset=/s-msft.com/gfwlist +server=/bmwstepconnections.com/127.0.0.1#5335 +ipset=/bmwstepconnections.com/gfwlist +server=/hotpornbible.com/127.0.0.1#5335 +ipset=/hotpornbible.com/gfwlist +server=/imgcrl.org/127.0.0.1#5335 +ipset=/imgcrl.org/gfwlist +server=/manytoon.com/127.0.0.1#5335 +ipset=/manytoon.com/gfwlist +server=/freehentaistream.com/127.0.0.1#5335 +ipset=/freehentaistream.com/gfwlist +server=/evise.com/127.0.0.1#5335 +ipset=/evise.com/gfwlist +server=/xxx-porn-fuck.com/127.0.0.1#5335 +ipset=/xxx-porn-fuck.com/gfwlist +server=/familysimulator.io/127.0.0.1#5335 +ipset=/familysimulator.io/gfwlist +server=/lgsalesportal.com/127.0.0.1#5335 +ipset=/lgsalesportal.com/gfwlist +server=/beatsfactorycollection.com/127.0.0.1#5335 +ipset=/beatsfactorycollection.com/gfwlist +server=/xlstudio.com/127.0.0.1#5335 +ipset=/xlstudio.com/gfwlist +server=/faapy.com/127.0.0.1#5335 +ipset=/faapy.com/gfwlist +server=/yandex.jobs/127.0.0.1#5335 +ipset=/yandex.jobs/gfwlist +server=/volvobuses.com.tw/127.0.0.1#5335 +ipset=/volvobuses.com.tw/gfwlist +server=/venmo.org/127.0.0.1#5335 +ipset=/venmo.org/gfwlist +server=/illusiony.com/127.0.0.1#5335 +ipset=/illusiony.com/gfwlist +server=/facebookgraphsearch.com/127.0.0.1#5335 +ipset=/facebookgraphsearch.com/gfwlist +server=/racked.com/127.0.0.1#5335 +ipset=/racked.com/gfwlist +server=/viewerswives.net/127.0.0.1#5335 +ipset=/viewerswives.net/gfwlist +server=/thaichix.com/127.0.0.1#5335 +ipset=/thaichix.com/gfwlist +server=/webobjects.co.uk/127.0.0.1#5335 +ipset=/webobjects.co.uk/gfwlist +server=/monsterbeatsforsale.com/127.0.0.1#5335 +ipset=/monsterbeatsforsale.com/gfwlist +server=/xvideosx.com.br/127.0.0.1#5335 +ipset=/xvideosx.com.br/gfwlist +server=/cbsservice.aws.syncbak.com/127.0.0.1#5335 +ipset=/cbsservice.aws.syncbak.com/gfwlist +server=/albastudio.co/127.0.0.1#5335 +ipset=/albastudio.co/gfwlist +server=/fetishpornonly.com/127.0.0.1#5335 +ipset=/fetishpornonly.com/gfwlist +server=/worldhack.com/127.0.0.1#5335 +ipset=/worldhack.com/gfwlist +server=/myfoxchicago.com/127.0.0.1#5335 +ipset=/myfoxchicago.com/gfwlist +server=/fortnite.com/127.0.0.1#5335 +ipset=/fortnite.com/gfwlist +server=/yahoo.is/127.0.0.1#5335 +ipset=/yahoo.is/gfwlist +server=/alphabet.de/127.0.0.1#5335 +ipset=/alphabet.de/gfwlist +server=/yomiuri-johkai.co.jp/127.0.0.1#5335 +ipset=/yomiuri-johkai.co.jp/gfwlist +server=/link2galleries.com/127.0.0.1#5335 +ipset=/link2galleries.com/gfwlist +server=/geforce.co.kr/127.0.0.1#5335 +ipset=/geforce.co.kr/gfwlist +server=/exploitedteensasia.com/127.0.0.1#5335 +ipset=/exploitedteensasia.com/gfwlist +server=/bustyoldsluts.com/127.0.0.1#5335 +ipset=/bustyoldsluts.com/gfwlist +server=/fap-xxx.com/127.0.0.1#5335 +ipset=/fap-xxx.com/gfwlist +server=/geti2p.net/127.0.0.1#5335 +ipset=/geti2p.net/gfwlist +server=/hulu.us/127.0.0.1#5335 +ipset=/hulu.us/gfwlist +server=/comodoca4.com/127.0.0.1#5335 +ipset=/comodoca4.com/gfwlist +server=/spankred3d.com/127.0.0.1#5335 +ipset=/spankred3d.com/gfwlist +server=/scholar.google.com.py/127.0.0.1#5335 +ipset=/scholar.google.com.py/gfwlist +server=/beatsbydrdreoutlet.com/127.0.0.1#5335 +ipset=/beatsbydrdreoutlet.com/gfwlist +server=/myfoxcharlotte.com/127.0.0.1#5335 +ipset=/myfoxcharlotte.com/gfwlist +server=/somanylolies.com/127.0.0.1#5335 +ipset=/somanylolies.com/gfwlist +server=/fulltaboo.tv/127.0.0.1#5335 +ipset=/fulltaboo.tv/gfwlist +server=/letsencrypt.com/127.0.0.1#5335 +ipset=/letsencrypt.com/gfwlist +server=/disneyhentai.com/127.0.0.1#5335 +ipset=/disneyhentai.com/gfwlist +server=/yo1health.com/127.0.0.1#5335 +ipset=/yo1health.com/gfwlist +server=/bcrncdn.com/127.0.0.1#5335 +ipset=/bcrncdn.com/gfwlist +server=/adobeaemcloud.net/127.0.0.1#5335 +ipset=/adobeaemcloud.net/gfwlist +server=/conscrypt.org/127.0.0.1#5335 +ipset=/conscrypt.org/gfwlist +server=/thaigirls.net/127.0.0.1#5335 +ipset=/thaigirls.net/gfwlist +server=/facnbook.com/127.0.0.1#5335 +ipset=/facnbook.com/gfwlist +server=/intercamcashpassport.com.mx/127.0.0.1#5335 +ipset=/intercamcashpassport.com.mx/gfwlist +server=/cloudflare-ipfs.com/127.0.0.1#5335 +ipset=/cloudflare-ipfs.com/gfwlist +server=/ebayca.com/127.0.0.1#5335 +ipset=/ebayca.com/gfwlist +server=/webrtc.org/127.0.0.1#5335 +ipset=/webrtc.org/gfwlist +server=/nikeusa.com/127.0.0.1#5335 +ipset=/nikeusa.com/gfwlist +server=/v2ray.cool/127.0.0.1#5335 +ipset=/v2ray.cool/gfwlist +server=/icloud.ch/127.0.0.1#5335 +ipset=/icloud.ch/gfwlist +server=/ebay.co.ve/127.0.0.1#5335 +ipset=/ebay.co.ve/gfwlist +server=/bmw-jordan.com/127.0.0.1#5335 +ipset=/bmw-jordan.com/gfwlist +server=/canon.hu/127.0.0.1#5335 +ipset=/canon.hu/gfwlist +server=/porn-stalker.fr/127.0.0.1#5335 +ipset=/porn-stalker.fr/gfwlist +server=/topbeatsbydrdreoutlet.com/127.0.0.1#5335 +ipset=/topbeatsbydrdreoutlet.com/gfwlist +server=/microsoft.de/127.0.0.1#5335 +ipset=/microsoft.de/gfwlist +server=/minidurham.ca/127.0.0.1#5335 +ipset=/minidurham.ca/gfwlist +server=/leannecrowvideos.com/127.0.0.1#5335 +ipset=/leannecrowvideos.com/gfwlist +server=/freebasics.com/127.0.0.1#5335 +ipset=/freebasics.com/gfwlist +server=/bmw-albania.com/127.0.0.1#5335 +ipset=/bmw-albania.com/gfwlist +server=/wildxxxhardcore.com/127.0.0.1#5335 +ipset=/wildxxxhardcore.com/gfwlist +server=/blogspot.mk/127.0.0.1#5335 +ipset=/blogspot.mk/gfwlist +server=/drebeats-france.com/127.0.0.1#5335 +ipset=/drebeats-france.com/gfwlist +server=/dagfs.com/127.0.0.1#5335 +ipset=/dagfs.com/gfwlist +server=/paypalshopping.net/127.0.0.1#5335 +ipset=/paypalshopping.net/gfwlist +server=/sex-hot-sites.com/127.0.0.1#5335 +ipset=/sex-hot-sites.com/gfwlist +server=/verisign.com.br/127.0.0.1#5335 +ipset=/verisign.com.br/gfwlist +server=/perfectnaked.com/127.0.0.1#5335 +ipset=/perfectnaked.com/gfwlist +server=/hplip.net/127.0.0.1#5335 +ipset=/hplip.net/gfwlist +server=/animegal.net/127.0.0.1#5335 +ipset=/animegal.net/gfwlist +server=/xxxstreams.eu/127.0.0.1#5335 +ipset=/xxxstreams.eu/gfwlist +server=/chaturbate.com/127.0.0.1#5335 +ipset=/chaturbate.com/gfwlist +server=/nikeclub.com/127.0.0.1#5335 +ipset=/nikeclub.com/gfwlist +server=/kktix.com/127.0.0.1#5335 +ipset=/kktix.com/gfwlist +server=/hotladyhere.com/127.0.0.1#5335 +ipset=/hotladyhere.com/gfwlist +server=/ahvideosexe.com/127.0.0.1#5335 +ipset=/ahvideosexe.com/gfwlist +server=/instagramlogin.com/127.0.0.1#5335 +ipset=/instagramlogin.com/gfwlist +server=/centos.org/127.0.0.1#5335 +ipset=/centos.org/gfwlist +server=/oauthz.com/127.0.0.1#5335 +ipset=/oauthz.com/gfwlist +server=/x1337x.se/127.0.0.1#5335 +ipset=/x1337x.se/gfwlist +server=/mach-os.net/127.0.0.1#5335 +ipset=/mach-os.net/gfwlist +server=/tsmodelstube.com/127.0.0.1#5335 +ipset=/tsmodelstube.com/gfwlist +server=/hornygfporn.com/127.0.0.1#5335 +ipset=/hornygfporn.com/gfwlist +server=/gloryofheracles.com/127.0.0.1#5335 +ipset=/gloryofheracles.com/gfwlist +server=/booksc.me/127.0.0.1#5335 +ipset=/booksc.me/gfwlist +server=/eca.hinet.net/127.0.0.1#5335 +ipset=/eca.hinet.net/gfwlist +server=/vkontakte.ru/127.0.0.1#5335 +ipset=/vkontakte.ru/gfwlist +server=/crit-staging.com/127.0.0.1#5335 +ipset=/crit-staging.com/gfwlist +server=/fabuyemian.com/127.0.0.1#5335 +ipset=/fabuyemian.com/gfwlist +server=/yourdoll.com/127.0.0.1#5335 +ipset=/yourdoll.com/gfwlist +server=/beatsua.com/127.0.0.1#5335 +ipset=/beatsua.com/gfwlist +server=/newtalk.tw/127.0.0.1#5335 +ipset=/newtalk.tw/gfwlist +server=/nikeshoesmarket.com/127.0.0.1#5335 +ipset=/nikeshoesmarket.com/gfwlist +server=/petiteballerinasfucked.com/127.0.0.1#5335 +ipset=/petiteballerinasfucked.com/gfwlist +server=/vimeo.fr/127.0.0.1#5335 +ipset=/vimeo.fr/gfwlist +server=/mastercard.pt/127.0.0.1#5335 +ipset=/mastercard.pt/gfwlist +server=/nikegenealogy.com/127.0.0.1#5335 +ipset=/nikegenealogy.com/gfwlist +server=/yahoo.com.sg/127.0.0.1#5335 +ipset=/yahoo.com.sg/gfwlist +server=/windy.com/127.0.0.1#5335 +ipset=/windy.com/gfwlist +server=/sony.lt/127.0.0.1#5335 +ipset=/sony.lt/gfwlist +server=/facebookcoronavirus.com/127.0.0.1#5335 +ipset=/facebookcoronavirus.com/gfwlist +server=/livephotos.tv/127.0.0.1#5335 +ipset=/livephotos.tv/gfwlist +server=/att-japan.com/127.0.0.1#5335 +ipset=/att-japan.com/gfwlist +server=/ikea.com.gr/127.0.0.1#5335 +ipset=/ikea.com.gr/gfwlist +server=/zeit.co/127.0.0.1#5335 +ipset=/zeit.co/gfwlist +server=/hairyclassic.com/127.0.0.1#5335 +ipset=/hairyclassic.com/gfwlist +server=/zeitworld.com/127.0.0.1#5335 +ipset=/zeitworld.com/gfwlist +server=/gaymenring.com/127.0.0.1#5335 +ipset=/gaymenring.com/gfwlist +server=/liberapay.org/127.0.0.1#5335 +ipset=/liberapay.org/gfwlist +server=/independentoperatorcn.com/127.0.0.1#5335 +ipset=/independentoperatorcn.com/gfwlist +server=/javscatting.com/127.0.0.1#5335 +ipset=/javscatting.com/gfwlist +server=/rakuten-static.com/127.0.0.1#5335 +ipset=/rakuten-static.com/gfwlist +server=/s-bluemix.net/127.0.0.1#5335 +ipset=/s-bluemix.net/gfwlist +server=/primevideo.tv/127.0.0.1#5335 +ipset=/primevideo.tv/gfwlist +server=/javbus22.com/127.0.0.1#5335 +ipset=/javbus22.com/gfwlist +server=/visa.ca/127.0.0.1#5335 +ipset=/visa.ca/gfwlist +server=/directvhouston.com/127.0.0.1#5335 +ipset=/directvhouston.com/gfwlist +server=/gloryholeswallow.com/127.0.0.1#5335 +ipset=/gloryholeswallow.com/gfwlist +server=/ebayglobalshipping.com/127.0.0.1#5335 +ipset=/ebayglobalshipping.com/gfwlist +server=/ozeex.com/127.0.0.1#5335 +ipset=/ozeex.com/gfwlist +server=/donsnaughtymodels.com/127.0.0.1#5335 +ipset=/donsnaughtymodels.com/gfwlist +server=/facebo-ok.com/127.0.0.1#5335 +ipset=/facebo-ok.com/gfwlist +server=/anime-rule34-world.b-cdn.net/127.0.0.1#5335 +ipset=/anime-rule34-world.b-cdn.net/gfwlist +server=/dropboxforum.com/127.0.0.1#5335 +ipset=/dropboxforum.com/gfwlist +server=/mini.nc/127.0.0.1#5335 +ipset=/mini.nc/gfwlist +server=/taiwannews.com.tw/127.0.0.1#5335 +ipset=/taiwannews.com.tw/gfwlist +server=/paypal-europe.com/127.0.0.1#5335 +ipset=/paypal-europe.com/gfwlist +server=/reallesbianexposed.com/127.0.0.1#5335 +ipset=/reallesbianexposed.com/gfwlist +server=/discordsays.com/127.0.0.1#5335 +ipset=/discordsays.com/gfwlist +server=/bmwdelawarevalley.com/127.0.0.1#5335 +ipset=/bmwdelawarevalley.com/gfwlist +server=/haisetu.net/127.0.0.1#5335 +ipset=/haisetu.net/gfwlist +server=/casquebeatsbydrdresolohd.com/127.0.0.1#5335 +ipset=/casquebeatsbydrdresolohd.com/gfwlist +server=/icloud.com/127.0.0.1#5335 +ipset=/icloud.com/gfwlist +server=/extraindiansex.com/127.0.0.1#5335 +ipset=/extraindiansex.com/gfwlist +server=/abow.jp/127.0.0.1#5335 +ipset=/abow.jp/gfwlist +server=/plusone8.com/127.0.0.1#5335 +ipset=/plusone8.com/gfwlist +server=/appleonline.com/127.0.0.1#5335 +ipset=/appleonline.com/gfwlist +server=/famouspornstars.com/127.0.0.1#5335 +ipset=/famouspornstars.com/gfwlist +server=/shopee.io/127.0.0.1#5335 +ipset=/shopee.io/gfwlist +server=/publicsexhub.com/127.0.0.1#5335 +ipset=/publicsexhub.com/gfwlist +server=/yandex.ru/127.0.0.1#5335 +ipset=/yandex.ru/gfwlist +server=/amateur-pussies.com/127.0.0.1#5335 +ipset=/amateur-pussies.com/gfwlist +server=/nikeshoescity.com/127.0.0.1#5335 +ipset=/nikeshoescity.com/gfwlist +server=/amazonaws.co.uk/127.0.0.1#5335 +ipset=/amazonaws.co.uk/gfwlist +server=/lgappstv.com/127.0.0.1#5335 +ipset=/lgappstv.com/gfwlist +server=/beatsbydresaleonlines-nz.com/127.0.0.1#5335 +ipset=/beatsbydresaleonlines-nz.com/gfwlist +server=/microsoftadc.com/127.0.0.1#5335 +ipset=/microsoftadc.com/gfwlist +server=/tps138.info/127.0.0.1#5335 +ipset=/tps138.info/gfwlist +server=/onmanorama.com/127.0.0.1#5335 +ipset=/onmanorama.com/gfwlist +server=/bmw.rs/127.0.0.1#5335 +ipset=/bmw.rs/gfwlist +server=/rarbg.me/127.0.0.1#5335 +ipset=/rarbg.me/gfwlist +server=/joinside.org/127.0.0.1#5335 +ipset=/joinside.org/gfwlist +server=/girlsxxx.net/127.0.0.1#5335 +ipset=/girlsxxx.net/gfwlist +server=/kamisama-day.jp/127.0.0.1#5335 +ipset=/kamisama-day.jp/gfwlist +server=/hpcomputers.com/127.0.0.1#5335 +ipset=/hpcomputers.com/gfwlist +server=/linearcollider.org/127.0.0.1#5335 +ipset=/linearcollider.org/gfwlist +server=/lizardporn.com/127.0.0.1#5335 +ipset=/lizardporn.com/gfwlist +server=/youtube.co.at/127.0.0.1#5335 +ipset=/youtube.co.at/gfwlist +server=/youtube.rs/127.0.0.1#5335 +ipset=/youtube.rs/gfwlist +server=/bestpremiumpornsite.com/127.0.0.1#5335 +ipset=/bestpremiumpornsite.com/gfwlist +server=/dweb.link/127.0.0.1#5335 +ipset=/dweb.link/gfwlist +server=/youtube.co.cr/127.0.0.1#5335 +ipset=/youtube.co.cr/gfwlist +server=/facwebook.com/127.0.0.1#5335 +ipset=/facwebook.com/gfwlist +server=/akastream.com/127.0.0.1#5335 +ipset=/akastream.com/gfwlist +server=/createspace.com/127.0.0.1#5335 +ipset=/createspace.com/gfwlist +server=/volvotrucks.nl/127.0.0.1#5335 +ipset=/volvotrucks.nl/gfwlist +server=/instagramizlenme.com/127.0.0.1#5335 +ipset=/instagramizlenme.com/gfwlist +server=/earngeek.com/127.0.0.1#5335 +ipset=/earngeek.com/gfwlist +server=/googleapis.com/127.0.0.1#5335 +ipset=/googleapis.com/gfwlist +server=/beatspillnewcolor.com/127.0.0.1#5335 +ipset=/beatspillnewcolor.com/gfwlist +server=/sandisk.co.uk/127.0.0.1#5335 +ipset=/sandisk.co.uk/gfwlist +server=/positivessl.com/127.0.0.1#5335 +ipset=/positivessl.com/gfwlist +server=/shyav.com/127.0.0.1#5335 +ipset=/shyav.com/gfwlist +server=/mariobroswii.com/127.0.0.1#5335 +ipset=/mariobroswii.com/gfwlist +server=/pornodrome.tv/127.0.0.1#5335 +ipset=/pornodrome.tv/gfwlist +server=/pearsonassessment.nl/127.0.0.1#5335 +ipset=/pearsonassessment.nl/gfwlist +server=/xvideos-porn-video.com/127.0.0.1#5335 +ipset=/xvideos-porn-video.com/gfwlist +server=/vfsco.pl/127.0.0.1#5335 +ipset=/vfsco.pl/gfwlist +server=/briantreepayments.tv/127.0.0.1#5335 +ipset=/briantreepayments.tv/gfwlist +server=/bmw-motorrad.dz/127.0.0.1#5335 +ipset=/bmw-motorrad.dz/gfwlist +server=/bloombergnext.com/127.0.0.1#5335 +ipset=/bloombergnext.com/gfwlist +server=/beatsbydreoordopjes.com/127.0.0.1#5335 +ipset=/beatsbydreoordopjes.com/gfwlist +server=/touchsmartpc.com/127.0.0.1#5335 +ipset=/touchsmartpc.com/gfwlist +server=/freefblikes.com/127.0.0.1#5335 +ipset=/freefblikes.com/gfwlist +server=/youtubego.id/127.0.0.1#5335 +ipset=/youtubego.id/gfwlist +server=/appdomain.cloud/127.0.0.1#5335 +ipset=/appdomain.cloud/gfwlist +server=/pornmadeathome.com/127.0.0.1#5335 +ipset=/pornmadeathome.com/gfwlist +server=/applecentar.co.rs/127.0.0.1#5335 +ipset=/applecentar.co.rs/gfwlist +server=/oncars.in/127.0.0.1#5335 +ipset=/oncars.in/gfwlist +server=/fontshop-prod-responsive-images.s3.amazonaws.com/127.0.0.1#5335 +ipset=/fontshop-prod-responsive-images.s3.amazonaws.com/gfwlist +server=/applepay.berlin/127.0.0.1#5335 +ipset=/applepay.berlin/gfwlist +server=/cnnmoneystream.com/127.0.0.1#5335 +ipset=/cnnmoneystream.com/gfwlist +server=/bridgestonetire.com/127.0.0.1#5335 +ipset=/bridgestonetire.com/gfwlist +server=/adidas.hu/127.0.0.1#5335 +ipset=/adidas.hu/gfwlist +server=/telebay.com/127.0.0.1#5335 +ipset=/telebay.com/gfwlist +server=/bingagencyawards.com/127.0.0.1#5335 +ipset=/bingagencyawards.com/gfwlist +server=/thebeatsbydre.com/127.0.0.1#5335 +ipset=/thebeatsbydre.com/gfwlist +server=/ikea.my/127.0.0.1#5335 +ipset=/ikea.my/gfwlist +server=/rule34h.com/127.0.0.1#5335 +ipset=/rule34h.com/gfwlist +server=/facebookmsn.com/127.0.0.1#5335 +ipset=/facebookmsn.com/gfwlist +server=/facebookporn.org/127.0.0.1#5335 +ipset=/facebookporn.org/gfwlist +server=/globalsign.net/127.0.0.1#5335 +ipset=/globalsign.net/gfwlist +server=/billmelater.com/127.0.0.1#5335 +ipset=/billmelater.com/gfwlist +server=/libgen.st/127.0.0.1#5335 +ipset=/libgen.st/gfwlist +server=/xinfhw.com/127.0.0.1#5335 +ipset=/xinfhw.com/gfwlist +server=/bmw-asia.com/127.0.0.1#5335 +ipset=/bmw-asia.com/gfwlist +server=/pixiv.org/127.0.0.1#5335 +ipset=/pixiv.org/gfwlist +server=/downloadsforipod.com/127.0.0.1#5335 +ipset=/downloadsforipod.com/gfwlist +server=/alphabet.lv/127.0.0.1#5335 +ipset=/alphabet.lv/gfwlist +server=/pornxvideos.win/127.0.0.1#5335 +ipset=/pornxvideos.win/gfwlist +server=/free-aa.com/127.0.0.1#5335 +ipset=/free-aa.com/gfwlist +server=/sislovesme.com/127.0.0.1#5335 +ipset=/sislovesme.com/gfwlist +server=/cbspressexpress.com/127.0.0.1#5335 +ipset=/cbspressexpress.com/gfwlist +server=/hex.pm/127.0.0.1#5335 +ipset=/hex.pm/gfwlist +server=/sanspo.com/127.0.0.1#5335 +ipset=/sanspo.com/gfwlist +server=/ptt.sex/127.0.0.1#5335 +ipset=/ptt.sex/gfwlist +server=/mingpaomonthly.com/127.0.0.1#5335 +ipset=/mingpaomonthly.com/gfwlist +server=/titanfall.com/127.0.0.1#5335 +ipset=/titanfall.com/gfwlist +server=/durex.ro/127.0.0.1#5335 +ipset=/durex.ro/gfwlist +server=/momsbangteens.com/127.0.0.1#5335 +ipset=/momsbangteens.com/gfwlist +server=/realmaturesfuck.com/127.0.0.1#5335 +ipset=/realmaturesfuck.com/gfwlist +server=/12diasderegalosdeitunes.co.cr/127.0.0.1#5335 +ipset=/12diasderegalosdeitunes.co.cr/gfwlist +server=/xnxx2.info/127.0.0.1#5335 +ipset=/xnxx2.info/gfwlist +server=/thegatewaypundit.com/127.0.0.1#5335 +ipset=/thegatewaypundit.com/gfwlist +server=/zononi.com/127.0.0.1#5335 +ipset=/zononi.com/gfwlist +server=/amazonauthorinsights.com/127.0.0.1#5335 +ipset=/amazonauthorinsights.com/gfwlist +server=/vrbgay.com/127.0.0.1#5335 +ipset=/vrbgay.com/gfwlist +server=/xn--fiqs8sxootzz.xn--hxt814e/127.0.0.1#5335 +ipset=/xn--fiqs8sxootzz.xn--hxt814e/gfwlist +server=/nintendowii.com/127.0.0.1#5335 +ipset=/nintendowii.com/gfwlist +server=/oculusforbusiness.com/127.0.0.1#5335 +ipset=/oculusforbusiness.com/gfwlist +server=/xxnxx-porn.com/127.0.0.1#5335 +ipset=/xxnxx-porn.com/gfwlist +server=/vokevr.com/127.0.0.1#5335 +ipset=/vokevr.com/gfwlist +server=/accountpaypal.net/127.0.0.1#5335 +ipset=/accountpaypal.net/gfwlist +server=/shelfstuff.com/127.0.0.1#5335 +ipset=/shelfstuff.com/gfwlist +server=/facebookatschool.com/127.0.0.1#5335 +ipset=/facebookatschool.com/gfwlist +server=/yourmomsgotbigtits.com/127.0.0.1#5335 +ipset=/yourmomsgotbigtits.com/gfwlist +server=/applexpo.net/127.0.0.1#5335 +ipset=/applexpo.net/gfwlist +server=/justmysocks1.net/127.0.0.1#5335 +ipset=/justmysocks1.net/gfwlist +server=/weeklytimesnow.com.au/127.0.0.1#5335 +ipset=/weeklytimesnow.com.au/gfwlist +server=/hotfiesta.com/127.0.0.1#5335 +ipset=/hotfiesta.com/gfwlist +server=/pixplug.in/127.0.0.1#5335 +ipset=/pixplug.in/gfwlist +server=/smallteenpussy.com/127.0.0.1#5335 +ipset=/smallteenpussy.com/gfwlist +server=/line.biz/127.0.0.1#5335 +ipset=/line.biz/gfwlist +server=/usa-beatsbydreheadphonesonsale.net/127.0.0.1#5335 +ipset=/usa-beatsbydreheadphonesonsale.net/gfwlist +server=/mingpaotor.com/127.0.0.1#5335 +ipset=/mingpaotor.com/gfwlist +server=/erodoujinshi-world.com/127.0.0.1#5335 +ipset=/erodoujinshi-world.com/gfwlist +server=/akahost.net/127.0.0.1#5335 +ipset=/akahost.net/gfwlist +server=/mythicentertainment.net/127.0.0.1#5335 +ipset=/mythicentertainment.net/gfwlist +server=/vervesex.com/127.0.0.1#5335 +ipset=/vervesex.com/gfwlist +server=/bluemix.net/127.0.0.1#5335 +ipset=/bluemix.net/gfwlist +server=/12diasderegalosdeitunes.com/127.0.0.1#5335 +ipset=/12diasderegalosdeitunes.com/gfwlist +server=/half.tv/127.0.0.1#5335 +ipset=/half.tv/gfwlist +server=/microsoftadvertising.com/127.0.0.1#5335 +ipset=/microsoftadvertising.com/gfwlist +server=/vidown.com/127.0.0.1#5335 +ipset=/vidown.com/gfwlist +server=/cnet.com/127.0.0.1#5335 +ipset=/cnet.com/gfwlist +server=/spacex.com/127.0.0.1#5335 +ipset=/spacex.com/gfwlist +server=/freegaysexgames.com/127.0.0.1#5335 +ipset=/freegaysexgames.com/gfwlist +server=/ikea.jo/127.0.0.1#5335 +ipset=/ikea.jo/gfwlist +server=/starbucks.com.sg/127.0.0.1#5335 +ipset=/starbucks.com.sg/gfwlist +server=/nikefrance.com/127.0.0.1#5335 +ipset=/nikefrance.com/gfwlist +server=/justduckit.com/127.0.0.1#5335 +ipset=/justduckit.com/gfwlist +server=/bmw-drivingexperience.com/127.0.0.1#5335 +ipset=/bmw-drivingexperience.com/gfwlist +server=/bypasscensorship.org/127.0.0.1#5335 +ipset=/bypasscensorship.org/gfwlist +server=/hbo.map.fastly.net/127.0.0.1#5335 +ipset=/hbo.map.fastly.net/gfwlist +server=/zoho.in/127.0.0.1#5335 +ipset=/zoho.in/gfwlist +server=/fapporn.me/127.0.0.1#5335 +ipset=/fapporn.me/gfwlist +server=/etpress.com.hk/127.0.0.1#5335 +ipset=/etpress.com.hk/gfwlist +server=/ebayclassifieds.tv/127.0.0.1#5335 +ipset=/ebayclassifieds.tv/gfwlist +server=/neuerporno.com/127.0.0.1#5335 +ipset=/neuerporno.com/gfwlist +server=/ozvoice.org/127.0.0.1#5335 +ipset=/ozvoice.org/gfwlist +server=/thedailysnkr.com/127.0.0.1#5335 +ipset=/thedailysnkr.com/gfwlist +server=/jkforum.net/127.0.0.1#5335 +ipset=/jkforum.net/gfwlist +server=/finishinfo.it/127.0.0.1#5335 +ipset=/finishinfo.it/gfwlist +server=/teensnow.com/127.0.0.1#5335 +ipset=/teensnow.com/gfwlist +server=/americasvoice.news/127.0.0.1#5335 +ipset=/americasvoice.news/gfwlist +server=/redis.io/127.0.0.1#5335 +ipset=/redis.io/gfwlist +server=/liverail.com/127.0.0.1#5335 +ipset=/liverail.com/gfwlist +server=/hbomaxdash.s.llnwi.net/127.0.0.1#5335 +ipset=/hbomaxdash.s.llnwi.net/gfwlist +server=/contest.com/127.0.0.1#5335 +ipset=/contest.com/gfwlist +server=/githubassets.com/127.0.0.1#5335 +ipset=/githubassets.com/gfwlist +server=/pahabicilemezsurprizler.com/127.0.0.1#5335 +ipset=/pahabicilemezsurprizler.com/gfwlist +server=/verisign.dk/127.0.0.1#5335 +ipset=/verisign.dk/gfwlist +server=/beatswholesale.us/127.0.0.1#5335 +ipset=/beatswholesale.us/gfwlist +server=/swissign.li/127.0.0.1#5335 +ipset=/swissign.li/gfwlist +server=/stepmaturesex.com/127.0.0.1#5335 +ipset=/stepmaturesex.com/gfwlist +server=/iphoneplus.wang/127.0.0.1#5335 +ipset=/iphoneplus.wang/gfwlist +server=/stripselector.com/127.0.0.1#5335 +ipset=/stripselector.com/gfwlist +server=/ituneslogin.net/127.0.0.1#5335 +ipset=/ituneslogin.net/gfwlist +server=/instituteofwar.org/127.0.0.1#5335 +ipset=/instituteofwar.org/gfwlist +server=/javhub.net/127.0.0.1#5335 +ipset=/javhub.net/gfwlist +server=/whimn.com.au/127.0.0.1#5335 +ipset=/whimn.com.au/gfwlist +server=/indiansexmms2.com/127.0.0.1#5335 +ipset=/indiansexmms2.com/gfwlist +server=/weekly-economist.com/127.0.0.1#5335 +ipset=/weekly-economist.com/gfwlist +server=/volvotrucks.kg/127.0.0.1#5335 +ipset=/volvotrucks.kg/gfwlist +server=/watch-ebay.org/127.0.0.1#5335 +ipset=/watch-ebay.org/gfwlist +server=/facebook-forum.com/127.0.0.1#5335 +ipset=/facebook-forum.com/gfwlist +server=/uplay.com/127.0.0.1#5335 +ipset=/uplay.com/gfwlist +server=/outletnike.com/127.0.0.1#5335 +ipset=/outletnike.com/gfwlist +server=/mini.tn/127.0.0.1#5335 +ipset=/mini.tn/gfwlist +server=/hket.com/127.0.0.1#5335 +ipset=/hket.com/gfwlist +server=/nke6.com/127.0.0.1#5335 +ipset=/nke6.com/gfwlist +server=/intel.ie/127.0.0.1#5335 +ipset=/intel.ie/gfwlist +server=/dirtyship.com/127.0.0.1#5335 +ipset=/dirtyship.com/gfwlist +server=/colombianas.webcam/127.0.0.1#5335 +ipset=/colombianas.webcam/gfwlist +server=/fonts.com/127.0.0.1#5335 +ipset=/fonts.com/gfwlist +server=/porn-discounts.com/127.0.0.1#5335 +ipset=/porn-discounts.com/gfwlist +server=/mit.net/127.0.0.1#5335 +ipset=/mit.net/gfwlist +server=/365buymy.com/127.0.0.1#5335 +ipset=/365buymy.com/gfwlist +server=/huluad.com/127.0.0.1#5335 +ipset=/huluad.com/gfwlist +server=/golos-ameriki.ru/127.0.0.1#5335 +ipset=/golos-ameriki.ru/gfwlist +server=/bmwspecialoffers.ca/127.0.0.1#5335 +ipset=/bmwspecialoffers.ca/gfwlist +server=/sego8.cc/127.0.0.1#5335 +ipset=/sego8.cc/gfwlist +server=/pearson.fr/127.0.0.1#5335 +ipset=/pearson.fr/gfwlist +server=/yahoo.mw/127.0.0.1#5335 +ipset=/yahoo.mw/gfwlist +server=/autumn-jade.com/127.0.0.1#5335 +ipset=/autumn-jade.com/gfwlist +server=/fury.io/127.0.0.1#5335 +ipset=/fury.io/gfwlist +server=/amateurpornonly.com/127.0.0.1#5335 +ipset=/amateurpornonly.com/gfwlist +server=/highcolonic.info/127.0.0.1#5335 +ipset=/highcolonic.info/gfwlist +server=/appleinclegal.com/127.0.0.1#5335 +ipset=/appleinclegal.com/gfwlist +server=/hornysexgame.com/127.0.0.1#5335 +ipset=/hornysexgame.com/gfwlist +server=/bmw-group.net/127.0.0.1#5335 +ipset=/bmw-group.net/gfwlist +server=/hentaibros.com/127.0.0.1#5335 +ipset=/hentaibros.com/gfwlist +server=/52fuliji.cc/127.0.0.1#5335 +ipset=/52fuliji.cc/gfwlist +server=/att.net/127.0.0.1#5335 +ipset=/att.net/gfwlist +server=/bmw.lk/127.0.0.1#5335 +ipset=/bmw.lk/gfwlist +server=/nextdigital.com.hk/127.0.0.1#5335 +ipset=/nextdigital.com.hk/gfwlist +server=/gayasiantheater.com/127.0.0.1#5335 +ipset=/gayasiantheater.com/gfwlist +server=/microsoft.hu/127.0.0.1#5335 +ipset=/microsoft.hu/gfwlist +server=/debank.com/127.0.0.1#5335 +ipset=/debank.com/gfwlist +server=/beats-bydreoutletonline.com/127.0.0.1#5335 +ipset=/beats-bydreoutletonline.com/gfwlist +server=/1337xx.to/127.0.0.1#5335 +ipset=/1337xx.to/gfwlist +server=/page.link/127.0.0.1#5335 +ipset=/page.link/gfwlist +server=/gputechconf.com.au/127.0.0.1#5335 +ipset=/gputechconf.com.au/gfwlist +server=/oath.cloud/127.0.0.1#5335 +ipset=/oath.cloud/gfwlist +server=/paypal-apps.com/127.0.0.1#5335 +ipset=/paypal-apps.com/gfwlist +server=/newenergyfinance.com/127.0.0.1#5335 +ipset=/newenergyfinance.com/gfwlist +server=/hpconnected.us/127.0.0.1#5335 +ipset=/hpconnected.us/gfwlist +server=/applepaysupplies.tv/127.0.0.1#5335 +ipset=/applepaysupplies.tv/gfwlist +server=/volvobuses.com.pt/127.0.0.1#5335 +ipset=/volvobuses.com.pt/gfwlist +server=/airwick.es/127.0.0.1#5335 +ipset=/airwick.es/gfwlist +server=/speedrun.com/127.0.0.1#5335 +ipset=/speedrun.com/gfwlist +server=/google.ht/127.0.0.1#5335 +ipset=/google.ht/gfwlist +server=/lewdvrgames.com/127.0.0.1#5335 +ipset=/lewdvrgames.com/gfwlist +server=/hdpornt.com/127.0.0.1#5335 +ipset=/hdpornt.com/gfwlist +server=/disneyinternational.com/127.0.0.1#5335 +ipset=/disneyinternational.com/gfwlist +server=/masterintelligence.com/127.0.0.1#5335 +ipset=/masterintelligence.com/gfwlist +server=/deepl.com/127.0.0.1#5335 +ipset=/deepl.com/gfwlist +server=/paypal-team.com/127.0.0.1#5335 +ipset=/paypal-team.com/gfwlist +server=/instagramtakiphilesi.com/127.0.0.1#5335 +ipset=/instagramtakiphilesi.com/gfwlist +server=/pornpros.com/127.0.0.1#5335 +ipset=/pornpros.com/gfwlist +server=/2gayboys.com/127.0.0.1#5335 +ipset=/2gayboys.com/gfwlist +server=/afpforum.com/127.0.0.1#5335 +ipset=/afpforum.com/gfwlist +server=/bigtopsites.com/127.0.0.1#5335 +ipset=/bigtopsites.com/gfwlist +server=/anime-tube.pw/127.0.0.1#5335 +ipset=/anime-tube.pw/gfwlist +server=/eropasture.com/127.0.0.1#5335 +ipset=/eropasture.com/gfwlist +server=/twitteroauth.com/127.0.0.1#5335 +ipset=/twitteroauth.com/gfwlist +server=/scholar.google.de/127.0.0.1#5335 +ipset=/scholar.google.de/gfwlist +server=/ohsexfilm.com/127.0.0.1#5335 +ipset=/ohsexfilm.com/gfwlist +server=/gateway.pinata.cloud/127.0.0.1#5335 +ipset=/gateway.pinata.cloud/gfwlist +server=/minneapolisbmw.com/127.0.0.1#5335 +ipset=/minneapolisbmw.com/gfwlist +server=/pokemongoldsilver.com/127.0.0.1#5335 +ipset=/pokemongoldsilver.com/gfwlist +server=/hpdriver.com/127.0.0.1#5335 +ipset=/hpdriver.com/gfwlist +server=/valvesoftware.com/127.0.0.1#5335 +ipset=/valvesoftware.com/gfwlist +server=/rsshub.app/127.0.0.1#5335 +ipset=/rsshub.app/gfwlist +server=/beatsbydrdre-headphones.com/127.0.0.1#5335 +ipset=/beatsbydrdre-headphones.com/gfwlist +server=/0emm.com/127.0.0.1#5335 +ipset=/0emm.com/gfwlist +server=/shopify.dev/127.0.0.1#5335 +ipset=/shopify.dev/gfwlist +server=/xn--74q035i.xn--hxt814e/127.0.0.1#5335 +ipset=/xn--74q035i.xn--hxt814e/gfwlist +server=/calendarserver.org/127.0.0.1#5335 +ipset=/calendarserver.org/gfwlist +server=/anysex.com/127.0.0.1#5335 +ipset=/anysex.com/gfwlist +server=/d2anahhhmp1ffz.cloudfront.net/127.0.0.1#5335 +ipset=/d2anahhhmp1ffz.cloudfront.net/gfwlist +server=/snapwebcams.com/127.0.0.1#5335 +ipset=/snapwebcams.com/gfwlist +server=/dis.gd/127.0.0.1#5335 +ipset=/dis.gd/gfwlist +server=/foxsoccershop.com/127.0.0.1#5335 +ipset=/foxsoccershop.com/gfwlist +server=/fbhome.com/127.0.0.1#5335 +ipset=/fbhome.com/gfwlist +server=/ohpornovideo.com/127.0.0.1#5335 +ipset=/ohpornovideo.com/gfwlist +server=/terapeak.info/127.0.0.1#5335 +ipset=/terapeak.info/gfwlist +server=/privatemarketplaces.us/127.0.0.1#5335 +ipset=/privatemarketplaces.us/gfwlist +server=/typenetwork.com/127.0.0.1#5335 +ipset=/typenetwork.com/gfwlist +server=/bastropfirestone.com/127.0.0.1#5335 +ipset=/bastropfirestone.com/gfwlist +server=/beurettesvideo.com/127.0.0.1#5335 +ipset=/beurettesvideo.com/gfwlist +server=/mini-lebanon.com/127.0.0.1#5335 +ipset=/mini-lebanon.com/gfwlist +server=/paradisehotelquizfox.com/127.0.0.1#5335 +ipset=/paradisehotelquizfox.com/gfwlist +server=/buypass-ssl.com/127.0.0.1#5335 +ipset=/buypass-ssl.com/gfwlist +server=/newsgawakaru.com/127.0.0.1#5335 +ipset=/newsgawakaru.com/gfwlist +server=/www-paypal.info/127.0.0.1#5335 +ipset=/www-paypal.info/gfwlist +server=/ipod.ru/127.0.0.1#5335 +ipset=/ipod.ru/gfwlist +server=/demdex.net/127.0.0.1#5335 +ipset=/demdex.net/gfwlist +server=/deps.dev/127.0.0.1#5335 +ipset=/deps.dev/gfwlist +server=/cosplayeromania.jp/127.0.0.1#5335 +ipset=/cosplayeromania.jp/gfwlist +server=/epochtimes.com.br/127.0.0.1#5335 +ipset=/epochtimes.com.br/gfwlist +server=/xlecx.org/127.0.0.1#5335 +ipset=/xlecx.org/gfwlist +server=/customnikeshoes.com/127.0.0.1#5335 +ipset=/customnikeshoes.com/gfwlist +server=/volvotruckcenter.kr/127.0.0.1#5335 +ipset=/volvotruckcenter.kr/gfwlist +server=/whatsapp.info/127.0.0.1#5335 +ipset=/whatsapp.info/gfwlist +server=/monsterbeatsfactory.net/127.0.0.1#5335 +ipset=/monsterbeatsfactory.net/gfwlist +server=/directvrichmond.com/127.0.0.1#5335 +ipset=/directvrichmond.com/gfwlist +server=/fbbmarket.com/127.0.0.1#5335 +ipset=/fbbmarket.com/gfwlist +server=/ikea.com.pr/127.0.0.1#5335 +ipset=/ikea.com.pr/gfwlist +server=/fetishtown.net/127.0.0.1#5335 +ipset=/fetishtown.net/gfwlist +server=/terrapeak.com/127.0.0.1#5335 +ipset=/terrapeak.com/gfwlist +server=/prime-video.com/127.0.0.1#5335 +ipset=/prime-video.com/gfwlist +server=/stonefoxlingerie.com/127.0.0.1#5335 +ipset=/stonefoxlingerie.com/gfwlist +server=/3d-toon.com/127.0.0.1#5335 +ipset=/3d-toon.com/gfwlist +server=/canon.ge/127.0.0.1#5335 +ipset=/canon.ge/gfwlist +server=/hppavillionlaptop.com/127.0.0.1#5335 +ipset=/hppavillionlaptop.com/gfwlist +server=/microsoftuwp.com/127.0.0.1#5335 +ipset=/microsoftuwp.com/gfwlist +server=/openmaps.org/127.0.0.1#5335 +ipset=/openmaps.org/gfwlist +server=/durex.dk/127.0.0.1#5335 +ipset=/durex.dk/gfwlist +server=/wankizer.com/127.0.0.1#5335 +ipset=/wankizer.com/gfwlist +server=/theinitium.com/127.0.0.1#5335 +ipset=/theinitium.com/gfwlist +server=/sharkyporn.com/127.0.0.1#5335 +ipset=/sharkyporn.com/gfwlist +server=/cheapbeatsbydrenz.net/127.0.0.1#5335 +ipset=/cheapbeatsbydrenz.net/gfwlist +server=/shesfreaky.com/127.0.0.1#5335 +ipset=/shesfreaky.com/gfwlist +server=/topescort.nl/127.0.0.1#5335 +ipset=/topescort.nl/gfwlist +server=/pornojux.com/127.0.0.1#5335 +ipset=/pornojux.com/gfwlist +server=/dmgmediaprivacy.co.uk/127.0.0.1#5335 +ipset=/dmgmediaprivacy.co.uk/gfwlist +server=/nintendo.eu/127.0.0.1#5335 +ipset=/nintendo.eu/gfwlist +server=/ebi.ac.uk/127.0.0.1#5335 +ipset=/ebi.ac.uk/gfwlist +server=/cheapbeatsbus.com/127.0.0.1#5335 +ipset=/cheapbeatsbus.com/gfwlist +server=/bestbuy-jobs.com/127.0.0.1#5335 +ipset=/bestbuy-jobs.com/gfwlist +server=/imac.one/127.0.0.1#5335 +ipset=/imac.one/gfwlist +server=/clip16.com/127.0.0.1#5335 +ipset=/clip16.com/gfwlist +server=/viewpointsfromfacebook.com/127.0.0.1#5335 +ipset=/viewpointsfromfacebook.com/gfwlist +server=/geeksquad.tv/127.0.0.1#5335 +ipset=/geeksquad.tv/gfwlist +server=/latex-project.org/127.0.0.1#5335 +ipset=/latex-project.org/gfwlist +server=/wetandpuffy.com/127.0.0.1#5335 +ipset=/wetandpuffy.com/gfwlist +server=/pmatehunter.com/127.0.0.1#5335 +ipset=/pmatehunter.com/gfwlist +server=/epochtimes.com.au/127.0.0.1#5335 +ipset=/epochtimes.com.au/gfwlist +server=/thz7.net/127.0.0.1#5335 +ipset=/thz7.net/gfwlist +server=/alphabet.cz/127.0.0.1#5335 +ipset=/alphabet.cz/gfwlist +server=/adguard.com/127.0.0.1#5335 +ipset=/adguard.com/gfwlist +server=/bmw-motorrad.com.my/127.0.0.1#5335 +ipset=/bmw-motorrad.com.my/gfwlist +server=/liketruyen.net/127.0.0.1#5335 +ipset=/liketruyen.net/gfwlist +server=/nubiles-porn.com/127.0.0.1#5335 +ipset=/nubiles-porn.com/gfwlist +server=/all-sex-links.com/127.0.0.1#5335 +ipset=/all-sex-links.com/gfwlist +server=/embed.ly/127.0.0.1#5335 +ipset=/embed.ly/gfwlist +server=/incommon-rsa.org/127.0.0.1#5335 +ipset=/incommon-rsa.org/gfwlist +server=/pornfuror.com/127.0.0.1#5335 +ipset=/pornfuror.com/gfwlist +server=/starbucks.com.tr/127.0.0.1#5335 +ipset=/starbucks.com.tr/gfwlist +server=/spreadporn.org/127.0.0.1#5335 +ipset=/spreadporn.org/gfwlist +server=/volvospares.com/127.0.0.1#5335 +ipset=/volvospares.com/gfwlist +server=/pornohut.info/127.0.0.1#5335 +ipset=/pornohut.info/gfwlist +server=/wd.com/127.0.0.1#5335 +ipset=/wd.com/gfwlist +server=/dotcernpilot.info/127.0.0.1#5335 +ipset=/dotcernpilot.info/gfwlist +server=/foxcreativeuniversity.com/127.0.0.1#5335 +ipset=/foxcreativeuniversity.com/gfwlist +server=/porndisk.com/127.0.0.1#5335 +ipset=/porndisk.com/gfwlist +server=/bloombergradio.com/127.0.0.1#5335 +ipset=/bloombergradio.com/gfwlist +server=/visa.com.co/127.0.0.1#5335 +ipset=/visa.com.co/gfwlist +server=/yandex.com.ua/127.0.0.1#5335 +ipset=/yandex.com.ua/gfwlist +server=/vodafone.de/127.0.0.1#5335 +ipset=/vodafone.de/gfwlist +server=/ikea.co.pl/127.0.0.1#5335 +ipset=/ikea.co.pl/gfwlist +server=/xxx.xxx/127.0.0.1#5335 +ipset=/xxx.xxx/gfwlist +server=/addison-wesley.ch/127.0.0.1#5335 +ipset=/addison-wesley.ch/gfwlist +server=/voaafrique.com/127.0.0.1#5335 +ipset=/voaafrique.com/gfwlist +server=/intel.us/127.0.0.1#5335 +ipset=/intel.us/gfwlist +server=/psg-int-centralus.cloudapp.net/127.0.0.1#5335 +ipset=/psg-int-centralus.cloudapp.net/gfwlist +server=/fb.com/127.0.0.1#5335 +ipset=/fb.com/gfwlist +server=/passport.net/127.0.0.1#5335 +ipset=/passport.net/gfwlist +server=/hplaptop.com/127.0.0.1#5335 +ipset=/hplaptop.com/gfwlist +server=/ea.com/127.0.0.1#5335 +ipset=/ea.com/gfwlist +server=/jtvnw.net/127.0.0.1#5335 +ipset=/jtvnw.net/gfwlist +server=/voxcreative.com/127.0.0.1#5335 +ipset=/voxcreative.com/gfwlist +server=/youtube.com.ph/127.0.0.1#5335 +ipset=/youtube.com.ph/gfwlist +server=/zb.com/127.0.0.1#5335 +ipset=/zb.com/gfwlist +server=/nikedunksshoes.com/127.0.0.1#5335 +ipset=/nikedunksshoes.com/gfwlist +server=/mainichibooks.com/127.0.0.1#5335 +ipset=/mainichibooks.com/gfwlist +server=/farfetch.net/127.0.0.1#5335 +ipset=/farfetch.net/gfwlist +server=/explicittube.com/127.0.0.1#5335 +ipset=/explicittube.com/gfwlist +server=/ttvnw.net/127.0.0.1#5335 +ipset=/ttvnw.net/gfwlist +server=/volvobuses.be/127.0.0.1#5335 +ipset=/volvobuses.be/gfwlist +server=/luvmov.com/127.0.0.1#5335 +ipset=/luvmov.com/gfwlist +server=/paypalnetwork.org/127.0.0.1#5335 +ipset=/paypalnetwork.org/gfwlist +server=/bmw-world.tv/127.0.0.1#5335 +ipset=/bmw-world.tv/gfwlist +server=/facebookworld.com/127.0.0.1#5335 +ipset=/facebookworld.com/gfwlist +server=/alt6-mtalk.google.com/127.0.0.1#5335 +ipset=/alt6-mtalk.google.com/gfwlist +server=/16fhgdty.xyz/127.0.0.1#5335 +ipset=/16fhgdty.xyz/gfwlist +server=/adultfreex.com/127.0.0.1#5335 +ipset=/adultfreex.com/gfwlist +server=/historyofdota.com/127.0.0.1#5335 +ipset=/historyofdota.com/gfwlist +server=/alpherafs.ie/127.0.0.1#5335 +ipset=/alpherafs.ie/gfwlist +server=/finishkilpailu.fi/127.0.0.1#5335 +ipset=/finishkilpailu.fi/gfwlist +server=/google.rw/127.0.0.1#5335 +ipset=/google.rw/gfwlist +server=/attglobal.net/127.0.0.1#5335 +ipset=/attglobal.net/gfwlist +server=/alivevm.com/127.0.0.1#5335 +ipset=/alivevm.com/gfwlist +server=/aranzadi.es/127.0.0.1#5335 +ipset=/aranzadi.es/gfwlist +server=/gaypornlove.net/127.0.0.1#5335 +ipset=/gaypornlove.net/gfwlist +server=/0cgdklr5sfwj.com/127.0.0.1#5335 +ipset=/0cgdklr5sfwj.com/gfwlist +server=/younger19.com/127.0.0.1#5335 +ipset=/younger19.com/gfwlist +server=/psyccareers.com/127.0.0.1#5335 +ipset=/psyccareers.com/gfwlist +server=/me.com/127.0.0.1#5335 +ipset=/me.com/gfwlist +server=/zohouniversity.com/127.0.0.1#5335 +ipset=/zohouniversity.com/gfwlist +server=/javbus.com/127.0.0.1#5335 +ipset=/javbus.com/gfwlist +server=/nebay.net/127.0.0.1#5335 +ipset=/nebay.net/gfwlist +server=/thepornscat.com/127.0.0.1#5335 +ipset=/thepornscat.com/gfwlist +server=/blogspot.td/127.0.0.1#5335 +ipset=/blogspot.td/gfwlist +server=/canon.co.il/127.0.0.1#5335 +ipset=/canon.co.il/gfwlist +server=/69-sexgames.com/127.0.0.1#5335 +ipset=/69-sexgames.com/gfwlist +server=/kijijiraps.ca/127.0.0.1#5335 +ipset=/kijijiraps.ca/gfwlist +server=/mofosnetwork.com/127.0.0.1#5335 +ipset=/mofosnetwork.com/gfwlist +server=/yahoo.com.vn/127.0.0.1#5335 +ipset=/yahoo.com.vn/gfwlist +server=/gettyimages.pt/127.0.0.1#5335 +ipset=/gettyimages.pt/gfwlist +server=/srwwu.uno/127.0.0.1#5335 +ipset=/srwwu.uno/gfwlist +server=/microsoft.uz/127.0.0.1#5335 +ipset=/microsoft.uz/gfwlist +server=/pinterest.com.vn/127.0.0.1#5335 +ipset=/pinterest.com.vn/gfwlist +server=/cabletv.com.hk/127.0.0.1#5335 +ipset=/cabletv.com.hk/gfwlist +server=/diablo3.com/127.0.0.1#5335 +ipset=/diablo3.com/gfwlist +server=/nakadashi.to/127.0.0.1#5335 +ipset=/nakadashi.to/gfwlist +server=/oreilly.review/127.0.0.1#5335 +ipset=/oreilly.review/gfwlist +server=/hot-teens.com/127.0.0.1#5335 +ipset=/hot-teens.com/gfwlist +server=/makeitopen.com/127.0.0.1#5335 +ipset=/makeitopen.com/gfwlist +server=/dynacw.com/127.0.0.1#5335 +ipset=/dynacw.com/gfwlist +server=/lede-project.org/127.0.0.1#5335 +ipset=/lede-project.org/gfwlist +server=/beatsbydresonline-nz.com/127.0.0.1#5335 +ipset=/beatsbydresonline-nz.com/gfwlist +server=/beatsbydresalemall2013.com/127.0.0.1#5335 +ipset=/beatsbydresalemall2013.com/gfwlist +server=/porcore.com/127.0.0.1#5335 +ipset=/porcore.com/gfwlist +server=/powerappscdn.net/127.0.0.1#5335 +ipset=/powerappscdn.net/gfwlist +server=/rakuten.ca/127.0.0.1#5335 +ipset=/rakuten.ca/gfwlist +server=/rk.com/127.0.0.1#5335 +ipset=/rk.com/gfwlist +server=/elasticbeanstalk.com/127.0.0.1#5335 +ipset=/elasticbeanstalk.com/gfwlist +server=/vk.com/127.0.0.1#5335 +ipset=/vk.com/gfwlist +server=/oxlife.co/127.0.0.1#5335 +ipset=/oxlife.co/gfwlist +server=/internationalsaimoe.com/127.0.0.1#5335 +ipset=/internationalsaimoe.com/gfwlist +server=/idservice.inc/127.0.0.1#5335 +ipset=/idservice.inc/gfwlist +server=/bffshd.com/127.0.0.1#5335 +ipset=/bffshd.com/gfwlist +server=/squirrelgroup.net/127.0.0.1#5335 +ipset=/squirrelgroup.net/gfwlist +server=/blogspot.sk/127.0.0.1#5335 +ipset=/blogspot.sk/gfwlist +server=/microsoft.ua/127.0.0.1#5335 +ipset=/microsoft.ua/gfwlist +server=/bountyhunterporn.com/127.0.0.1#5335 +ipset=/bountyhunterporn.com/gfwlist +server=/ipadair.cl/127.0.0.1#5335 +ipset=/ipadair.cl/gfwlist +server=/takegoto.com/127.0.0.1#5335 +ipset=/takegoto.com/gfwlist +server=/ikea.au/127.0.0.1#5335 +ipset=/ikea.au/gfwlist +server=/av69.tv/127.0.0.1#5335 +ipset=/av69.tv/gfwlist +server=/logitech.com.cn/127.0.0.1#5335 +ipset=/logitech.com.cn/gfwlist +server=/hbogoasia.sg/127.0.0.1#5335 +ipset=/hbogoasia.sg/gfwlist +server=/cbsplaylistserver.aws.syncbak.com/127.0.0.1#5335 +ipset=/cbsplaylistserver.aws.syncbak.com/gfwlist +server=/hpprinterinstalls.com/127.0.0.1#5335 +ipset=/hpprinterinstalls.com/gfwlist +server=/intercom.com/127.0.0.1#5335 +ipset=/intercom.com/gfwlist +server=/nikehelp.com/127.0.0.1#5335 +ipset=/nikehelp.com/gfwlist +server=/mallandrinhas.net/127.0.0.1#5335 +ipset=/mallandrinhas.net/gfwlist +server=/gettyimages.be/127.0.0.1#5335 +ipset=/gettyimages.be/gfwlist +server=/2k.com/127.0.0.1#5335 +ipset=/2k.com/gfwlist +server=/bestgames-2022.com/127.0.0.1#5335 +ipset=/bestgames-2022.com/gfwlist +server=/apple.is/127.0.0.1#5335 +ipset=/apple.is/gfwlist +server=/pinterest.co.nz/127.0.0.1#5335 +ipset=/pinterest.co.nz/gfwlist +server=/finishbrasil.com.br/127.0.0.1#5335 +ipset=/finishbrasil.com.br/gfwlist +server=/skype-edf.akadns.net/127.0.0.1#5335 +ipset=/skype-edf.akadns.net/gfwlist +server=/mastercard.com.co/127.0.0.1#5335 +ipset=/mastercard.com.co/gfwlist +server=/pornyeah.com/127.0.0.1#5335 +ipset=/pornyeah.com/gfwlist +server=/microsoft.ee/127.0.0.1#5335 +ipset=/microsoft.ee/gfwlist +server=/intel.md/127.0.0.1#5335 +ipset=/intel.md/gfwlist +server=/58avgo.com/127.0.0.1#5335 +ipset=/58avgo.com/gfwlist +server=/ass4all.com/127.0.0.1#5335 +ipset=/ass4all.com/gfwlist +server=/myxvids.com/127.0.0.1#5335 +ipset=/myxvids.com/gfwlist +server=/youtube.my/127.0.0.1#5335 +ipset=/youtube.my/gfwlist +server=/lasvegasbmw.com/127.0.0.1#5335 +ipset=/lasvegasbmw.com/gfwlist +server=/healthcarecareeronline.com/127.0.0.1#5335 +ipset=/healthcarecareeronline.com/gfwlist +server=/randyblue.com/127.0.0.1#5335 +ipset=/randyblue.com/gfwlist +server=/avstar6.com/127.0.0.1#5335 +ipset=/avstar6.com/gfwlist +server=/vipstudiocali.com/127.0.0.1#5335 +ipset=/vipstudiocali.com/gfwlist +server=/nikewear.com/127.0.0.1#5335 +ipset=/nikewear.com/gfwlist +server=/myaccountglobalcash.com/127.0.0.1#5335 +ipset=/myaccountglobalcash.com/gfwlist +server=/petite.one/127.0.0.1#5335 +ipset=/petite.one/gfwlist +server=/ro89.com/127.0.0.1#5335 +ipset=/ro89.com/gfwlist +server=/annualpelvicexam.com/127.0.0.1#5335 +ipset=/annualpelvicexam.com/gfwlist +server=/mybestbuy.com/127.0.0.1#5335 +ipset=/mybestbuy.com/gfwlist +server=/blogspot.bj/127.0.0.1#5335 +ipset=/blogspot.bj/gfwlist +server=/radiosvoboda.org/127.0.0.1#5335 +ipset=/radiosvoboda.org/gfwlist +server=/xhamsterlive.com/127.0.0.1#5335 +ipset=/xhamsterlive.com/gfwlist +server=/akamai.com/127.0.0.1#5335 +ipset=/akamai.com/gfwlist +server=/unraveltwo.com/127.0.0.1#5335 +ipset=/unraveltwo.com/gfwlist +server=/bluehatil.com/127.0.0.1#5335 +ipset=/bluehatil.com/gfwlist +server=/juliamiles.com/127.0.0.1#5335 +ipset=/juliamiles.com/gfwlist +server=/sexytuber.com/127.0.0.1#5335 +ipset=/sexytuber.com/gfwlist +server=/adorevids.com/127.0.0.1#5335 +ipset=/adorevids.com/gfwlist +server=/lavteam.org/127.0.0.1#5335 +ipset=/lavteam.org/gfwlist +server=/facebookwork.com/127.0.0.1#5335 +ipset=/facebookwork.com/gfwlist +server=/iwork.se/127.0.0.1#5335 +ipset=/iwork.se/gfwlist +server=/nurofen.hu/127.0.0.1#5335 +ipset=/nurofen.hu/gfwlist +server=/thinkboxsoftware.com/127.0.0.1#5335 +ipset=/thinkboxsoftware.com/gfwlist +server=/pornsexer.com/127.0.0.1#5335 +ipset=/pornsexer.com/gfwlist +server=/sellercommunity.com/127.0.0.1#5335 +ipset=/sellercommunity.com/gfwlist +server=/mastercard.co.id/127.0.0.1#5335 +ipset=/mastercard.co.id/gfwlist +server=/mirar.xxx/127.0.0.1#5335 +ipset=/mirar.xxx/gfwlist +server=/callabitch.org/127.0.0.1#5335 +ipset=/callabitch.org/gfwlist +server=/brightcove.com/127.0.0.1#5335 +ipset=/brightcove.com/gfwlist +server=/morteincam.com/127.0.0.1#5335 +ipset=/morteincam.com/gfwlist +server=/new-jero.net/127.0.0.1#5335 +ipset=/new-jero.net/gfwlist +server=/iphoto.no/127.0.0.1#5335 +ipset=/iphoto.no/gfwlist +server=/play4free.com/127.0.0.1#5335 +ipset=/play4free.com/gfwlist +server=/huluteam.com/127.0.0.1#5335 +ipset=/huluteam.com/gfwlist +server=/pornking.fun/127.0.0.1#5335 +ipset=/pornking.fun/gfwlist +server=/myhelpinglab.com/127.0.0.1#5335 +ipset=/myhelpinglab.com/gfwlist +server=/oxfordmusiconline.com/127.0.0.1#5335 +ipset=/oxfordmusiconline.com/gfwlist +server=/stripchat.com/127.0.0.1#5335 +ipset=/stripchat.com/gfwlist +server=/supermario3dworld.com/127.0.0.1#5335 +ipset=/supermario3dworld.com/gfwlist +server=/huffingtonpost.com.au/127.0.0.1#5335 +ipset=/huffingtonpost.com.au/gfwlist +server=/pornoko.net/127.0.0.1#5335 +ipset=/pornoko.net/gfwlist +server=/thebeatsbydre.net/127.0.0.1#5335 +ipset=/thebeatsbydre.net/gfwlist +server=/torrindex.net/127.0.0.1#5335 +ipset=/torrindex.net/gfwlist +server=/google.com.pe/127.0.0.1#5335 +ipset=/google.com.pe/gfwlist +server=/vodafone.com/127.0.0.1#5335 +ipset=/vodafone.com/gfwlist +server=/dribbble.com/127.0.0.1#5335 +ipset=/dribbble.com/gfwlist +server=/applestore.sg/127.0.0.1#5335 +ipset=/applestore.sg/gfwlist +server=/pokemonswordshield.com/127.0.0.1#5335 +ipset=/pokemonswordshield.com/gfwlist +server=/btcbox.co.jp/127.0.0.1#5335 +ipset=/btcbox.co.jp/gfwlist +server=/alexanderstreet.com/127.0.0.1#5335 +ipset=/alexanderstreet.com/gfwlist +server=/picasaweb.net/127.0.0.1#5335 +ipset=/picasaweb.net/gfwlist +server=/youtube.lt/127.0.0.1#5335 +ipset=/youtube.lt/gfwlist +server=/hptouchpointmanager.com/127.0.0.1#5335 +ipset=/hptouchpointmanager.com/gfwlist +server=/usvimosquito.com/127.0.0.1#5335 +ipset=/usvimosquito.com/gfwlist +server=/desiporn.tube/127.0.0.1#5335 +ipset=/desiporn.tube/gfwlist +server=/akadeem.net/127.0.0.1#5335 +ipset=/akadeem.net/gfwlist +server=/llnwd.net/127.0.0.1#5335 +ipset=/llnwd.net/gfwlist +server=/beatsbydrehd.com/127.0.0.1#5335 +ipset=/beatsbydrehd.com/gfwlist +server=/google.ee/127.0.0.1#5335 +ipset=/google.ee/gfwlist +server=/tgp6.com/127.0.0.1#5335 +ipset=/tgp6.com/gfwlist +server=/amateur-porn-tube.net/127.0.0.1#5335 +ipset=/amateur-porn-tube.net/gfwlist +server=/powerautomate.com/127.0.0.1#5335 +ipset=/powerautomate.com/gfwlist +server=/javtag.net/127.0.0.1#5335 +ipset=/javtag.net/gfwlist +server=/volvotrucks.pl/127.0.0.1#5335 +ipset=/volvotrucks.pl/gfwlist +server=/epochtimes.fr/127.0.0.1#5335 +ipset=/epochtimes.fr/gfwlist +server=/freedirecttvspecial.com/127.0.0.1#5335 +ipset=/freedirecttvspecial.com/gfwlist +server=/freematuresgallery.com/127.0.0.1#5335 +ipset=/freematuresgallery.com/gfwlist +server=/iina.io/127.0.0.1#5335 +ipset=/iina.io/gfwlist +server=/foxnewspolitics.com/127.0.0.1#5335 +ipset=/foxnewspolitics.com/gfwlist +server=/zb.io/127.0.0.1#5335 +ipset=/zb.io/gfwlist +server=/hotgirlsclips.com/127.0.0.1#5335 +ipset=/hotgirlsclips.com/gfwlist +server=/foxd.tv/127.0.0.1#5335 +ipset=/foxd.tv/gfwlist +server=/forthethrone.com/127.0.0.1#5335 +ipset=/forthethrone.com/gfwlist +server=/visualstudio.net/127.0.0.1#5335 +ipset=/visualstudio.net/gfwlist +server=/conda.io/127.0.0.1#5335 +ipset=/conda.io/gfwlist +server=/xvideo.vlog.br/127.0.0.1#5335 +ipset=/xvideo.vlog.br/gfwlist +server=/nordstrom.com/127.0.0.1#5335 +ipset=/nordstrom.com/gfwlist +server=/vipheadphones.com/127.0.0.1#5335 +ipset=/vipheadphones.com/gfwlist +server=/premiumpornlist.com/127.0.0.1#5335 +ipset=/premiumpornlist.com/gfwlist +server=/hpprintersupplies.com/127.0.0.1#5335 +ipset=/hpprintersupplies.com/gfwlist +server=/intel.tw/127.0.0.1#5335 +ipset=/intel.tw/gfwlist +server=/freeteenporn.xxx/127.0.0.1#5335 +ipset=/freeteenporn.xxx/gfwlist +server=/1lib.to/127.0.0.1#5335 +ipset=/1lib.to/gfwlist +server=/thomsonreuters.com.pe/127.0.0.1#5335 +ipset=/thomsonreuters.com.pe/gfwlist +server=/freesitexxx.com/127.0.0.1#5335 +ipset=/freesitexxx.com/gfwlist +server=/hcaptcha.com/127.0.0.1#5335 +ipset=/hcaptcha.com/gfwlist +server=/oculusdiving.com/127.0.0.1#5335 +ipset=/oculusdiving.com/gfwlist +server=/pearsonschoolsandfecolleges.co.uk/127.0.0.1#5335 +ipset=/pearsonschoolsandfecolleges.co.uk/gfwlist +server=/beatsdreoutletsale.com/127.0.0.1#5335 +ipset=/beatsdreoutletsale.com/gfwlist +server=/demoprint.com/127.0.0.1#5335 +ipset=/demoprint.com/gfwlist +server=/v.gd/127.0.0.1#5335 +ipset=/v.gd/gfwlist +server=/huluqa.com/127.0.0.1#5335 +ipset=/huluqa.com/gfwlist +server=/casquesbeatsaudio.com/127.0.0.1#5335 +ipset=/casquesbeatsaudio.com/gfwlist +server=/onlyleaks.me/127.0.0.1#5335 +ipset=/onlyleaks.me/gfwlist +server=/sextubeset.com/127.0.0.1#5335 +ipset=/sextubeset.com/gfwlist +server=/youtube.by/127.0.0.1#5335 +ipset=/youtube.by/gfwlist +server=/family-simulator.io/127.0.0.1#5335 +ipset=/family-simulator.io/gfwlist +server=/tktube.com/127.0.0.1#5335 +ipset=/tktube.com/gfwlist +server=/freesexalbum.com/127.0.0.1#5335 +ipset=/freesexalbum.com/gfwlist +server=/casquemonsterbeatsbydre2013.com/127.0.0.1#5335 +ipset=/casquemonsterbeatsbydre2013.com/gfwlist +server=/kinkypeepz.com/127.0.0.1#5335 +ipset=/kinkypeepz.com/gfwlist +server=/video01.org/127.0.0.1#5335 +ipset=/video01.org/gfwlist +server=/asme.org/127.0.0.1#5335 +ipset=/asme.org/gfwlist +server=/yeyuehuachao11.com/127.0.0.1#5335 +ipset=/yeyuehuachao11.com/gfwlist +server=/shopbydre.com/127.0.0.1#5335 +ipset=/shopbydre.com/gfwlist +server=/erosberry.com/127.0.0.1#5335 +ipset=/erosberry.com/gfwlist +server=/intel.nl/127.0.0.1#5335 +ipset=/intel.nl/gfwlist +server=/bingapistatistics.com/127.0.0.1#5335 +ipset=/bingapistatistics.com/gfwlist +server=/seaofsolitude.com/127.0.0.1#5335 +ipset=/seaofsolitude.com/gfwlist +server=/6mature9.com/127.0.0.1#5335 +ipset=/6mature9.com/gfwlist +server=/besterpornos.com/127.0.0.1#5335 +ipset=/besterpornos.com/gfwlist +server=/gosq.co/127.0.0.1#5335 +ipset=/gosq.co/gfwlist +server=/aapl.tw/127.0.0.1#5335 +ipset=/aapl.tw/gfwlist +server=/truyengihay.net/127.0.0.1#5335 +ipset=/truyengihay.net/gfwlist +server=/sankei-kurashi.com/127.0.0.1#5335 +ipset=/sankei-kurashi.com/gfwlist +server=/hpindigopress.com/127.0.0.1#5335 +ipset=/hpindigopress.com/gfwlist +server=/bmw.fr/127.0.0.1#5335 +ipset=/bmw.fr/gfwlist +server=/msauth.net/127.0.0.1#5335 +ipset=/msauth.net/gfwlist +server=/activelearnprimary.co.uk/127.0.0.1#5335 +ipset=/activelearnprimary.co.uk/gfwlist +server=/dell-brand.com/127.0.0.1#5335 +ipset=/dell-brand.com/gfwlist +server=/championshipseriesleague.com/127.0.0.1#5335 +ipset=/championshipseriesleague.com/gfwlist +server=/bmw.com.sv/127.0.0.1#5335 +ipset=/bmw.com.sv/gfwlist +server=/spankbang.com/127.0.0.1#5335 +ipset=/spankbang.com/gfwlist +server=/shemaletube.pro/127.0.0.1#5335 +ipset=/shemaletube.pro/gfwlist +server=/needforspeedundergroundeast.com/127.0.0.1#5335 +ipset=/needforspeedundergroundeast.com/gfwlist +server=/sslpaypal.org/127.0.0.1#5335 +ipset=/sslpaypal.org/gfwlist +server=/etnet.com.hk/127.0.0.1#5335 +ipset=/etnet.com.hk/gfwlist +server=/beatsdrenewcolorful4usale.com/127.0.0.1#5335 +ipset=/beatsdrenewcolorful4usale.com/gfwlist +server=/facebooe.com/127.0.0.1#5335 +ipset=/facebooe.com/gfwlist +server=/uxxxporn.com/127.0.0.1#5335 +ipset=/uxxxporn.com/gfwlist +server=/dkbeatsbydre.com/127.0.0.1#5335 +ipset=/dkbeatsbydre.com/gfwlist +server=/dldshare.net/127.0.0.1#5335 +ipset=/dldshare.net/gfwlist +server=/coomer.party/127.0.0.1#5335 +ipset=/coomer.party/gfwlist +server=/google.sn/127.0.0.1#5335 +ipset=/google.sn/gfwlist +server=/beats-bydrestore.com/127.0.0.1#5335 +ipset=/beats-bydrestore.com/gfwlist +server=/cherrypornhd.com/127.0.0.1#5335 +ipset=/cherrypornhd.com/gfwlist +server=/seemyporn.com/127.0.0.1#5335 +ipset=/seemyporn.com/gfwlist +server=/blogspot.rs/127.0.0.1#5335 +ipset=/blogspot.rs/gfwlist +server=/bridgestonecomercial.com.br/127.0.0.1#5335 +ipset=/bridgestonecomercial.com.br/gfwlist +server=/dualeotruyen1s.com/127.0.0.1#5335 +ipset=/dualeotruyen1s.com/gfwlist +server=/tail-f.com/127.0.0.1#5335 +ipset=/tail-f.com/gfwlist +server=/sexxxx.rodeo/127.0.0.1#5335 +ipset=/sexxxx.rodeo/gfwlist +server=/bromo.com/127.0.0.1#5335 +ipset=/bromo.com/gfwlist +server=/yogalayout.com/127.0.0.1#5335 +ipset=/yogalayout.com/gfwlist +server=/hornygamer.com/127.0.0.1#5335 +ipset=/hornygamer.com/gfwlist +server=/jiuzhouyihuo.com/127.0.0.1#5335 +ipset=/jiuzhouyihuo.com/gfwlist +server=/parstream.net/127.0.0.1#5335 +ipset=/parstream.net/gfwlist +server=/xlinkz.to/127.0.0.1#5335 +ipset=/xlinkz.to/gfwlist +server=/mini-connected.nl/127.0.0.1#5335 +ipset=/mini-connected.nl/gfwlist +server=/indianpornfast.com/127.0.0.1#5335 +ipset=/indianpornfast.com/gfwlist +server=/drdrebeatsbillig.com/127.0.0.1#5335 +ipset=/drdrebeatsbillig.com/gfwlist +server=/youtube.co.kr/127.0.0.1#5335 +ipset=/youtube.co.kr/gfwlist +server=/vfsco.it/127.0.0.1#5335 +ipset=/vfsco.it/gfwlist +server=/openweave.io/127.0.0.1#5335 +ipset=/openweave.io/gfwlist +server=/xapplist.com/127.0.0.1#5335 +ipset=/xapplist.com/gfwlist +server=/shopee.tw/127.0.0.1#5335 +ipset=/shopee.tw/gfwlist +server=/beatsbydrestorevip.com/127.0.0.1#5335 +ipset=/beatsbydrestorevip.com/gfwlist +server=/garena.com/127.0.0.1#5335 +ipset=/garena.com/gfwlist +server=/bmw.bg/127.0.0.1#5335 +ipset=/bmw.bg/gfwlist +server=/gearspop.com/127.0.0.1#5335 +ipset=/gearspop.com/gfwlist +server=/fire-emblem-heroes.com/127.0.0.1#5335 +ipset=/fire-emblem-heroes.com/gfwlist +server=/exoticuganda.com/127.0.0.1#5335 +ipset=/exoticuganda.com/gfwlist +server=/europepmc.org/127.0.0.1#5335 +ipset=/europepmc.org/gfwlist +server=/toon-3d.com/127.0.0.1#5335 +ipset=/toon-3d.com/gfwlist +server=/miniwidget.ca/127.0.0.1#5335 +ipset=/miniwidget.ca/gfwlist +server=/alchemysynth.com/127.0.0.1#5335 +ipset=/alchemysynth.com/gfwlist +server=/mini.am/127.0.0.1#5335 +ipset=/mini.am/gfwlist +server=/reaxys.com/127.0.0.1#5335 +ipset=/reaxys.com/gfwlist +server=/mini-connected.at/127.0.0.1#5335 +ipset=/mini-connected.at/gfwlist +server=/ebaybags.com/127.0.0.1#5335 +ipset=/ebaybags.com/gfwlist +server=/appleone.space/127.0.0.1#5335 +ipset=/appleone.space/gfwlist +server=/yamaxun.com/127.0.0.1#5335 +ipset=/yamaxun.com/gfwlist +server=/briantreepayments.net/127.0.0.1#5335 +ipset=/briantreepayments.net/gfwlist +server=/developria.com/127.0.0.1#5335 +ipset=/developria.com/gfwlist +server=/kali.org/127.0.0.1#5335 +ipset=/kali.org/gfwlist +server=/amazonlaunchpad.com/127.0.0.1#5335 +ipset=/amazonlaunchpad.com/gfwlist +server=/headphonessupply.com/127.0.0.1#5335 +ipset=/headphonessupply.com/gfwlist +server=/icloudos.de/127.0.0.1#5335 +ipset=/icloudos.de/gfwlist +server=/influencersgonewild.com/127.0.0.1#5335 +ipset=/influencersgonewild.com/gfwlist +server=/one889.app/127.0.0.1#5335 +ipset=/one889.app/gfwlist +server=/city-hentai.com/127.0.0.1#5335 +ipset=/city-hentai.com/gfwlist +server=/poweredbyintel.com/127.0.0.1#5335 +ipset=/poweredbyintel.com/gfwlist +server=/brightcove.imgix.net/127.0.0.1#5335 +ipset=/brightcove.imgix.net/gfwlist +server=/sb-mobile.jp/127.0.0.1#5335 +ipset=/sb-mobile.jp/gfwlist +server=/aerogardcn.com/127.0.0.1#5335 +ipset=/aerogardcn.com/gfwlist +server=/beatsbydrespeakers.com/127.0.0.1#5335 +ipset=/beatsbydrespeakers.com/gfwlist +server=/serbiporno.net/127.0.0.1#5335 +ipset=/serbiporno.net/gfwlist +server=/volvotrucks.co.nz/127.0.0.1#5335 +ipset=/volvotrucks.co.nz/gfwlist +server=/chuporno.com/127.0.0.1#5335 +ipset=/chuporno.com/gfwlist +server=/gooddaychicago.com/127.0.0.1#5335 +ipset=/gooddaychicago.com/gfwlist +server=/bestbuysolutions.net/127.0.0.1#5335 +ipset=/bestbuysolutions.net/gfwlist +server=/valoryirene.com/127.0.0.1#5335 +ipset=/valoryirene.com/gfwlist +server=/shp.ee/127.0.0.1#5335 +ipset=/shp.ee/gfwlist +server=/javpush.com/127.0.0.1#5335 +ipset=/javpush.com/gfwlist +server=/bnetcmsus-a.akamaihd.net/127.0.0.1#5335 +ipset=/bnetcmsus-a.akamaihd.net/gfwlist +server=/hot-arab-films.com/127.0.0.1#5335 +ipset=/hot-arab-films.com/gfwlist +server=/clipsbai.com/127.0.0.1#5335 +ipset=/clipsbai.com/gfwlist +server=/capitaliq.com/127.0.0.1#5335 +ipset=/capitaliq.com/gfwlist +server=/ciscojabbervideo.net/127.0.0.1#5335 +ipset=/ciscojabbervideo.net/gfwlist +server=/bokep.net/127.0.0.1#5335 +ipset=/bokep.net/gfwlist +server=/mini.lu/127.0.0.1#5335 +ipset=/mini.lu/gfwlist +server=/qmap.pub/127.0.0.1#5335 +ipset=/qmap.pub/gfwlist +server=/booksc.eu/127.0.0.1#5335 +ipset=/booksc.eu/gfwlist +server=/nesaporn.mobi/127.0.0.1#5335 +ipset=/nesaporn.mobi/gfwlist +server=/softbankventuresasia.com/127.0.0.1#5335 +ipset=/softbankventuresasia.com/gfwlist +server=/pinterest.ca/127.0.0.1#5335 +ipset=/pinterest.ca/gfwlist +server=/69loli.com/127.0.0.1#5335 +ipset=/69loli.com/gfwlist +server=/yahoo.co.il/127.0.0.1#5335 +ipset=/yahoo.co.il/gfwlist +server=/squarecdn.com/127.0.0.1#5335 +ipset=/squarecdn.com/gfwlist +server=/identrust.net/127.0.0.1#5335 +ipset=/identrust.net/gfwlist +server=/booth.pm/127.0.0.1#5335 +ipset=/booth.pm/gfwlist +server=/canon.bg/127.0.0.1#5335 +ipset=/canon.bg/gfwlist +server=/appleenews.com/127.0.0.1#5335 +ipset=/appleenews.com/gfwlist +server=/mult34.com/127.0.0.1#5335 +ipset=/mult34.com/gfwlist +server=/google.ml/127.0.0.1#5335 +ipset=/google.ml/gfwlist +server=/tomonews.net/127.0.0.1#5335 +ipset=/tomonews.net/gfwlist +server=/imagepost.com/127.0.0.1#5335 +ipset=/imagepost.com/gfwlist +server=/custom-iphonecase.com/127.0.0.1#5335 +ipset=/custom-iphonecase.com/gfwlist +server=/hgsacx.com/127.0.0.1#5335 +ipset=/hgsacx.com/gfwlist +server=/myfoxdc.com/127.0.0.1#5335 +ipset=/myfoxdc.com/gfwlist +server=/youtube.com.do/127.0.0.1#5335 +ipset=/youtube.com.do/gfwlist +server=/foxnetworks.info/127.0.0.1#5335 +ipset=/foxnetworks.info/gfwlist +server=/phimsexnhanh.club/127.0.0.1#5335 +ipset=/phimsexnhanh.club/gfwlist +server=/porndudecasting.com/127.0.0.1#5335 +ipset=/porndudecasting.com/gfwlist +server=/xecce.com/127.0.0.1#5335 +ipset=/xecce.com/gfwlist +server=/euroipad.com/127.0.0.1#5335 +ipset=/euroipad.com/gfwlist +server=/touchid.wang/127.0.0.1#5335 +ipset=/touchid.wang/gfwlist +server=/bitly.is/127.0.0.1#5335 +ipset=/bitly.is/gfwlist +server=/kyodoimages.jp/127.0.0.1#5335 +ipset=/kyodoimages.jp/gfwlist +server=/sweetsinner.com/127.0.0.1#5335 +ipset=/sweetsinner.com/gfwlist +server=/ekhindi.com/127.0.0.1#5335 +ipset=/ekhindi.com/gfwlist +server=/epoch.cloud/127.0.0.1#5335 +ipset=/epoch.cloud/gfwlist +server=/friendbook.info/127.0.0.1#5335 +ipset=/friendbook.info/gfwlist +server=/thisismoney.co.uk/127.0.0.1#5335 +ipset=/thisismoney.co.uk/gfwlist +server=/google.it/127.0.0.1#5335 +ipset=/google.it/gfwlist +server=/yahoo.com.pr/127.0.0.1#5335 +ipset=/yahoo.com.pr/gfwlist +server=/thesafeporn.com/127.0.0.1#5335 +ipset=/thesafeporn.com/gfwlist +server=/gayasianamateurs.com/127.0.0.1#5335 +ipset=/gayasianamateurs.com/gfwlist +server=/youtube.kr/127.0.0.1#5335 +ipset=/youtube.kr/gfwlist +server=/shegg.com/127.0.0.1#5335 +ipset=/shegg.com/gfwlist +server=/muse.jhu.edu/127.0.0.1#5335 +ipset=/muse.jhu.edu/gfwlist +server=/luoli.info/127.0.0.1#5335 +ipset=/luoli.info/gfwlist +server=/directvsavings.com/127.0.0.1#5335 +ipset=/directvsavings.com/gfwlist +server=/hddgames.cc/127.0.0.1#5335 +ipset=/hddgames.cc/gfwlist +server=/ebay.com.ph/127.0.0.1#5335 +ipset=/ebay.com.ph/gfwlist +server=/indianpornvideos2.com/127.0.0.1#5335 +ipset=/indianpornvideos2.com/gfwlist +server=/cortanaanalytics.com/127.0.0.1#5335 +ipset=/cortanaanalytics.com/gfwlist +server=/thelegendarystarfy.com/127.0.0.1#5335 +ipset=/thelegendarystarfy.com/gfwlist +server=/gogole.com/127.0.0.1#5335 +ipset=/gogole.com/gfwlist +server=/kodi.tv/127.0.0.1#5335 +ipset=/kodi.tv/gfwlist +server=/xxxtubeset.com/127.0.0.1#5335 +ipset=/xxxtubeset.com/gfwlist +server=/blackstonespoliceservice.com/127.0.0.1#5335 +ipset=/blackstonespoliceservice.com/gfwlist +server=/usercontent.dev/127.0.0.1#5335 +ipset=/usercontent.dev/gfwlist +server=/outbound.io/127.0.0.1#5335 +ipset=/outbound.io/gfwlist +server=/applefilmaker.com/127.0.0.1#5335 +ipset=/applefilmaker.com/gfwlist +server=/wofl.tv/127.0.0.1#5335 +ipset=/wofl.tv/gfwlist +server=/sexmodel.wordpress.com/127.0.0.1#5335 +ipset=/sexmodel.wordpress.com/gfwlist +server=/instagran.com/127.0.0.1#5335 +ipset=/instagran.com/gfwlist +server=/yandex.de/127.0.0.1#5335 +ipset=/yandex.de/gfwlist +server=/beatsdre-monster.com/127.0.0.1#5335 +ipset=/beatsdre-monster.com/gfwlist +server=/xxx2023.com/127.0.0.1#5335 +ipset=/xxx2023.com/gfwlist +server=/steamcontent.com/127.0.0.1#5335 +ipset=/steamcontent.com/gfwlist +server=/certinomis.fr/127.0.0.1#5335 +ipset=/certinomis.fr/gfwlist +server=/javtrust.com/127.0.0.1#5335 +ipset=/javtrust.com/gfwlist +server=/topanime.biz/127.0.0.1#5335 +ipset=/topanime.biz/gfwlist +server=/hentaiseason.com/127.0.0.1#5335 +ipset=/hentaiseason.com/gfwlist +server=/bestiality.guru/127.0.0.1#5335 +ipset=/bestiality.guru/gfwlist +server=/cheapmonsterbeatssale.com/127.0.0.1#5335 +ipset=/cheapmonsterbeatssale.com/gfwlist +server=/paypal-innovationlab.com/127.0.0.1#5335 +ipset=/paypal-innovationlab.com/gfwlist +server=/shields.io/127.0.0.1#5335 +ipset=/shields.io/gfwlist +server=/bmwstartupgarage.com/127.0.0.1#5335 +ipset=/bmwstartupgarage.com/gfwlist +server=/avstar05.me/127.0.0.1#5335 +ipset=/avstar05.me/gfwlist +server=/zuckerberg.net/127.0.0.1#5335 +ipset=/zuckerberg.net/gfwlist +server=/jwt.ms/127.0.0.1#5335 +ipset=/jwt.ms/gfwlist +server=/ebay.be/127.0.0.1#5335 +ipset=/ebay.be/gfwlist +server=/intel.de/127.0.0.1#5335 +ipset=/intel.de/gfwlist +server=/pornoitaliano.com/127.0.0.1#5335 +ipset=/pornoitaliano.com/gfwlist +server=/leaguoflegends.com/127.0.0.1#5335 +ipset=/leaguoflegends.com/gfwlist +server=/chatsex.xxx/127.0.0.1#5335 +ipset=/chatsex.xxx/gfwlist +server=/sharmota.com/127.0.0.1#5335 +ipset=/sharmota.com/gfwlist +server=/vfsco.us/127.0.0.1#5335 +ipset=/vfsco.us/gfwlist +server=/ieee-vics.org/127.0.0.1#5335 +ipset=/ieee-vics.org/gfwlist +server=/minilangley.com/127.0.0.1#5335 +ipset=/minilangley.com/gfwlist +server=/raponlinereview.com/127.0.0.1#5335 +ipset=/raponlinereview.com/gfwlist +server=/volvobuses.com/127.0.0.1#5335 +ipset=/volvobuses.com/gfwlist +server=/over18arcade.com/127.0.0.1#5335 +ipset=/over18arcade.com/gfwlist +server=/fsdn.com/127.0.0.1#5335 +ipset=/fsdn.com/gfwlist +server=/googledomains.com/127.0.0.1#5335 +ipset=/googledomains.com/gfwlist +server=/yeswegays.com/127.0.0.1#5335 +ipset=/yeswegays.com/gfwlist +server=/swisssign-group.li/127.0.0.1#5335 +ipset=/swisssign-group.li/gfwlist +server=/msdn.com/127.0.0.1#5335 +ipset=/msdn.com/gfwlist +server=/nbyy.tv/127.0.0.1#5335 +ipset=/nbyy.tv/gfwlist +server=/simplifycommerce.com/127.0.0.1#5335 +ipset=/simplifycommerce.com/gfwlist +server=/espn.hb.omtrdc.net/127.0.0.1#5335 +ipset=/espn.hb.omtrdc.net/gfwlist +server=/hentaitube.online/127.0.0.1#5335 +ipset=/hentaitube.online/gfwlist +server=/nextstop.com/127.0.0.1#5335 +ipset=/nextstop.com/gfwlist +server=/niosii.com/127.0.0.1#5335 +ipset=/niosii.com/gfwlist +server=/adultgamestop.com/127.0.0.1#5335 +ipset=/adultgamestop.com/gfwlist +server=/apple.ee/127.0.0.1#5335 +ipset=/apple.ee/gfwlist +server=/live-patreon-marketing.pantheonsite.io/127.0.0.1#5335 +ipset=/live-patreon-marketing.pantheonsite.io/gfwlist +server=/alphera-finance.in/127.0.0.1#5335 +ipset=/alphera-finance.in/gfwlist +server=/youtubemobilesupport.com/127.0.0.1#5335 +ipset=/youtubemobilesupport.com/gfwlist +server=/thepornbet.com/127.0.0.1#5335 +ipset=/thepornbet.com/gfwlist +server=/galaxymobile.jp/127.0.0.1#5335 +ipset=/galaxymobile.jp/gfwlist +server=/volvobuses.fi/127.0.0.1#5335 +ipset=/volvobuses.fi/gfwlist +server=/masaladesi.com/127.0.0.1#5335 +ipset=/masaladesi.com/gfwlist +server=/redlightcenter.com/127.0.0.1#5335 +ipset=/redlightcenter.com/gfwlist +server=/disneystreaming.com/127.0.0.1#5335 +ipset=/disneystreaming.com/gfwlist +server=/xerotica.com/127.0.0.1#5335 +ipset=/xerotica.com/gfwlist +server=/ikea.ee/127.0.0.1#5335 +ipset=/ikea.ee/gfwlist +server=/k8s.io/127.0.0.1#5335 +ipset=/k8s.io/gfwlist +server=/blogblog.com/127.0.0.1#5335 +ipset=/blogblog.com/gfwlist +server=/ekolojik.org/127.0.0.1#5335 +ipset=/ekolojik.org/gfwlist +server=/facebgook.com/127.0.0.1#5335 +ipset=/facebgook.com/gfwlist +server=/beatsshop-uk.com/127.0.0.1#5335 +ipset=/beatsshop-uk.com/gfwlist +server=/camsvids.tv/127.0.0.1#5335 +ipset=/camsvids.tv/gfwlist +server=/jetfuelapp.com/127.0.0.1#5335 +ipset=/jetfuelapp.com/gfwlist +server=/gsccdn.com/127.0.0.1#5335 +ipset=/gsccdn.com/gfwlist +server=/attdns.com/127.0.0.1#5335 +ipset=/attdns.com/gfwlist +server=/vmwareemeablog.com/127.0.0.1#5335 +ipset=/vmwareemeablog.com/gfwlist +server=/bmw-product-highlights.com/127.0.0.1#5335 +ipset=/bmw-product-highlights.com/gfwlist +server=/vscode.search.windows.net/127.0.0.1#5335 +ipset=/vscode.search.windows.net/gfwlist +server=/jizzboom.com/127.0.0.1#5335 +ipset=/jizzboom.com/gfwlist +server=/whatsapp.org/127.0.0.1#5335 +ipset=/whatsapp.org/gfwlist +server=/netflixdnstest10.com/127.0.0.1#5335 +ipset=/netflixdnstest10.com/gfwlist +server=/toprealvideos.com/127.0.0.1#5335 +ipset=/toprealvideos.com/gfwlist +server=/needforspeedredline.com/127.0.0.1#5335 +ipset=/needforspeedredline.com/gfwlist +server=/bmw.pl/127.0.0.1#5335 +ipset=/bmw.pl/gfwlist +server=/dvdstudiopro.net/127.0.0.1#5335 +ipset=/dvdstudiopro.net/gfwlist +server=/qt.io/127.0.0.1#5335 +ipset=/qt.io/gfwlist +server=/boltdns.net/127.0.0.1#5335 +ipset=/boltdns.net/gfwlist +server=/mastercard.az/127.0.0.1#5335 +ipset=/mastercard.az/gfwlist +server=/porndork.com/127.0.0.1#5335 +ipset=/porndork.com/gfwlist +server=/asahi.com/127.0.0.1#5335 +ipset=/asahi.com/gfwlist +server=/vimeostatus.com/127.0.0.1#5335 +ipset=/vimeostatus.com/gfwlist +server=/omg.adult/127.0.0.1#5335 +ipset=/omg.adult/gfwlist +server=/amateurslovesporn.com/127.0.0.1#5335 +ipset=/amateurslovesporn.com/gfwlist +server=/googlefinland.com/127.0.0.1#5335 +ipset=/googlefinland.com/gfwlist +server=/shellcheck.net/127.0.0.1#5335 +ipset=/shellcheck.net/gfwlist +server=/volvotrucks.co.zm/127.0.0.1#5335 +ipset=/volvotrucks.co.zm/gfwlist +server=/attalascom.com/127.0.0.1#5335 +ipset=/attalascom.com/gfwlist +server=/discord.store/127.0.0.1#5335 +ipset=/discord.store/gfwlist +server=/angulardart.org/127.0.0.1#5335 +ipset=/angulardart.org/gfwlist +server=/cybertrust.co.jp/127.0.0.1#5335 +ipset=/cybertrust.co.jp/gfwlist +server=/mini-jordan.com/127.0.0.1#5335 +ipset=/mini-jordan.com/gfwlist +server=/tandberg.com/127.0.0.1#5335 +ipset=/tandberg.com/gfwlist +server=/tryrating.com/127.0.0.1#5335 +ipset=/tryrating.com/gfwlist +server=/hpbestbuy.com/127.0.0.1#5335 +ipset=/hpbestbuy.com/gfwlist +server=/familyporn.tv/127.0.0.1#5335 +ipset=/familyporn.tv/gfwlist +server=/axios.com/127.0.0.1#5335 +ipset=/axios.com/gfwlist +server=/pornodanke.com/127.0.0.1#5335 +ipset=/pornodanke.com/gfwlist +server=/imacsources.com/127.0.0.1#5335 +ipset=/imacsources.com/gfwlist +server=/insidefilms.com/127.0.0.1#5335 +ipset=/insidefilms.com/gfwlist +server=/camwhoreshd.com/127.0.0.1#5335 +ipset=/camwhoreshd.com/gfwlist +server=/gwiki.net/127.0.0.1#5335 +ipset=/gwiki.net/gfwlist +server=/epochmediagroup.com/127.0.0.1#5335 +ipset=/epochmediagroup.com/gfwlist +server=/ebayenterprise.net/127.0.0.1#5335 +ipset=/ebayenterprise.net/gfwlist +server=/hentaisub.info/127.0.0.1#5335 +ipset=/hentaisub.info/gfwlist +server=/cheapbeatsbydremall.com/127.0.0.1#5335 +ipset=/cheapbeatsbydremall.com/gfwlist +server=/muji.com/127.0.0.1#5335 +ipset=/muji.com/gfwlist +server=/macbookair.com.es/127.0.0.1#5335 +ipset=/macbookair.com.es/gfwlist +server=/iphone5.com/127.0.0.1#5335 +ipset=/iphone5.com/gfwlist +server=/rolsociety.org/127.0.0.1#5335 +ipset=/rolsociety.org/gfwlist +server=/digitalplayground.com/127.0.0.1#5335 +ipset=/digitalplayground.com/gfwlist +server=/2371tom.com/127.0.0.1#5335 +ipset=/2371tom.com/gfwlist +server=/google.mv/127.0.0.1#5335 +ipset=/google.mv/gfwlist +server=/apkpure.com/127.0.0.1#5335 +ipset=/apkpure.com/gfwlist +server=/fotolja.com/127.0.0.1#5335 +ipset=/fotolja.com/gfwlist +server=/nintendo-europe-sales.com/127.0.0.1#5335 +ipset=/nintendo-europe-sales.com/gfwlist +server=/jav-vr.net/127.0.0.1#5335 +ipset=/jav-vr.net/gfwlist +server=/updatetube.com/127.0.0.1#5335 +ipset=/updatetube.com/gfwlist +server=/kindleoasis.jp/127.0.0.1#5335 +ipset=/kindleoasis.jp/gfwlist +server=/durex.es/127.0.0.1#5335 +ipset=/durex.es/gfwlist +server=/nikeshoesinc.com/127.0.0.1#5335 +ipset=/nikeshoesinc.com/gfwlist +server=/getdropbox.com/127.0.0.1#5335 +ipset=/getdropbox.com/gfwlist +server=/bastillepost.com/127.0.0.1#5335 +ipset=/bastillepost.com/gfwlist +server=/ikea.ch/127.0.0.1#5335 +ipset=/ikea.ch/gfwlist +server=/ikea.gr/127.0.0.1#5335 +ipset=/ikea.gr/gfwlist +server=/camster.com/127.0.0.1#5335 +ipset=/camster.com/gfwlist +server=/trueanal.com/127.0.0.1#5335 +ipset=/trueanal.com/gfwlist +server=/foxsports.pe/127.0.0.1#5335 +ipset=/foxsports.pe/gfwlist +server=/milta1980.co.uk/127.0.0.1#5335 +ipset=/milta1980.co.uk/gfwlist +server=/indiangirlsclub.com/127.0.0.1#5335 +ipset=/indiangirlsclub.com/gfwlist +server=/justswallows.com/127.0.0.1#5335 +ipset=/justswallows.com/gfwlist +server=/bmw-motorrad.co/127.0.0.1#5335 +ipset=/bmw-motorrad.co/gfwlist +server=/google.hu/127.0.0.1#5335 +ipset=/google.hu/gfwlist +server=/sissy-university.com/127.0.0.1#5335 +ipset=/sissy-university.com/gfwlist +server=/bmw-connecteddrive.ru/127.0.0.1#5335 +ipset=/bmw-connecteddrive.ru/gfwlist +server=/hkbnes.net/127.0.0.1#5335 +ipset=/hkbnes.net/gfwlist +server=/hdouban.com/127.0.0.1#5335 +ipset=/hdouban.com/gfwlist +server=/dogspics.net/127.0.0.1#5335 +ipset=/dogspics.net/gfwlist +server=/avpanda.cc/127.0.0.1#5335 +ipset=/avpanda.cc/gfwlist +server=/oxfordwesternmusic.com/127.0.0.1#5335 +ipset=/oxfordwesternmusic.com/gfwlist +server=/disney.asia/127.0.0.1#5335 +ipset=/disney.asia/gfwlist +server=/scholar.google.com.au/127.0.0.1#5335 +ipset=/scholar.google.com.au/gfwlist +server=/bmw-museum.com/127.0.0.1#5335 +ipset=/bmw-museum.com/gfwlist +server=/foxgay.com/127.0.0.1#5335 +ipset=/foxgay.com/gfwlist +server=/gfpics.com/127.0.0.1#5335 +ipset=/gfpics.com/gfwlist +server=/vmwlabconnect.com/127.0.0.1#5335 +ipset=/vmwlabconnect.com/gfwlist +server=/indiansexpussy.com/127.0.0.1#5335 +ipset=/indiansexpussy.com/gfwlist +server=/t21ipau.nikkei.co.jp/127.0.0.1#5335 +ipset=/t21ipau.nikkei.co.jp/gfwlist +server=/kyodo-d.info/127.0.0.1#5335 +ipset=/kyodo-d.info/gfwlist +server=/qwant.it/127.0.0.1#5335 +ipset=/qwant.it/gfwlist +server=/ebay-cz.com/127.0.0.1#5335 +ipset=/ebay-cz.com/gfwlist +server=/mariadb.org/127.0.0.1#5335 +ipset=/mariadb.org/gfwlist +server=/mat6tube.com/127.0.0.1#5335 +ipset=/mat6tube.com/gfwlist +server=/acmvalidationsaws.com/127.0.0.1#5335 +ipset=/acmvalidationsaws.com/gfwlist +server=/hkbigman.net/127.0.0.1#5335 +ipset=/hkbigman.net/gfwlist +server=/beatsbydreheadphones-nz.com/127.0.0.1#5335 +ipset=/beatsbydreheadphones-nz.com/gfwlist +server=/scala-sbt.org/127.0.0.1#5335 +ipset=/scala-sbt.org/gfwlist +server=/appleiphone.net/127.0.0.1#5335 +ipset=/appleiphone.net/gfwlist +server=/3animalsextube.com/127.0.0.1#5335 +ipset=/3animalsextube.com/gfwlist +server=/macintoshsoftware.com/127.0.0.1#5335 +ipset=/macintoshsoftware.com/gfwlist +server=/onlyhentaistuff.com/127.0.0.1#5335 +ipset=/onlyhentaistuff.com/gfwlist +server=/sharizelvideos.com/127.0.0.1#5335 +ipset=/sharizelvideos.com/gfwlist +server=/indianporngirls.com/127.0.0.1#5335 +ipset=/indianporngirls.com/gfwlist +server=/scholar.google.lt/127.0.0.1#5335 +ipset=/scholar.google.lt/gfwlist +server=/minicaribbean.com/127.0.0.1#5335 +ipset=/minicaribbean.com/gfwlist +server=/vfsco.ch/127.0.0.1#5335 +ipset=/vfsco.ch/gfwlist +server=/javhard.org/127.0.0.1#5335 +ipset=/javhard.org/gfwlist +server=/adidas.ru/127.0.0.1#5335 +ipset=/adidas.ru/gfwlist +server=/yourfantasybeginsnow.com/127.0.0.1#5335 +ipset=/yourfantasybeginsnow.com/gfwlist +server=/milfpornpics.xxx/127.0.0.1#5335 +ipset=/milfpornpics.xxx/gfwlist +server=/mickey.tv/127.0.0.1#5335 +ipset=/mickey.tv/gfwlist +server=/bmw-diplomatic-sales.com/127.0.0.1#5335 +ipset=/bmw-diplomatic-sales.com/gfwlist +server=/appleid.hk/127.0.0.1#5335 +ipset=/appleid.hk/gfwlist +server=/paypal-photocard.com/127.0.0.1#5335 +ipset=/paypal-photocard.com/gfwlist +server=/misa-prod.s3.ap-northeast-1.amazonaws.com/127.0.0.1#5335 +ipset=/misa-prod.s3.ap-northeast-1.amazonaws.com/gfwlist +server=/infowars.com/127.0.0.1#5335 +ipset=/infowars.com/gfwlist +server=/lyzsxx.com/127.0.0.1#5335 +ipset=/lyzsxx.com/gfwlist +server=/bsw.jp/127.0.0.1#5335 +ipset=/bsw.jp/gfwlist +server=/4ertik.live/127.0.0.1#5335 +ipset=/4ertik.live/gfwlist +server=/gitlab.net/127.0.0.1#5335 +ipset=/gitlab.net/gfwlist +server=/kissjav.li/127.0.0.1#5335 +ipset=/kissjav.li/gfwlist +server=/kaob3.xyz/127.0.0.1#5335 +ipset=/kaob3.xyz/gfwlist +server=/tblop.com/127.0.0.1#5335 +ipset=/tblop.com/gfwlist +server=/oxfordscholarship.com/127.0.0.1#5335 +ipset=/oxfordscholarship.com/gfwlist +server=/wellmaturetube.com/127.0.0.1#5335 +ipset=/wellmaturetube.com/gfwlist +server=/porkahd.co/127.0.0.1#5335 +ipset=/porkahd.co/gfwlist +server=/strepsils.com.ph/127.0.0.1#5335 +ipset=/strepsils.com.ph/gfwlist +server=/minneapolisbmw.net/127.0.0.1#5335 +ipset=/minneapolisbmw.net/gfwlist +server=/the-japan-news.com/127.0.0.1#5335 +ipset=/the-japan-news.com/gfwlist +server=/pornogramxxx.com/127.0.0.1#5335 +ipset=/pornogramxxx.com/gfwlist +server=/ibb.co/127.0.0.1#5335 +ipset=/ibb.co/gfwlist +server=/nintendo.de/127.0.0.1#5335 +ipset=/nintendo.de/gfwlist +server=/spotifyjobs.com/127.0.0.1#5335 +ipset=/spotifyjobs.com/gfwlist +server=/canon.kz/127.0.0.1#5335 +ipset=/canon.kz/gfwlist +server=/theclyster.com/127.0.0.1#5335 +ipset=/theclyster.com/gfwlist +server=/youtube.ng/127.0.0.1#5335 +ipset=/youtube.ng/gfwlist +server=/ipns.co/127.0.0.1#5335 +ipset=/ipns.co/gfwlist +server=/microsoft.rs/127.0.0.1#5335 +ipset=/microsoft.rs/gfwlist +server=/enemasupplier.com/127.0.0.1#5335 +ipset=/enemasupplier.com/gfwlist +server=/beatsbydrecustomwireless.com/127.0.0.1#5335 +ipset=/beatsbydrecustomwireless.com/gfwlist +server=/google.co.ug/127.0.0.1#5335 +ipset=/google.co.ug/gfwlist +server=/mashaalradio.com/127.0.0.1#5335 +ipset=/mashaalradio.com/gfwlist +server=/wireless.radio/127.0.0.1#5335 +ipset=/wireless.radio/gfwlist +server=/vultr.com/127.0.0.1#5335 +ipset=/vultr.com/gfwlist +server=/nyti.ms/127.0.0.1#5335 +ipset=/nyti.ms/gfwlist +server=/renchead.com/127.0.0.1#5335 +ipset=/renchead.com/gfwlist +server=/azureiotsuite.com/127.0.0.1#5335 +ipset=/azureiotsuite.com/gfwlist +server=/i.jeded.com/127.0.0.1#5335 +ipset=/i.jeded.com/gfwlist +server=/swingers-homemade-videos.com/127.0.0.1#5335 +ipset=/swingers-homemade-videos.com/gfwlist +server=/visamiddleeast.com/127.0.0.1#5335 +ipset=/visamiddleeast.com/gfwlist +server=/banatal3arab.com/127.0.0.1#5335 +ipset=/banatal3arab.com/gfwlist +server=/proxyadult.org/127.0.0.1#5335 +ipset=/proxyadult.org/gfwlist +server=/visaluxuryhotelcollection.com.mx/127.0.0.1#5335 +ipset=/visaluxuryhotelcollection.com.mx/gfwlist +server=/gastrointestinalexam.com/127.0.0.1#5335 +ipset=/gastrointestinalexam.com/gfwlist +server=/imovie.eu/127.0.0.1#5335 +ipset=/imovie.eu/gfwlist +server=/wantmywife.com/127.0.0.1#5335 +ipset=/wantmywife.com/gfwlist +server=/avstar2.com/127.0.0.1#5335 +ipset=/avstar2.com/gfwlist +server=/dawngatechronicles.com/127.0.0.1#5335 +ipset=/dawngatechronicles.com/gfwlist +server=/ohsexotube.com/127.0.0.1#5335 +ipset=/ohsexotube.com/gfwlist +server=/facultyopinions.com/127.0.0.1#5335 +ipset=/facultyopinions.com/gfwlist +server=/azureedge.net/127.0.0.1#5335 +ipset=/azureedge.net/gfwlist +server=/faicbooc.com/127.0.0.1#5335 +ipset=/faicbooc.com/gfwlist +server=/cash.app/127.0.0.1#5335 +ipset=/cash.app/gfwlist +server=/applewatchedition.com/127.0.0.1#5335 +ipset=/applewatchedition.com/gfwlist +server=/filme2.xxx/127.0.0.1#5335 +ipset=/filme2.xxx/gfwlist +server=/dssott.com/127.0.0.1#5335 +ipset=/dssott.com/gfwlist +server=/duckmovie.com/127.0.0.1#5335 +ipset=/duckmovie.com/gfwlist +server=/earpod.net/127.0.0.1#5335 +ipset=/earpod.net/gfwlist +server=/ss7.app/127.0.0.1#5335 +ipset=/ss7.app/gfwlist +server=/ipfs.anonymize.com/127.0.0.1#5335 +ipset=/ipfs.anonymize.com/gfwlist +server=/megapornpics.com/127.0.0.1#5335 +ipset=/megapornpics.com/gfwlist +server=/ipodcleaner.com/127.0.0.1#5335 +ipset=/ipodcleaner.com/gfwlist +server=/facebof.com/127.0.0.1#5335 +ipset=/facebof.com/gfwlist +server=/apyarstorybooks.blogspot.com/127.0.0.1#5335 +ipset=/apyarstorybooks.blogspot.com/gfwlist +server=/activelearnprimary.com.au/127.0.0.1#5335 +ipset=/activelearnprimary.com.au/gfwlist +server=/deepfreeze.tech/127.0.0.1#5335 +ipset=/deepfreeze.tech/gfwlist +server=/swingersexorgy.com/127.0.0.1#5335 +ipset=/swingersexorgy.com/gfwlist +server=/leavinghpinc.com/127.0.0.1#5335 +ipset=/leavinghpinc.com/gfwlist +server=/foampositeshoes.com/127.0.0.1#5335 +ipset=/foampositeshoes.com/gfwlist +server=/pornadoo.com/127.0.0.1#5335 +ipset=/pornadoo.com/gfwlist +server=/ilecture.co.nz/127.0.0.1#5335 +ipset=/ilecture.co.nz/gfwlist +server=/volvotrucks.pe/127.0.0.1#5335 +ipset=/volvotrucks.pe/gfwlist +server=/office.com/127.0.0.1#5335 +ipset=/office.com/gfwlist +server=/pinterestmail.com/127.0.0.1#5335 +ipset=/pinterestmail.com/gfwlist +server=/immoral.jp/127.0.0.1#5335 +ipset=/immoral.jp/gfwlist +server=/visa.com.gt/127.0.0.1#5335 +ipset=/visa.com.gt/gfwlist +server=/bodyandsoul.com.au/127.0.0.1#5335 +ipset=/bodyandsoul.com.au/gfwlist +server=/veet.no/127.0.0.1#5335 +ipset=/veet.no/gfwlist +server=/premiumbooty.com/127.0.0.1#5335 +ipset=/premiumbooty.com/gfwlist +server=/nineteentube.com/127.0.0.1#5335 +ipset=/nineteentube.com/gfwlist +server=/adidas.at/127.0.0.1#5335 +ipset=/adidas.at/gfwlist +server=/saleblackfridaydrebeats.com/127.0.0.1#5335 +ipset=/saleblackfridaydrebeats.com/gfwlist +server=/youtube.mn/127.0.0.1#5335 +ipset=/youtube.mn/gfwlist +server=/paypal-activate.org/127.0.0.1#5335 +ipset=/paypal-activate.org/gfwlist +server=/icloud-isupport.com/127.0.0.1#5335 +ipset=/icloud-isupport.com/gfwlist +server=/south-plus.net/127.0.0.1#5335 +ipset=/south-plus.net/gfwlist +server=/foxsports.com.pe/127.0.0.1#5335 +ipset=/foxsports.com.pe/gfwlist +server=/mydirtyhobby.com/127.0.0.1#5335 +ipset=/mydirtyhobby.com/gfwlist +server=/adultgames18.com/127.0.0.1#5335 +ipset=/adultgames18.com/gfwlist +server=/internetexplorer.co/127.0.0.1#5335 +ipset=/internetexplorer.co/gfwlist +server=/ifontcloud.com/127.0.0.1#5335 +ipset=/ifontcloud.com/gfwlist +server=/strepsils.pt/127.0.0.1#5335 +ipset=/strepsils.pt/gfwlist +server=/darksidemagazine.com/127.0.0.1#5335 +ipset=/darksidemagazine.com/gfwlist +server=/crazyshit.com/127.0.0.1#5335 +ipset=/crazyshit.com/gfwlist +server=/bustymomsvideo.com/127.0.0.1#5335 +ipset=/bustymomsvideo.com/gfwlist +server=/archiveofourown.com/127.0.0.1#5335 +ipset=/archiveofourown.com/gfwlist +server=/kidsnikeshoes.com/127.0.0.1#5335 +ipset=/kidsnikeshoes.com/gfwlist +server=/macports.org/127.0.0.1#5335 +ipset=/macports.org/gfwlist +server=/wetplace.com/127.0.0.1#5335 +ipset=/wetplace.com/gfwlist +server=/eromanga-school.com/127.0.0.1#5335 +ipset=/eromanga-school.com/gfwlist +server=/babesbang.com/127.0.0.1#5335 +ipset=/babesbang.com/gfwlist +server=/alpherafinancialservices.in/127.0.0.1#5335 +ipset=/alpherafinancialservices.in/gfwlist +server=/mask.icloud.com/127.0.0.1#5335 +ipset=/mask.icloud.com/gfwlist +server=/photos18.com/127.0.0.1#5335 +ipset=/photos18.com/gfwlist +server=/gohentai.net/127.0.0.1#5335 +ipset=/gohentai.net/gfwlist +server=/venmo.info/127.0.0.1#5335 +ipset=/venmo.info/gfwlist +server=/mini.in/127.0.0.1#5335 +ipset=/mini.in/gfwlist +server=/yandex.fr/127.0.0.1#5335 +ipset=/yandex.fr/gfwlist +server=/dianapost.com/127.0.0.1#5335 +ipset=/dianapost.com/gfwlist +server=/grss-ieee.org/127.0.0.1#5335 +ipset=/grss-ieee.org/gfwlist +server=/fandom.zendesk.com/127.0.0.1#5335 +ipset=/fandom.zendesk.com/gfwlist +server=/escortrankings.uk/127.0.0.1#5335 +ipset=/escortrankings.uk/gfwlist +server=/ptzwx.com/127.0.0.1#5335 +ipset=/ptzwx.com/gfwlist +server=/strepsils.si/127.0.0.1#5335 +ipset=/strepsils.si/gfwlist +server=/uriminzokkiri.com/127.0.0.1#5335 +ipset=/uriminzokkiri.com/gfwlist +server=/as-hls-uk-live.akamaized.net/127.0.0.1#5335 +ipset=/as-hls-uk-live.akamaized.net/gfwlist +server=/winudf.com/127.0.0.1#5335 +ipset=/winudf.com/gfwlist +server=/boylove.live/127.0.0.1#5335 +ipset=/boylove.live/gfwlist +server=/paypal-center.org/127.0.0.1#5335 +ipset=/paypal-center.org/gfwlist +server=/discordactivities.com/127.0.0.1#5335 +ipset=/discordactivities.com/gfwlist +server=/familymart.com.my/127.0.0.1#5335 +ipset=/familymart.com.my/gfwlist +server=/bmw-motorrad.pt/127.0.0.1#5335 +ipset=/bmw-motorrad.pt/gfwlist +server=/nikefind.com/127.0.0.1#5335 +ipset=/nikefind.com/gfwlist +server=/nintendoswitch.net/127.0.0.1#5335 +ipset=/nintendoswitch.net/gfwlist +server=/nicky.xxx/127.0.0.1#5335 +ipset=/nicky.xxx/gfwlist +server=/sxarab.top/127.0.0.1#5335 +ipset=/sxarab.top/gfwlist +server=/airsupportapp.com/127.0.0.1#5335 +ipset=/airsupportapp.com/gfwlist +server=/tati-log.com/127.0.0.1#5335 +ipset=/tati-log.com/gfwlist +server=/akatns.net/127.0.0.1#5335 +ipset=/akatns.net/gfwlist +server=/zhainanjidid.top/127.0.0.1#5335 +ipset=/zhainanjidid.top/gfwlist +server=/porngo.com/127.0.0.1#5335 +ipset=/porngo.com/gfwlist +server=/zeenews.com/127.0.0.1#5335 +ipset=/zeenews.com/gfwlist +server=/facebookcanadianelectionintegrityinitiative.com/127.0.0.1#5335 +ipset=/facebookcanadianelectionintegrityinitiative.com/gfwlist +server=/casquebeatsfracheter.com/127.0.0.1#5335 +ipset=/casquebeatsfracheter.com/gfwlist +server=/ibm.eu/127.0.0.1#5335 +ipset=/ibm.eu/gfwlist +server=/analscreen.com/127.0.0.1#5335 +ipset=/analscreen.com/gfwlist +server=/tube8.com/127.0.0.1#5335 +ipset=/tube8.com/gfwlist +server=/airwick.sk/127.0.0.1#5335 +ipset=/airwick.sk/gfwlist +server=/clco.cc/127.0.0.1#5335 +ipset=/clco.cc/gfwlist +server=/intel.ba/127.0.0.1#5335 +ipset=/intel.ba/gfwlist +server=/imgsmail.ru/127.0.0.1#5335 +ipset=/imgsmail.ru/gfwlist +server=/duckduckgo.com.mx/127.0.0.1#5335 +ipset=/duckduckgo.com.mx/gfwlist +server=/machogaytube.com/127.0.0.1#5335 +ipset=/machogaytube.com/gfwlist +server=/bitporno.com/127.0.0.1#5335 +ipset=/bitporno.com/gfwlist +server=/pearsoncmg.com/127.0.0.1#5335 +ipset=/pearsoncmg.com/gfwlist +server=/underlords.com/127.0.0.1#5335 +ipset=/underlords.com/gfwlist +server=/karger.com/127.0.0.1#5335 +ipset=/karger.com/gfwlist +server=/beatsdre.net/127.0.0.1#5335 +ipset=/beatsdre.net/gfwlist +server=/aebn.com/127.0.0.1#5335 +ipset=/aebn.com/gfwlist +server=/revenue-performance-management.com/127.0.0.1#5335 +ipset=/revenue-performance-management.com/gfwlist +server=/coithienthai.com/127.0.0.1#5335 +ipset=/coithienthai.com/gfwlist +server=/epochtimeshk.org/127.0.0.1#5335 +ipset=/epochtimeshk.org/gfwlist +server=/watch-porn.net/127.0.0.1#5335 +ipset=/watch-porn.net/gfwlist +server=/google.com.ag/127.0.0.1#5335 +ipset=/google.com.ag/gfwlist +server=/yahoo.com.gt/127.0.0.1#5335 +ipset=/yahoo.com.gt/gfwlist +server=/mini.com.pl/127.0.0.1#5335 +ipset=/mini.com.pl/gfwlist +server=/miniso.by/127.0.0.1#5335 +ipset=/miniso.by/gfwlist +server=/beatsbydres-shop.com/127.0.0.1#5335 +ipset=/beatsbydres-shop.com/gfwlist +server=/pokemon.com/127.0.0.1#5335 +ipset=/pokemon.com/gfwlist +server=/nijifeti.com/127.0.0.1#5335 +ipset=/nijifeti.com/gfwlist +server=/videoindexer.ai/127.0.0.1#5335 +ipset=/videoindexer.ai/gfwlist +server=/youporner.eu/127.0.0.1#5335 +ipset=/youporner.eu/gfwlist +server=/wmflabs.org/127.0.0.1#5335 +ipset=/wmflabs.org/gfwlist +server=/widevine.com/127.0.0.1#5335 +ipset=/widevine.com/gfwlist +server=/realestate.com.au/127.0.0.1#5335 +ipset=/realestate.com.au/gfwlist +server=/calgon.tv/127.0.0.1#5335 +ipset=/calgon.tv/gfwlist +server=/javsex.to/127.0.0.1#5335 +ipset=/javsex.to/gfwlist +server=/mylf.com/127.0.0.1#5335 +ipset=/mylf.com/gfwlist +server=/fm4.jp/127.0.0.1#5335 +ipset=/fm4.jp/gfwlist +server=/ipod.com.tw/127.0.0.1#5335 +ipset=/ipod.com.tw/gfwlist +server=/zaobao.sg/127.0.0.1#5335 +ipset=/zaobao.sg/gfwlist +server=/xbox360.eu/127.0.0.1#5335 +ipset=/xbox360.eu/gfwlist +server=/swisssign-group.com/127.0.0.1#5335 +ipset=/swisssign-group.com/gfwlist +server=/askubuntu.com/127.0.0.1#5335 +ipset=/askubuntu.com/gfwlist +server=/nfsc.global/127.0.0.1#5335 +ipset=/nfsc.global/gfwlist +server=/sociolotron.com/127.0.0.1#5335 +ipset=/sociolotron.com/gfwlist +server=/myfonts.net/127.0.0.1#5335 +ipset=/myfonts.net/gfwlist +server=/krux.com/127.0.0.1#5335 +ipset=/krux.com/gfwlist +server=/github.community/127.0.0.1#5335 +ipset=/github.community/gfwlist +server=/gputechconf.co.kr/127.0.0.1#5335 +ipset=/gputechconf.co.kr/gfwlist +server=/morganclaypool.com/127.0.0.1#5335 +ipset=/morganclaypool.com/gfwlist +server=/xn--6eup7j.net/127.0.0.1#5335 +ipset=/xn--6eup7j.net/gfwlist +server=/youtube.com.hn/127.0.0.1#5335 +ipset=/youtube.com.hn/gfwlist +server=/packer.io/127.0.0.1#5335 +ipset=/packer.io/gfwlist +server=/bethsoft.com/127.0.0.1#5335 +ipset=/bethsoft.com/gfwlist +server=/epikporn.com/127.0.0.1#5335 +ipset=/epikporn.com/gfwlist +server=/filmporno.it/127.0.0.1#5335 +ipset=/filmporno.it/gfwlist +server=/moez-m.com/127.0.0.1#5335 +ipset=/moez-m.com/gfwlist +server=/microsoftgamestack.com/127.0.0.1#5335 +ipset=/microsoftgamestack.com/gfwlist +server=/9to5terminal.com/127.0.0.1#5335 +ipset=/9to5terminal.com/gfwlist +server=/anilos.com/127.0.0.1#5335 +ipset=/anilos.com/gfwlist +server=/travelex.it/127.0.0.1#5335 +ipset=/travelex.it/gfwlist +server=/asproexapi.com/127.0.0.1#5335 +ipset=/asproexapi.com/gfwlist +server=/yahoo.com.lb/127.0.0.1#5335 +ipset=/yahoo.com.lb/gfwlist +server=/isca-speech.org/127.0.0.1#5335 +ipset=/isca-speech.org/gfwlist +server=/icloud.fr/127.0.0.1#5335 +ipset=/icloud.fr/gfwlist +server=/v8project.org/127.0.0.1#5335 +ipset=/v8project.org/gfwlist +server=/avgigi.com/127.0.0.1#5335 +ipset=/avgigi.com/gfwlist +server=/pornomineiro.com/127.0.0.1#5335 +ipset=/pornomineiro.com/gfwlist +server=/veet.us/127.0.0.1#5335 +ipset=/veet.us/gfwlist +server=/yiqiedoushiganggangkaishi.org/127.0.0.1#5335 +ipset=/yiqiedoushiganggangkaishi.org/gfwlist +server=/porno800.com/127.0.0.1#5335 +ipset=/porno800.com/gfwlist +server=/yarnpkg.com/127.0.0.1#5335 +ipset=/yarnpkg.com/gfwlist +server=/visa.mn/127.0.0.1#5335 +ipset=/visa.mn/gfwlist +server=/adidas.co.in/127.0.0.1#5335 +ipset=/adidas.co.in/gfwlist +server=/cc18.tv/127.0.0.1#5335 +ipset=/cc18.tv/gfwlist +server=/sky.com/127.0.0.1#5335 +ipset=/sky.com/gfwlist +server=/facebook.org/127.0.0.1#5335 +ipset=/facebook.org/gfwlist +server=/beatsbydrdrestore.com/127.0.0.1#5335 +ipset=/beatsbydrdrestore.com/gfwlist +server=/insider-intelligence.com/127.0.0.1#5335 +ipset=/insider-intelligence.com/gfwlist +server=/gclubs.com/127.0.0.1#5335 +ipset=/gclubs.com/gfwlist +server=/sustainthesound.com/127.0.0.1#5335 +ipset=/sustainthesound.com/gfwlist +server=/budatt.com/127.0.0.1#5335 +ipset=/budatt.com/gfwlist +server=/kilmeadeandfriends.com/127.0.0.1#5335 +ipset=/kilmeadeandfriends.com/gfwlist +server=/nikenews.com/127.0.0.1#5335 +ipset=/nikenews.com/gfwlist +server=/bestporncomix.com/127.0.0.1#5335 +ipset=/bestporncomix.com/gfwlist +server=/onenote.com/127.0.0.1#5335 +ipset=/onenote.com/gfwlist +server=/javtorrent.me/127.0.0.1#5335 +ipset=/javtorrent.me/gfwlist +server=/bmwmass.com/127.0.0.1#5335 +ipset=/bmwmass.com/gfwlist +server=/facebookpokerchips.info/127.0.0.1#5335 +ipset=/facebookpokerchips.info/gfwlist +server=/researchkit.tv/127.0.0.1#5335 +ipset=/researchkit.tv/gfwlist +server=/free3dadultgames.com/127.0.0.1#5335 +ipset=/free3dadultgames.com/gfwlist +server=/facebookstudios.org/127.0.0.1#5335 +ipset=/facebookstudios.org/gfwlist +server=/zeplin.io/127.0.0.1#5335 +ipset=/zeplin.io/gfwlist +server=/ourshemales.com/127.0.0.1#5335 +ipset=/ourshemales.com/gfwlist +server=/beeg.com/127.0.0.1#5335 +ipset=/beeg.com/gfwlist +server=/macbookair.co.uk/127.0.0.1#5335 +ipset=/macbookair.co.uk/gfwlist +server=/milfs-now.com/127.0.0.1#5335 +ipset=/milfs-now.com/gfwlist +server=/dengiamerika.com/127.0.0.1#5335 +ipset=/dengiamerika.com/gfwlist +server=/sex0098.com/127.0.0.1#5335 +ipset=/sex0098.com/gfwlist +server=/discordpartygames.com/127.0.0.1#5335 +ipset=/discordpartygames.com/gfwlist +server=/twitterinc.com/127.0.0.1#5335 +ipset=/twitterinc.com/gfwlist +server=/miniso.my/127.0.0.1#5335 +ipset=/miniso.my/gfwlist +server=/pearsonassessment.be/127.0.0.1#5335 +ipset=/pearsonassessment.be/gfwlist +server=/wujieliulan.com/127.0.0.1#5335 +ipset=/wujieliulan.com/gfwlist +server=/onsalekey.com/127.0.0.1#5335 +ipset=/onsalekey.com/gfwlist +server=/issitedownrightnow.com/127.0.0.1#5335 +ipset=/issitedownrightnow.com/gfwlist +server=/disneysrivieraresort.com/127.0.0.1#5335 +ipset=/disneysrivieraresort.com/gfwlist +server=/canon.lv/127.0.0.1#5335 +ipset=/canon.lv/gfwlist +server=/directvmonitoring.com/127.0.0.1#5335 +ipset=/directvmonitoring.com/gfwlist +server=/strepsils.at/127.0.0.1#5335 +ipset=/strepsils.at/gfwlist +server=/kenyanporn.blogspot.com/127.0.0.1#5335 +ipset=/kenyanporn.blogspot.com/gfwlist +server=/amplifyapp.com/127.0.0.1#5335 +ipset=/amplifyapp.com/gfwlist +server=/lge.co.kr/127.0.0.1#5335 +ipset=/lge.co.kr/gfwlist +server=/beatsbydrsmonsterinusa.com/127.0.0.1#5335 +ipset=/beatsbydrsmonsterinusa.com/gfwlist +server=/pornocaserotube.com/127.0.0.1#5335 +ipset=/pornocaserotube.com/gfwlist +server=/q13.com/127.0.0.1#5335 +ipset=/q13.com/gfwlist +server=/adult-home-videos.com/127.0.0.1#5335 +ipset=/adult-home-videos.com/gfwlist +server=/pornofilmlist.com/127.0.0.1#5335 +ipset=/pornofilmlist.com/gfwlist +server=/steamcommunity.com/127.0.0.1#5335 +ipset=/steamcommunity.com/gfwlist +server=/onlineporn-vids.com/127.0.0.1#5335 +ipset=/onlineporn-vids.com/gfwlist +server=/airwick.cl/127.0.0.1#5335 +ipset=/airwick.cl/gfwlist +server=/ebayads.net/127.0.0.1#5335 +ipset=/ebayads.net/gfwlist +server=/amazon-jp-recruiting.com/127.0.0.1#5335 +ipset=/amazon-jp-recruiting.com/gfwlist +server=/worldsex.com/127.0.0.1#5335 +ipset=/worldsex.com/gfwlist +server=/bbbaihu.vip/127.0.0.1#5335 +ipset=/bbbaihu.vip/gfwlist +server=/haho.moe/127.0.0.1#5335 +ipset=/haho.moe/gfwlist +server=/bloomsburydesignlibrary.com/127.0.0.1#5335 +ipset=/bloomsburydesignlibrary.com/gfwlist +server=/pearson-intl.com/127.0.0.1#5335 +ipset=/pearson-intl.com/gfwlist +server=/facbook.com/127.0.0.1#5335 +ipset=/facbook.com/gfwlist +server=/bmw-motorrad.jp/127.0.0.1#5335 +ipset=/bmw-motorrad.jp/gfwlist +server=/hqdesexo.com/127.0.0.1#5335 +ipset=/hqdesexo.com/gfwlist +server=/suruga-ya.com/127.0.0.1#5335 +ipset=/suruga-ya.com/gfwlist +server=/usertrust.com/127.0.0.1#5335 +ipset=/usertrust.com/gfwlist +server=/rakuten.com.tw/127.0.0.1#5335 +ipset=/rakuten.com.tw/gfwlist +server=/xxxfile.org/127.0.0.1#5335 +ipset=/xxxfile.org/gfwlist +server=/hamsterporn.tv/127.0.0.1#5335 +ipset=/hamsterporn.tv/gfwlist +server=/isgame365.cc/127.0.0.1#5335 +ipset=/isgame365.cc/gfwlist +server=/googleoptimize.com/127.0.0.1#5335 +ipset=/googleoptimize.com/gfwlist +server=/garotaporno.com/127.0.0.1#5335 +ipset=/garotaporno.com/gfwlist +server=/intel.pe/127.0.0.1#5335 +ipset=/intel.pe/gfwlist +server=/beatsbydreshops.net/127.0.0.1#5335 +ipset=/beatsbydreshops.net/gfwlist +server=/nikecraft.com/127.0.0.1#5335 +ipset=/nikecraft.com/gfwlist +server=/boylabs.net/127.0.0.1#5335 +ipset=/boylabs.net/gfwlist +server=/hpsmartstage.com/127.0.0.1#5335 +ipset=/hpsmartstage.com/gfwlist +server=/stark-verlag.ch/127.0.0.1#5335 +ipset=/stark-verlag.ch/gfwlist +server=/visadpsonline.us/127.0.0.1#5335 +ipset=/visadpsonline.us/gfwlist +server=/menshin-channel.com/127.0.0.1#5335 +ipset=/menshin-channel.com/gfwlist +server=/sonyprotechnosupport.co.jp/127.0.0.1#5335 +ipset=/sonyprotechnosupport.co.jp/gfwlist +server=/applepaysupplies.com/127.0.0.1#5335 +ipset=/applepaysupplies.com/gfwlist +server=/devcon.org/127.0.0.1#5335 +ipset=/devcon.org/gfwlist +server=/thomsonreuters.co.kr/127.0.0.1#5335 +ipset=/thomsonreuters.co.kr/gfwlist +server=/apple.fr/127.0.0.1#5335 +ipset=/apple.fr/gfwlist +server=/macbookpro.com/127.0.0.1#5335 +ipset=/macbookpro.com/gfwlist +server=/ebayopen.com/127.0.0.1#5335 +ipset=/ebayopen.com/gfwlist +server=/bmw.de/127.0.0.1#5335 +ipset=/bmw.de/gfwlist +server=/copro.pw/127.0.0.1#5335 +ipset=/copro.pw/gfwlist +server=/volvotrucks.al/127.0.0.1#5335 +ipset=/volvotrucks.al/gfwlist +server=/rule34.xxx/127.0.0.1#5335 +ipset=/rule34.xxx/gfwlist +server=/facfebook.com/127.0.0.1#5335 +ipset=/facfebook.com/gfwlist +server=/xnxx2.pro/127.0.0.1#5335 +ipset=/xnxx2.pro/gfwlist +server=/edisebay.com/127.0.0.1#5335 +ipset=/edisebay.com/gfwlist +server=/yahoo.as/127.0.0.1#5335 +ipset=/yahoo.as/gfwlist +server=/bmw.sn/127.0.0.1#5335 +ipset=/bmw.sn/gfwlist +server=/yahoo.fr/127.0.0.1#5335 +ipset=/yahoo.fr/gfwlist +server=/bbcmedia.co.uk/127.0.0.1#5335 +ipset=/bbcmedia.co.uk/gfwlist +server=/paypal-communication.com/127.0.0.1#5335 +ipset=/paypal-communication.com/gfwlist +server=/rumah123.com/127.0.0.1#5335 +ipset=/rumah123.com/gfwlist +server=/zoosexfarm.com/127.0.0.1#5335 +ipset=/zoosexfarm.com/gfwlist +server=/icloude.com/127.0.0.1#5335 +ipset=/icloude.com/gfwlist +server=/youpornlist.com/127.0.0.1#5335 +ipset=/youpornlist.com/gfwlist +server=/strikinglycdn.com/127.0.0.1#5335 +ipset=/strikinglycdn.com/gfwlist +server=/sbitravelcard.com/127.0.0.1#5335 +ipset=/sbitravelcard.com/gfwlist +server=/ipodnano.com/127.0.0.1#5335 +ipset=/ipodnano.com/gfwlist +server=/disneybaby.com/127.0.0.1#5335 +ipset=/disneybaby.com/gfwlist +server=/veet.ca/127.0.0.1#5335 +ipset=/veet.ca/gfwlist +server=/xboxone.eu/127.0.0.1#5335 +ipset=/xboxone.eu/gfwlist +server=/pokemon-sunmoon.com/127.0.0.1#5335 +ipset=/pokemon-sunmoon.com/gfwlist +server=/mdn.mozillademos.org/127.0.0.1#5335 +ipset=/mdn.mozillademos.org/gfwlist +server=/aliveipc.com/127.0.0.1#5335 +ipset=/aliveipc.com/gfwlist +server=/homemadefucktube.com/127.0.0.1#5335 +ipset=/homemadefucktube.com/gfwlist +server=/vanish.si/127.0.0.1#5335 +ipset=/vanish.si/gfwlist +server=/cherrypimps.com/127.0.0.1#5335 +ipset=/cherrypimps.com/gfwlist +server=/ikea.com.mx/127.0.0.1#5335 +ipset=/ikea.com.mx/gfwlist +server=/beatsbydre-outlet.com/127.0.0.1#5335 +ipset=/beatsbydre-outlet.com/gfwlist +server=/porn4days.cc/127.0.0.1#5335 +ipset=/porn4days.cc/gfwlist +server=/hentai-for.net/127.0.0.1#5335 +ipset=/hentai-for.net/gfwlist +server=/behance.net/127.0.0.1#5335 +ipset=/behance.net/gfwlist +server=/brotli.org/127.0.0.1#5335 +ipset=/brotli.org/gfwlist +server=/newsamerica.com/127.0.0.1#5335 +ipset=/newsamerica.com/gfwlist +server=/customizedbeatsdre.com/127.0.0.1#5335 +ipset=/customizedbeatsdre.com/gfwlist +server=/xwebporn.com/127.0.0.1#5335 +ipset=/xwebporn.com/gfwlist +server=/medium.systems/127.0.0.1#5335 +ipset=/medium.systems/gfwlist +server=/ciscolive.com/127.0.0.1#5335 +ipset=/ciscolive.com/gfwlist +server=/hkej.com/127.0.0.1#5335 +ipset=/hkej.com/gfwlist +server=/windowsuem.com/127.0.0.1#5335 +ipset=/windowsuem.com/gfwlist +server=/bonedathome.com/127.0.0.1#5335 +ipset=/bonedathome.com/gfwlist +server=/mochajs.org/127.0.0.1#5335 +ipset=/mochajs.org/gfwlist +server=/link.theplatform.com/127.0.0.1#5335 +ipset=/link.theplatform.com/gfwlist +server=/omniture.com/127.0.0.1#5335 +ipset=/omniture.com/gfwlist +server=/microsoftnews.org/127.0.0.1#5335 +ipset=/microsoftnews.org/gfwlist +server=/bmwdealerdirect.com/127.0.0.1#5335 +ipset=/bmwdealerdirect.com/gfwlist +server=/mach-os.com/127.0.0.1#5335 +ipset=/mach-os.com/gfwlist +server=/mini.nl/127.0.0.1#5335 +ipset=/mini.nl/gfwlist +server=/mastercard.com.lb/127.0.0.1#5335 +ipset=/mastercard.com.lb/gfwlist +server=/limeteensex.com/127.0.0.1#5335 +ipset=/limeteensex.com/gfwlist +server=/bloombergindustry.com/127.0.0.1#5335 +ipset=/bloombergindustry.com/gfwlist +server=/nurgay.to/127.0.0.1#5335 +ipset=/nurgay.to/gfwlist +server=/netflixdnstest4.com/127.0.0.1#5335 +ipset=/netflixdnstest4.com/gfwlist +server=/canon.com.mt/127.0.0.1#5335 +ipset=/canon.com.mt/gfwlist +server=/hentaifox.com/127.0.0.1#5335 +ipset=/hentaifox.com/gfwlist +server=/breasthealthinfo.com/127.0.0.1#5335 +ipset=/breasthealthinfo.com/gfwlist +server=/thecuckoldporn.com/127.0.0.1#5335 +ipset=/thecuckoldporn.com/gfwlist +server=/drebeats-solo.com/127.0.0.1#5335 +ipset=/drebeats-solo.com/gfwlist +server=/visa.is/127.0.0.1#5335 +ipset=/visa.is/gfwlist +server=/youtubego.co.id/127.0.0.1#5335 +ipset=/youtubego.co.id/gfwlist +server=/finishwin.be/127.0.0.1#5335 +ipset=/finishwin.be/gfwlist +server=/cheapbeatsbydrefau.com/127.0.0.1#5335 +ipset=/cheapbeatsbydrefau.com/gfwlist +server=/b3bos.com/127.0.0.1#5335 +ipset=/b3bos.com/gfwlist +server=/vdoav.com/127.0.0.1#5335 +ipset=/vdoav.com/gfwlist +server=/adultartsites.com/127.0.0.1#5335 +ipset=/adultartsites.com/gfwlist +server=/alphabet.com.pt/127.0.0.1#5335 +ipset=/alphabet.com.pt/gfwlist +server=/ebayclassifiedsgroup.info/127.0.0.1#5335 +ipset=/ebayclassifiedsgroup.info/gfwlist +server=/applepay.tv/127.0.0.1#5335 +ipset=/applepay.tv/gfwlist +server=/arabysexy.mobi/127.0.0.1#5335 +ipset=/arabysexy.mobi/gfwlist +server=/mastercard.co.ke/127.0.0.1#5335 +ipset=/mastercard.co.ke/gfwlist +server=/beatsep.net/127.0.0.1#5335 +ipset=/beatsep.net/gfwlist +server=/beatsbydreol.com/127.0.0.1#5335 +ipset=/beatsbydreol.com/gfwlist +server=/twifuli.com/127.0.0.1#5335 +ipset=/twifuli.com/gfwlist +server=/youtube.com.pe/127.0.0.1#5335 +ipset=/youtube.com.pe/gfwlist +server=/sony.com.vn/127.0.0.1#5335 +ipset=/sony.com.vn/gfwlist +server=/beats-soaho.com/127.0.0.1#5335 +ipset=/beats-soaho.com/gfwlist +server=/bitvise.com/127.0.0.1#5335 +ipset=/bitvise.com/gfwlist +server=/bmw.co.kr/127.0.0.1#5335 +ipset=/bmw.co.kr/gfwlist +server=/xvideos5.com.br/127.0.0.1#5335 +ipset=/xvideos5.com.br/gfwlist +server=/nijieronavi.com/127.0.0.1#5335 +ipset=/nijieronavi.com/gfwlist +server=/adelaidenow.com.au/127.0.0.1#5335 +ipset=/adelaidenow.com.au/gfwlist +server=/discountedporn.com/127.0.0.1#5335 +ipset=/discountedporn.com/gfwlist +server=/igniteseurope.com/127.0.0.1#5335 +ipset=/igniteseurope.com/gfwlist +server=/redporno.cz/127.0.0.1#5335 +ipset=/redporno.cz/gfwlist +server=/starbucks.com.bn/127.0.0.1#5335 +ipset=/starbucks.com.bn/gfwlist +server=/xnostars.com/127.0.0.1#5335 +ipset=/xnostars.com/gfwlist +server=/icloud.is/127.0.0.1#5335 +ipset=/icloud.is/gfwlist +server=/bbwmilftube.com/127.0.0.1#5335 +ipset=/bbwmilftube.com/gfwlist +server=/milflove.live/127.0.0.1#5335 +ipset=/milflove.live/gfwlist +server=/r10s.com/127.0.0.1#5335 +ipset=/r10s.com/gfwlist +server=/icloud.fi/127.0.0.1#5335 +ipset=/icloud.fi/gfwlist +server=/facebookdusexe.org/127.0.0.1#5335 +ipset=/facebookdusexe.org/gfwlist +server=/mobile01.com/127.0.0.1#5335 +ipset=/mobile01.com/gfwlist +server=/googletagmanager.com/127.0.0.1#5335 +ipset=/googletagmanager.com/gfwlist +server=/visaicsdirect.com/127.0.0.1#5335 +ipset=/visaicsdirect.com/gfwlist +server=/ciscotr.com/127.0.0.1#5335 +ipset=/ciscotr.com/gfwlist +server=/beatsbydressale.com/127.0.0.1#5335 +ipset=/beatsbydressale.com/gfwlist +server=/sextubish.com/127.0.0.1#5335 +ipset=/sextubish.com/gfwlist +server=/volvotrucks.be/127.0.0.1#5335 +ipset=/volvotrucks.be/gfwlist +server=/dechamora.com/127.0.0.1#5335 +ipset=/dechamora.com/gfwlist +server=/move-free.net/127.0.0.1#5335 +ipset=/move-free.net/gfwlist +server=/pornteen123.com/127.0.0.1#5335 +ipset=/pornteen123.com/gfwlist +server=/applewallet.tv/127.0.0.1#5335 +ipset=/applewallet.tv/gfwlist +server=/sony.com.br/127.0.0.1#5335 +ipset=/sony.com.br/gfwlist +server=/pornfidelity.com/127.0.0.1#5335 +ipset=/pornfidelity.com/gfwlist +server=/hyu2.com/127.0.0.1#5335 +ipset=/hyu2.com/gfwlist +server=/directvmetropolisil.com/127.0.0.1#5335 +ipset=/directvmetropolisil.com/gfwlist +server=/detentiongirls.com/127.0.0.1#5335 +ipset=/detentiongirls.com/gfwlist +server=/bbg.gov/127.0.0.1#5335 +ipset=/bbg.gov/gfwlist +server=/ikea.no/127.0.0.1#5335 +ipset=/ikea.no/gfwlist +server=/java.com/127.0.0.1#5335 +ipset=/java.com/gfwlist +server=/javdoe.com/127.0.0.1#5335 +ipset=/javdoe.com/gfwlist +server=/applereach.com/127.0.0.1#5335 +ipset=/applereach.com/gfwlist +server=/erotic-photos.net/127.0.0.1#5335 +ipset=/erotic-photos.net/gfwlist +server=/volvotrucks.es/127.0.0.1#5335 +ipset=/volvotrucks.es/gfwlist +server=/kodi.wiki/127.0.0.1#5335 +ipset=/kodi.wiki/gfwlist +server=/oppai-doga.info/127.0.0.1#5335 +ipset=/oppai-doga.info/gfwlist +server=/nintendo.it/127.0.0.1#5335 +ipset=/nintendo.it/gfwlist +server=/blogspot.re/127.0.0.1#5335 +ipset=/blogspot.re/gfwlist +server=/cmpaas.com/127.0.0.1#5335 +ipset=/cmpaas.com/gfwlist +server=/xvideoz.win/127.0.0.1#5335 +ipset=/xvideoz.win/gfwlist +server=/beatsbydrecheaper.com/127.0.0.1#5335 +ipset=/beatsbydrecheaper.com/gfwlist +server=/attwirelessonline.com/127.0.0.1#5335 +ipset=/attwirelessonline.com/gfwlist +server=/nbc.co/127.0.0.1#5335 +ipset=/nbc.co/gfwlist +server=/yahoo.co.jp/127.0.0.1#5335 +ipset=/yahoo.co.jp/gfwlist +server=/applepay.rs/127.0.0.1#5335 +ipset=/applepay.rs/gfwlist +server=/amazon.red/127.0.0.1#5335 +ipset=/amazon.red/gfwlist +server=/happymeal.com.au/127.0.0.1#5335 +ipset=/happymeal.com.au/gfwlist +server=/maturesexual.com/127.0.0.1#5335 +ipset=/maturesexual.com/gfwlist +server=/intel.la/127.0.0.1#5335 +ipset=/intel.la/gfwlist +server=/fruitycams.com/127.0.0.1#5335 +ipset=/fruitycams.com/gfwlist +server=/bridgestonecomercial.com.ar/127.0.0.1#5335 +ipset=/bridgestonecomercial.com.ar/gfwlist +server=/multipornfor.me/127.0.0.1#5335 +ipset=/multipornfor.me/gfwlist +server=/wix.com/127.0.0.1#5335 +ipset=/wix.com/gfwlist +server=/blogspot.com/127.0.0.1#5335 +ipset=/blogspot.com/gfwlist +server=/sambaporno.com/127.0.0.1#5335 +ipset=/sambaporno.com/gfwlist +server=/aria.ms/127.0.0.1#5335 +ipset=/aria.ms/gfwlist +server=/applestore.bg/127.0.0.1#5335 +ipset=/applestore.bg/gfwlist +server=/awsthinkbox.com/127.0.0.1#5335 +ipset=/awsthinkbox.com/gfwlist +server=/asahishimbun.sc.omtrdc.net/127.0.0.1#5335 +ipset=/asahishimbun.sc.omtrdc.net/gfwlist +server=/thisvid.com/127.0.0.1#5335 +ipset=/thisvid.com/gfwlist +server=/facebooksz.com/127.0.0.1#5335 +ipset=/facebooksz.com/gfwlist +server=/paypallabs.com/127.0.0.1#5335 +ipset=/paypallabs.com/gfwlist +server=/eachpay.net/127.0.0.1#5335 +ipset=/eachpay.net/gfwlist +server=/cheapbeatsbydresale.com/127.0.0.1#5335 +ipset=/cheapbeatsbydresale.com/gfwlist +server=/paypal-login.org/127.0.0.1#5335 +ipset=/paypal-login.org/gfwlist +server=/momtarts3d.com/127.0.0.1#5335 +ipset=/momtarts3d.com/gfwlist +server=/jable.org/127.0.0.1#5335 +ipset=/jable.org/gfwlist +server=/espressif.com/127.0.0.1#5335 +ipset=/espressif.com/gfwlist +server=/analcamshow.com/127.0.0.1#5335 +ipset=/analcamshow.com/gfwlist +server=/adobe-video-partner-finder.com/127.0.0.1#5335 +ipset=/adobe-video-partner-finder.com/gfwlist +server=/dev-theguardian.com/127.0.0.1#5335 +ipset=/dev-theguardian.com/gfwlist +server=/dropbox-dns.com/127.0.0.1#5335 +ipset=/dropbox-dns.com/gfwlist +server=/videosdesexo.com.br/127.0.0.1#5335 +ipset=/videosdesexo.com.br/gfwlist +server=/85tube.com/127.0.0.1#5335 +ipset=/85tube.com/gfwlist +server=/ebonyinlove.com/127.0.0.1#5335 +ipset=/ebonyinlove.com/gfwlist +server=/fox.tv/127.0.0.1#5335 +ipset=/fox.tv/gfwlist +server=/tristatebmw.com/127.0.0.1#5335 +ipset=/tristatebmw.com/gfwlist +server=/escobarvip.it/127.0.0.1#5335 +ipset=/escobarvip.it/gfwlist +server=/apigee.com/127.0.0.1#5335 +ipset=/apigee.com/gfwlist +server=/bang-movies.com/127.0.0.1#5335 +ipset=/bang-movies.com/gfwlist +server=/marvelparty.net/127.0.0.1#5335 +ipset=/marvelparty.net/gfwlist +server=/cloupia.com/127.0.0.1#5335 +ipset=/cloupia.com/gfwlist +server=/huffingtonpost.com.mx/127.0.0.1#5335 +ipset=/huffingtonpost.com.mx/gfwlist +server=/bmw-connecteddrive.co.za/127.0.0.1#5335 +ipset=/bmw-connecteddrive.co.za/gfwlist +server=/shopee.fr/127.0.0.1#5335 +ipset=/shopee.fr/gfwlist +server=/cython.org/127.0.0.1#5335 +ipset=/cython.org/gfwlist +server=/bintray.com/127.0.0.1#5335 +ipset=/bintray.com/gfwlist +server=/imagecurl.com/127.0.0.1#5335 +ipset=/imagecurl.com/gfwlist +server=/xxxgames.games/127.0.0.1#5335 +ipset=/xxxgames.games/gfwlist +server=/pornhubselect.com/127.0.0.1#5335 +ipset=/pornhubselect.com/gfwlist +server=/zoosexnet.com/127.0.0.1#5335 +ipset=/zoosexnet.com/gfwlist +server=/igetnaughty.com/127.0.0.1#5335 +ipset=/igetnaughty.com/gfwlist +server=/aporntv.com/127.0.0.1#5335 +ipset=/aporntv.com/gfwlist +server=/clojure.org/127.0.0.1#5335 +ipset=/clojure.org/gfwlist +server=/riotgames.com/127.0.0.1#5335 +ipset=/riotgames.com/gfwlist +server=/python.org/127.0.0.1#5335 +ipset=/python.org/gfwlist +server=/ikea.co.jp/127.0.0.1#5335 +ipset=/ikea.co.jp/gfwlist +server=/blogspot.co.id/127.0.0.1#5335 +ipset=/blogspot.co.id/gfwlist +server=/1to1computing.com.au/127.0.0.1#5335 +ipset=/1to1computing.com.au/gfwlist +server=/jerkdolls.com/127.0.0.1#5335 +ipset=/jerkdolls.com/gfwlist +server=/milfmovs.com/127.0.0.1#5335 +ipset=/milfmovs.com/gfwlist +server=/vanishcentroamerica.com/127.0.0.1#5335 +ipset=/vanishcentroamerica.com/gfwlist +server=/dansmovies.com/127.0.0.1#5335 +ipset=/dansmovies.com/gfwlist +server=/epochhk.com/127.0.0.1#5335 +ipset=/epochhk.com/gfwlist +server=/gotraffic.net/127.0.0.1#5335 +ipset=/gotraffic.net/gfwlist +server=/1classtube.com/127.0.0.1#5335 +ipset=/1classtube.com/gfwlist +server=/drebeats-monsterusa.com/127.0.0.1#5335 +ipset=/drebeats-monsterusa.com/gfwlist +server=/epochtimes.com.ua/127.0.0.1#5335 +ipset=/epochtimes.com.ua/gfwlist +server=/beatsbydrebeatsby.com/127.0.0.1#5335 +ipset=/beatsbydrebeatsby.com/gfwlist +server=/billmelater.net/127.0.0.1#5335 +ipset=/billmelater.net/gfwlist +server=/abeatsbydrdre.com/127.0.0.1#5335 +ipset=/abeatsbydrdre.com/gfwlist +server=/sex.com/127.0.0.1#5335 +ipset=/sex.com/gfwlist +server=/wzlthw.com/127.0.0.1#5335 +ipset=/wzlthw.com/gfwlist +server=/tsundora.com/127.0.0.1#5335 +ipset=/tsundora.com/gfwlist +server=/drebeatsstudio2013.com/127.0.0.1#5335 +ipset=/drebeatsstudio2013.com/gfwlist +server=/88kkn.com/127.0.0.1#5335 +ipset=/88kkn.com/gfwlist +server=/analqts.com/127.0.0.1#5335 +ipset=/analqts.com/gfwlist +server=/twinktube.sexy/127.0.0.1#5335 +ipset=/twinktube.sexy/gfwlist +server=/4club.com/127.0.0.1#5335 +ipset=/4club.com/gfwlist +server=/nikeit.com/127.0.0.1#5335 +ipset=/nikeit.com/gfwlist +server=/hdpornmax.net/127.0.0.1#5335 +ipset=/hdpornmax.net/gfwlist +server=/p-events-delivery.akamaized.net/127.0.0.1#5335 +ipset=/p-events-delivery.akamaized.net/gfwlist +server=/guangming.com.my/127.0.0.1#5335 +ipset=/guangming.com.my/gfwlist +server=/microsoftnews.cc/127.0.0.1#5335 +ipset=/microsoftnews.cc/gfwlist +server=/next.com/127.0.0.1#5335 +ipset=/next.com/gfwlist +server=/nicolepeters.com/127.0.0.1#5335 +ipset=/nicolepeters.com/gfwlist +server=/quicktime.eu/127.0.0.1#5335 +ipset=/quicktime.eu/gfwlist +server=/bigcocker.com/127.0.0.1#5335 +ipset=/bigcocker.com/gfwlist +server=/cherrypanpan.com/127.0.0.1#5335 +ipset=/cherrypanpan.com/gfwlist +server=/hdxnxx.xxx/127.0.0.1#5335 +ipset=/hdxnxx.xxx/gfwlist +server=/cheapbeatsla.com/127.0.0.1#5335 +ipset=/cheapbeatsla.com/gfwlist +server=/nbys1.tv/127.0.0.1#5335 +ipset=/nbys1.tv/gfwlist +server=/blaoshi.cc/127.0.0.1#5335 +ipset=/blaoshi.cc/gfwlist +server=/aboutamazon.jp/127.0.0.1#5335 +ipset=/aboutamazon.jp/gfwlist +server=/bb33.net/127.0.0.1#5335 +ipset=/bb33.net/gfwlist +server=/xnxx.net/127.0.0.1#5335 +ipset=/xnxx.net/gfwlist +server=/disney.no/127.0.0.1#5335 +ipset=/disney.no/gfwlist +server=/sci-hub.se/127.0.0.1#5335 +ipset=/sci-hub.se/gfwlist +server=/pornobuzz.net/127.0.0.1#5335 +ipset=/pornobuzz.net/gfwlist +server=/webcamjackers.com/127.0.0.1#5335 +ipset=/webcamjackers.com/gfwlist +server=/headphones-outlet-online.com/127.0.0.1#5335 +ipset=/headphones-outlet-online.com/gfwlist +server=/microsoft.is/127.0.0.1#5335 +ipset=/microsoft.is/gfwlist +server=/starfox.com/127.0.0.1#5335 +ipset=/starfox.com/gfwlist +server=/tabooporn.tv/127.0.0.1#5335 +ipset=/tabooporn.tv/gfwlist +server=/adobeoobe.com/127.0.0.1#5335 +ipset=/adobeoobe.com/gfwlist +server=/adobeku.com/127.0.0.1#5335 +ipset=/adobeku.com/gfwlist +server=/nakedamateurmilf.com/127.0.0.1#5335 +ipset=/nakedamateurmilf.com/gfwlist +server=/daindianporn.com/127.0.0.1#5335 +ipset=/daindianporn.com/gfwlist +server=/limedia.tw/127.0.0.1#5335 +ipset=/limedia.tw/gfwlist +server=/syhacked.com/127.0.0.1#5335 +ipset=/syhacked.com/gfwlist +server=/fedoraforum.org/127.0.0.1#5335 +ipset=/fedoraforum.org/gfwlist +server=/msftnet.org/127.0.0.1#5335 +ipset=/msftnet.org/gfwlist +server=/facebookenespanol.com/127.0.0.1#5335 +ipset=/facebookenespanol.com/gfwlist +server=/67maoab.com/127.0.0.1#5335 +ipset=/67maoab.com/gfwlist +server=/miniso-au.com/127.0.0.1#5335 +ipset=/miniso-au.com/gfwlist +server=/xxxwow.net/127.0.0.1#5335 +ipset=/xxxwow.net/gfwlist +server=/donkparty.com/127.0.0.1#5335 +ipset=/donkparty.com/gfwlist +server=/paypal-excelinvoicing.com/127.0.0.1#5335 +ipset=/paypal-excelinvoicing.com/gfwlist +server=/fuckmaturepussy.com/127.0.0.1#5335 +ipset=/fuckmaturepussy.com/gfwlist +server=/freesexgames.games/127.0.0.1#5335 +ipset=/freesexgames.games/gfwlist +server=/xn--cck4d8b3009a.com/127.0.0.1#5335 +ipset=/xn--cck4d8b3009a.com/gfwlist +server=/marketingcloud.com/127.0.0.1#5335 +ipset=/marketingcloud.com/gfwlist +server=/hdfreeporn.net/127.0.0.1#5335 +ipset=/hdfreeporn.net/gfwlist +server=/volvotruckcenter.dk/127.0.0.1#5335 +ipset=/volvotruckcenter.dk/gfwlist +server=/gcld-line.com/127.0.0.1#5335 +ipset=/gcld-line.com/gfwlist +server=/bluekai.com/127.0.0.1#5335 +ipset=/bluekai.com/gfwlist +server=/videostravestis.xxx/127.0.0.1#5335 +ipset=/videostravestis.xxx/gfwlist +server=/bayvoice.net/127.0.0.1#5335 +ipset=/bayvoice.net/gfwlist +server=/needforspeedtherun.com/127.0.0.1#5335 +ipset=/needforspeedtherun.com/gfwlist +server=/aljazeera.com/127.0.0.1#5335 +ipset=/aljazeera.com/gfwlist +server=/188channel.com/127.0.0.1#5335 +ipset=/188channel.com/gfwlist +server=/cpz.to/127.0.0.1#5335 +ipset=/cpz.to/gfwlist +server=/vod-sub-uk-live.akamaized.net/127.0.0.1#5335 +ipset=/vod-sub-uk-live.akamaized.net/gfwlist +server=/googleapps.com/127.0.0.1#5335 +ipset=/googleapps.com/gfwlist +server=/famousnudes.com/127.0.0.1#5335 +ipset=/famousnudes.com/gfwlist +server=/all3dsexpics.com/127.0.0.1#5335 +ipset=/all3dsexpics.com/gfwlist +server=/rectovaginalexam.com/127.0.0.1#5335 +ipset=/rectovaginalexam.com/gfwlist +server=/tiktokv.com/127.0.0.1#5335 +ipset=/tiktokv.com/gfwlist +server=/harpercollinsspeakersbureau.com/127.0.0.1#5335 +ipset=/harpercollinsspeakersbureau.com/gfwlist +server=/hentainanime.com/127.0.0.1#5335 +ipset=/hentainanime.com/gfwlist +server=/dlercloud.com/127.0.0.1#5335 +ipset=/dlercloud.com/gfwlist +server=/issquareup.com/127.0.0.1#5335 +ipset=/issquareup.com/gfwlist +server=/smartcommunitiescoalition.com/127.0.0.1#5335 +ipset=/smartcommunitiescoalition.com/gfwlist +server=/jjdong7.com/127.0.0.1#5335 +ipset=/jjdong7.com/gfwlist +server=/cheapmonsterbeatsusa.us/127.0.0.1#5335 +ipset=/cheapmonsterbeatsusa.us/gfwlist +server=/epochtimes.ru/127.0.0.1#5335 +ipset=/epochtimes.ru/gfwlist +server=/myfistingporn.com/127.0.0.1#5335 +ipset=/myfistingporn.com/gfwlist +server=/directtvreviews.com/127.0.0.1#5335 +ipset=/directtvreviews.com/gfwlist +server=/gelbooru.com/127.0.0.1#5335 +ipset=/gelbooru.com/gfwlist +server=/volvotrucks.ge/127.0.0.1#5335 +ipset=/volvotrucks.ge/gfwlist +server=/mortein.com.br/127.0.0.1#5335 +ipset=/mortein.com.br/gfwlist +server=/1watchmygf.com/127.0.0.1#5335 +ipset=/1watchmygf.com/gfwlist +server=/adwords.com/127.0.0.1#5335 +ipset=/adwords.com/gfwlist +server=/bmw-motorrad.cl/127.0.0.1#5335 +ipset=/bmw-motorrad.cl/gfwlist +server=/bentobox.tv/127.0.0.1#5335 +ipset=/bentobox.tv/gfwlist +server=/qckprn.com/127.0.0.1#5335 +ipset=/qckprn.com/gfwlist +server=/pornpander.com/127.0.0.1#5335 +ipset=/pornpander.com/gfwlist +server=/paypal-database.us/127.0.0.1#5335 +ipset=/paypal-database.us/gfwlist +server=/pornolab.net/127.0.0.1#5335 +ipset=/pornolab.net/gfwlist +server=/bnbstatic.com/127.0.0.1#5335 +ipset=/bnbstatic.com/gfwlist +server=/googlecert.net/127.0.0.1#5335 +ipset=/googlecert.net/gfwlist +server=/foxsportsflorida.com/127.0.0.1#5335 +ipset=/foxsportsflorida.com/gfwlist +server=/bloomberglp.com/127.0.0.1#5335 +ipset=/bloomberglp.com/gfwlist +server=/livexxx.me/127.0.0.1#5335 +ipset=/livexxx.me/gfwlist +server=/bmw-motorrad.fr/127.0.0.1#5335 +ipset=/bmw-motorrad.fr/gfwlist +server=/intel.it/127.0.0.1#5335 +ipset=/intel.it/gfwlist +server=/cuckoldingwifey.com/127.0.0.1#5335 +ipset=/cuckoldingwifey.com/gfwlist +server=/sohcradio.com/127.0.0.1#5335 +ipset=/sohcradio.com/gfwlist +server=/realclear.com/127.0.0.1#5335 +ipset=/realclear.com/gfwlist +server=/google.co.uz/127.0.0.1#5335 +ipset=/google.co.uz/gfwlist +server=/durexukraine.com/127.0.0.1#5335 +ipset=/durexukraine.com/gfwlist +server=/finishinfo.com.au/127.0.0.1#5335 +ipset=/finishinfo.com.au/gfwlist +server=/bmw-connecteddrive.com.au/127.0.0.1#5335 +ipset=/bmw-connecteddrive.com.au/gfwlist +server=/stxmosquito.com/127.0.0.1#5335 +ipset=/stxmosquito.com/gfwlist +server=/bloombergtax1.com/127.0.0.1#5335 +ipset=/bloombergtax1.com/gfwlist +server=/bustysammieblack.com/127.0.0.1#5335 +ipset=/bustysammieblack.com/gfwlist +server=/whoreslag.com/127.0.0.1#5335 +ipset=/whoreslag.com/gfwlist +server=/www-paypal.us/127.0.0.1#5335 +ipset=/www-paypal.us/gfwlist +server=/openthread.io/127.0.0.1#5335 +ipset=/openthread.io/gfwlist +server=/blowjobqueens.net/127.0.0.1#5335 +ipset=/blowjobqueens.net/gfwlist +server=/foxweatherwatch.com/127.0.0.1#5335 +ipset=/foxweatherwatch.com/gfwlist +server=/ipadair.tw/127.0.0.1#5335 +ipset=/ipadair.tw/gfwlist +server=/walmart-content.com/127.0.0.1#5335 +ipset=/walmart-content.com/gfwlist +server=/sirenxxxstudios.com/127.0.0.1#5335 +ipset=/sirenxxxstudios.com/gfwlist +server=/attwifi.com/127.0.0.1#5335 +ipset=/attwifi.com/gfwlist +server=/paypal-communications.com/127.0.0.1#5335 +ipset=/paypal-communications.com/gfwlist +server=/manoramanews.com/127.0.0.1#5335 +ipset=/manoramanews.com/gfwlist +server=/realgfporn.com/127.0.0.1#5335 +ipset=/realgfporn.com/gfwlist +server=/nikesportswear.com/127.0.0.1#5335 +ipset=/nikesportswear.com/gfwlist +server=/porno365.website/127.0.0.1#5335 +ipset=/porno365.website/gfwlist +server=/yahoo.com.do/127.0.0.1#5335 +ipset=/yahoo.com.do/gfwlist +server=/anacams.com/127.0.0.1#5335 +ipset=/anacams.com/gfwlist +server=/bestbuyrewards.com/127.0.0.1#5335 +ipset=/bestbuyrewards.com/gfwlist +server=/facebooklivestaging.org/127.0.0.1#5335 +ipset=/facebooklivestaging.org/gfwlist +server=/backdoorlesbians.com/127.0.0.1#5335 +ipset=/backdoorlesbians.com/gfwlist +server=/hentaiblue.com/127.0.0.1#5335 +ipset=/hentaiblue.com/gfwlist +server=/managedpki.com/127.0.0.1#5335 +ipset=/managedpki.com/gfwlist +server=/beascoremodel.com/127.0.0.1#5335 +ipset=/beascoremodel.com/gfwlist +server=/alpherafinance.com.hk/127.0.0.1#5335 +ipset=/alpherafinance.com.hk/gfwlist +server=/mini-oman.com/127.0.0.1#5335 +ipset=/mini-oman.com/gfwlist +server=/porngogo.supertop-100.com/127.0.0.1#5335 +ipset=/porngogo.supertop-100.com/gfwlist +server=/nintendo.pt/127.0.0.1#5335 +ipset=/nintendo.pt/gfwlist +server=/dollarphotosclub.com/127.0.0.1#5335 +ipset=/dollarphotosclub.com/gfwlist +server=/hot-sex-tube.com/127.0.0.1#5335 +ipset=/hot-sex-tube.com/gfwlist +server=/szabadeuropa.hu/127.0.0.1#5335 +ipset=/szabadeuropa.hu/gfwlist +server=/verisign.asia/127.0.0.1#5335 +ipset=/verisign.asia/gfwlist +server=/footstockings.com/127.0.0.1#5335 +ipset=/footstockings.com/gfwlist +server=/finishinfo.ru/127.0.0.1#5335 +ipset=/finishinfo.ru/gfwlist +server=/beatsaudios.net/127.0.0.1#5335 +ipset=/beatsaudios.net/gfwlist +server=/definebabe.com/127.0.0.1#5335 +ipset=/definebabe.com/gfwlist +server=/sankeishop.jp/127.0.0.1#5335 +ipset=/sankeishop.jp/gfwlist +server=/scientificlinux.org/127.0.0.1#5335 +ipset=/scientificlinux.org/gfwlist +server=/lolshop.co.kr/127.0.0.1#5335 +ipset=/lolshop.co.kr/gfwlist +server=/researchandcare.org/127.0.0.1#5335 +ipset=/researchandcare.org/gfwlist +server=/lovebeatsdr.com/127.0.0.1#5335 +ipset=/lovebeatsdr.com/gfwlist +server=/bmw-motorcycles.vn/127.0.0.1#5335 +ipset=/bmw-motorcycles.vn/gfwlist +server=/phxbmw.com/127.0.0.1#5335 +ipset=/phxbmw.com/gfwlist +server=/18push.com/127.0.0.1#5335 +ipset=/18push.com/gfwlist +server=/hpeurope.com/127.0.0.1#5335 +ipset=/hpeurope.com/gfwlist +server=/hardcore-sex-filme.com/127.0.0.1#5335 +ipset=/hardcore-sex-filme.com/gfwlist +server=/bobvoyeur.com/127.0.0.1#5335 +ipset=/bobvoyeur.com/gfwlist +server=/istripper.com/127.0.0.1#5335 +ipset=/istripper.com/gfwlist +server=/canon.hr/127.0.0.1#5335 +ipset=/canon.hr/gfwlist +server=/youngpornonly.com/127.0.0.1#5335 +ipset=/youngpornonly.com/gfwlist +server=/apple.it/127.0.0.1#5335 +ipset=/apple.it/gfwlist +server=/volvobuses.ma/127.0.0.1#5335 +ipset=/volvobuses.ma/gfwlist +server=/nintendo.com.hk/127.0.0.1#5335 +ipset=/nintendo.com.hk/gfwlist +server=/shopifysvc.com/127.0.0.1#5335 +ipset=/shopifysvc.com/gfwlist +server=/blackboxgames.com/127.0.0.1#5335 +ipset=/blackboxgames.com/gfwlist +server=/1pondo.tv/127.0.0.1#5335 +ipset=/1pondo.tv/gfwlist +server=/xn--mts47c3w9b1qr.net/127.0.0.1#5335 +ipset=/xn--mts47c3w9b1qr.net/gfwlist +server=/jade-net-home.com/127.0.0.1#5335 +ipset=/jade-net-home.com/gfwlist +server=/scholar.google.pl/127.0.0.1#5335 +ipset=/scholar.google.pl/gfwlist +server=/deepfreeze.co.uk/127.0.0.1#5335 +ipset=/deepfreeze.co.uk/gfwlist +server=/yahoo.co.tz/127.0.0.1#5335 +ipset=/yahoo.co.tz/gfwlist +server=/teatroporno.com/127.0.0.1#5335 +ipset=/teatroporno.com/gfwlist +server=/businesswebwise.com/127.0.0.1#5335 +ipset=/businesswebwise.com/gfwlist +server=/drdreprobeatssale.com/127.0.0.1#5335 +ipset=/drdreprobeatssale.com/gfwlist +server=/lokinet.org/127.0.0.1#5335 +ipset=/lokinet.org/gfwlist +server=/book18.org/127.0.0.1#5335 +ipset=/book18.org/gfwlist +server=/fapforfun.net/127.0.0.1#5335 +ipset=/fapforfun.net/gfwlist +server=/hot-cartoon.com/127.0.0.1#5335 +ipset=/hot-cartoon.com/gfwlist +server=/scival.com/127.0.0.1#5335 +ipset=/scival.com/gfwlist +server=/science.com/127.0.0.1#5335 +ipset=/science.com/gfwlist +server=/impala-media-production.s3.amazonaws.com/127.0.0.1#5335 +ipset=/impala-media-production.s3.amazonaws.com/gfwlist +server=/lol-europe.com/127.0.0.1#5335 +ipset=/lol-europe.com/gfwlist +server=/repe21.com/127.0.0.1#5335 +ipset=/repe21.com/gfwlist +server=/teacherfucksteens.com/127.0.0.1#5335 +ipset=/teacherfucksteens.com/gfwlist +server=/bmw.lc/127.0.0.1#5335 +ipset=/bmw.lc/gfwlist +server=/babesnetwork.com/127.0.0.1#5335 +ipset=/babesnetwork.com/gfwlist +server=/tube18.sex/127.0.0.1#5335 +ipset=/tube18.sex/gfwlist +server=/bmw-motorrad-now-or-never.com/127.0.0.1#5335 +ipset=/bmw-motorrad-now-or-never.com/gfwlist +server=/gab.com/127.0.0.1#5335 +ipset=/gab.com/gfwlist +server=/pornoorzel.com/127.0.0.1#5335 +ipset=/pornoorzel.com/gfwlist +server=/sego8.co/127.0.0.1#5335 +ipset=/sego8.co/gfwlist +server=/yaddal.tv/127.0.0.1#5335 +ipset=/yaddal.tv/gfwlist +server=/nikeplus.com/127.0.0.1#5335 +ipset=/nikeplus.com/gfwlist +server=/xn--m1abbbgjah.lol/127.0.0.1#5335 +ipset=/xn--m1abbbgjah.lol/gfwlist +server=/devopsassessment.net/127.0.0.1#5335 +ipset=/devopsassessment.net/gfwlist +server=/yahoo.hu/127.0.0.1#5335 +ipset=/yahoo.hu/gfwlist +server=/berlincompanions.com/127.0.0.1#5335 +ipset=/berlincompanions.com/gfwlist +server=/intel.vu/127.0.0.1#5335 +ipset=/intel.vu/gfwlist +server=/bmw-tahiti.com/127.0.0.1#5335 +ipset=/bmw-tahiti.com/gfwlist +server=/drdreheadphonekey.com/127.0.0.1#5335 +ipset=/drdreheadphonekey.com/gfwlist +server=/yahoo.com.kw/127.0.0.1#5335 +ipset=/yahoo.com.kw/gfwlist +server=/ebay.sg/127.0.0.1#5335 +ipset=/ebay.sg/gfwlist +server=/workstations.tv/127.0.0.1#5335 +ipset=/workstations.tv/gfwlist +server=/fcaebook.com/127.0.0.1#5335 +ipset=/fcaebook.com/gfwlist +server=/dicela.com/127.0.0.1#5335 +ipset=/dicela.com/gfwlist +server=/see.xxx/127.0.0.1#5335 +ipset=/see.xxx/gfwlist +server=/nytchina.com/127.0.0.1#5335 +ipset=/nytchina.com/gfwlist +server=/nikefr.com/127.0.0.1#5335 +ipset=/nikefr.com/gfwlist +server=/pdxbmw.com/127.0.0.1#5335 +ipset=/pdxbmw.com/gfwlist +server=/mmonsterheadphones.net/127.0.0.1#5335 +ipset=/mmonsterheadphones.net/gfwlist +server=/tiltbrush.com/127.0.0.1#5335 +ipset=/tiltbrush.com/gfwlist +server=/scholar.google.co.jp/127.0.0.1#5335 +ipset=/scholar.google.co.jp/gfwlist +server=/likuoo.video/127.0.0.1#5335 +ipset=/likuoo.video/gfwlist +server=/ftop.ru/127.0.0.1#5335 +ipset=/ftop.ru/gfwlist +server=/powerbeats2wireless.com/127.0.0.1#5335 +ipset=/powerbeats2wireless.com/gfwlist +server=/infolinker.com.tw/127.0.0.1#5335 +ipset=/infolinker.com.tw/gfwlist +server=/minimarkham.com/127.0.0.1#5335 +ipset=/minimarkham.com/gfwlist +server=/gittigidiyorsikayet.com/127.0.0.1#5335 +ipset=/gittigidiyorsikayet.com/gfwlist +server=/apple.sa/127.0.0.1#5335 +ipset=/apple.sa/gfwlist +server=/heartbreakers.gallery/127.0.0.1#5335 +ipset=/heartbreakers.gallery/gfwlist +server=/xxx.com/127.0.0.1#5335 +ipset=/xxx.com/gfwlist +server=/inkedravens.com/127.0.0.1#5335 +ipset=/inkedravens.com/gfwlist +server=/porndude2.com/127.0.0.1#5335 +ipset=/porndude2.com/gfwlist +server=/dirctv.com/127.0.0.1#5335 +ipset=/dirctv.com/gfwlist +server=/cams.com/127.0.0.1#5335 +ipset=/cams.com/gfwlist +server=/ecgapp.net/127.0.0.1#5335 +ipset=/ecgapp.net/gfwlist +server=/tastyblacks.com/127.0.0.1#5335 +ipset=/tastyblacks.com/gfwlist +server=/laowang.vip/127.0.0.1#5335 +ipset=/laowang.vip/gfwlist +server=/apple.kr/127.0.0.1#5335 +ipset=/apple.kr/gfwlist +server=/extensionworkshop.com/127.0.0.1#5335 +ipset=/extensionworkshop.com/gfwlist +server=/teraperk.com/127.0.0.1#5335 +ipset=/teraperk.com/gfwlist +server=/aljazeera.net/127.0.0.1#5335 +ipset=/aljazeera.net/gfwlist +server=/allhen.online/127.0.0.1#5335 +ipset=/allhen.online/gfwlist +server=/airwick.at/127.0.0.1#5335 +ipset=/airwick.at/gfwlist +server=/csgfnmdb.com/127.0.0.1#5335 +ipset=/csgfnmdb.com/gfwlist +server=/firewire.eu/127.0.0.1#5335 +ipset=/firewire.eu/gfwlist +server=/mobileme.dk/127.0.0.1#5335 +ipset=/mobileme.dk/gfwlist +server=/bmw-qatar.com/127.0.0.1#5335 +ipset=/bmw-qatar.com/gfwlist +server=/trust-provider.com/127.0.0.1#5335 +ipset=/trust-provider.com/gfwlist +server=/jav.dog/127.0.0.1#5335 +ipset=/jav.dog/gfwlist +server=/publicpornvideo.com/127.0.0.1#5335 +ipset=/publicpornvideo.com/gfwlist +server=/eablackbox.com/127.0.0.1#5335 +ipset=/eablackbox.com/gfwlist +server=/mypornfox.com/127.0.0.1#5335 +ipset=/mypornfox.com/gfwlist +server=/desiraesworld.com/127.0.0.1#5335 +ipset=/desiraesworld.com/gfwlist +server=/appule.com/127.0.0.1#5335 +ipset=/appule.com/gfwlist +server=/esmatube.com/127.0.0.1#5335 +ipset=/esmatube.com/gfwlist +server=/bmwgroup-plants.com/127.0.0.1#5335 +ipset=/bmwgroup-plants.com/gfwlist +server=/ntdtv.org/127.0.0.1#5335 +ipset=/ntdtv.org/gfwlist +server=/wwwmfacebook.com/127.0.0.1#5335 +ipset=/wwwmfacebook.com/gfwlist +server=/edu-research.org/127.0.0.1#5335 +ipset=/edu-research.org/gfwlist +server=/watchjavonline.com/127.0.0.1#5335 +ipset=/watchjavonline.com/gfwlist +server=/ptapjmp.com/127.0.0.1#5335 +ipset=/ptapjmp.com/gfwlist +server=/stream-mydirtyhobby.biz/127.0.0.1#5335 +ipset=/stream-mydirtyhobby.biz/gfwlist +server=/love7.xyz/127.0.0.1#5335 +ipset=/love7.xyz/gfwlist +server=/bdsmlibrary.com/127.0.0.1#5335 +ipset=/bdsmlibrary.com/gfwlist +server=/dart.dev/127.0.0.1#5335 +ipset=/dart.dev/gfwlist +server=/nakedasiansex.com/127.0.0.1#5335 +ipset=/nakedasiansex.com/gfwlist +server=/branchportal.com/127.0.0.1#5335 +ipset=/branchportal.com/gfwlist +server=/pornobrasil.org/127.0.0.1#5335 +ipset=/pornobrasil.org/gfwlist +server=/xvideosbrasil.com/127.0.0.1#5335 +ipset=/xvideosbrasil.com/gfwlist +server=/sexoquente.blog/127.0.0.1#5335 +ipset=/sexoquente.blog/gfwlist +server=/fb.watch/127.0.0.1#5335 +ipset=/fb.watch/gfwlist +server=/mono-project.com/127.0.0.1#5335 +ipset=/mono-project.com/gfwlist +server=/facebooa.com/127.0.0.1#5335 +ipset=/facebooa.com/gfwlist +server=/pinterest.com.au/127.0.0.1#5335 +ipset=/pinterest.com.au/gfwlist +server=/hornybutt.com/127.0.0.1#5335 +ipset=/hornybutt.com/gfwlist +server=/rokutime.com/127.0.0.1#5335 +ipset=/rokutime.com/gfwlist +server=/binads.com/127.0.0.1#5335 +ipset=/binads.com/gfwlist +server=/applewatch.wang/127.0.0.1#5335 +ipset=/applewatch.wang/gfwlist +server=/rtings.com/127.0.0.1#5335 +ipset=/rtings.com/gfwlist +server=/compass.is/127.0.0.1#5335 +ipset=/compass.is/gfwlist +server=/xn--tkry91n.com/127.0.0.1#5335 +ipset=/xn--tkry91n.com/gfwlist +server=/sextvx.com/127.0.0.1#5335 +ipset=/sextvx.com/gfwlist +server=/renzhe.cloud/127.0.0.1#5335 +ipset=/renzhe.cloud/gfwlist +server=/faceid99.net/127.0.0.1#5335 +ipset=/faceid99.net/gfwlist +server=/amz123.com/127.0.0.1#5335 +ipset=/amz123.com/gfwlist +server=/icuminside.com/127.0.0.1#5335 +ipset=/icuminside.com/gfwlist +server=/hypodermic-injection.com/127.0.0.1#5335 +ipset=/hypodermic-injection.com/gfwlist +server=/beatsbydrdresale.net/127.0.0.1#5335 +ipset=/beatsbydrdresale.net/gfwlist +server=/homemadepornclip.com/127.0.0.1#5335 +ipset=/homemadepornclip.com/gfwlist +server=/camwhores.video/127.0.0.1#5335 +ipset=/camwhores.video/gfwlist +server=/mmaaxx.com/127.0.0.1#5335 +ipset=/mmaaxx.com/gfwlist +server=/xxxporn.su/127.0.0.1#5335 +ipset=/xxxporn.su/gfwlist +server=/2013cheapestbeats.com/127.0.0.1#5335 +ipset=/2013cheapestbeats.com/gfwlist +server=/twitter.jp/127.0.0.1#5335 +ipset=/twitter.jp/gfwlist +server=/nike-uk.com/127.0.0.1#5335 +ipset=/nike-uk.com/gfwlist +server=/google.cat/127.0.0.1#5335 +ipset=/google.cat/gfwlist +server=/dazn-api.com/127.0.0.1#5335 +ipset=/dazn-api.com/gfwlist +server=/statics-marketingsites-eas-ms-com.akamaized.net/127.0.0.1#5335 +ipset=/statics-marketingsites-eas-ms-com.akamaized.net/gfwlist +server=/celebritystorysite.com/127.0.0.1#5335 +ipset=/celebritystorysite.com/gfwlist +server=/fuck55.net/127.0.0.1#5335 +ipset=/fuck55.net/gfwlist +server=/icevirtuallibrary.com/127.0.0.1#5335 +ipset=/icevirtuallibrary.com/gfwlist +server=/mastercard.lu/127.0.0.1#5335 +ipset=/mastercard.lu/gfwlist +server=/fbrpms.com/127.0.0.1#5335 +ipset=/fbrpms.com/gfwlist +server=/linkedin.at/127.0.0.1#5335 +ipset=/linkedin.at/gfwlist +server=/gettyimages.hk/127.0.0.1#5335 +ipset=/gettyimages.hk/gfwlist +server=/fontbook.com/127.0.0.1#5335 +ipset=/fontbook.com/gfwlist +server=/money-link.com.tw/127.0.0.1#5335 +ipset=/money-link.com.tw/gfwlist +server=/naked.com/127.0.0.1#5335 +ipset=/naked.com/gfwlist +server=/fox.com/127.0.0.1#5335 +ipset=/fox.com/gfwlist +server=/bmw.mq/127.0.0.1#5335 +ipset=/bmw.mq/gfwlist +server=/best-sex-games.com/127.0.0.1#5335 +ipset=/best-sex-games.com/gfwlist +server=/blackandstacked.com/127.0.0.1#5335 +ipset=/blackandstacked.com/gfwlist +server=/ebaymotors.org/127.0.0.1#5335 +ipset=/ebaymotors.org/gfwlist +server=/dirtydoglinks.com/127.0.0.1#5335 +ipset=/dirtydoglinks.com/gfwlist +server=/shooshtime.com/127.0.0.1#5335 +ipset=/shooshtime.com/gfwlist +server=/n3ro.wtf/127.0.0.1#5335 +ipset=/n3ro.wtf/gfwlist +server=/joyclub.de/127.0.0.1#5335 +ipset=/joyclub.de/gfwlist +server=/drebeatspill.com/127.0.0.1#5335 +ipset=/drebeatspill.com/gfwlist +server=/bmw.mn/127.0.0.1#5335 +ipset=/bmw.mn/gfwlist +server=/ebayshop.com/127.0.0.1#5335 +ipset=/ebayshop.com/gfwlist +server=/yandex.lt/127.0.0.1#5335 +ipset=/yandex.lt/gfwlist +server=/estudio360.com.co/127.0.0.1#5335 +ipset=/estudio360.com.co/gfwlist +server=/stxmosquitoproject.org/127.0.0.1#5335 +ipset=/stxmosquitoproject.org/gfwlist +server=/hentaiheroes.com/127.0.0.1#5335 +ipset=/hentaiheroes.com/gfwlist +server=/clickserver.googleads.com/127.0.0.1#5335 +ipset=/clickserver.googleads.com/gfwlist +server=/ipod.no/127.0.0.1#5335 +ipset=/ipod.no/gfwlist +server=/tubeenema.com/127.0.0.1#5335 +ipset=/tubeenema.com/gfwlist +server=/singtaobooks.com/127.0.0.1#5335 +ipset=/singtaobooks.com/gfwlist +server=/marketexecutive.net/127.0.0.1#5335 +ipset=/marketexecutive.net/gfwlist +server=/veet.ro/127.0.0.1#5335 +ipset=/veet.ro/gfwlist +server=/javgg.net/127.0.0.1#5335 +ipset=/javgg.net/gfwlist +server=/starwars.com/127.0.0.1#5335 +ipset=/starwars.com/gfwlist +server=/camwhores.tv/127.0.0.1#5335 +ipset=/camwhores.tv/gfwlist +server=/embs.org/127.0.0.1#5335 +ipset=/embs.org/gfwlist +server=/openmidas.com/127.0.0.1#5335 +ipset=/openmidas.com/gfwlist +server=/disney-studio.com/127.0.0.1#5335 +ipset=/disney-studio.com/gfwlist +server=/fakings.com/127.0.0.1#5335 +ipset=/fakings.com/gfwlist +server=/bmw.com.uy/127.0.0.1#5335 +ipset=/bmw.com.uy/gfwlist +server=/freexxxporn.org/127.0.0.1#5335 +ipset=/freexxxporn.org/gfwlist +server=/xxxhubvideos.com/127.0.0.1#5335 +ipset=/xxxhubvideos.com/gfwlist +server=/dartsearch.net/127.0.0.1#5335 +ipset=/dartsearch.net/gfwlist +server=/wheelpop.com/127.0.0.1#5335 +ipset=/wheelpop.com/gfwlist +server=/softbankci.com/127.0.0.1#5335 +ipset=/softbankci.com/gfwlist +server=/wikimediacloud.org/127.0.0.1#5335 +ipset=/wikimediacloud.org/gfwlist +server=/beatssbydredanmark.com/127.0.0.1#5335 +ipset=/beatssbydredanmark.com/gfwlist +server=/diddykongracing.com/127.0.0.1#5335 +ipset=/diddykongracing.com/gfwlist +server=/bugzilla.org/127.0.0.1#5335 +ipset=/bugzilla.org/gfwlist +server=/bgov.com/127.0.0.1#5335 +ipset=/bgov.com/gfwlist +server=/hpayshop.com/127.0.0.1#5335 +ipset=/hpayshop.com/gfwlist +server=/termux.org/127.0.0.1#5335 +ipset=/termux.org/gfwlist +server=/poshtestgallery.com/127.0.0.1#5335 +ipset=/poshtestgallery.com/gfwlist +server=/airport-gov-cn.com/127.0.0.1#5335 +ipset=/airport-gov-cn.com/gfwlist +server=/mspairlift.com/127.0.0.1#5335 +ipset=/mspairlift.com/gfwlist +server=/riotgames.tv/127.0.0.1#5335 +ipset=/riotgames.tv/gfwlist +server=/ankarazirvesi2018.com/127.0.0.1#5335 +ipset=/ankarazirvesi2018.com/gfwlist +server=/bmw-motorrad-authorities.com/127.0.0.1#5335 +ipset=/bmw-motorrad-authorities.com/gfwlist +server=/sony.kz/127.0.0.1#5335 +ipset=/sony.kz/gfwlist +server=/hdrplusdata.org/127.0.0.1#5335 +ipset=/hdrplusdata.org/gfwlist +server=/volvo.se/127.0.0.1#5335 +ipset=/volvo.se/gfwlist +server=/ebayhabit.com/127.0.0.1#5335 +ipset=/ebayhabit.com/gfwlist +server=/torcidadeouro.com/127.0.0.1#5335 +ipset=/torcidadeouro.com/gfwlist +server=/facebookhome.info/127.0.0.1#5335 +ipset=/facebookhome.info/gfwlist +server=/xbox.org/127.0.0.1#5335 +ipset=/xbox.org/gfwlist +server=/pinterest.engineering/127.0.0.1#5335 +ipset=/pinterest.engineering/gfwlist +server=/wegamedeveloper.com/127.0.0.1#5335 +ipset=/wegamedeveloper.com/gfwlist +server=/okx.com/127.0.0.1#5335 +ipset=/okx.com/gfwlist +server=/wzmyg.com/127.0.0.1#5335 +ipset=/wzmyg.com/gfwlist +server=/monsterbeats-solo.net/127.0.0.1#5335 +ipset=/monsterbeats-solo.net/gfwlist +server=/eaaccess.com/127.0.0.1#5335 +ipset=/eaaccess.com/gfwlist +server=/abclider.com/127.0.0.1#5335 +ipset=/abclider.com/gfwlist +server=/comodoca2.com/127.0.0.1#5335 +ipset=/comodoca2.com/gfwlist +server=/sakuralive.com/127.0.0.1#5335 +ipset=/sakuralive.com/gfwlist +server=/visa.se/127.0.0.1#5335 +ipset=/visa.se/gfwlist +server=/zootube1.com/127.0.0.1#5335 +ipset=/zootube1.com/gfwlist +server=/hp-webplatform.com/127.0.0.1#5335 +ipset=/hp-webplatform.com/gfwlist +server=/rbspeakup.com/127.0.0.1#5335 +ipset=/rbspeakup.com/gfwlist +server=/fetishpornfilms.com/127.0.0.1#5335 +ipset=/fetishpornfilms.com/gfwlist +server=/beatfactoryoutlets.com/127.0.0.1#5335 +ipset=/beatfactoryoutlets.com/gfwlist +server=/battlefield.com/127.0.0.1#5335 +ipset=/battlefield.com/gfwlist +server=/moveaws.com/127.0.0.1#5335 +ipset=/moveaws.com/gfwlist +server=/openwrt.org/127.0.0.1#5335 +ipset=/openwrt.org/gfwlist +server=/supermariogalaxy.com/127.0.0.1#5335 +ipset=/supermariogalaxy.com/gfwlist +server=/tuta.io/127.0.0.1#5335 +ipset=/tuta.io/gfwlist +server=/paaypal.com/127.0.0.1#5335 +ipset=/paaypal.com/gfwlist +server=/naiadsystems.com/127.0.0.1#5335 +ipset=/naiadsystems.com/gfwlist +server=/hpusertraining.com/127.0.0.1#5335 +ipset=/hpusertraining.com/gfwlist +server=/yahoo.cl/127.0.0.1#5335 +ipset=/yahoo.cl/gfwlist +server=/huluusa.com/127.0.0.1#5335 +ipset=/huluusa.com/gfwlist +server=/ebayimg.com/127.0.0.1#5335 +ipset=/ebayimg.com/gfwlist +server=/visa.com.tr/127.0.0.1#5335 +ipset=/visa.com.tr/gfwlist +server=/ok.ru/127.0.0.1#5335 +ipset=/ok.ru/gfwlist +server=/bmw-motorrad.co.za/127.0.0.1#5335 +ipset=/bmw-motorrad.co.za/gfwlist +server=/javextreme.net/127.0.0.1#5335 +ipset=/javextreme.net/gfwlist +server=/nowe.com/127.0.0.1#5335 +ipset=/nowe.com/gfwlist +server=/yinmh.com/127.0.0.1#5335 +ipset=/yinmh.com/gfwlist +server=/iporntoo.com/127.0.0.1#5335 +ipset=/iporntoo.com/gfwlist +server=/appl4e.com/127.0.0.1#5335 +ipset=/appl4e.com/gfwlist +server=/thisav.org/127.0.0.1#5335 +ipset=/thisav.org/gfwlist +server=/videosdesexo.br.com/127.0.0.1#5335 +ipset=/videosdesexo.br.com/gfwlist +server=/nbcuni.com/127.0.0.1#5335 +ipset=/nbcuni.com/gfwlist +server=/ubisoft.com/127.0.0.1#5335 +ipset=/ubisoft.com/gfwlist +server=/nudeteenboys.net/127.0.0.1#5335 +ipset=/nudeteenboys.net/gfwlist +server=/voasomali.com/127.0.0.1#5335 +ipset=/voasomali.com/gfwlist +server=/medow.ru/127.0.0.1#5335 +ipset=/medow.ru/gfwlist +server=/beatsbydreonlie2013-nl.com/127.0.0.1#5335 +ipset=/beatsbydreonlie2013-nl.com/gfwlist +server=/xboxab.com/127.0.0.1#5335 +ipset=/xboxab.com/gfwlist +server=/povr.com/127.0.0.1#5335 +ipset=/povr.com/gfwlist +server=/appletaiwan.com/127.0.0.1#5335 +ipset=/appletaiwan.com/gfwlist +server=/youtube.mx/127.0.0.1#5335 +ipset=/youtube.mx/gfwlist +server=/wirelessgroup.co.uk/127.0.0.1#5335 +ipset=/wirelessgroup.co.uk/gfwlist +server=/ya.ru/127.0.0.1#5335 +ipset=/ya.ru/gfwlist +server=/cheapheadsetshop.com/127.0.0.1#5335 +ipset=/cheapheadsetshop.com/gfwlist +server=/ltn.com.tw/127.0.0.1#5335 +ipset=/ltn.com.tw/gfwlist +server=/calgonit.com/127.0.0.1#5335 +ipset=/calgonit.com/gfwlist +server=/sonypcl.jp/127.0.0.1#5335 +ipset=/sonypcl.jp/gfwlist +server=/paypalhere.tv/127.0.0.1#5335 +ipset=/paypalhere.tv/gfwlist +server=/sexmadeathome.com/127.0.0.1#5335 +ipset=/sexmadeathome.com/gfwlist +server=/bmwconnecteddrive.com/127.0.0.1#5335 +ipset=/bmwconnecteddrive.com/gfwlist +server=/sexy-beauties.com/127.0.0.1#5335 +ipset=/sexy-beauties.com/gfwlist +server=/69games.xxx/127.0.0.1#5335 +ipset=/69games.xxx/gfwlist +server=/canon.cz/127.0.0.1#5335 +ipset=/canon.cz/gfwlist +server=/dajiyuan.eu/127.0.0.1#5335 +ipset=/dajiyuan.eu/gfwlist +server=/vod-thumb-uk-live.akamaized.net/127.0.0.1#5335 +ipset=/vod-thumb-uk-live.akamaized.net/gfwlist +server=/lgecareers.com/127.0.0.1#5335 +ipset=/lgecareers.com/gfwlist +server=/voacantonese.com/127.0.0.1#5335 +ipset=/voacantonese.com/gfwlist +server=/boobpedia.com/127.0.0.1#5335 +ipset=/boobpedia.com/gfwlist +server=/10musume.com/127.0.0.1#5335 +ipset=/10musume.com/gfwlist +server=/thumbzilla.com/127.0.0.1#5335 +ipset=/thumbzilla.com/gfwlist +server=/starbucks.com.mx/127.0.0.1#5335 +ipset=/starbucks.com.mx/gfwlist +server=/smartoneholdings.com/127.0.0.1#5335 +ipset=/smartoneholdings.com/gfwlist +server=/ikea.co.uk/127.0.0.1#5335 +ipset=/ikea.co.uk/gfwlist +server=/drebeats-studio.com/127.0.0.1#5335 +ipset=/drebeats-studio.com/gfwlist +server=/airwick.ca/127.0.0.1#5335 +ipset=/airwick.ca/gfwlist +server=/whispersystems.org/127.0.0.1#5335 +ipset=/whispersystems.org/gfwlist +server=/paypal-prepaid.com/127.0.0.1#5335 +ipset=/paypal-prepaid.com/gfwlist +server=/hentaiporn.com/127.0.0.1#5335 +ipset=/hentaiporn.com/gfwlist +server=/wwwinstagram.com/127.0.0.1#5335 +ipset=/wwwinstagram.com/gfwlist +server=/cartoon-sex.tv/127.0.0.1#5335 +ipset=/cartoon-sex.tv/gfwlist +server=/cheapbeatsbydrdrepro.com/127.0.0.1#5335 +ipset=/cheapbeatsbydrdrepro.com/gfwlist +server=/shemalespoiledwhore.com/127.0.0.1#5335 +ipset=/shemalespoiledwhore.com/gfwlist +server=/nike-usa.com/127.0.0.1#5335 +ipset=/nike-usa.com/gfwlist +server=/hpinstantink.ca/127.0.0.1#5335 +ipset=/hpinstantink.ca/gfwlist +server=/hshsxkj.com/127.0.0.1#5335 +ipset=/hshsxkj.com/gfwlist +server=/tvbeventpower.com.hk/127.0.0.1#5335 +ipset=/tvbeventpower.com.hk/gfwlist +server=/wwwicloud.com/127.0.0.1#5335 +ipset=/wwwicloud.com/gfwlist +server=/wuyefuli.org/127.0.0.1#5335 +ipset=/wuyefuli.org/gfwlist +server=/newschristmasshopping.com/127.0.0.1#5335 +ipset=/newschristmasshopping.com/gfwlist +server=/bloombergtaxtech.com/127.0.0.1#5335 +ipset=/bloombergtaxtech.com/gfwlist +server=/mymmode.com/127.0.0.1#5335 +ipset=/mymmode.com/gfwlist +server=/girlfriendvids.net/127.0.0.1#5335 +ipset=/girlfriendvids.net/gfwlist +server=/fapnado.com/127.0.0.1#5335 +ipset=/fapnado.com/gfwlist +server=/mypearsonshop.com.mx/127.0.0.1#5335 +ipset=/mypearsonshop.com.mx/gfwlist +server=/sony.com.bo/127.0.0.1#5335 +ipset=/sony.com.bo/gfwlist +server=/intelvmwarecybersecurity.com/127.0.0.1#5335 +ipset=/intelvmwarecybersecurity.com/gfwlist +server=/928.plus/127.0.0.1#5335 +ipset=/928.plus/gfwlist +server=/xozilla.com/127.0.0.1#5335 +ipset=/xozilla.com/gfwlist +server=/bitquick.co/127.0.0.1#5335 +ipset=/bitquick.co/gfwlist +server=/bidong25.com/127.0.0.1#5335 +ipset=/bidong25.com/gfwlist +server=/macosforge.org/127.0.0.1#5335 +ipset=/macosforge.org/gfwlist +server=/topescortbabes.com/127.0.0.1#5335 +ipset=/topescortbabes.com/gfwlist +server=/xxxhdvideo.mobi/127.0.0.1#5335 +ipset=/xxxhdvideo.mobi/gfwlist +server=/wwwebay.com/127.0.0.1#5335 +ipset=/wwwebay.com/gfwlist +server=/themilfmovies.com/127.0.0.1#5335 +ipset=/themilfmovies.com/gfwlist +server=/gizmoxxx.com/127.0.0.1#5335 +ipset=/gizmoxxx.com/gfwlist +server=/buyaapl.net/127.0.0.1#5335 +ipset=/buyaapl.net/gfwlist +server=/n15zev3w.shop/127.0.0.1#5335 +ipset=/n15zev3w.shop/gfwlist +server=/sis001.com/127.0.0.1#5335 +ipset=/sis001.com/gfwlist +server=/adobedc.net/127.0.0.1#5335 +ipset=/adobedc.net/gfwlist +server=/minivilledequebec.com/127.0.0.1#5335 +ipset=/minivilledequebec.com/gfwlist +server=/teachmyass.com/127.0.0.1#5335 +ipset=/teachmyass.com/gfwlist +server=/favelaporno.com/127.0.0.1#5335 +ipset=/favelaporno.com/gfwlist +server=/yandex.uz/127.0.0.1#5335 +ipset=/yandex.uz/gfwlist +server=/47gyosei.jp/127.0.0.1#5335 +ipset=/47gyosei.jp/gfwlist +server=/ebaymag.com/127.0.0.1#5335 +ipset=/ebaymag.com/gfwlist +server=/icloudhome.com/127.0.0.1#5335 +ipset=/icloudhome.com/gfwlist +server=/rtm.tnt-ea.com/127.0.0.1#5335 +ipset=/rtm.tnt-ea.com/gfwlist +server=/girls2see.ch/127.0.0.1#5335 +ipset=/girls2see.ch/gfwlist +server=/herokucdn.com/127.0.0.1#5335 +ipset=/herokucdn.com/gfwlist +server=/hpspeaker.com/127.0.0.1#5335 +ipset=/hpspeaker.com/gfwlist +server=/jav.gallery/127.0.0.1#5335 +ipset=/jav.gallery/gfwlist +server=/globalsecurity.org/127.0.0.1#5335 +ipset=/globalsecurity.org/gfwlist +server=/tubesex.me/127.0.0.1#5335 +ipset=/tubesex.me/gfwlist +server=/daoc.net/127.0.0.1#5335 +ipset=/daoc.net/gfwlist +server=/theav.cc/127.0.0.1#5335 +ipset=/theav.cc/gfwlist +server=/disney-asia.com/127.0.0.1#5335 +ipset=/disney-asia.com/gfwlist +server=/esposasymaridos.com/127.0.0.1#5335 +ipset=/esposasymaridos.com/gfwlist +server=/bustykerrymarie.com/127.0.0.1#5335 +ipset=/bustykerrymarie.com/gfwlist +server=/apple.hn/127.0.0.1#5335 +ipset=/apple.hn/gfwlist +server=/binance.cloud/127.0.0.1#5335 +ipset=/binance.cloud/gfwlist +server=/hackerguardian.com/127.0.0.1#5335 +ipset=/hackerguardian.com/gfwlist +server=/picacomic.xyz/127.0.0.1#5335 +ipset=/picacomic.xyz/gfwlist +server=/ams02.space/127.0.0.1#5335 +ipset=/ams02.space/gfwlist +server=/xvideos.blog/127.0.0.1#5335 +ipset=/xvideos.blog/gfwlist +server=/young-amateur-movies.com/127.0.0.1#5335 +ipset=/young-amateur-movies.com/gfwlist +server=/cheerwholesale.us/127.0.0.1#5335 +ipset=/cheerwholesale.us/gfwlist +server=/eamythic.net/127.0.0.1#5335 +ipset=/eamythic.net/gfwlist +server=/beatsbydrediscount.com/127.0.0.1#5335 +ipset=/beatsbydrediscount.com/gfwlist +server=/amazingcuckold.com/127.0.0.1#5335 +ipset=/amazingcuckold.com/gfwlist +server=/webcamgirls.chat/127.0.0.1#5335 +ipset=/webcamgirls.chat/gfwlist +server=/virtualearth.net/127.0.0.1#5335 +ipset=/virtualearth.net/gfwlist +server=/home-sex-tapes.com/127.0.0.1#5335 +ipset=/home-sex-tapes.com/gfwlist +server=/nvidia.com/127.0.0.1#5335 +ipset=/nvidia.com/gfwlist +server=/modelmediaus.com/127.0.0.1#5335 +ipset=/modelmediaus.com/gfwlist +server=/facebook-texas-holdem.com/127.0.0.1#5335 +ipset=/facebook-texas-holdem.com/gfwlist +server=/unstyle.us/127.0.0.1#5335 +ipset=/unstyle.us/gfwlist +server=/ccav69.info/127.0.0.1#5335 +ipset=/ccav69.info/gfwlist +server=/paypal-gift.com/127.0.0.1#5335 +ipset=/paypal-gift.com/gfwlist +server=/muji.eu/127.0.0.1#5335 +ipset=/muji.eu/gfwlist +server=/xoom-experience.com/127.0.0.1#5335 +ipset=/xoom-experience.com/gfwlist +server=/binancezh.live/127.0.0.1#5335 +ipset=/binancezh.live/gfwlist +server=/transpornsites.com/127.0.0.1#5335 +ipset=/transpornsites.com/gfwlist +server=/playartifact.com/127.0.0.1#5335 +ipset=/playartifact.com/gfwlist +server=/nomulus.foo/127.0.0.1#5335 +ipset=/nomulus.foo/gfwlist +server=/lliusno.com/127.0.0.1#5335 +ipset=/lliusno.com/gfwlist +server=/softbank-telecom.com/127.0.0.1#5335 +ipset=/softbank-telecom.com/gfwlist +server=/bmw-connecteddrive.no/127.0.0.1#5335 +ipset=/bmw-connecteddrive.no/gfwlist +server=/geeksquad.ca/127.0.0.1#5335 +ipset=/geeksquad.ca/gfwlist +server=/nakedmodelsxxx.com/127.0.0.1#5335 +ipset=/nakedmodelsxxx.com/gfwlist +server=/homemoviestube.com/127.0.0.1#5335 +ipset=/homemoviestube.com/gfwlist +server=/jmcomic.me/127.0.0.1#5335 +ipset=/jmcomic.me/gfwlist +server=/yourgynexam.com/127.0.0.1#5335 +ipset=/yourgynexam.com/gfwlist +server=/dettol.ie/127.0.0.1#5335 +ipset=/dettol.ie/gfwlist +server=/onefifteen.net/127.0.0.1#5335 +ipset=/onefifteen.net/gfwlist +server=/hentaigamer.org/127.0.0.1#5335 +ipset=/hentaigamer.org/gfwlist +server=/static-cisco.com/127.0.0.1#5335 +ipset=/static-cisco.com/gfwlist +server=/wanokokorosoh.com/127.0.0.1#5335 +ipset=/wanokokorosoh.com/gfwlist +server=/myappleid.com/127.0.0.1#5335 +ipset=/myappleid.com/gfwlist +server=/onlyincestporn.com/127.0.0.1#5335 +ipset=/onlyincestporn.com/gfwlist +server=/ladsp.com/127.0.0.1#5335 +ipset=/ladsp.com/gfwlist +server=/bmw.co.ao/127.0.0.1#5335 +ipset=/bmw.co.ao/gfwlist +server=/betterexplained.com/127.0.0.1#5335 +ipset=/betterexplained.com/gfwlist +server=/appletv.fr/127.0.0.1#5335 +ipset=/appletv.fr/gfwlist +server=/storyful.com/127.0.0.1#5335 +ipset=/storyful.com/gfwlist +server=/bmw.es/127.0.0.1#5335 +ipset=/bmw.es/gfwlist +server=/sub147.com/127.0.0.1#5335 +ipset=/sub147.com/gfwlist +server=/berkeley.edu/127.0.0.1#5335 +ipset=/berkeley.edu/gfwlist +server=/miniso.ca/127.0.0.1#5335 +ipset=/miniso.ca/gfwlist +server=/instaadder.com/127.0.0.1#5335 +ipset=/instaadder.com/gfwlist +server=/novinhasdozapzap.com/127.0.0.1#5335 +ipset=/novinhasdozapzap.com/gfwlist +server=/beatspascher-bydre.com/127.0.0.1#5335 +ipset=/beatspascher-bydre.com/gfwlist +server=/tawny-peaks.com/127.0.0.1#5335 +ipset=/tawny-peaks.com/gfwlist +server=/codeforaliving.io/127.0.0.1#5335 +ipset=/codeforaliving.io/gfwlist +server=/bmwauslieferungszentrum.com/127.0.0.1#5335 +ipset=/bmwauslieferungszentrum.com/gfwlist +server=/nbcnews.com/127.0.0.1#5335 +ipset=/nbcnews.com/gfwlist +server=/www-cdn.icloud.com.akadns.net/127.0.0.1#5335 +ipset=/www-cdn.icloud.com.akadns.net/gfwlist +server=/bbc.net.uk/127.0.0.1#5335 +ipset=/bbc.net.uk/gfwlist +server=/volvotrucks.co.za/127.0.0.1#5335 +ipset=/volvotrucks.co.za/gfwlist +server=/appleaustralia.net.au/127.0.0.1#5335 +ipset=/appleaustralia.net.au/gfwlist +server=/jav-1080.com/127.0.0.1#5335 +ipset=/jav-1080.com/gfwlist +server=/my-magazine.me/127.0.0.1#5335 +ipset=/my-magazine.me/gfwlist +server=/xlgirls.com/127.0.0.1#5335 +ipset=/xlgirls.com/gfwlist +server=/cnshopin.com/127.0.0.1#5335 +ipset=/cnshopin.com/gfwlist +server=/wisecoin.com/127.0.0.1#5335 +ipset=/wisecoin.com/gfwlist +server=/paypal-corp.com/127.0.0.1#5335 +ipset=/paypal-corp.com/gfwlist +server=/9to5google.com/127.0.0.1#5335 +ipset=/9to5google.com/gfwlist +server=/jmcomic.mobi/127.0.0.1#5335 +ipset=/jmcomic.mobi/gfwlist +server=/supjav.com/127.0.0.1#5335 +ipset=/supjav.com/gfwlist +server=/fappcelebs.com/127.0.0.1#5335 +ipset=/fappcelebs.com/gfwlist +server=/porngamesverse.com/127.0.0.1#5335 +ipset=/porngamesverse.com/gfwlist +server=/fox46.com/127.0.0.1#5335 +ipset=/fox46.com/gfwlist +server=/hornychat.net/127.0.0.1#5335 +ipset=/hornychat.net/gfwlist +server=/reddit.com/127.0.0.1#5335 +ipset=/reddit.com/gfwlist +server=/nikkansports.com/127.0.0.1#5335 +ipset=/nikkansports.com/gfwlist +server=/asianpornmovies.com/127.0.0.1#5335 +ipset=/asianpornmovies.com/gfwlist +server=/ieeemce.org/127.0.0.1#5335 +ipset=/ieeemce.org/gfwlist +server=/258porn.com/127.0.0.1#5335 +ipset=/258porn.com/gfwlist +server=/anal.media/127.0.0.1#5335 +ipset=/anal.media/gfwlist +server=/jjgirls.com/127.0.0.1#5335 +ipset=/jjgirls.com/gfwlist +server=/gopivotal.net/127.0.0.1#5335 +ipset=/gopivotal.net/gfwlist +server=/pornvideotube.online/127.0.0.1#5335 +ipset=/pornvideotube.online/gfwlist +server=/openvpn.net/127.0.0.1#5335 +ipset=/openvpn.net/gfwlist +server=/rosemarydoll.com/127.0.0.1#5335 +ipset=/rosemarydoll.com/gfwlist +server=/hdhole.com/127.0.0.1#5335 +ipset=/hdhole.com/gfwlist +server=/youtube.com.hk/127.0.0.1#5335 +ipset=/youtube.com.hk/gfwlist +server=/cdnpure.com/127.0.0.1#5335 +ipset=/cdnpure.com/gfwlist +server=/xvideostravestis.xxx/127.0.0.1#5335 +ipset=/xvideostravestis.xxx/gfwlist +server=/vrporn.com/127.0.0.1#5335 +ipset=/vrporn.com/gfwlist +server=/ppaypal.com/127.0.0.1#5335 +ipset=/ppaypal.com/gfwlist +server=/paypal-secure.net/127.0.0.1#5335 +ipset=/paypal-secure.net/gfwlist +server=/cliphunter.com/127.0.0.1#5335 +ipset=/cliphunter.com/gfwlist +server=/facebookgames.com/127.0.0.1#5335 +ipset=/facebookgames.com/gfwlist +server=/pornhost.com/127.0.0.1#5335 +ipset=/pornhost.com/gfwlist +server=/apl-hamivideo.cdn.hinet.net/127.0.0.1#5335 +ipset=/apl-hamivideo.cdn.hinet.net/gfwlist +server=/vmwsalesrewards.com/127.0.0.1#5335 +ipset=/vmwsalesrewards.com/gfwlist +server=/xxx-files.org/127.0.0.1#5335 +ipset=/xxx-files.org/gfwlist +server=/allhorsesex.com/127.0.0.1#5335 +ipset=/allhorsesex.com/gfwlist +server=/xscale.com/127.0.0.1#5335 +ipset=/xscale.com/gfwlist +server=/babesandbitches.net/127.0.0.1#5335 +ipset=/babesandbitches.net/gfwlist +server=/settv.com.tw/127.0.0.1#5335 +ipset=/settv.com.tw/gfwlist +server=/nikefoamposites.com/127.0.0.1#5335 +ipset=/nikefoamposites.com/gfwlist +server=/pentium.com/127.0.0.1#5335 +ipset=/pentium.com/gfwlist +server=/azurestackvalidation.com/127.0.0.1#5335 +ipset=/azurestackvalidation.com/gfwlist +server=/bmwperformancecenter.com/127.0.0.1#5335 +ipset=/bmwperformancecenter.com/gfwlist +server=/ukipad.com/127.0.0.1#5335 +ipset=/ukipad.com/gfwlist +server=/yandex.st/127.0.0.1#5335 +ipset=/yandex.st/gfwlist +server=/ebaycoins.com/127.0.0.1#5335 +ipset=/ebaycoins.com/gfwlist +server=/gosq.com/127.0.0.1#5335 +ipset=/gosq.com/gfwlist +server=/sexiframe.com/127.0.0.1#5335 +ipset=/sexiframe.com/gfwlist +server=/citytourgirls.com/127.0.0.1#5335 +ipset=/citytourgirls.com/gfwlist +server=/pincong.rocks/127.0.0.1#5335 +ipset=/pincong.rocks/gfwlist +server=/hunk.ws/127.0.0.1#5335 +ipset=/hunk.ws/gfwlist +server=/blpprofessional.com/127.0.0.1#5335 +ipset=/blpprofessional.com/gfwlist +server=/tgirlcentral.com/127.0.0.1#5335 +ipset=/tgirlcentral.com/gfwlist +server=/uhub.com/127.0.0.1#5335 +ipset=/uhub.com/gfwlist +server=/datasheets360.com/127.0.0.1#5335 +ipset=/datasheets360.com/gfwlist +server=/airwick.us/127.0.0.1#5335 +ipset=/airwick.us/gfwlist +server=/hentaihaven.me/127.0.0.1#5335 +ipset=/hentaihaven.me/gfwlist +server=/shireyishunjian.com/127.0.0.1#5335 +ipset=/shireyishunjian.com/gfwlist +server=/adidas.cz/127.0.0.1#5335 +ipset=/adidas.cz/gfwlist +server=/rarbg.is/127.0.0.1#5335 +ipset=/rarbg.is/gfwlist +server=/businessinsider.com/127.0.0.1#5335 +ipset=/businessinsider.com/gfwlist +server=/visa.gr/127.0.0.1#5335 +ipset=/visa.gr/gfwlist +server=/storm.mg/127.0.0.1#5335 +ipset=/storm.mg/gfwlist +server=/cockyboys.com/127.0.0.1#5335 +ipset=/cockyboys.com/gfwlist +server=/netflix.com.edgesuite.net/127.0.0.1#5335 +ipset=/netflix.com.edgesuite.net/gfwlist +server=/monsterbeatsmall.com/127.0.0.1#5335 +ipset=/monsterbeatsmall.com/gfwlist +server=/18doujin.com/127.0.0.1#5335 +ipset=/18doujin.com/gfwlist +server=/itunes.us/127.0.0.1#5335 +ipset=/itunes.us/gfwlist +server=/thetimes.co.uk/127.0.0.1#5335 +ipset=/thetimes.co.uk/gfwlist +server=/tellapart.com/127.0.0.1#5335 +ipset=/tellapart.com/gfwlist +server=/smutindia.com/127.0.0.1#5335 +ipset=/smutindia.com/gfwlist +server=/netpornsex.net/127.0.0.1#5335 +ipset=/netpornsex.net/gfwlist +server=/qualcommlabs.com/127.0.0.1#5335 +ipset=/qualcommlabs.com/gfwlist +server=/applepaysupplies.net/127.0.0.1#5335 +ipset=/applepaysupplies.net/gfwlist +server=/faeboook.com/127.0.0.1#5335 +ipset=/faeboook.com/gfwlist +server=/ecimg.tw/127.0.0.1#5335 +ipset=/ecimg.tw/gfwlist +server=/duckduckgo.ke/127.0.0.1#5335 +ipset=/duckduckgo.ke/gfwlist +server=/gen.lib.rus.ec/127.0.0.1#5335 +ipset=/gen.lib.rus.ec/gfwlist +server=/nukemanga.com/127.0.0.1#5335 +ipset=/nukemanga.com/gfwlist +server=/guardianapps.co.uk/127.0.0.1#5335 +ipset=/guardianapps.co.uk/gfwlist +server=/durex.com.tr/127.0.0.1#5335 +ipset=/durex.com.tr/gfwlist +server=/earphonescheapest.com/127.0.0.1#5335 +ipset=/earphonescheapest.com/gfwlist +server=/c-ij.com/127.0.0.1#5335 +ipset=/c-ij.com/gfwlist +server=/desihoes.com/127.0.0.1#5335 +ipset=/desihoes.com/gfwlist +server=/exxxtra.net/127.0.0.1#5335 +ipset=/exxxtra.net/gfwlist +server=/reuters.com/127.0.0.1#5335 +ipset=/reuters.com/gfwlist +server=/payhulu.com/127.0.0.1#5335 +ipset=/payhulu.com/gfwlist +server=/veporn.com/127.0.0.1#5335 +ipset=/veporn.com/gfwlist +server=/homofans.blogspot.com/127.0.0.1#5335 +ipset=/homofans.blogspot.com/gfwlist +server=/amznl.com/127.0.0.1#5335 +ipset=/amznl.com/gfwlist +server=/thepornlistdude.com/127.0.0.1#5335 +ipset=/thepornlistdude.com/gfwlist +server=/incentivetravelgifts.com/127.0.0.1#5335 +ipset=/incentivetravelgifts.com/gfwlist +server=/volvotrucks.rs/127.0.0.1#5335 +ipset=/volvotrucks.rs/gfwlist +server=/reuters.tv/127.0.0.1#5335 +ipset=/reuters.tv/gfwlist +server=/intel.si/127.0.0.1#5335 +ipset=/intel.si/gfwlist +server=/vfsco.ie/127.0.0.1#5335 +ipset=/vfsco.ie/gfwlist +server=/ah-me.com/127.0.0.1#5335 +ipset=/ah-me.com/gfwlist +server=/sonybo.co.jp/127.0.0.1#5335 +ipset=/sonybo.co.jp/gfwlist +server=/sexwebvideo.com/127.0.0.1#5335 +ipset=/sexwebvideo.com/gfwlist +server=/businessinsider.fr/127.0.0.1#5335 +ipset=/businessinsider.fr/gfwlist +server=/digitalassetlinks.org/127.0.0.1#5335 +ipset=/digitalassetlinks.org/gfwlist +server=/javfor.me/127.0.0.1#5335 +ipset=/javfor.me/gfwlist +server=/monsterbeatstudio.com/127.0.0.1#5335 +ipset=/monsterbeatstudio.com/gfwlist +server=/booloo.com/127.0.0.1#5335 +ipset=/booloo.com/gfwlist +server=/php.net/127.0.0.1#5335 +ipset=/php.net/gfwlist +server=/snapcraft.io/127.0.0.1#5335 +ipset=/snapcraft.io/gfwlist +server=/beatsstudiohodetelefoner.com/127.0.0.1#5335 +ipset=/beatsstudiohodetelefoner.com/gfwlist +server=/redditmail.com/127.0.0.1#5335 +ipset=/redditmail.com/gfwlist +server=/ikea.om/127.0.0.1#5335 +ipset=/ikea.om/gfwlist +server=/canon.ee/127.0.0.1#5335 +ipset=/canon.ee/gfwlist +server=/marketolive.com/127.0.0.1#5335 +ipset=/marketolive.com/gfwlist +server=/4porn4.com/127.0.0.1#5335 +ipset=/4porn4.com/gfwlist +server=/reconinstruments.com/127.0.0.1#5335 +ipset=/reconinstruments.com/gfwlist +server=/scholar.google.com.ly/127.0.0.1#5335 +ipset=/scholar.google.com.ly/gfwlist +server=/asianporn.sexy/127.0.0.1#5335 +ipset=/asianporn.sexy/gfwlist +server=/emagic.de/127.0.0.1#5335 +ipset=/emagic.de/gfwlist +server=/qkjuyet.com/127.0.0.1#5335 +ipset=/qkjuyet.com/gfwlist +server=/xxxpornotuber.com/127.0.0.1#5335 +ipset=/xxxpornotuber.com/gfwlist +server=/ipple.com/127.0.0.1#5335 +ipset=/ipple.com/gfwlist +server=/jkbeats.com/127.0.0.1#5335 +ipset=/jkbeats.com/gfwlist +server=/topnudemalecelebs.com/127.0.0.1#5335 +ipset=/topnudemalecelebs.com/gfwlist +server=/universalpicturesinternational.com/127.0.0.1#5335 +ipset=/universalpicturesinternational.com/gfwlist +server=/vilavpn.com/127.0.0.1#5335 +ipset=/vilavpn.com/gfwlist +server=/skyoceanrescue.de/127.0.0.1#5335 +ipset=/skyoceanrescue.de/gfwlist +server=/namemybeats.com/127.0.0.1#5335 +ipset=/namemybeats.com/gfwlist +server=/facebooj.com/127.0.0.1#5335 +ipset=/facebooj.com/gfwlist +server=/shikorina.net/127.0.0.1#5335 +ipset=/shikorina.net/gfwlist +server=/moneywithfacebook.com/127.0.0.1#5335 +ipset=/moneywithfacebook.com/gfwlist +server=/facecbgook.com/127.0.0.1#5335 +ipset=/facecbgook.com/gfwlist +server=/sissy.game/127.0.0.1#5335 +ipset=/sissy.game/gfwlist +server=/wiipartyu.com/127.0.0.1#5335 +ipset=/wiipartyu.com/gfwlist +server=/chatwhores.org/127.0.0.1#5335 +ipset=/chatwhores.org/gfwlist +server=/awstrack.me/127.0.0.1#5335 +ipset=/awstrack.me/gfwlist +server=/anaconda.org/127.0.0.1#5335 +ipset=/anaconda.org/gfwlist +server=/bangbrosnetwork.com/127.0.0.1#5335 +ipset=/bangbrosnetwork.com/gfwlist +server=/discord.tools/127.0.0.1#5335 +ipset=/discord.tools/gfwlist +server=/hottestfilms.com/127.0.0.1#5335 +ipset=/hottestfilms.com/gfwlist +server=/chromeos.dev/127.0.0.1#5335 +ipset=/chromeos.dev/gfwlist +server=/xnxxx.cc/127.0.0.1#5335 +ipset=/xnxxx.cc/gfwlist +server=/signal.org/127.0.0.1#5335 +ipset=/signal.org/gfwlist +server=/intercom.io/127.0.0.1#5335 +ipset=/intercom.io/gfwlist +server=/starbucks.co.id/127.0.0.1#5335 +ipset=/starbucks.co.id/gfwlist +server=/imaypb.com/127.0.0.1#5335 +ipset=/imaypb.com/gfwlist +server=/hpdrivers.com/127.0.0.1#5335 +ipset=/hpdrivers.com/gfwlist +server=/taiwansex.tw/127.0.0.1#5335 +ipset=/taiwansex.tw/gfwlist +server=/hptv.fun/127.0.0.1#5335 +ipset=/hptv.fun/gfwlist +server=/typeisbeautiful.com/127.0.0.1#5335 +ipset=/typeisbeautiful.com/gfwlist +server=/svipshipin.store/127.0.0.1#5335 +ipset=/svipshipin.store/gfwlist +server=/vipergirls.to/127.0.0.1#5335 +ipset=/vipergirls.to/gfwlist +server=/archive.org/127.0.0.1#5335 +ipset=/archive.org/gfwlist +server=/qoo10.jp/127.0.0.1#5335 +ipset=/qoo10.jp/gfwlist +server=/zuckerberg.com/127.0.0.1#5335 +ipset=/zuckerberg.com/gfwlist +server=/cbsinteractive.com/127.0.0.1#5335 +ipset=/cbsinteractive.com/gfwlist +server=/awempire.com/127.0.0.1#5335 +ipset=/awempire.com/gfwlist +server=/empflix.com/127.0.0.1#5335 +ipset=/empflix.com/gfwlist +server=/onstream.cc/127.0.0.1#5335 +ipset=/onstream.cc/gfwlist +server=/mycomicsxxx.com/127.0.0.1#5335 +ipset=/mycomicsxxx.com/gfwlist +server=/github.dev/127.0.0.1#5335 +ipset=/github.dev/gfwlist +server=/cam4.com/127.0.0.1#5335 +ipset=/cam4.com/gfwlist +server=/shameless.com/127.0.0.1#5335 +ipset=/shameless.com/gfwlist +server=/pornjam.com/127.0.0.1#5335 +ipset=/pornjam.com/gfwlist +server=/nintendoswitchtogether.com/127.0.0.1#5335 +ipset=/nintendoswitchtogether.com/gfwlist +server=/moeero-library.com/127.0.0.1#5335 +ipset=/moeero-library.com/gfwlist +server=/noisullifb.com/127.0.0.1#5335 +ipset=/noisullifb.com/gfwlist +server=/perfectgirls.net/127.0.0.1#5335 +ipset=/perfectgirls.net/gfwlist +server=/intel.in/127.0.0.1#5335 +ipset=/intel.in/gfwlist +server=/primevideo.org/127.0.0.1#5335 +ipset=/primevideo.org/gfwlist +server=/authorxml.com/127.0.0.1#5335 +ipset=/authorxml.com/gfwlist +server=/wwwpornhub.pro/127.0.0.1#5335 +ipset=/wwwpornhub.pro/gfwlist +server=/logitechg.com/127.0.0.1#5335 +ipset=/logitechg.com/gfwlist +server=/hawaiibmw.com/127.0.0.1#5335 +ipset=/hawaiibmw.com/gfwlist +server=/management-azure-devices.net/127.0.0.1#5335 +ipset=/management-azure-devices.net/gfwlist +server=/xgames.zone/127.0.0.1#5335 +ipset=/xgames.zone/gfwlist +server=/xsela.cc/127.0.0.1#5335 +ipset=/xsela.cc/gfwlist +server=/netfapx.com/127.0.0.1#5335 +ipset=/netfapx.com/gfwlist +server=/vox-cdn.com/127.0.0.1#5335 +ipset=/vox-cdn.com/gfwlist +server=/youtube.ly/127.0.0.1#5335 +ipset=/youtube.ly/gfwlist +server=/hentai.desi/127.0.0.1#5335 +ipset=/hentai.desi/gfwlist +server=/javday.tv/127.0.0.1#5335 +ipset=/javday.tv/gfwlist +server=/enematube.com/127.0.0.1#5335 +ipset=/enematube.com/gfwlist +server=/dontbubble.us/127.0.0.1#5335 +ipset=/dontbubble.us/gfwlist +server=/services-exchange.com/127.0.0.1#5335 +ipset=/services-exchange.com/gfwlist +server=/brasilincesto.com/127.0.0.1#5335 +ipset=/brasilincesto.com/gfwlist +server=/marketo.co.uk/127.0.0.1#5335 +ipset=/marketo.co.uk/gfwlist +server=/nintendo-europe.com/127.0.0.1#5335 +ipset=/nintendo-europe.com/gfwlist +server=/nxtdig.com.tw/127.0.0.1#5335 +ipset=/nxtdig.com.tw/gfwlist +server=/blogspot.co.at/127.0.0.1#5335 +ipset=/blogspot.co.at/gfwlist +server=/watchanimeattheoffice.com/127.0.0.1#5335 +ipset=/watchanimeattheoffice.com/gfwlist +server=/dojin.com/127.0.0.1#5335 +ipset=/dojin.com/gfwlist +server=/intel.my/127.0.0.1#5335 +ipset=/intel.my/gfwlist +server=/nintendo.co.uk/127.0.0.1#5335 +ipset=/nintendo.co.uk/gfwlist +server=/bmw-motorrad.co.uk/127.0.0.1#5335 +ipset=/bmw-motorrad.co.uk/gfwlist +server=/tgirlpostop.com/127.0.0.1#5335 +ipset=/tgirlpostop.com/gfwlist +server=/minivaughanwest.com/127.0.0.1#5335 +ipset=/minivaughanwest.com/gfwlist +server=/ippog.org/127.0.0.1#5335 +ipset=/ippog.org/gfwlist +server=/aeasyshop.com/127.0.0.1#5335 +ipset=/aeasyshop.com/gfwlist +server=/bmw-eg.com/127.0.0.1#5335 +ipset=/bmw-eg.com/gfwlist +server=/visb.org/127.0.0.1#5335 +ipset=/visb.org/gfwlist +server=/faebok.com/127.0.0.1#5335 +ipset=/faebok.com/gfwlist +server=/mcdonalds.no/127.0.0.1#5335 +ipset=/mcdonalds.no/gfwlist +server=/paypal-special.com/127.0.0.1#5335 +ipset=/paypal-special.com/gfwlist +server=/bunnylust.com/127.0.0.1#5335 +ipset=/bunnylust.com/gfwlist +server=/scholar.google.com.pr/127.0.0.1#5335 +ipset=/scholar.google.com.pr/gfwlist +server=/itunesu.net/127.0.0.1#5335 +ipset=/itunesu.net/gfwlist +server=/directvforhotels.com/127.0.0.1#5335 +ipset=/directvforhotels.com/gfwlist +server=/youtube.co.nz/127.0.0.1#5335 +ipset=/youtube.co.nz/gfwlist +server=/moneyswift.online/127.0.0.1#5335 +ipset=/moneyswift.online/gfwlist +server=/durex.co.il/127.0.0.1#5335 +ipset=/durex.co.il/gfwlist +server=/microsoftnewskids.com/127.0.0.1#5335 +ipset=/microsoftnewskids.com/gfwlist +server=/hetzner.de/127.0.0.1#5335 +ipset=/hetzner.de/gfwlist +server=/bmw-military-sales.com/127.0.0.1#5335 +ipset=/bmw-military-sales.com/gfwlist +server=/buyitnow.com/127.0.0.1#5335 +ipset=/buyitnow.com/gfwlist +server=/goldteenporn.com/127.0.0.1#5335 +ipset=/goldteenporn.com/gfwlist +server=/pornmz.net/127.0.0.1#5335 +ipset=/pornmz.net/gfwlist +server=/oxforddnb.com/127.0.0.1#5335 +ipset=/oxforddnb.com/gfwlist +server=/applicationinsights.io/127.0.0.1#5335 +ipset=/applicationinsights.io/gfwlist +server=/get.new/127.0.0.1#5335 +ipset=/get.new/gfwlist +server=/sssins.com/127.0.0.1#5335 +ipset=/sssins.com/gfwlist +server=/mastercard.hr/127.0.0.1#5335 +ipset=/mastercard.hr/gfwlist +server=/playnintendo.com/127.0.0.1#5335 +ipset=/playnintendo.com/gfwlist +server=/amazon.co.jp/127.0.0.1#5335 +ipset=/amazon.co.jp/gfwlist +server=/visa.com.ge/127.0.0.1#5335 +ipset=/visa.com.ge/gfwlist +server=/didce.com/127.0.0.1#5335 +ipset=/didce.com/gfwlist +server=/milkmanbook.com/127.0.0.1#5335 +ipset=/milkmanbook.com/gfwlist +server=/itu.int/127.0.0.1#5335 +ipset=/itu.int/gfwlist +server=/beatscheap-nz.com/127.0.0.1#5335 +ipset=/beatscheap-nz.com/gfwlist +server=/zbporn.com/127.0.0.1#5335 +ipset=/zbporn.com/gfwlist +server=/verisigninc.com/127.0.0.1#5335 +ipset=/verisigninc.com/gfwlist +server=/lucasentertainment.com/127.0.0.1#5335 +ipset=/lucasentertainment.com/gfwlist +server=/intercomcdn.com/127.0.0.1#5335 +ipset=/intercomcdn.com/gfwlist +server=/embl.fr/127.0.0.1#5335 +ipset=/embl.fr/gfwlist +server=/tunsafe.com/127.0.0.1#5335 +ipset=/tunsafe.com/gfwlist +server=/editorx.com/127.0.0.1#5335 +ipset=/editorx.com/gfwlist +server=/pixanalytics.com/127.0.0.1#5335 +ipset=/pixanalytics.com/gfwlist +server=/wholeplanetfoundation.org/127.0.0.1#5335 +ipset=/wholeplanetfoundation.org/gfwlist +server=/txxx.com/127.0.0.1#5335 +ipset=/txxx.com/gfwlist +server=/lightxxxtube.com/127.0.0.1#5335 +ipset=/lightxxxtube.com/gfwlist +server=/trustsign.ch/127.0.0.1#5335 +ipset=/trustsign.ch/gfwlist +server=/schemer.com/127.0.0.1#5335 +ipset=/schemer.com/gfwlist +server=/pinterest.it/127.0.0.1#5335 +ipset=/pinterest.it/gfwlist +server=/milfpornonly.com/127.0.0.1#5335 +ipset=/milfpornonly.com/gfwlist +server=/msropendata.com/127.0.0.1#5335 +ipset=/msropendata.com/gfwlist +server=/zobry.site/127.0.0.1#5335 +ipset=/zobry.site/gfwlist +server=/ie10.com/127.0.0.1#5335 +ipset=/ie10.com/gfwlist +server=/google.com.py/127.0.0.1#5335 +ipset=/google.com.py/gfwlist +server=/azuredigitaltwins.net/127.0.0.1#5335 +ipset=/azuredigitaltwins.net/gfwlist +server=/pornobom.com.br/127.0.0.1#5335 +ipset=/pornobom.com.br/gfwlist +server=/jmlr.org/127.0.0.1#5335 +ipset=/jmlr.org/gfwlist +server=/bloombergtv.mn/127.0.0.1#5335 +ipset=/bloombergtv.mn/gfwlist +server=/link-o-rama.com/127.0.0.1#5335 +ipset=/link-o-rama.com/gfwlist +server=/drebeatstudio.com/127.0.0.1#5335 +ipset=/drebeatstudio.com/gfwlist +server=/milffox.com/127.0.0.1#5335 +ipset=/milffox.com/gfwlist +server=/digitalcertvalidation.com/127.0.0.1#5335 +ipset=/digitalcertvalidation.com/gfwlist +server=/facebookstories.com/127.0.0.1#5335 +ipset=/facebookstories.com/gfwlist +server=/themercury.com.au/127.0.0.1#5335 +ipset=/themercury.com.au/gfwlist +server=/zoom.com.cn/127.0.0.1#5335 +ipset=/zoom.com.cn/gfwlist +server=/trans500.com/127.0.0.1#5335 +ipset=/trans500.com/gfwlist +server=/faceboof.com/127.0.0.1#5335 +ipset=/faceboof.com/gfwlist +server=/radiofarda.com/127.0.0.1#5335 +ipset=/radiofarda.com/gfwlist +server=/warp.plus/127.0.0.1#5335 +ipset=/warp.plus/gfwlist +server=/paypalbenefits.com/127.0.0.1#5335 +ipset=/paypalbenefits.com/gfwlist +server=/qualcomm.co.id/127.0.0.1#5335 +ipset=/qualcomm.co.id/gfwlist +server=/findacard.com/127.0.0.1#5335 +ipset=/findacard.com/gfwlist +server=/nvidia.fr/127.0.0.1#5335 +ipset=/nvidia.fr/gfwlist +server=/bmw.pt/127.0.0.1#5335 +ipset=/bmw.pt/gfwlist +server=/yaptube.com/127.0.0.1#5335 +ipset=/yaptube.com/gfwlist +server=/studiobeatsbydrdre.com/127.0.0.1#5335 +ipset=/studiobeatsbydrdre.com/gfwlist +server=/rubygems.org/127.0.0.1#5335 +ipset=/rubygems.org/gfwlist +server=/yahoo.com.mx/127.0.0.1#5335 +ipset=/yahoo.com.mx/gfwlist +server=/makecode.org/127.0.0.1#5335 +ipset=/makecode.org/gfwlist +server=/caijinglengyan.com/127.0.0.1#5335 +ipset=/caijinglengyan.com/gfwlist +server=/hentaiworld.tv/127.0.0.1#5335 +ipset=/hentaiworld.tv/gfwlist +server=/nudistbeachporn.com/127.0.0.1#5335 +ipset=/nudistbeachporn.com/gfwlist +server=/ultradonkey.com/127.0.0.1#5335 +ipset=/ultradonkey.com/gfwlist +server=/cbssports.com/127.0.0.1#5335 +ipset=/cbssports.com/gfwlist +server=/tsthai.com/127.0.0.1#5335 +ipset=/tsthai.com/gfwlist +server=/durex.com/127.0.0.1#5335 +ipset=/durex.com/gfwlist +server=/monbeats2013.com/127.0.0.1#5335 +ipset=/monbeats2013.com/gfwlist +server=/tiaz.site/127.0.0.1#5335 +ipset=/tiaz.site/gfwlist +server=/atlantaminidealers.com/127.0.0.1#5335 +ipset=/atlantaminidealers.com/gfwlist +server=/slack-files.com/127.0.0.1#5335 +ipset=/slack-files.com/gfwlist +server=/ddh.gg/127.0.0.1#5335 +ipset=/ddh.gg/gfwlist +server=/espndotcom.tt.omtrdc.net/127.0.0.1#5335 +ipset=/espndotcom.tt.omtrdc.net/gfwlist +server=/lovegirls.cam/127.0.0.1#5335 +ipset=/lovegirls.cam/gfwlist +server=/mastercardworldwide.com/127.0.0.1#5335 +ipset=/mastercardworldwide.com/gfwlist +server=/hentai2read.com/127.0.0.1#5335 +ipset=/hentai2read.com/gfwlist +server=/jove.com/127.0.0.1#5335 +ipset=/jove.com/gfwlist +server=/amateur-fetish.com/127.0.0.1#5335 +ipset=/amateur-fetish.com/gfwlist +server=/illusionze.com/127.0.0.1#5335 +ipset=/illusionze.com/gfwlist +server=/amazon.nl/127.0.0.1#5335 +ipset=/amazon.nl/gfwlist +server=/x3vid.com/127.0.0.1#5335 +ipset=/x3vid.com/gfwlist +server=/bbcpornonly.com/127.0.0.1#5335 +ipset=/bbcpornonly.com/gfwlist +server=/nuki-dokoro.com/127.0.0.1#5335 +ipset=/nuki-dokoro.com/gfwlist +server=/hentai247.net/127.0.0.1#5335 +ipset=/hentai247.net/gfwlist +server=/casquebeatsofficiel-fr.com/127.0.0.1#5335 +ipset=/casquebeatsofficiel-fr.com/gfwlist +server=/dollnight.com/127.0.0.1#5335 +ipset=/dollnight.com/gfwlist +server=/appleone.chat/127.0.0.1#5335 +ipset=/appleone.chat/gfwlist +server=/javhdonline.com/127.0.0.1#5335 +ipset=/javhdonline.com/gfwlist +server=/hentaihub.xxx/127.0.0.1#5335 +ipset=/hentaihub.xxx/gfwlist +server=/latampartneruniversity.com/127.0.0.1#5335 +ipset=/latampartneruniversity.com/gfwlist +server=/facecbook.com/127.0.0.1#5335 +ipset=/facecbook.com/gfwlist +server=/60plusmilfs.com/127.0.0.1#5335 +ipset=/60plusmilfs.com/gfwlist +server=/50plusmilfs.com/127.0.0.1#5335 +ipset=/50plusmilfs.com/gfwlist +server=/myfreeblack.com/127.0.0.1#5335 +ipset=/myfreeblack.com/gfwlist +server=/bmw.com.bn/127.0.0.1#5335 +ipset=/bmw.com.bn/gfwlist +server=/fox49.tv/127.0.0.1#5335 +ipset=/fox49.tv/gfwlist +server=/pearsonelt.ch/127.0.0.1#5335 +ipset=/pearsonelt.ch/gfwlist +server=/collins.in/127.0.0.1#5335 +ipset=/collins.in/gfwlist +server=/thaicherry.com/127.0.0.1#5335 +ipset=/thaicherry.com/gfwlist +server=/chocam.com/127.0.0.1#5335 +ipset=/chocam.com/gfwlist +server=/brill.com/127.0.0.1#5335 +ipset=/brill.com/gfwlist +server=/internetexxxplorer.com/127.0.0.1#5335 +ipset=/internetexxxplorer.com/gfwlist +server=/hboasia.com/127.0.0.1#5335 +ipset=/hboasia.com/gfwlist +server=/mastercard.eu/127.0.0.1#5335 +ipset=/mastercard.eu/gfwlist +server=/accv.es/127.0.0.1#5335 +ipset=/accv.es/gfwlist +server=/bcvp0rtal.com/127.0.0.1#5335 +ipset=/bcvp0rtal.com/gfwlist +server=/fotoscaserasx.com/127.0.0.1#5335 +ipset=/fotoscaserasx.com/gfwlist +server=/udnfunlife.com/127.0.0.1#5335 +ipset=/udnfunlife.com/gfwlist +server=/newsmax.in/127.0.0.1#5335 +ipset=/newsmax.in/gfwlist +server=/youtube.ru/127.0.0.1#5335 +ipset=/youtube.ru/gfwlist +server=/nurofen.es/127.0.0.1#5335 +ipset=/nurofen.es/gfwlist +server=/pscp.tv/127.0.0.1#5335 +ipset=/pscp.tv/gfwlist +server=/excedo.com/127.0.0.1#5335 +ipset=/excedo.com/gfwlist +server=/stocking-tease.com/127.0.0.1#5335 +ipset=/stocking-tease.com/gfwlist +server=/topcartoonsites.com/127.0.0.1#5335 +ipset=/topcartoonsites.com/gfwlist +server=/adult-sex-games.com/127.0.0.1#5335 +ipset=/adult-sex-games.com/gfwlist +server=/homemadeanalporn.com/127.0.0.1#5335 +ipset=/homemadeanalporn.com/gfwlist +server=/adobeexperienceawards.com/127.0.0.1#5335 +ipset=/adobeexperienceawards.com/gfwlist +server=/pki-post.ch/127.0.0.1#5335 +ipset=/pki-post.ch/gfwlist +server=/hp3dsamplepromo.com/127.0.0.1#5335 +ipset=/hp3dsamplepromo.com/gfwlist +server=/mewe.com/127.0.0.1#5335 +ipset=/mewe.com/gfwlist +server=/gputechconf.eu/127.0.0.1#5335 +ipset=/gputechconf.eu/gfwlist +server=/tokyo-sports.co.jp/127.0.0.1#5335 +ipset=/tokyo-sports.co.jp/gfwlist +server=/mcdonalds.se/127.0.0.1#5335 +ipset=/mcdonalds.se/gfwlist +server=/2013beatsbydreshop.com/127.0.0.1#5335 +ipset=/2013beatsbydreshop.com/gfwlist +server=/zooporn.pro/127.0.0.1#5335 +ipset=/zooporn.pro/gfwlist +server=/pornosphere.com/127.0.0.1#5335 +ipset=/pornosphere.com/gfwlist +server=/i91av.org/127.0.0.1#5335 +ipset=/i91av.org/gfwlist +server=/erito.com/127.0.0.1#5335 +ipset=/erito.com/gfwlist +server=/fox9.com/127.0.0.1#5335 +ipset=/fox9.com/gfwlist +server=/durex.ie/127.0.0.1#5335 +ipset=/durex.ie/gfwlist +server=/facebook-program.com/127.0.0.1#5335 +ipset=/facebook-program.com/gfwlist +server=/amebaowndme.com/127.0.0.1#5335 +ipset=/amebaowndme.com/gfwlist +server=/bmwartjourney.com/127.0.0.1#5335 +ipset=/bmwartjourney.com/gfwlist +server=/volvotruckrental.be/127.0.0.1#5335 +ipset=/volvotruckrental.be/gfwlist +server=/paramount.com/127.0.0.1#5335 +ipset=/paramount.com/gfwlist +server=/scene7.com/127.0.0.1#5335 +ipset=/scene7.com/gfwlist +server=/indian-free-xnxx.com/127.0.0.1#5335 +ipset=/indian-free-xnxx.com/gfwlist +server=/easports.com/127.0.0.1#5335 +ipset=/easports.com/gfwlist +server=/avstar04.com/127.0.0.1#5335 +ipset=/avstar04.com/gfwlist +server=/apple.co.uk/127.0.0.1#5335 +ipset=/apple.co.uk/gfwlist +server=/bloombergsurvey.com/127.0.0.1#5335 +ipset=/bloombergsurvey.com/gfwlist +server=/javhdporn.com/127.0.0.1#5335 +ipset=/javhdporn.com/gfwlist +server=/huluapp.com/127.0.0.1#5335 +ipset=/huluapp.com/gfwlist +server=/icloudo.net/127.0.0.1#5335 +ipset=/icloudo.net/gfwlist +server=/vfsforgit.com/127.0.0.1#5335 +ipset=/vfsforgit.com/gfwlist +server=/icloud.sk/127.0.0.1#5335 +ipset=/icloud.sk/gfwlist +server=/adultgamereviews.com/127.0.0.1#5335 +ipset=/adultgamereviews.com/gfwlist +server=/swjedifallenorder.com/127.0.0.1#5335 +ipset=/swjedifallenorder.com/gfwlist +server=/kusugurizanmai.com/127.0.0.1#5335 +ipset=/kusugurizanmai.com/gfwlist +server=/nbcolympics.com/127.0.0.1#5335 +ipset=/nbcolympics.com/gfwlist +server=/sony.pl/127.0.0.1#5335 +ipset=/sony.pl/gfwlist +server=/nownews.com/127.0.0.1#5335 +ipset=/nownews.com/gfwlist +server=/kindle.it/127.0.0.1#5335 +ipset=/kindle.it/gfwlist +server=/foxsports.com.ve/127.0.0.1#5335 +ipset=/foxsports.com.ve/gfwlist +server=/161sex.com/127.0.0.1#5335 +ipset=/161sex.com/gfwlist +server=/jizzle.com/127.0.0.1#5335 +ipset=/jizzle.com/gfwlist +server=/docs.rs/127.0.0.1#5335 +ipset=/docs.rs/gfwlist +server=/verisign.es/127.0.0.1#5335 +ipset=/verisign.es/gfwlist +server=/scharferporno.com/127.0.0.1#5335 +ipset=/scharferporno.com/gfwlist +server=/hentaihaven.xxx/127.0.0.1#5335 +ipset=/hentaihaven.xxx/gfwlist +server=/bmw.com.pe/127.0.0.1#5335 +ipset=/bmw.com.pe/gfwlist +server=/hentaimovieplanet.com/127.0.0.1#5335 +ipset=/hentaimovieplanet.com/gfwlist +server=/democracy.earth/127.0.0.1#5335 +ipset=/democracy.earth/gfwlist +server=/ipodnano.net/127.0.0.1#5335 +ipset=/ipodnano.net/gfwlist +server=/discordcdn.com/127.0.0.1#5335 +ipset=/discordcdn.com/gfwlist +server=/lonestarnaughtygirls.com/127.0.0.1#5335 +ipset=/lonestarnaughtygirls.com/gfwlist +server=/drebeatsdeutschland.net/127.0.0.1#5335 +ipset=/drebeatsdeutschland.net/gfwlist +server=/bestbuyideax.com/127.0.0.1#5335 +ipset=/bestbuyideax.com/gfwlist +server=/xfreehd.com/127.0.0.1#5335 +ipset=/xfreehd.com/gfwlist +server=/ccnsite.com/127.0.0.1#5335 +ipset=/ccnsite.com/gfwlist +server=/volvotrucks.co.uk/127.0.0.1#5335 +ipset=/volvotrucks.co.uk/gfwlist +server=/attspecial.com/127.0.0.1#5335 +ipset=/attspecial.com/gfwlist +server=/momsteachsex.com/127.0.0.1#5335 +ipset=/momsteachsex.com/gfwlist +server=/janor6.net/127.0.0.1#5335 +ipset=/janor6.net/gfwlist +server=/uniswap.org/127.0.0.1#5335 +ipset=/uniswap.org/gfwlist +server=/washa.tv/127.0.0.1#5335 +ipset=/washa.tv/gfwlist +server=/idnike.com/127.0.0.1#5335 +ipset=/idnike.com/gfwlist +server=/bmw-connecteddrive.ch/127.0.0.1#5335 +ipset=/bmw-connecteddrive.ch/gfwlist +server=/directvdealer.com/127.0.0.1#5335 +ipset=/directvdealer.com/gfwlist +server=/awstrust.com/127.0.0.1#5335 +ipset=/awstrust.com/gfwlist +server=/bmw.hr/127.0.0.1#5335 +ipset=/bmw.hr/gfwlist +server=/finishinfo.se/127.0.0.1#5335 +ipset=/finishinfo.se/gfwlist +server=/realmilwaukeenow.com/127.0.0.1#5335 +ipset=/realmilwaukeenow.com/gfwlist +server=/pinterest.at/127.0.0.1#5335 +ipset=/pinterest.at/gfwlist +server=/itunesessentials.com/127.0.0.1#5335 +ipset=/itunesessentials.com/gfwlist +server=/eenike.com/127.0.0.1#5335 +ipset=/eenike.com/gfwlist +server=/cisco-returns.com/127.0.0.1#5335 +ipset=/cisco-returns.com/gfwlist +server=/apple.ro/127.0.0.1#5335 +ipset=/apple.ro/gfwlist +server=/volvotrucks.md/127.0.0.1#5335 +ipset=/volvotrucks.md/gfwlist +server=/appleipodsettlement.com/127.0.0.1#5335 +ipset=/appleipodsettlement.com/gfwlist +server=/shemalehd.sex/127.0.0.1#5335 +ipset=/shemalehd.sex/gfwlist +server=/starbucks.ad/127.0.0.1#5335 +ipset=/starbucks.ad/gfwlist +server=/h-flash.com/127.0.0.1#5335 +ipset=/h-flash.com/gfwlist +server=/rundf665.cyou/127.0.0.1#5335 +ipset=/rundf665.cyou/gfwlist +server=/fastlane.tools/127.0.0.1#5335 +ipset=/fastlane.tools/gfwlist +server=/kindgirls.com/127.0.0.1#5335 +ipset=/kindgirls.com/gfwlist +server=/famousinternetgirls.com/127.0.0.1#5335 +ipset=/famousinternetgirls.com/gfwlist +server=/mcdonalds.com/127.0.0.1#5335 +ipset=/mcdonalds.com/gfwlist +server=/sign.new/127.0.0.1#5335 +ipset=/sign.new/gfwlist +server=/chroniclesec.com/127.0.0.1#5335 +ipset=/chroniclesec.com/gfwlist +server=/ddd-smart.net/127.0.0.1#5335 +ipset=/ddd-smart.net/gfwlist +server=/sextop1.net/127.0.0.1#5335 +ipset=/sextop1.net/gfwlist +server=/xxxtubegf.com/127.0.0.1#5335 +ipset=/xxxtubegf.com/gfwlist +server=/hulugans.com/127.0.0.1#5335 +ipset=/hulugans.com/gfwlist +server=/paheal.net/127.0.0.1#5335 +ipset=/paheal.net/gfwlist +server=/allfet.net/127.0.0.1#5335 +ipset=/allfet.net/gfwlist +server=/pussyporntubes.com/127.0.0.1#5335 +ipset=/pussyporntubes.com/gfwlist +server=/favebook.com/127.0.0.1#5335 +ipset=/favebook.com/gfwlist +server=/beatselectronic.net/127.0.0.1#5335 +ipset=/beatselectronic.net/gfwlist +server=/meetandfuckgames.com/127.0.0.1#5335 +ipset=/meetandfuckgames.com/gfwlist +server=/marvelsuperwar.com/127.0.0.1#5335 +ipset=/marvelsuperwar.com/gfwlist +server=/spotify.map.fastlylb.net/127.0.0.1#5335 +ipset=/spotify.map.fastlylb.net/gfwlist +server=/fastlane.ci/127.0.0.1#5335 +ipset=/fastlane.ci/gfwlist +server=/shemaletrannypics.com/127.0.0.1#5335 +ipset=/shemaletrannypics.com/gfwlist +server=/adulti01.com/127.0.0.1#5335 +ipset=/adulti01.com/gfwlist +server=/applestore.com.tw/127.0.0.1#5335 +ipset=/applestore.com.tw/gfwlist +server=/xnxx-cdn.com/127.0.0.1#5335 +ipset=/xnxx-cdn.com/gfwlist +server=/porn-sex-video.me/127.0.0.1#5335 +ipset=/porn-sex-video.me/gfwlist +server=/raspberrypi.org/127.0.0.1#5335 +ipset=/raspberrypi.org/gfwlist +server=/bloomberg.fm/127.0.0.1#5335 +ipset=/bloomberg.fm/gfwlist +server=/vhxqa2.com/127.0.0.1#5335 +ipset=/vhxqa2.com/gfwlist +server=/mini.by/127.0.0.1#5335 +ipset=/mini.by/gfwlist +server=/girlsfuck-tube.com/127.0.0.1#5335 +ipset=/girlsfuck-tube.com/gfwlist +server=/40momporntube.com/127.0.0.1#5335 +ipset=/40momporntube.com/gfwlist +server=/pornyteen.com/127.0.0.1#5335 +ipset=/pornyteen.com/gfwlist +server=/epigeum.com/127.0.0.1#5335 +ipset=/epigeum.com/gfwlist +server=/salebeatslasteststyle4you.com/127.0.0.1#5335 +ipset=/salebeatslasteststyle4you.com/gfwlist +server=/xxxhentai.net/127.0.0.1#5335 +ipset=/xxxhentai.net/gfwlist +server=/ebay.ie/127.0.0.1#5335 +ipset=/ebay.ie/gfwlist +server=/e-tugra.com/127.0.0.1#5335 +ipset=/e-tugra.com/gfwlist +server=/esm.run/127.0.0.1#5335 +ipset=/esm.run/gfwlist +server=/yahoo.co.bw/127.0.0.1#5335 +ipset=/yahoo.co.bw/gfwlist +server=/dropbox.tech/127.0.0.1#5335 +ipset=/dropbox.tech/gfwlist +server=/badasianpussy.com/127.0.0.1#5335 +ipset=/badasianpussy.com/gfwlist +server=/monsterbeatsbydre-usa.com/127.0.0.1#5335 +ipset=/monsterbeatsbydre-usa.com/gfwlist +server=/coronavirusnow.com/127.0.0.1#5335 +ipset=/coronavirusnow.com/gfwlist +server=/blackamateurfuck.com/127.0.0.1#5335 +ipset=/blackamateurfuck.com/gfwlist +server=/xxxtubezoo.com/127.0.0.1#5335 +ipset=/xxxtubezoo.com/gfwlist +server=/paypal-secure.org/127.0.0.1#5335 +ipset=/paypal-secure.org/gfwlist +server=/ubuntu-touch.io/127.0.0.1#5335 +ipset=/ubuntu-touch.io/gfwlist +server=/venmo-touch.com/127.0.0.1#5335 +ipset=/venmo-touch.com/gfwlist +server=/notepad-plus-plus.org/127.0.0.1#5335 +ipset=/notepad-plus-plus.org/gfwlist +server=/bmw-sports.com/127.0.0.1#5335 +ipset=/bmw-sports.com/gfwlist +server=/creampieforgranny.com/127.0.0.1#5335 +ipset=/creampieforgranny.com/gfwlist +server=/bdsmland.org/127.0.0.1#5335 +ipset=/bdsmland.org/gfwlist +server=/jiuse905.com/127.0.0.1#5335 +ipset=/jiuse905.com/gfwlist +server=/beatscasque-france.com/127.0.0.1#5335 +ipset=/beatscasque-france.com/gfwlist +server=/bmw.ht/127.0.0.1#5335 +ipset=/bmw.ht/gfwlist +server=/yahoo.dk/127.0.0.1#5335 +ipset=/yahoo.dk/gfwlist +server=/hornygirlsonline.org/127.0.0.1#5335 +ipset=/hornygirlsonline.org/gfwlist +server=/yaoiotaku.com/127.0.0.1#5335 +ipset=/yaoiotaku.com/gfwlist +server=/bitsquare.io/127.0.0.1#5335 +ipset=/bitsquare.io/gfwlist +server=/starwarstheoldrepublic.com/127.0.0.1#5335 +ipset=/starwarstheoldrepublic.com/gfwlist +server=/asahicom.jp/127.0.0.1#5335 +ipset=/asahicom.jp/gfwlist +server=/golang.org/127.0.0.1#5335 +ipset=/golang.org/gfwlist +server=/visainfinite.ca/127.0.0.1#5335 +ipset=/visainfinite.ca/gfwlist +server=/bmw.cc/127.0.0.1#5335 +ipset=/bmw.cc/gfwlist +server=/foxnewsnetwork.com/127.0.0.1#5335 +ipset=/foxnewsnetwork.com/gfwlist +server=/visainfiniteluxuryhotels.ca/127.0.0.1#5335 +ipset=/visainfiniteluxuryhotels.ca/gfwlist +server=/bloombergstatus.com/127.0.0.1#5335 +ipset=/bloombergstatus.com/gfwlist +server=/yarininsuyu.com/127.0.0.1#5335 +ipset=/yarininsuyu.com/gfwlist +server=/xxxxvideo.uno/127.0.0.1#5335 +ipset=/xxxxvideo.uno/gfwlist +server=/melonbooks.co.jp/127.0.0.1#5335 +ipset=/melonbooks.co.jp/gfwlist +server=/realamericanstories.info/127.0.0.1#5335 +ipset=/realamericanstories.info/gfwlist +server=/disneyadsales.com/127.0.0.1#5335 +ipset=/disneyadsales.com/gfwlist +server=/needforspeedlightning.com/127.0.0.1#5335 +ipset=/needforspeedlightning.com/gfwlist +server=/ebaycom.com/127.0.0.1#5335 +ipset=/ebaycom.com/gfwlist +server=/d-trust.net/127.0.0.1#5335 +ipset=/d-trust.net/gfwlist +server=/gfpornmovies.com/127.0.0.1#5335 +ipset=/gfpornmovies.com/gfwlist +server=/iphoneacessorios.com.br/127.0.0.1#5335 +ipset=/iphoneacessorios.com.br/gfwlist +server=/redgifs.com/127.0.0.1#5335 +ipset=/redgifs.com/gfwlist +server=/fox26houston.com/127.0.0.1#5335 +ipset=/fox26houston.com/gfwlist +server=/upjav.cc/127.0.0.1#5335 +ipset=/upjav.cc/gfwlist +server=/blazor.net/127.0.0.1#5335 +ipset=/blazor.net/gfwlist +server=/nextwork.com.tw/127.0.0.1#5335 +ipset=/nextwork.com.tw/gfwlist +server=/blogspot.lt/127.0.0.1#5335 +ipset=/blogspot.lt/gfwlist +server=/merakigo.com/127.0.0.1#5335 +ipset=/merakigo.com/gfwlist +server=/onefifteen.org/127.0.0.1#5335 +ipset=/onefifteen.org/gfwlist +server=/life-global.org/127.0.0.1#5335 +ipset=/life-global.org/gfwlist +server=/shockingmovies.com/127.0.0.1#5335 +ipset=/shockingmovies.com/gfwlist +server=/pca.st/127.0.0.1#5335 +ipset=/pca.st/gfwlist +server=/drbizzaro.com/127.0.0.1#5335 +ipset=/drbizzaro.com/gfwlist +server=/camgoddess.tv/127.0.0.1#5335 +ipset=/camgoddess.tv/gfwlist +server=/gaythebest.com/127.0.0.1#5335 +ipset=/gaythebest.com/gfwlist +server=/databank.worldbank.org/127.0.0.1#5335 +ipset=/databank.worldbank.org/gfwlist +server=/6arabs.com/127.0.0.1#5335 +ipset=/6arabs.com/gfwlist +server=/xxxpicz.com/127.0.0.1#5335 +ipset=/xxxpicz.com/gfwlist +server=/volvotrucks.ee/127.0.0.1#5335 +ipset=/volvotrucks.ee/gfwlist +server=/xenoblade.com/127.0.0.1#5335 +ipset=/xenoblade.com/gfwlist +server=/icloud-content.com/127.0.0.1#5335 +ipset=/icloud-content.com/gfwlist +server=/gemfire.net/127.0.0.1#5335 +ipset=/gemfire.net/gfwlist +server=/udn.com.tw/127.0.0.1#5335 +ipset=/udn.com.tw/gfwlist +server=/vivaxnxx.com/127.0.0.1#5335 +ipset=/vivaxnxx.com/gfwlist +server=/forbiddenasian.com/127.0.0.1#5335 +ipset=/forbiddenasian.com/gfwlist +server=/ydn.com.tw/127.0.0.1#5335 +ipset=/ydn.com.tw/gfwlist +server=/mktorest.com/127.0.0.1#5335 +ipset=/mktorest.com/gfwlist +server=/epochtimes.com.tw/127.0.0.1#5335 +ipset=/epochtimes.com.tw/gfwlist +server=/pornhubdeutsch.net/127.0.0.1#5335 +ipset=/pornhubdeutsch.net/gfwlist +server=/ebay-us.com/127.0.0.1#5335 +ipset=/ebay-us.com/gfwlist +server=/volvopenta.com/127.0.0.1#5335 +ipset=/volvopenta.com/gfwlist +server=/faststone.org/127.0.0.1#5335 +ipset=/faststone.org/gfwlist +server=/googledrive.com/127.0.0.1#5335 +ipset=/googledrive.com/gfwlist +server=/mybmw.ca/127.0.0.1#5335 +ipset=/mybmw.ca/gfwlist +server=/iproperty.com/127.0.0.1#5335 +ipset=/iproperty.com/gfwlist +server=/truyen-hentai.fr/127.0.0.1#5335 +ipset=/truyen-hentai.fr/gfwlist +server=/brdteengal.com/127.0.0.1#5335 +ipset=/brdteengal.com/gfwlist +server=/attpurchasing.com/127.0.0.1#5335 +ipset=/attpurchasing.com/gfwlist +server=/hzmn.net/127.0.0.1#5335 +ipset=/hzmn.net/gfwlist +server=/xxxassfuck.com/127.0.0.1#5335 +ipset=/xxxassfuck.com/gfwlist +server=/xvideos-dl.top/127.0.0.1#5335 +ipset=/xvideos-dl.top/gfwlist +server=/adidas.dk/127.0.0.1#5335 +ipset=/adidas.dk/gfwlist +server=/yahoo.com.tj/127.0.0.1#5335 +ipset=/yahoo.com.tj/gfwlist +server=/gamer2-cds.cdn.hinet.net/127.0.0.1#5335 +ipset=/gamer2-cds.cdn.hinet.net/gfwlist +server=/mingky.org/127.0.0.1#5335 +ipset=/mingky.org/gfwlist +server=/ebayenterprise.info/127.0.0.1#5335 +ipset=/ebayenterprise.info/gfwlist +server=/yandex.ee/127.0.0.1#5335 +ipset=/yandex.ee/gfwlist +server=/beatsoutlet.net/127.0.0.1#5335 +ipset=/beatsoutlet.net/gfwlist +server=/amazonvideodirect.com/127.0.0.1#5335 +ipset=/amazonvideodirect.com/gfwlist +server=/bmwtampabay.com/127.0.0.1#5335 +ipset=/bmwtampabay.com/gfwlist +server=/dealbay.com/127.0.0.1#5335 +ipset=/dealbay.com/gfwlist +server=/opensuse.org/127.0.0.1#5335 +ipset=/opensuse.org/gfwlist +server=/zeronet.io/127.0.0.1#5335 +ipset=/zeronet.io/gfwlist +server=/finishinfo.jp/127.0.0.1#5335 +ipset=/finishinfo.jp/gfwlist +server=/pornstreams.tv/127.0.0.1#5335 +ipset=/pornstreams.tv/gfwlist +server=/newmonst1erbeatsto1re.com/127.0.0.1#5335 +ipset=/newmonst1erbeatsto1re.com/gfwlist +server=/qq.design/127.0.0.1#5335 +ipset=/qq.design/gfwlist +server=/townsvillebulletin.com.au/127.0.0.1#5335 +ipset=/townsvillebulletin.com.au/gfwlist +server=/javmuch.com/127.0.0.1#5335 +ipset=/javmuch.com/gfwlist +server=/jbe-platform.com/127.0.0.1#5335 +ipset=/jbe-platform.com/gfwlist +server=/huffpostbrasil.com/127.0.0.1#5335 +ipset=/huffpostbrasil.com/gfwlist +server=/totoleak.com/127.0.0.1#5335 +ipset=/totoleak.com/gfwlist +server=/facebook30.net/127.0.0.1#5335 +ipset=/facebook30.net/gfwlist +server=/mastercard.my/127.0.0.1#5335 +ipset=/mastercard.my/gfwlist +server=/sexarea.org/127.0.0.1#5335 +ipset=/sexarea.org/gfwlist +server=/digicert.com/127.0.0.1#5335 +ipset=/digicert.com/gfwlist +server=/straightouttasomewhere.com/127.0.0.1#5335 +ipset=/straightouttasomewhere.com/gfwlist +server=/vtvan.com/127.0.0.1#5335 +ipset=/vtvan.com/gfwlist +server=/filmesdesexo.blog/127.0.0.1#5335 +ipset=/filmesdesexo.blog/gfwlist +server=/netflixdnstest2.com/127.0.0.1#5335 +ipset=/netflixdnstest2.com/gfwlist +server=/pornoslon.me/127.0.0.1#5335 +ipset=/pornoslon.me/gfwlist +server=/cashpassport.com/127.0.0.1#5335 +ipset=/cashpassport.com/gfwlist +server=/osdn.net/127.0.0.1#5335 +ipset=/osdn.net/gfwlist +server=/doujin-eromanga.com/127.0.0.1#5335 +ipset=/doujin-eromanga.com/gfwlist +server=/youtube.com.ec/127.0.0.1#5335 +ipset=/youtube.com.ec/gfwlist +server=/icloudbox.net/127.0.0.1#5335 +ipset=/icloudbox.net/gfwlist +server=/google.kg/127.0.0.1#5335 +ipset=/google.kg/gfwlist +server=/paypal-proserv.com/127.0.0.1#5335 +ipset=/paypal-proserv.com/gfwlist +server=/cheapbeatsbydreonsale.com/127.0.0.1#5335 +ipset=/cheapbeatsbydreonsale.com/gfwlist +server=/facbool.com/127.0.0.1#5335 +ipset=/facbool.com/gfwlist +server=/tencent.design/127.0.0.1#5335 +ipset=/tencent.design/gfwlist +server=/localizecdn.com/127.0.0.1#5335 +ipset=/localizecdn.com/gfwlist +server=/shadowslaves.com/127.0.0.1#5335 +ipset=/shadowslaves.com/gfwlist +server=/office365tw.com/127.0.0.1#5335 +ipset=/office365tw.com/gfwlist +server=/onedrive.co.uk/127.0.0.1#5335 +ipset=/onedrive.co.uk/gfwlist +server=/xogogo.com/127.0.0.1#5335 +ipset=/xogogo.com/gfwlist +server=/github.blog/127.0.0.1#5335 +ipset=/github.blog/gfwlist +server=/yahoo.com.pk/127.0.0.1#5335 +ipset=/yahoo.com.pk/gfwlist +server=/macromedia.com/127.0.0.1#5335 +ipset=/macromedia.com/gfwlist +server=/appleone.club/127.0.0.1#5335 +ipset=/appleone.club/gfwlist +server=/volvobuses.tn/127.0.0.1#5335 +ipset=/volvobuses.tn/gfwlist +server=/nubilefilms.com/127.0.0.1#5335 +ipset=/nubilefilms.com/gfwlist +server=/admeld.com/127.0.0.1#5335 +ipset=/admeld.com/gfwlist +server=/worldsecuresystems.com/127.0.0.1#5335 +ipset=/worldsecuresystems.com/gfwlist +server=/freeanimalporn.net/127.0.0.1#5335 +ipset=/freeanimalporn.net/gfwlist +server=/redmatureporn.com/127.0.0.1#5335 +ipset=/redmatureporn.com/gfwlist +server=/3dsexgames.biz/127.0.0.1#5335 +ipset=/3dsexgames.biz/gfwlist +server=/voadeewanews.com/127.0.0.1#5335 +ipset=/voadeewanews.com/gfwlist +server=/bttzyw.com/127.0.0.1#5335 +ipset=/bttzyw.com/gfwlist +server=/gorin.jp/127.0.0.1#5335 +ipset=/gorin.jp/gfwlist +server=/pornprosnetwork.com/127.0.0.1#5335 +ipset=/pornprosnetwork.com/gfwlist +server=/singtaoopo.com/127.0.0.1#5335 +ipset=/singtaoopo.com/gfwlist +server=/xkeezmovies.com/127.0.0.1#5335 +ipset=/xkeezmovies.com/gfwlist +server=/bestialitytaboo.tv/127.0.0.1#5335 +ipset=/bestialitytaboo.tv/gfwlist +server=/sexy-models.net/127.0.0.1#5335 +ipset=/sexy-models.net/gfwlist +server=/centrino.com/127.0.0.1#5335 +ipset=/centrino.com/gfwlist +server=/paulsimon-music.com/127.0.0.1#5335 +ipset=/paulsimon-music.com/gfwlist +server=/beatsodre.com/127.0.0.1#5335 +ipset=/beatsodre.com/gfwlist +server=/simcity-buildit.com/127.0.0.1#5335 +ipset=/simcity-buildit.com/gfwlist +server=/jstor.org/127.0.0.1#5335 +ipset=/jstor.org/gfwlist +server=/urlgalleries.net/127.0.0.1#5335 +ipset=/urlgalleries.net/gfwlist +server=/businessinsider.com.pl/127.0.0.1#5335 +ipset=/businessinsider.com.pl/gfwlist +server=/wowyoungporn.com/127.0.0.1#5335 +ipset=/wowyoungporn.com/gfwlist +server=/rbeuroinfo.com/127.0.0.1#5335 +ipset=/rbeuroinfo.com/gfwlist +server=/265sdwe3.com/127.0.0.1#5335 +ipset=/265sdwe3.com/gfwlist +server=/iwank.tv/127.0.0.1#5335 +ipset=/iwank.tv/gfwlist +server=/cdnjs.com/127.0.0.1#5335 +ipset=/cdnjs.com/gfwlist +server=/privateclassics.com/127.0.0.1#5335 +ipset=/privateclassics.com/gfwlist +server=/feedly.com/127.0.0.1#5335 +ipset=/feedly.com/gfwlist +server=/xnxx.tv/127.0.0.1#5335 +ipset=/xnxx.tv/gfwlist +server=/bmw-connecteddrive.fr/127.0.0.1#5335 +ipset=/bmw-connecteddrive.fr/gfwlist +server=/rbnainternational.com/127.0.0.1#5335 +ipset=/rbnainternational.com/gfwlist +server=/wankoz.com/127.0.0.1#5335 +ipset=/wankoz.com/gfwlist +server=/analfuckvideo.com/127.0.0.1#5335 +ipset=/analfuckvideo.com/gfwlist +server=/microsofttradein.com/127.0.0.1#5335 +ipset=/microsofttradein.com/gfwlist +server=/statics-marketingsites-wcus-ms-com.akamaized.net/127.0.0.1#5335 +ipset=/statics-marketingsites-wcus-ms-com.akamaized.net/gfwlist +server=/c4rex.co/127.0.0.1#5335 +ipset=/c4rex.co/gfwlist +server=/fapopedia.net/127.0.0.1#5335 +ipset=/fapopedia.net/gfwlist +server=/kamababa.com/127.0.0.1#5335 +ipset=/kamababa.com/gfwlist +server=/videosdepornografia.blog.br/127.0.0.1#5335 +ipset=/videosdepornografia.blog.br/gfwlist +server=/thomsonreuters.com.au/127.0.0.1#5335 +ipset=/thomsonreuters.com.au/gfwlist +server=/thrixxx.com/127.0.0.1#5335 +ipset=/thrixxx.com/gfwlist +server=/amazontrust.com/127.0.0.1#5335 +ipset=/amazontrust.com/gfwlist +server=/porndroids.com/127.0.0.1#5335 +ipset=/porndroids.com/gfwlist +server=/viddeo-jav.net/127.0.0.1#5335 +ipset=/viddeo-jav.net/gfwlist +server=/qmov.com/127.0.0.1#5335 +ipset=/qmov.com/gfwlist +server=/seasidestory.tokyo/127.0.0.1#5335 +ipset=/seasidestory.tokyo/gfwlist +server=/nikebiz.info/127.0.0.1#5335 +ipset=/nikebiz.info/gfwlist +server=/4hu.tv/127.0.0.1#5335 +ipset=/4hu.tv/gfwlist +server=/crustwebsites.net/127.0.0.1#5335 +ipset=/crustwebsites.net/gfwlist +server=/srtcdn.net/127.0.0.1#5335 +ipset=/srtcdn.net/gfwlist +server=/facebookw.com/127.0.0.1#5335 +ipset=/facebookw.com/gfwlist +server=/monsterbeatsstore.com/127.0.0.1#5335 +ipset=/monsterbeatsstore.com/gfwlist +server=/volvotrucks.id/127.0.0.1#5335 +ipset=/volvotrucks.id/gfwlist +server=/sextubebox.com/127.0.0.1#5335 +ipset=/sextubebox.com/gfwlist +server=/femalefounderscomp.com/127.0.0.1#5335 +ipset=/femalefounderscomp.com/gfwlist +server=/sexecherche.com/127.0.0.1#5335 +ipset=/sexecherche.com/gfwlist +server=/classymomsex.com/127.0.0.1#5335 +ipset=/classymomsex.com/gfwlist +server=/pokemonblackwhite.com/127.0.0.1#5335 +ipset=/pokemonblackwhite.com/gfwlist +server=/monsterbeats-onsale.com/127.0.0.1#5335 +ipset=/monsterbeats-onsale.com/gfwlist +server=/amazonsdi.com/127.0.0.1#5335 +ipset=/amazonsdi.com/gfwlist +server=/iwantgalleries.com/127.0.0.1#5335 +ipset=/iwantgalleries.com/gfwlist +server=/kimosex.com/127.0.0.1#5335 +ipset=/kimosex.com/gfwlist +server=/bdsmstreak.com/127.0.0.1#5335 +ipset=/bdsmstreak.com/gfwlist +server=/optimumssl.com/127.0.0.1#5335 +ipset=/optimumssl.com/gfwlist +server=/sqlserveronlinux.com/127.0.0.1#5335 +ipset=/sqlserveronlinux.com/gfwlist +server=/ctee.com.tw/127.0.0.1#5335 +ipset=/ctee.com.tw/gfwlist +server=/eiu.com/127.0.0.1#5335 +ipset=/eiu.com/gfwlist +server=/doujin-info.net/127.0.0.1#5335 +ipset=/doujin-info.net/gfwlist +server=/dropboxpartners.com/127.0.0.1#5335 +ipset=/dropboxpartners.com/gfwlist +server=/scholar.google.gr/127.0.0.1#5335 +ipset=/scholar.google.gr/gfwlist +server=/bitflyer.com/127.0.0.1#5335 +ipset=/bitflyer.com/gfwlist +server=/appleworldwidedeveloper.hb-api.omtrdc.net/127.0.0.1#5335 +ipset=/appleworldwidedeveloper.hb-api.omtrdc.net/gfwlist +server=/oneapi.com/127.0.0.1#5335 +ipset=/oneapi.com/gfwlist +server=/amazon.it/127.0.0.1#5335 +ipset=/amazon.it/gfwlist +server=/mvideoporno.xxx/127.0.0.1#5335 +ipset=/mvideoporno.xxx/gfwlist +server=/fappeningthots.com/127.0.0.1#5335 +ipset=/fappeningthots.com/gfwlist +server=/buddymedia.com/127.0.0.1#5335 +ipset=/buddymedia.com/gfwlist +server=/ipod.com.fr/127.0.0.1#5335 +ipset=/ipod.com.fr/gfwlist +server=/thegithubshop.com/127.0.0.1#5335 +ipset=/thegithubshop.com/gfwlist +server=/mu6bce1c.xyz/127.0.0.1#5335 +ipset=/mu6bce1c.xyz/gfwlist +server=/google.com.gh/127.0.0.1#5335 +ipset=/google.com.gh/gfwlist +server=/stacksnippets.net/127.0.0.1#5335 +ipset=/stacksnippets.net/gfwlist +server=/shenyunperformingarts.org/127.0.0.1#5335 +ipset=/shenyunperformingarts.org/gfwlist +server=/gotporn.com/127.0.0.1#5335 +ipset=/gotporn.com/gfwlist +server=/voabambara.com/127.0.0.1#5335 +ipset=/voabambara.com/gfwlist +server=/porngub.com/127.0.0.1#5335 +ipset=/porngub.com/gfwlist +server=/vscode-cdn.net/127.0.0.1#5335 +ipset=/vscode-cdn.net/gfwlist +server=/sexsim.com/127.0.0.1#5335 +ipset=/sexsim.com/gfwlist +server=/veet.co.kr/127.0.0.1#5335 +ipset=/veet.co.kr/gfwlist +server=/pandamovies.pw/127.0.0.1#5335 +ipset=/pandamovies.pw/gfwlist +server=/paypal-center.info/127.0.0.1#5335 +ipset=/paypal-center.info/gfwlist +server=/watch-my-gf.com/127.0.0.1#5335 +ipset=/watch-my-gf.com/gfwlist +server=/zohowebstatic.com/127.0.0.1#5335 +ipset=/zohowebstatic.com/gfwlist +server=/paypal-marketing.com/127.0.0.1#5335 +ipset=/paypal-marketing.com/gfwlist +server=/hackthedrive.com/127.0.0.1#5335 +ipset=/hackthedrive.com/gfwlist +server=/liketwice.com/127.0.0.1#5335 +ipset=/liketwice.com/gfwlist +server=/target.com/127.0.0.1#5335 +ipset=/target.com/gfwlist +server=/viu.tv/127.0.0.1#5335 +ipset=/viu.tv/gfwlist +server=/art1lib.com/127.0.0.1#5335 +ipset=/art1lib.com/gfwlist +server=/theuab.net/127.0.0.1#5335 +ipset=/theuab.net/gfwlist +server=/djreprints.com/127.0.0.1#5335 +ipset=/djreprints.com/gfwlist +server=/sexu.com/127.0.0.1#5335 +ipset=/sexu.com/gfwlist +server=/2013pascherbeatsbydre.com/127.0.0.1#5335 +ipset=/2013pascherbeatsbydre.com/gfwlist +server=/sspanel.net/127.0.0.1#5335 +ipset=/sspanel.net/gfwlist +server=/vmwxw.com/127.0.0.1#5335 +ipset=/vmwxw.com/gfwlist +server=/proctoscopeexam.com/127.0.0.1#5335 +ipset=/proctoscopeexam.com/gfwlist +server=/facebook4business.com/127.0.0.1#5335 +ipset=/facebook4business.com/gfwlist +server=/mdnkids.com/127.0.0.1#5335 +ipset=/mdnkids.com/gfwlist +server=/realclearenergy.org/127.0.0.1#5335 +ipset=/realclearenergy.org/gfwlist +server=/jusmynote.wordpress.com/127.0.0.1#5335 +ipset=/jusmynote.wordpress.com/gfwlist +server=/monsterbeatsbydreshop.com/127.0.0.1#5335 +ipset=/monsterbeatsbydreshop.com/gfwlist +server=/silkengirl.com/127.0.0.1#5335 +ipset=/silkengirl.com/gfwlist +server=/pornbest.org/127.0.0.1#5335 +ipset=/pornbest.org/gfwlist +server=/visa.hk/127.0.0.1#5335 +ipset=/visa.hk/gfwlist +server=/bmw-connecteddrive.lt/127.0.0.1#5335 +ipset=/bmw-connecteddrive.lt/gfwlist +server=/monsterdrebeats-usa.net/127.0.0.1#5335 +ipset=/monsterdrebeats-usa.net/gfwlist +server=/foxneo.com/127.0.0.1#5335 +ipset=/foxneo.com/gfwlist +server=/cisco-warrantyfinder.com/127.0.0.1#5335 +ipset=/cisco-warrantyfinder.com/gfwlist +server=/weverse.io/127.0.0.1#5335 +ipset=/weverse.io/gfwlist +server=/ftvgirls.com/127.0.0.1#5335 +ipset=/ftvgirls.com/gfwlist +server=/bukkake.link/127.0.0.1#5335 +ipset=/bukkake.link/gfwlist +server=/snapchat.com/127.0.0.1#5335 +ipset=/snapchat.com/gfwlist +server=/primecurves.com/127.0.0.1#5335 +ipset=/primecurves.com/gfwlist +server=/ahpornotube.com/127.0.0.1#5335 +ipset=/ahpornotube.com/gfwlist +server=/iwantporn.net/127.0.0.1#5335 +ipset=/iwantporn.net/gfwlist +server=/bmwzentrum.com/127.0.0.1#5335 +ipset=/bmwzentrum.com/gfwlist +server=/mastercard.de/127.0.0.1#5335 +ipset=/mastercard.de/gfwlist +server=/alphabet.org.uk/127.0.0.1#5335 +ipset=/alphabet.org.uk/gfwlist +server=/umamusume.akamaized.net/127.0.0.1#5335 +ipset=/umamusume.akamaized.net/gfwlist +server=/yahoo.com.uy/127.0.0.1#5335 +ipset=/yahoo.com.uy/gfwlist +server=/mwhentai.net/127.0.0.1#5335 +ipset=/mwhentai.net/gfwlist +server=/hbogoasia.hk/127.0.0.1#5335 +ipset=/hbogoasia.hk/gfwlist +server=/bmw-connecteddrive.co.nz/127.0.0.1#5335 +ipset=/bmw-connecteddrive.co.nz/gfwlist +server=/hotmail.net/127.0.0.1#5335 +ipset=/hotmail.net/gfwlist +server=/youtube.com.ly/127.0.0.1#5335 +ipset=/youtube.com.ly/gfwlist +server=/caime.xyz/127.0.0.1#5335 +ipset=/caime.xyz/gfwlist +server=/curve.fi/127.0.0.1#5335 +ipset=/curve.fi/gfwlist +server=/monsterbeatsshops.net/127.0.0.1#5335 +ipset=/monsterbeatsshops.net/gfwlist +server=/vanish.sk/127.0.0.1#5335 +ipset=/vanish.sk/gfwlist +server=/hentai2.net/127.0.0.1#5335 +ipset=/hentai2.net/gfwlist +server=/enfabebe.com/127.0.0.1#5335 +ipset=/enfabebe.com/gfwlist +server=/bmwgroup.jobs/127.0.0.1#5335 +ipset=/bmwgroup.jobs/gfwlist +server=/lacomics.org/127.0.0.1#5335 +ipset=/lacomics.org/gfwlist +server=/homedepot-static.com/127.0.0.1#5335 +ipset=/homedepot-static.com/gfwlist +server=/postyourgirls.ws/127.0.0.1#5335 +ipset=/postyourgirls.ws/gfwlist +server=/onlynudes.org/127.0.0.1#5335 +ipset=/onlynudes.org/gfwlist +server=/leagueoflegends.co.kr/127.0.0.1#5335 +ipset=/leagueoflegends.co.kr/gfwlist +server=/mastercard.com.mx/127.0.0.1#5335 +ipset=/mastercard.com.mx/gfwlist +server=/duoweiweek.com/127.0.0.1#5335 +ipset=/duoweiweek.com/gfwlist +server=/sexvideos.tel/127.0.0.1#5335 +ipset=/sexvideos.tel/gfwlist +server=/integral7.com/127.0.0.1#5335 +ipset=/integral7.com/gfwlist +server=/now.sh/127.0.0.1#5335 +ipset=/now.sh/gfwlist +server=/madshi.net/127.0.0.1#5335 +ipset=/madshi.net/gfwlist +server=/visa.com/127.0.0.1#5335 +ipset=/visa.com/gfwlist +server=/techstreet.com/127.0.0.1#5335 +ipset=/techstreet.com/gfwlist +server=/vanish.es/127.0.0.1#5335 +ipset=/vanish.es/gfwlist +server=/adventofcode.com/127.0.0.1#5335 +ipset=/adventofcode.com/gfwlist +server=/mastercard.com.gt/127.0.0.1#5335 +ipset=/mastercard.com.gt/gfwlist +server=/applestore.co.uk/127.0.0.1#5335 +ipset=/applestore.co.uk/gfwlist +server=/sheflix.com/127.0.0.1#5335 +ipset=/sheflix.com/gfwlist +server=/9ccms.me/127.0.0.1#5335 +ipset=/9ccms.me/gfwlist +server=/verisign.com.vn/127.0.0.1#5335 +ipset=/verisign.com.vn/gfwlist +server=/apple.ca/127.0.0.1#5335 +ipset=/apple.ca/gfwlist +server=/thehulubraintrust.com/127.0.0.1#5335 +ipset=/thehulubraintrust.com/gfwlist +server=/older-women-porn.com/127.0.0.1#5335 +ipset=/older-women-porn.com/gfwlist +server=/5q5zu9f1.me/127.0.0.1#5335 +ipset=/5q5zu9f1.me/gfwlist +server=/whereilive.com.au/127.0.0.1#5335 +ipset=/whereilive.com.au/gfwlist +server=/microsoftsilverlight.com/127.0.0.1#5335 +ipset=/microsoftsilverlight.com/gfwlist +server=/bmw-motorrad.fi/127.0.0.1#5335 +ipset=/bmw-motorrad.fi/gfwlist +server=/sextubedot.com/127.0.0.1#5335 +ipset=/sextubedot.com/gfwlist +server=/whatbrowser.org/127.0.0.1#5335 +ipset=/whatbrowser.org/gfwlist +server=/amateurgirlfriends.net/127.0.0.1#5335 +ipset=/amateurgirlfriends.net/gfwlist +server=/globalsign.nl/127.0.0.1#5335 +ipset=/globalsign.nl/gfwlist +server=/mini.my/127.0.0.1#5335 +ipset=/mini.my/gfwlist +server=/clubhouseapi.com/127.0.0.1#5335 +ipset=/clubhouseapi.com/gfwlist +server=/sale-nikeshoes.com/127.0.0.1#5335 +ipset=/sale-nikeshoes.com/gfwlist +server=/fapxl.com/127.0.0.1#5335 +ipset=/fapxl.com/gfwlist +server=/hentaicore.net/127.0.0.1#5335 +ipset=/hentaicore.net/gfwlist +server=/wsjmediakit.com/127.0.0.1#5335 +ipset=/wsjmediakit.com/gfwlist +server=/haskell.org/127.0.0.1#5335 +ipset=/haskell.org/gfwlist +server=/moviesarena.com/127.0.0.1#5335 +ipset=/moviesarena.com/gfwlist +server=/beatsbydreaustraliaonline.com/127.0.0.1#5335 +ipset=/beatsbydreaustraliaonline.com/gfwlist +server=/scholar.google.fi/127.0.0.1#5335 +ipset=/scholar.google.fi/gfwlist +server=/visa.com.gy/127.0.0.1#5335 +ipset=/visa.com.gy/gfwlist +server=/ebaystore77.com/127.0.0.1#5335 +ipset=/ebaystore77.com/gfwlist +server=/cheapmonsterbeatsbydrdre.com/127.0.0.1#5335 +ipset=/cheapmonsterbeatsbydrdre.com/gfwlist +server=/scientificamerican.com/127.0.0.1#5335 +ipset=/scientificamerican.com/gfwlist +server=/ebayopensource.com/127.0.0.1#5335 +ipset=/ebayopensource.com/gfwlist +server=/xtube.com/127.0.0.1#5335 +ipset=/xtube.com/gfwlist +server=/0xxx.ws/127.0.0.1#5335 +ipset=/0xxx.ws/gfwlist +server=/omobi.cc/127.0.0.1#5335 +ipset=/omobi.cc/gfwlist +server=/bestbuy-audio.com/127.0.0.1#5335 +ipset=/bestbuy-audio.com/gfwlist +server=/herodex.org/127.0.0.1#5335 +ipset=/herodex.org/gfwlist +server=/deps.info/127.0.0.1#5335 +ipset=/deps.info/gfwlist +server=/hpsuresupply.com/127.0.0.1#5335 +ipset=/hpsuresupply.com/gfwlist +server=/worldflipper.jp/127.0.0.1#5335 +ipset=/worldflipper.jp/gfwlist +server=/foxneodigital.com/127.0.0.1#5335 +ipset=/foxneodigital.com/gfwlist +server=/hpccp.com/127.0.0.1#5335 +ipset=/hpccp.com/gfwlist +server=/mini.no/127.0.0.1#5335 +ipset=/mini.no/gfwlist +server=/amateursexstart.nl/127.0.0.1#5335 +ipset=/amateursexstart.nl/gfwlist +server=/accountkit.com/127.0.0.1#5335 +ipset=/accountkit.com/gfwlist +server=/facebookcovers.org/127.0.0.1#5335 +ipset=/facebookcovers.org/gfwlist +server=/besztbuy.com/127.0.0.1#5335 +ipset=/besztbuy.com/gfwlist +server=/digitaldesire.com/127.0.0.1#5335 +ipset=/digitaldesire.com/gfwlist +server=/canon.com.mk/127.0.0.1#5335 +ipset=/canon.com.mk/gfwlist +server=/applemusicfestival.com/127.0.0.1#5335 +ipset=/applemusicfestival.com/gfwlist +server=/xn--d4ty0ojsqzfd.com/127.0.0.1#5335 +ipset=/xn--d4ty0ojsqzfd.com/gfwlist +server=/notion.new/127.0.0.1#5335 +ipset=/notion.new/gfwlist +server=/scholar.google.co.th/127.0.0.1#5335 +ipset=/scholar.google.co.th/gfwlist +server=/4beatsbydre.com/127.0.0.1#5335 +ipset=/4beatsbydre.com/gfwlist +server=/5beatsbydre.com/127.0.0.1#5335 +ipset=/5beatsbydre.com/gfwlist +server=/erotera.blogo.jp/127.0.0.1#5335 +ipset=/erotera.blogo.jp/gfwlist +server=/beatsbydreheadphonesolo.com/127.0.0.1#5335 +ipset=/beatsbydreheadphonesolo.com/gfwlist +server=/mostly.jp/127.0.0.1#5335 +ipset=/mostly.jp/gfwlist +server=/drebeats-singapore.com/127.0.0.1#5335 +ipset=/drebeats-singapore.com/gfwlist +server=/google.lt/127.0.0.1#5335 +ipset=/google.lt/gfwlist +server=/disneylatino.com/127.0.0.1#5335 +ipset=/disneylatino.com/gfwlist +server=/grupobmw.com/127.0.0.1#5335 +ipset=/grupobmw.com/gfwlist +server=/minisolife.co.za/127.0.0.1#5335 +ipset=/minisolife.co.za/gfwlist +server=/fox-news.com/127.0.0.1#5335 +ipset=/fox-news.com/gfwlist +server=/monsterbeatsbydrdrecanada.com/127.0.0.1#5335 +ipset=/monsterbeatsbydrdrecanada.com/gfwlist +server=/pinterest.co.kr/127.0.0.1#5335 +ipset=/pinterest.co.kr/gfwlist +server=/localbitcoins.com/127.0.0.1#5335 +ipset=/localbitcoins.com/gfwlist +server=/propertysex.com/127.0.0.1#5335 +ipset=/propertysex.com/gfwlist +server=/h2porn.com/127.0.0.1#5335 +ipset=/h2porn.com/gfwlist +server=/acmvalidations.com/127.0.0.1#5335 +ipset=/acmvalidations.com/gfwlist +server=/appleid-uk.us/127.0.0.1#5335 +ipset=/appleid-uk.us/gfwlist +server=/appyq.com/127.0.0.1#5335 +ipset=/appyq.com/gfwlist +server=/wasmer.io/127.0.0.1#5335 +ipset=/wasmer.io/gfwlist +server=/enfamil.com/127.0.0.1#5335 +ipset=/enfamil.com/gfwlist +server=/pejyyah.com/127.0.0.1#5335 +ipset=/pejyyah.com/gfwlist +server=/enfamil.pl/127.0.0.1#5335 +ipset=/enfamil.pl/gfwlist +server=/cy22.tv/127.0.0.1#5335 +ipset=/cy22.tv/gfwlist +server=/ebayexpress.sg/127.0.0.1#5335 +ipset=/ebayexpress.sg/gfwlist +server=/casualhomemadesex.com/127.0.0.1#5335 +ipset=/casualhomemadesex.com/gfwlist +server=/91porn.com/127.0.0.1#5335 +ipset=/91porn.com/gfwlist +server=/ffotolia.com/127.0.0.1#5335 +ipset=/ffotolia.com/gfwlist +server=/gfotolia.com/127.0.0.1#5335 +ipset=/gfotolia.com/gfwlist +server=/bmw-tunisia.com/127.0.0.1#5335 +ipset=/bmw-tunisia.com/gfwlist +server=/alphera.ca/127.0.0.1#5335 +ipset=/alphera.ca/gfwlist +server=/tubinge.com/127.0.0.1#5335 +ipset=/tubinge.com/gfwlist +server=/ibeatsbydre.com/127.0.0.1#5335 +ipset=/ibeatsbydre.com/gfwlist +server=/spotify.design/127.0.0.1#5335 +ipset=/spotify.design/gfwlist +server=/zzcartoon.com/127.0.0.1#5335 +ipset=/zzcartoon.com/gfwlist +server=/ladyboygold.eu/127.0.0.1#5335 +ipset=/ladyboygold.eu/gfwlist +server=/lethalhardcorevr.com/127.0.0.1#5335 +ipset=/lethalhardcorevr.com/gfwlist +server=/retroclassicporn.com/127.0.0.1#5335 +ipset=/retroclassicporn.com/gfwlist +server=/ipadmini.lk/127.0.0.1#5335 +ipset=/ipadmini.lk/gfwlist +server=/9anime.cz/127.0.0.1#5335 +ipset=/9anime.cz/gfwlist +server=/shadowsocks.com/127.0.0.1#5335 +ipset=/shadowsocks.com/gfwlist +server=/chla3.com/127.0.0.1#5335 +ipset=/chla3.com/gfwlist +server=/young-webcam.net/127.0.0.1#5335 +ipset=/young-webcam.net/gfwlist +server=/vilavpn2.xyz/127.0.0.1#5335 +ipset=/vilavpn2.xyz/gfwlist +server=/durexindia.com/127.0.0.1#5335 +ipset=/durexindia.com/gfwlist +server=/protonmail.com/127.0.0.1#5335 +ipset=/protonmail.com/gfwlist +server=/aplestore.com/127.0.0.1#5335 +ipset=/aplestore.com/gfwlist +server=/scholar.google.hn/127.0.0.1#5335 +ipset=/scholar.google.hn/gfwlist +server=/youtube.com.es/127.0.0.1#5335 +ipset=/youtube.com.es/gfwlist +server=/letmejerk.fun/127.0.0.1#5335 +ipset=/letmejerk.fun/gfwlist +server=/movefrees.com/127.0.0.1#5335 +ipset=/movefrees.com/gfwlist +server=/medium.com/127.0.0.1#5335 +ipset=/medium.com/gfwlist +server=/insidemacintosh.com/127.0.0.1#5335 +ipset=/insidemacintosh.com/gfwlist +server=/gslink.us/127.0.0.1#5335 +ipset=/gslink.us/gfwlist +server=/ehwiki.org/127.0.0.1#5335 +ipset=/ehwiki.org/gfwlist +server=/twhentai.com/127.0.0.1#5335 +ipset=/twhentai.com/gfwlist +server=/terapeak.com/127.0.0.1#5335 +ipset=/terapeak.com/gfwlist +server=/fbooktaiwan.com/127.0.0.1#5335 +ipset=/fbooktaiwan.com/gfwlist +server=/bmw.am/127.0.0.1#5335 +ipset=/bmw.am/gfwlist +server=/gisplanning.com/127.0.0.1#5335 +ipset=/gisplanning.com/gfwlist +server=/bmw.com.ni/127.0.0.1#5335 +ipset=/bmw.com.ni/gfwlist +server=/bestlistofporn.com/127.0.0.1#5335 +ipset=/bestlistofporn.com/gfwlist +server=/beatspills.com/127.0.0.1#5335 +ipset=/beatspills.com/gfwlist +server=/volvobuses.ru/127.0.0.1#5335 +ipset=/volvobuses.ru/gfwlist +server=/18p2p.com/127.0.0.1#5335 +ipset=/18p2p.com/gfwlist +server=/pinterest.hu/127.0.0.1#5335 +ipset=/pinterest.hu/gfwlist +server=/hackfacebook.com/127.0.0.1#5335 +ipset=/hackfacebook.com/gfwlist +server=/f6988.com/127.0.0.1#5335 +ipset=/f6988.com/gfwlist +server=/luxuretv.fun/127.0.0.1#5335 +ipset=/luxuretv.fun/gfwlist +server=/veet.de/127.0.0.1#5335 +ipset=/veet.de/gfwlist +server=/wordpress.com/127.0.0.1#5335 +ipset=/wordpress.com/gfwlist +server=/bridgestone.com.co/127.0.0.1#5335 +ipset=/bridgestone.com.co/gfwlist +server=/ricefever.com/127.0.0.1#5335 +ipset=/ricefever.com/gfwlist +server=/spotify.com.edgesuite.net/127.0.0.1#5335 +ipset=/spotify.com.edgesuite.net/gfwlist +server=/paypal-optimizer.com/127.0.0.1#5335 +ipset=/paypal-optimizer.com/gfwlist +server=/xvds.tv/127.0.0.1#5335 +ipset=/xvds.tv/gfwlist +server=/soirt4.fun/127.0.0.1#5335 +ipset=/soirt4.fun/gfwlist +server=/jav-subtitles.com/127.0.0.1#5335 +ipset=/jav-subtitles.com/gfwlist +server=/rhodeislandbmw.com/127.0.0.1#5335 +ipset=/rhodeislandbmw.com/gfwlist +server=/videoxxxporn.biz/127.0.0.1#5335 +ipset=/videoxxxporn.biz/gfwlist +server=/xtubezoo.com/127.0.0.1#5335 +ipset=/xtubezoo.com/gfwlist +server=/beatsbydre-headphonesshop.com/127.0.0.1#5335 +ipset=/beatsbydre-headphonesshop.com/gfwlist +server=/beejp.net/127.0.0.1#5335 +ipset=/beejp.net/gfwlist +server=/pornvideobb.com/127.0.0.1#5335 +ipset=/pornvideobb.com/gfwlist +server=/famifun.com.tw/127.0.0.1#5335 +ipset=/famifun.com.tw/gfwlist +server=/beatsbestdeals.com/127.0.0.1#5335 +ipset=/beatsbestdeals.com/gfwlist +server=/24porn.com/127.0.0.1#5335 +ipset=/24porn.com/gfwlist +server=/uguisupapa.net/127.0.0.1#5335 +ipset=/uguisupapa.net/gfwlist +server=/xnxvideos.org/127.0.0.1#5335 +ipset=/xnxvideos.org/gfwlist +server=/bromite.org/127.0.0.1#5335 +ipset=/bromite.org/gfwlist +server=/airitilibrary.com/127.0.0.1#5335 +ipset=/airitilibrary.com/gfwlist +server=/applestore.cc/127.0.0.1#5335 +ipset=/applestore.cc/gfwlist +server=/itunbes.com/127.0.0.1#5335 +ipset=/itunbes.com/gfwlist +server=/btec.co.uk/127.0.0.1#5335 +ipset=/btec.co.uk/gfwlist +server=/intercomassets.com/127.0.0.1#5335 +ipset=/intercomassets.com/gfwlist +server=/rocksdb.org/127.0.0.1#5335 +ipset=/rocksdb.org/gfwlist +server=/foxnewssunday.com/127.0.0.1#5335 +ipset=/foxnewssunday.com/gfwlist +server=/flowtype.org/127.0.0.1#5335 +ipset=/flowtype.org/gfwlist +server=/alivercm.com/127.0.0.1#5335 +ipset=/alivercm.com/gfwlist +server=/clipsex.asia/127.0.0.1#5335 +ipset=/clipsex.asia/gfwlist +server=/futpromos.com/127.0.0.1#5335 +ipset=/futpromos.com/gfwlist +server=/hutpromos.com/127.0.0.1#5335 +ipset=/hutpromos.com/gfwlist +server=/science.org/127.0.0.1#5335 +ipset=/science.org/gfwlist +server=/blogspot.vn/127.0.0.1#5335 +ipset=/blogspot.vn/gfwlist +server=/webkitgtk.org/127.0.0.1#5335 +ipset=/webkitgtk.org/gfwlist +server=/bmw.co.id/127.0.0.1#5335 +ipset=/bmw.co.id/gfwlist +server=/mcrouter.org/127.0.0.1#5335 +ipset=/mcrouter.org/gfwlist +server=/nushemale.com/127.0.0.1#5335 +ipset=/nushemale.com/gfwlist +server=/hdpornvideo.xxx/127.0.0.1#5335 +ipset=/hdpornvideo.xxx/gfwlist +server=/planetsuzy.org/127.0.0.1#5335 +ipset=/planetsuzy.org/gfwlist +server=/avelip.com/127.0.0.1#5335 +ipset=/avelip.com/gfwlist +server=/akamaietpcompromisedcnctest.com/127.0.0.1#5335 +ipset=/akamaietpcompromisedcnctest.com/gfwlist +server=/falundafa.org.tw/127.0.0.1#5335 +ipset=/falundafa.org.tw/gfwlist +server=/darkcategories.com/127.0.0.1#5335 +ipset=/darkcategories.com/gfwlist +server=/japanesegirlspictures.com/127.0.0.1#5335 +ipset=/japanesegirlspictures.com/gfwlist +server=/hotescortdusseldorf.com/127.0.0.1#5335 +ipset=/hotescortdusseldorf.com/gfwlist +server=/sg1lib.org/127.0.0.1#5335 +ipset=/sg1lib.org/gfwlist +server=/monsterbeatsheadphone.com/127.0.0.1#5335 +ipset=/monsterbeatsheadphone.com/gfwlist +server=/videosporno.life/127.0.0.1#5335 +ipset=/videosporno.life/gfwlist +server=/intel.mk/127.0.0.1#5335 +ipset=/intel.mk/gfwlist +server=/paypalsurvey.com/127.0.0.1#5335 +ipset=/paypalsurvey.com/gfwlist +server=/bmw-calgary.ca/127.0.0.1#5335 +ipset=/bmw-calgary.ca/gfwlist +server=/foxmediacloud.com/127.0.0.1#5335 +ipset=/foxmediacloud.com/gfwlist +server=/cloudflaressl.com/127.0.0.1#5335 +ipset=/cloudflaressl.com/gfwlist +server=/kastatic.org/127.0.0.1#5335 +ipset=/kastatic.org/gfwlist +server=/via0.com/127.0.0.1#5335 +ipset=/via0.com/gfwlist +server=/kindleoasisnews.com/127.0.0.1#5335 +ipset=/kindleoasisnews.com/gfwlist +server=/hulugermany.com/127.0.0.1#5335 +ipset=/hulugermany.com/gfwlist +server=/el-ladies.com/127.0.0.1#5335 +ipset=/el-ladies.com/gfwlist +server=/foxnewsaffiliates.com/127.0.0.1#5335 +ipset=/foxnewsaffiliates.com/gfwlist +server=/beatsdreinau.com/127.0.0.1#5335 +ipset=/beatsdreinau.com/gfwlist +server=/supremacy.com/127.0.0.1#5335 +ipset=/supremacy.com/gfwlist +server=/appleaccount.net/127.0.0.1#5335 +ipset=/appleaccount.net/gfwlist +server=/paypal-support.com/127.0.0.1#5335 +ipset=/paypal-support.com/gfwlist +server=/trithucvn.org/127.0.0.1#5335 +ipset=/trithucvn.org/gfwlist +server=/visanet.net/127.0.0.1#5335 +ipset=/visanet.net/gfwlist +server=/appleid-applemx.com/127.0.0.1#5335 +ipset=/appleid-applemx.com/gfwlist +server=/google.co.id/127.0.0.1#5335 +ipset=/google.co.id/gfwlist +server=/computingreviews.com/127.0.0.1#5335 +ipset=/computingreviews.com/gfwlist +server=/nejm.org/127.0.0.1#5335 +ipset=/nejm.org/gfwlist +server=/qprize.com/127.0.0.1#5335 +ipset=/qprize.com/gfwlist +server=/huluhuluhuluhulu10.work/127.0.0.1#5335 +ipset=/huluhuluhuluhulu10.work/gfwlist +server=/mostpopularpornsites.com/127.0.0.1#5335 +ipset=/mostpopularpornsites.com/gfwlist +server=/directvmurfreesborotn.com/127.0.0.1#5335 +ipset=/directvmurfreesborotn.com/gfwlist +server=/xbox.eu/127.0.0.1#5335 +ipset=/xbox.eu/gfwlist +server=/18h.mm-cg.com/127.0.0.1#5335 +ipset=/18h.mm-cg.com/gfwlist +server=/porncrash.com/127.0.0.1#5335 +ipset=/porncrash.com/gfwlist +server=/foxsports.com/127.0.0.1#5335 +ipset=/foxsports.com/gfwlist +server=/advertisercommunity.com/127.0.0.1#5335 +ipset=/advertisercommunity.com/gfwlist +server=/bestporngames.com/127.0.0.1#5335 +ipset=/bestporngames.com/gfwlist +server=/3movs.xyz/127.0.0.1#5335 +ipset=/3movs.xyz/gfwlist +server=/travelex.fr/127.0.0.1#5335 +ipset=/travelex.fr/gfwlist +server=/facboox.com/127.0.0.1#5335 +ipset=/facboox.com/gfwlist +server=/newsexxxx.com/127.0.0.1#5335 +ipset=/newsexxxx.com/gfwlist +server=/lysol.co.cr/127.0.0.1#5335 +ipset=/lysol.co.cr/gfwlist +server=/unity.com/127.0.0.1#5335 +ipset=/unity.com/gfwlist +server=/hentai2012.com/127.0.0.1#5335 +ipset=/hentai2012.com/gfwlist +server=/vkmessenger.com/127.0.0.1#5335 +ipset=/vkmessenger.com/gfwlist +server=/nettyinternet.com/127.0.0.1#5335 +ipset=/nettyinternet.com/gfwlist +server=/youtube.de/127.0.0.1#5335 +ipset=/youtube.de/gfwlist +server=/amateurxx.org/127.0.0.1#5335 +ipset=/amateurxx.org/gfwlist +server=/guardianapis.com/127.0.0.1#5335 +ipset=/guardianapis.com/gfwlist +server=/veet.co.in/127.0.0.1#5335 +ipset=/veet.co.in/gfwlist +server=/harperacademic.com/127.0.0.1#5335 +ipset=/harperacademic.com/gfwlist +server=/keepmovingwithmovefree.com/127.0.0.1#5335 +ipset=/keepmovingwithmovefree.com/gfwlist +server=/bridgestone.com/127.0.0.1#5335 +ipset=/bridgestone.com/gfwlist +server=/vk-portal.net/127.0.0.1#5335 +ipset=/vk-portal.net/gfwlist +server=/webobjects.com/127.0.0.1#5335 +ipset=/webobjects.com/gfwlist +server=/nikestore.com/127.0.0.1#5335 +ipset=/nikestore.com/gfwlist +server=/ipfs.best-practice.se/127.0.0.1#5335 +ipset=/ipfs.best-practice.se/gfwlist +server=/pse.is/127.0.0.1#5335 +ipset=/pse.is/gfwlist +server=/volvobuses.it/127.0.0.1#5335 +ipset=/volvobuses.it/gfwlist +server=/ganjing.com/127.0.0.1#5335 +ipset=/ganjing.com/gfwlist +server=/crazy-amateurs.com/127.0.0.1#5335 +ipset=/crazy-amateurs.com/gfwlist +server=/youtube.co.tz/127.0.0.1#5335 +ipset=/youtube.co.tz/gfwlist +server=/fullhdxxx.com/127.0.0.1#5335 +ipset=/fullhdxxx.com/gfwlist +server=/paypal.so/127.0.0.1#5335 +ipset=/paypal.so/gfwlist +server=/aiv-cdn.net/127.0.0.1#5335 +ipset=/aiv-cdn.net/gfwlist +server=/pinterest.com/127.0.0.1#5335 +ipset=/pinterest.com/gfwlist +server=/mktdns.com/127.0.0.1#5335 +ipset=/mktdns.com/gfwlist +server=/api.ai/127.0.0.1#5335 +ipset=/api.ai/gfwlist +server=/iafd.com/127.0.0.1#5335 +ipset=/iafd.com/gfwlist +server=/videoleak.me/127.0.0.1#5335 +ipset=/videoleak.me/gfwlist +server=/meadjohnson.com.tw/127.0.0.1#5335 +ipset=/meadjohnson.com.tw/gfwlist +server=/googleearth.com/127.0.0.1#5335 +ipset=/googleearth.com/gfwlist +server=/celebsporno.com/127.0.0.1#5335 +ipset=/celebsporno.com/gfwlist +server=/megaphone.fm/127.0.0.1#5335 +ipset=/megaphone.fm/gfwlist +server=/xh-porn.com/127.0.0.1#5335 +ipset=/xh-porn.com/gfwlist +server=/sextreffen-portale.com/127.0.0.1#5335 +ipset=/sextreffen-portale.com/gfwlist +server=/hypodermicinjectiononline.com/127.0.0.1#5335 +ipset=/hypodermicinjectiononline.com/gfwlist +server=/akastream.net/127.0.0.1#5335 +ipset=/akastream.net/gfwlist +server=/appletvapp.apple/127.0.0.1#5335 +ipset=/appletvapp.apple/gfwlist +server=/clarivate.com/127.0.0.1#5335 +ipset=/clarivate.com/gfwlist +server=/blogspot.com.ee/127.0.0.1#5335 +ipset=/blogspot.com.ee/gfwlist +server=/pwabuilder.com/127.0.0.1#5335 +ipset=/pwabuilder.com/gfwlist +server=/rushporn.online/127.0.0.1#5335 +ipset=/rushporn.online/gfwlist +server=/hanzhen.xmulib.org/127.0.0.1#5335 +ipset=/hanzhen.xmulib.org/gfwlist +server=/centrino.net/127.0.0.1#5335 +ipset=/centrino.net/gfwlist +server=/facebooksignup.net/127.0.0.1#5335 +ipset=/facebooksignup.net/gfwlist +server=/vfsco.com.tr/127.0.0.1#5335 +ipset=/vfsco.com.tr/gfwlist +server=/milfs-gone-wild.com/127.0.0.1#5335 +ipset=/milfs-gone-wild.com/gfwlist +server=/chillingo.com/127.0.0.1#5335 +ipset=/chillingo.com/gfwlist +server=/pornvidhd.club/127.0.0.1#5335 +ipset=/pornvidhd.club/gfwlist +server=/hentaicovid.com/127.0.0.1#5335 +ipset=/hentaicovid.com/gfwlist +server=/adidas.se/127.0.0.1#5335 +ipset=/adidas.se/gfwlist +server=/vfsco.co.za/127.0.0.1#5335 +ipset=/vfsco.co.za/gfwlist +server=/artnudegalleries.com/127.0.0.1#5335 +ipset=/artnudegalleries.com/gfwlist +server=/sextubexxl.com/127.0.0.1#5335 +ipset=/sextubexxl.com/gfwlist +server=/redxxx.cc/127.0.0.1#5335 +ipset=/redxxx.cc/gfwlist +server=/arabxn.com/127.0.0.1#5335 +ipset=/arabxn.com/gfwlist +server=/camvideos.tv/127.0.0.1#5335 +ipset=/camvideos.tv/gfwlist +server=/herokuapp.com/127.0.0.1#5335 +ipset=/herokuapp.com/gfwlist +server=/beatsmusic.com/127.0.0.1#5335 +ipset=/beatsmusic.com/gfwlist +server=/youtube.jp/127.0.0.1#5335 +ipset=/youtube.jp/gfwlist +server=/scathd.com/127.0.0.1#5335 +ipset=/scathd.com/gfwlist +server=/sextoystop.com/127.0.0.1#5335 +ipset=/sextoystop.com/gfwlist +server=/camstagestudio.com/127.0.0.1#5335 +ipset=/camstagestudio.com/gfwlist +server=/ccstatic.org/127.0.0.1#5335 +ipset=/ccstatic.org/gfwlist +server=/gettyimages.fr/127.0.0.1#5335 +ipset=/gettyimages.fr/gfwlist +server=/fury.blog/127.0.0.1#5335 +ipset=/fury.blog/gfwlist +server=/maileoch.com/127.0.0.1#5335 +ipset=/maileoch.com/gfwlist +server=/nextwork.com.hk/127.0.0.1#5335 +ipset=/nextwork.com.hk/gfwlist +server=/1bigclub.com/127.0.0.1#5335 +ipset=/1bigclub.com/gfwlist +server=/bmw.by/127.0.0.1#5335 +ipset=/bmw.by/gfwlist +server=/mitpressjournals.org/127.0.0.1#5335 +ipset=/mitpressjournals.org/gfwlist +server=/gobeatsye.com/127.0.0.1#5335 +ipset=/gobeatsye.com/gfwlist +server=/xn--d1acpjx3f.xn--p1ai/127.0.0.1#5335 +ipset=/xn--d1acpjx3f.xn--p1ai/gfwlist +server=/lcgirls.com/127.0.0.1#5335 +ipset=/lcgirls.com/gfwlist +server=/spizoo.com/127.0.0.1#5335 +ipset=/spizoo.com/gfwlist +server=/pricelessafrica.com/127.0.0.1#5335 +ipset=/pricelessafrica.com/gfwlist +server=/fox42kptm.com/127.0.0.1#5335 +ipset=/fox42kptm.com/gfwlist +server=/xhot.pro/127.0.0.1#5335 +ipset=/xhot.pro/gfwlist +server=/html5rocks.com/127.0.0.1#5335 +ipset=/html5rocks.com/gfwlist +server=/ieee-aess.org/127.0.0.1#5335 +ipset=/ieee-aess.org/gfwlist +server=/zoo-hardcore.com/127.0.0.1#5335 +ipset=/zoo-hardcore.com/gfwlist +server=/pictocum.com/127.0.0.1#5335 +ipset=/pictocum.com/gfwlist +server=/zukunftswerkstatt.de/127.0.0.1#5335 +ipset=/zukunftswerkstatt.de/gfwlist +server=/mangahasu.se/127.0.0.1#5335 +ipset=/mangahasu.se/gfwlist +server=/fox10news.com/127.0.0.1#5335 +ipset=/fox10news.com/gfwlist +server=/intel.co.kr/127.0.0.1#5335 +ipset=/intel.co.kr/gfwlist +server=/seematureporn.com/127.0.0.1#5335 +ipset=/seematureporn.com/gfwlist +server=/vfsco.be/127.0.0.1#5335 +ipset=/vfsco.be/gfwlist +server=/atnext.com/127.0.0.1#5335 +ipset=/atnext.com/gfwlist +server=/zooyouporn.com/127.0.0.1#5335 +ipset=/zooyouporn.com/gfwlist +server=/damnhotz.com/127.0.0.1#5335 +ipset=/damnhotz.com/gfwlist +server=/asmhentai.com/127.0.0.1#5335 +ipset=/asmhentai.com/gfwlist +server=/fairmarket.com/127.0.0.1#5335 +ipset=/fairmarket.com/gfwlist +server=/scandalplanet.com/127.0.0.1#5335 +ipset=/scandalplanet.com/gfwlist +server=/chocolatey.org/127.0.0.1#5335 +ipset=/chocolatey.org/gfwlist +server=/iceporncasting.com/127.0.0.1#5335 +ipset=/iceporncasting.com/gfwlist +server=/imperial.insendi.com/127.0.0.1#5335 +ipset=/imperial.insendi.com/gfwlist +server=/illusnoi.com/127.0.0.1#5335 +ipset=/illusnoi.com/gfwlist +server=/intellij.com/127.0.0.1#5335 +ipset=/intellij.com/gfwlist +server=/wxoyt.com/127.0.0.1#5335 +ipset=/wxoyt.com/gfwlist +server=/shopeemobile.com/127.0.0.1#5335 +ipset=/shopeemobile.com/gfwlist +server=/mini-connected.com/127.0.0.1#5335 +ipset=/mini-connected.com/gfwlist +server=/pornfoolery.com/127.0.0.1#5335 +ipset=/pornfoolery.com/gfwlist +server=/wowgirls.com/127.0.0.1#5335 +ipset=/wowgirls.com/gfwlist +server=/polygon.com/127.0.0.1#5335 +ipset=/polygon.com/gfwlist +server=/sexbombo.com/127.0.0.1#5335 +ipset=/sexbombo.com/gfwlist +server=/intellij.net/127.0.0.1#5335 +ipset=/intellij.net/gfwlist +server=/sankei-kaihatsu.co.jp/127.0.0.1#5335 +ipset=/sankei-kaihatsu.co.jp/gfwlist +server=/truyen-hentai.com/127.0.0.1#5335 +ipset=/truyen-hentai.com/gfwlist +server=/minisexdoll.com/127.0.0.1#5335 +ipset=/minisexdoll.com/gfwlist +server=/yahoo.nl/127.0.0.1#5335 +ipset=/yahoo.nl/gfwlist +server=/telex.cc/127.0.0.1#5335 +ipset=/telex.cc/gfwlist +server=/volvopenta.com.br/127.0.0.1#5335 +ipset=/volvopenta.com.br/gfwlist +server=/golosameriki.com/127.0.0.1#5335 +ipset=/golosameriki.com/gfwlist +server=/videosmadeathome.com/127.0.0.1#5335 +ipset=/videosmadeathome.com/gfwlist +server=/chemnetbase.com/127.0.0.1#5335 +ipset=/chemnetbase.com/gfwlist +server=/facebookgroups.com/127.0.0.1#5335 +ipset=/facebookgroups.com/gfwlist +server=/akamaiphillipines.com/127.0.0.1#5335 +ipset=/akamaiphillipines.com/gfwlist +server=/thefacebook.net/127.0.0.1#5335 +ipset=/thefacebook.net/gfwlist +server=/cozydrdrebeats.com/127.0.0.1#5335 +ipset=/cozydrdrebeats.com/gfwlist +server=/onlineinstagram.com/127.0.0.1#5335 +ipset=/onlineinstagram.com/gfwlist +server=/velostrata.com/127.0.0.1#5335 +ipset=/velostrata.com/gfwlist +server=/ebay.pk/127.0.0.1#5335 +ipset=/ebay.pk/gfwlist +server=/hkcnews.com/127.0.0.1#5335 +ipset=/hkcnews.com/gfwlist +server=/yahoo.co.in/127.0.0.1#5335 +ipset=/yahoo.co.in/gfwlist +server=/anallivecams.com/127.0.0.1#5335 +ipset=/anallivecams.com/gfwlist +server=/kenyaraha.net/127.0.0.1#5335 +ipset=/kenyaraha.net/gfwlist +server=/bondagesm.xyz/127.0.0.1#5335 +ipset=/bondagesm.xyz/gfwlist +server=/openstreetmap.net/127.0.0.1#5335 +ipset=/openstreetmap.net/gfwlist +server=/scholar.google.at/127.0.0.1#5335 +ipset=/scholar.google.at/gfwlist +server=/llnwi.net/127.0.0.1#5335 +ipset=/llnwi.net/gfwlist +server=/vxnbbrs.xyz/127.0.0.1#5335 +ipset=/vxnbbrs.xyz/gfwlist +server=/githubhackathon.com/127.0.0.1#5335 +ipset=/githubhackathon.com/gfwlist +server=/beatsbydreuk.com/127.0.0.1#5335 +ipset=/beatsbydreuk.com/gfwlist +server=/hkgolden.media/127.0.0.1#5335 +ipset=/hkgolden.media/gfwlist +server=/erome.com/127.0.0.1#5335 +ipset=/erome.com/gfwlist +server=/realclearhistory.com/127.0.0.1#5335 +ipset=/realclearhistory.com/gfwlist +server=/ccdc.cam.ac.uk/127.0.0.1#5335 +ipset=/ccdc.cam.ac.uk/gfwlist +server=/wildfanny.com/127.0.0.1#5335 +ipset=/wildfanny.com/gfwlist +server=/duckduckgo.nl/127.0.0.1#5335 +ipset=/duckduckgo.nl/gfwlist +server=/furrypornvideos.com/127.0.0.1#5335 +ipset=/furrypornvideos.com/gfwlist +server=/xxxvideos247.com/127.0.0.1#5335 +ipset=/xxxvideos247.com/gfwlist +server=/studioluxus.com/127.0.0.1#5335 +ipset=/studioluxus.com/gfwlist +server=/1337x.gd/127.0.0.1#5335 +ipset=/1337x.gd/gfwlist +server=/alphabet.es/127.0.0.1#5335 +ipset=/alphabet.es/gfwlist +server=/sharethis.com/127.0.0.1#5335 +ipset=/sharethis.com/gfwlist +server=/japan-forward.com/127.0.0.1#5335 +ipset=/japan-forward.com/gfwlist +server=/docker.io/127.0.0.1#5335 +ipset=/docker.io/gfwlist +server=/firefox.com/127.0.0.1#5335 +ipset=/firefox.com/gfwlist +server=/tiktokcdn.com/127.0.0.1#5335 +ipset=/tiktokcdn.com/gfwlist +server=/logicoolg.com/127.0.0.1#5335 +ipset=/logicoolg.com/gfwlist +server=/youtube.ch/127.0.0.1#5335 +ipset=/youtube.ch/gfwlist +server=/boysfood.com/127.0.0.1#5335 +ipset=/boysfood.com/gfwlist +server=/babesinporn.com/127.0.0.1#5335 +ipset=/babesinporn.com/gfwlist +server=/ptt2.cc/127.0.0.1#5335 +ipset=/ptt2.cc/gfwlist +server=/applecomputer.co.in/127.0.0.1#5335 +ipset=/applecomputer.co.in/gfwlist +server=/ipodcentre.nl/127.0.0.1#5335 +ipset=/ipodcentre.nl/gfwlist +server=/byteoversea.com/127.0.0.1#5335 +ipset=/byteoversea.com/gfwlist +server=/nikeprice.com/127.0.0.1#5335 +ipset=/nikeprice.com/gfwlist +server=/seemilfporn.com/127.0.0.1#5335 +ipset=/seemilfporn.com/gfwlist +server=/vrpornmania.com/127.0.0.1#5335 +ipset=/vrpornmania.com/gfwlist +server=/jqueryui.com/127.0.0.1#5335 +ipset=/jqueryui.com/gfwlist +server=/planetminecraft.com/127.0.0.1#5335 +ipset=/planetminecraft.com/gfwlist +server=/cableav.tv/127.0.0.1#5335 +ipset=/cableav.tv/gfwlist +server=/disneycareers.com/127.0.0.1#5335 +ipset=/disneycareers.com/gfwlist +server=/dyttapi.com/127.0.0.1#5335 +ipset=/dyttapi.com/gfwlist +server=/redhdtube.xxx/127.0.0.1#5335 +ipset=/redhdtube.xxx/gfwlist +server=/dirtyflix.com/127.0.0.1#5335 +ipset=/dirtyflix.com/gfwlist +server=/vfsco.kr/127.0.0.1#5335 +ipset=/vfsco.kr/gfwlist +server=/apple-watch.com.ru/127.0.0.1#5335 +ipset=/apple-watch.com.ru/gfwlist +server=/thetimes.ie/127.0.0.1#5335 +ipset=/thetimes.ie/gfwlist +server=/paypalgivingfund.org/127.0.0.1#5335 +ipset=/paypalgivingfund.org/gfwlist +server=/volvobuses.com.br/127.0.0.1#5335 +ipset=/volvobuses.com.br/gfwlist +server=/drdreheadphonesusstore.com/127.0.0.1#5335 +ipset=/drdreheadphonesusstore.com/gfwlist +server=/minikelowna.com/127.0.0.1#5335 +ipset=/minikelowna.com/gfwlist +server=/k9vidz.com/127.0.0.1#5335 +ipset=/k9vidz.com/gfwlist +server=/msocdn.com/127.0.0.1#5335 +ipset=/msocdn.com/gfwlist +server=/gettyimages.fi/127.0.0.1#5335 +ipset=/gettyimages.fi/gfwlist +server=/voadeewaradio.com/127.0.0.1#5335 +ipset=/voadeewaradio.com/gfwlist +server=/3dhentaix.com/127.0.0.1#5335 +ipset=/3dhentaix.com/gfwlist +server=/instagramphoto.com/127.0.0.1#5335 +ipset=/instagramphoto.com/gfwlist +server=/zeenite.com/127.0.0.1#5335 +ipset=/zeenite.com/gfwlist +server=/truthordarepics.com/127.0.0.1#5335 +ipset=/truthordarepics.com/gfwlist +server=/hpdrivers.org/127.0.0.1#5335 +ipset=/hpdrivers.org/gfwlist +server=/opengraphprotocol.com/127.0.0.1#5335 +ipset=/opengraphprotocol.com/gfwlist +server=/adult789.futoka.jp/127.0.0.1#5335 +ipset=/adult789.futoka.jp/gfwlist +server=/fimfiction.net/127.0.0.1#5335 +ipset=/fimfiction.net/gfwlist +server=/bmw-carit.de/127.0.0.1#5335 +ipset=/bmw-carit.de/gfwlist +server=/thepornblender.com/127.0.0.1#5335 +ipset=/thepornblender.com/gfwlist +server=/machos.net/127.0.0.1#5335 +ipset=/machos.net/gfwlist +server=/onedrive.live.com/127.0.0.1#5335 +ipset=/onedrive.live.com/gfwlist +server=/att.tv/127.0.0.1#5335 +ipset=/att.tv/gfwlist +server=/pornmaster.fun/127.0.0.1#5335 +ipset=/pornmaster.fun/gfwlist +server=/latticedata.com/127.0.0.1#5335 +ipset=/latticedata.com/gfwlist +server=/imsrbx.xyz/127.0.0.1#5335 +ipset=/imsrbx.xyz/gfwlist +server=/bmwgroup-classic.com/127.0.0.1#5335 +ipset=/bmwgroup-classic.com/gfwlist +server=/vanish.co.uk/127.0.0.1#5335 +ipset=/vanish.co.uk/gfwlist +server=/fox2detroit.com/127.0.0.1#5335 +ipset=/fox2detroit.com/gfwlist +server=/heywire.com/127.0.0.1#5335 +ipset=/heywire.com/gfwlist +server=/intell.com/127.0.0.1#5335 +ipset=/intell.com/gfwlist +server=/91fans.org/127.0.0.1#5335 +ipset=/91fans.org/gfwlist +server=/roborecall.com/127.0.0.1#5335 +ipset=/roborecall.com/gfwlist +server=/collabora.org/127.0.0.1#5335 +ipset=/collabora.org/gfwlist +server=/syosetu.com/127.0.0.1#5335 +ipset=/syosetu.com/gfwlist +server=/hxcsxs.pro/127.0.0.1#5335 +ipset=/hxcsxs.pro/gfwlist +server=/lusthero.com/127.0.0.1#5335 +ipset=/lusthero.com/gfwlist +server=/xxmovz.com/127.0.0.1#5335 +ipset=/xxmovz.com/gfwlist +server=/ipadair.jp/127.0.0.1#5335 +ipset=/ipadair.jp/gfwlist +server=/ams.org/127.0.0.1#5335 +ipset=/ams.org/gfwlist +server=/disney.bg/127.0.0.1#5335 +ipset=/disney.bg/gfwlist +server=/bmw.at/127.0.0.1#5335 +ipset=/bmw.at/gfwlist +server=/ahentaitv.com/127.0.0.1#5335 +ipset=/ahentaitv.com/gfwlist +server=/drebeats-monster.com/127.0.0.1#5335 +ipset=/drebeats-monster.com/gfwlist +server=/canon.ca/127.0.0.1#5335 +ipset=/canon.ca/gfwlist +server=/neowin.net/127.0.0.1#5335 +ipset=/neowin.net/gfwlist +server=/wholefoods.com/127.0.0.1#5335 +ipset=/wholefoods.com/gfwlist +server=/now.com.hk/127.0.0.1#5335 +ipset=/now.com.hk/gfwlist +server=/mini.com.ec/127.0.0.1#5335 +ipset=/mini.com.ec/gfwlist +server=/mypornads.com/127.0.0.1#5335 +ipset=/mypornads.com/gfwlist +server=/xoxoteiras.com/127.0.0.1#5335 +ipset=/xoxoteiras.com/gfwlist +server=/midatlanticbmwmotorcycles.com/127.0.0.1#5335 +ipset=/midatlanticbmwmotorcycles.com/gfwlist +server=/imgbb.com/127.0.0.1#5335 +ipset=/imgbb.com/gfwlist +server=/1drv.com/127.0.0.1#5335 +ipset=/1drv.com/gfwlist +server=/nikedawn.com/127.0.0.1#5335 +ipset=/nikedawn.com/gfwlist +server=/kiji.ca/127.0.0.1#5335 +ipset=/kiji.ca/gfwlist +server=/bbc.co.uk/127.0.0.1#5335 +ipset=/bbc.co.uk/gfwlist +server=/ospray.org/127.0.0.1#5335 +ipset=/ospray.org/gfwlist +server=/universalstudioshollywood.com/127.0.0.1#5335 +ipset=/universalstudioshollywood.com/gfwlist +server=/pornhd8k.net/127.0.0.1#5335 +ipset=/pornhd8k.net/gfwlist +server=/mkt.com/127.0.0.1#5335 +ipset=/mkt.com/gfwlist +server=/seselah.com/127.0.0.1#5335 +ipset=/seselah.com/gfwlist +server=/rferl.org/127.0.0.1#5335 +ipset=/rferl.org/gfwlist +server=/boulx.com/127.0.0.1#5335 +ipset=/boulx.com/gfwlist +server=/google.com.tj/127.0.0.1#5335 +ipset=/google.com.tj/gfwlist +server=/yandex.sx/127.0.0.1#5335 +ipset=/yandex.sx/gfwlist +server=/xxxccc4.com/127.0.0.1#5335 +ipset=/xxxccc4.com/gfwlist +server=/x.company/127.0.0.1#5335 +ipset=/x.company/gfwlist +server=/itnel.com/127.0.0.1#5335 +ipset=/itnel.com/gfwlist +server=/wrds-www.wharton.upenn.edu/127.0.0.1#5335 +ipset=/wrds-www.wharton.upenn.edu/gfwlist +server=/crazyxxx3dworld.net/127.0.0.1#5335 +ipset=/crazyxxx3dworld.net/gfwlist +server=/voabangla.com/127.0.0.1#5335 +ipset=/voabangla.com/gfwlist +server=/weinvoiceit.com/127.0.0.1#5335 +ipset=/weinvoiceit.com/gfwlist +server=/googlefiber.net/127.0.0.1#5335 +ipset=/googlefiber.net/gfwlist +server=/pornditos.com/127.0.0.1#5335 +ipset=/pornditos.com/gfwlist +server=/yourporngod.com/127.0.0.1#5335 +ipset=/yourporngod.com/gfwlist +server=/pornhits.com/127.0.0.1#5335 +ipset=/pornhits.com/gfwlist +server=/muncloud.dog/127.0.0.1#5335 +ipset=/muncloud.dog/gfwlist +server=/eprintsw.com/127.0.0.1#5335 +ipset=/eprintsw.com/gfwlist +server=/adobegov.com/127.0.0.1#5335 +ipset=/adobegov.com/gfwlist +server=/vmwareviewpoint.com/127.0.0.1#5335 +ipset=/vmwareviewpoint.com/gfwlist +server=/momtube.club/127.0.0.1#5335 +ipset=/momtube.club/gfwlist +server=/barrons-conferences.com/127.0.0.1#5335 +ipset=/barrons-conferences.com/gfwlist +server=/beatsbydrestudio-australia.com/127.0.0.1#5335 +ipset=/beatsbydrestudio-australia.com/gfwlist +server=/foxdcg.com/127.0.0.1#5335 +ipset=/foxdcg.com/gfwlist +server=/canonfoundation.org/127.0.0.1#5335 +ipset=/canonfoundation.org/gfwlist +server=/netpornsex.com/127.0.0.1#5335 +ipset=/netpornsex.com/gfwlist +server=/maturescam.com/127.0.0.1#5335 +ipset=/maturescam.com/gfwlist +server=/b6b33.com/127.0.0.1#5335 +ipset=/b6b33.com/gfwlist +server=/applewatch.tw/127.0.0.1#5335 +ipset=/applewatch.tw/gfwlist +server=/papalah.com/127.0.0.1#5335 +ipset=/papalah.com/gfwlist +server=/facewbook.co/127.0.0.1#5335 +ipset=/facewbook.co/gfwlist +server=/rea.design/127.0.0.1#5335 +ipset=/rea.design/gfwlist +server=/sexyhumorgames.com/127.0.0.1#5335 +ipset=/sexyhumorgames.com/gfwlist +server=/facecbook.org/127.0.0.1#5335 +ipset=/facecbook.org/gfwlist +server=/foxcincy.net/127.0.0.1#5335 +ipset=/foxcincy.net/gfwlist +server=/foxsports.co/127.0.0.1#5335 +ipset=/foxsports.co/gfwlist +server=/bridgestone-asiapacific.com/127.0.0.1#5335 +ipset=/bridgestone-asiapacific.com/gfwlist +server=/xnxxhd.tv/127.0.0.1#5335 +ipset=/xnxxhd.tv/gfwlist +server=/fury.dev/127.0.0.1#5335 +ipset=/fury.dev/gfwlist +server=/blogspot.tw/127.0.0.1#5335 +ipset=/blogspot.tw/gfwlist +server=/cstatic.net/127.0.0.1#5335 +ipset=/cstatic.net/gfwlist +server=/rstatic.net/127.0.0.1#5335 +ipset=/rstatic.net/gfwlist +server=/annamilk.com/127.0.0.1#5335 +ipset=/annamilk.com/gfwlist +server=/itunes.ca/127.0.0.1#5335 +ipset=/itunes.ca/gfwlist +server=/nikeadidas.com/127.0.0.1#5335 +ipset=/nikeadidas.com/gfwlist +server=/huffpostarabi.com/127.0.0.1#5335 +ipset=/huffpostarabi.com/gfwlist +server=/connectionseducation.com/127.0.0.1#5335 +ipset=/connectionseducation.com/gfwlist +server=/notion-static.com/127.0.0.1#5335 +ipset=/notion-static.com/gfwlist +server=/asknudes.com/127.0.0.1#5335 +ipset=/asknudes.com/gfwlist +server=/yandex.aero/127.0.0.1#5335 +ipset=/yandex.aero/gfwlist +server=/freebeacon.com/127.0.0.1#5335 +ipset=/freebeacon.com/gfwlist +server=/google.com.bo/127.0.0.1#5335 +ipset=/google.com.bo/gfwlist +server=/esperanzagomez.org/127.0.0.1#5335 +ipset=/esperanzagomez.org/gfwlist +server=/ibeatsbydre.cc/127.0.0.1#5335 +ipset=/ibeatsbydre.cc/gfwlist +server=/azureedge-test.net/127.0.0.1#5335 +ipset=/azureedge-test.net/gfwlist +server=/disneyiejobs.com/127.0.0.1#5335 +ipset=/disneyiejobs.com/gfwlist +server=/post852.com/127.0.0.1#5335 +ipset=/post852.com/gfwlist +server=/services-apple.net/127.0.0.1#5335 +ipset=/services-apple.net/gfwlist +server=/55dndn.com/127.0.0.1#5335 +ipset=/55dndn.com/gfwlist +server=/beatsdrdrecuffie.net/127.0.0.1#5335 +ipset=/beatsdrdrecuffie.net/gfwlist +server=/fotiolia.com/127.0.0.1#5335 +ipset=/fotiolia.com/gfwlist +server=/sonytc.co.jp/127.0.0.1#5335 +ipset=/sonytc.co.jp/gfwlist +server=/new-akiba.com/127.0.0.1#5335 +ipset=/new-akiba.com/gfwlist +server=/asebay.com/127.0.0.1#5335 +ipset=/asebay.com/gfwlist +server=/sexhdmovs.com/127.0.0.1#5335 +ipset=/sexhdmovs.com/gfwlist +server=/yeyuehuachao13.com/127.0.0.1#5335 +ipset=/yeyuehuachao13.com/gfwlist +server=/intel.ga/127.0.0.1#5335 +ipset=/intel.ga/gfwlist +server=/webex.fr/127.0.0.1#5335 +ipset=/webex.fr/gfwlist +server=/paypal-community.com/127.0.0.1#5335 +ipset=/paypal-community.com/gfwlist +server=/foxsoccerplus.tv/127.0.0.1#5335 +ipset=/foxsoccerplus.tv/gfwlist +server=/foxnews.net/127.0.0.1#5335 +ipset=/foxnews.net/gfwlist +server=/collegejournal.com/127.0.0.1#5335 +ipset=/collegejournal.com/gfwlist +server=/digitalplaygroundnetwork.com/127.0.0.1#5335 +ipset=/digitalplaygroundnetwork.com/gfwlist +server=/adultgamingroom.com/127.0.0.1#5335 +ipset=/adultgamingroom.com/gfwlist +server=/yourpelvicexam.com/127.0.0.1#5335 +ipset=/yourpelvicexam.com/gfwlist +server=/minisokorea.com/127.0.0.1#5335 +ipset=/minisokorea.com/gfwlist +server=/durex.com.ng/127.0.0.1#5335 +ipset=/durex.com.ng/gfwlist +server=/redislabs.com/127.0.0.1#5335 +ipset=/redislabs.com/gfwlist +server=/dettol.com.au/127.0.0.1#5335 +ipset=/dettol.com.au/gfwlist +server=/kingofpics.com/127.0.0.1#5335 +ipset=/kingofpics.com/gfwlist +server=/freebrowser.org/127.0.0.1#5335 +ipset=/freebrowser.org/gfwlist +server=/originalhulu.com/127.0.0.1#5335 +ipset=/originalhulu.com/gfwlist +server=/pornsites.xxx/127.0.0.1#5335 +ipset=/pornsites.xxx/gfwlist +server=/yahoo.cz/127.0.0.1#5335 +ipset=/yahoo.cz/gfwlist +server=/wholefoodsmarket.com/127.0.0.1#5335 +ipset=/wholefoodsmarket.com/gfwlist +server=/youtube.pa/127.0.0.1#5335 +ipset=/youtube.pa/gfwlist +server=/firstpelvicexam.com/127.0.0.1#5335 +ipset=/firstpelvicexam.com/gfwlist +server=/av-channel.com/127.0.0.1#5335 +ipset=/av-channel.com/gfwlist +server=/lfai.foundation/127.0.0.1#5335 +ipset=/lfai.foundation/gfwlist +server=/urchin.com/127.0.0.1#5335 +ipset=/urchin.com/gfwlist +server=/extremetube.com/127.0.0.1#5335 +ipset=/extremetube.com/gfwlist +server=/mommystoytime.com/127.0.0.1#5335 +ipset=/mommystoytime.com/gfwlist +server=/dlmobilegarena-a.akamaihd.net/127.0.0.1#5335 +ipset=/dlmobilegarena-a.akamaihd.net/gfwlist +server=/lmmbtc.com/127.0.0.1#5335 +ipset=/lmmbtc.com/gfwlist +server=/hotindianxxxsex.com/127.0.0.1#5335 +ipset=/hotindianxxxsex.com/gfwlist +server=/shianyuanfang.com/127.0.0.1#5335 +ipset=/shianyuanfang.com/gfwlist +server=/txqzz34r.com/127.0.0.1#5335 +ipset=/txqzz34r.com/gfwlist +server=/vmwareusergroupstore.com/127.0.0.1#5335 +ipset=/vmwareusergroupstore.com/gfwlist +server=/asagaku.com/127.0.0.1#5335 +ipset=/asagaku.com/gfwlist +server=/qumingwz.com/127.0.0.1#5335 +ipset=/qumingwz.com/gfwlist +server=/babyzone.com/127.0.0.1#5335 +ipset=/babyzone.com/gfwlist +server=/girlfriendhomeporn.com/127.0.0.1#5335 +ipset=/girlfriendhomeporn.com/gfwlist +server=/sexlikereal.com/127.0.0.1#5335 +ipset=/sexlikereal.com/gfwlist +server=/ebaytv.org/127.0.0.1#5335 +ipset=/ebaytv.org/gfwlist +server=/newssyndication.com/127.0.0.1#5335 +ipset=/newssyndication.com/gfwlist +server=/bcove.video/127.0.0.1#5335 +ipset=/bcove.video/gfwlist +server=/freudbox.com/127.0.0.1#5335 +ipset=/freudbox.com/gfwlist +server=/xboxstudios.com/127.0.0.1#5335 +ipset=/xboxstudios.com/gfwlist +server=/fastlylabs.com/127.0.0.1#5335 +ipset=/fastlylabs.com/gfwlist +server=/ipod.tw/127.0.0.1#5335 +ipset=/ipod.tw/gfwlist +server=/hp3d.com/127.0.0.1#5335 +ipset=/hp3d.com/gfwlist +server=/scoreland2.com/127.0.0.1#5335 +ipset=/scoreland2.com/gfwlist +server=/ryokoyomiuri.co.jp/127.0.0.1#5335 +ipset=/ryokoyomiuri.co.jp/gfwlist +server=/burningcamel.com/127.0.0.1#5335 +ipset=/burningcamel.com/gfwlist +server=/xxvideos.xxx/127.0.0.1#5335 +ipset=/xxvideos.xxx/gfwlist +server=/twistedlinks.net/127.0.0.1#5335 +ipset=/twistedlinks.net/gfwlist +server=/hentai-archive.com/127.0.0.1#5335 +ipset=/hentai-archive.com/gfwlist +server=/myfoxphilly.com/127.0.0.1#5335 +ipset=/myfoxphilly.com/gfwlist +server=/bmw-motorrad.com.tr/127.0.0.1#5335 +ipset=/bmw-motorrad.com.tr/gfwlist +server=/skunkgirl.cc/127.0.0.1#5335 +ipset=/skunkgirl.cc/gfwlist +server=/facebuok.com/127.0.0.1#5335 +ipset=/facebuok.com/gfwlist +server=/finishinfo.no/127.0.0.1#5335 +ipset=/finishinfo.no/gfwlist +server=/paypal-network.org/127.0.0.1#5335 +ipset=/paypal-network.org/gfwlist +server=/xoomcom.com/127.0.0.1#5335 +ipset=/xoomcom.com/gfwlist +server=/abbywintersfree.com/127.0.0.1#5335 +ipset=/abbywintersfree.com/gfwlist +server=/airwick.pl/127.0.0.1#5335 +ipset=/airwick.pl/gfwlist +server=/dialga.com/127.0.0.1#5335 +ipset=/dialga.com/gfwlist +server=/tanflix.com/127.0.0.1#5335 +ipset=/tanflix.com/gfwlist +server=/nintendo.be/127.0.0.1#5335 +ipset=/nintendo.be/gfwlist +server=/vsmarketplacebadge.apphb.com/127.0.0.1#5335 +ipset=/vsmarketplacebadge.apphb.com/gfwlist +server=/vrpornjack.com/127.0.0.1#5335 +ipset=/vrpornjack.com/gfwlist +server=/fifastreet.com/127.0.0.1#5335 +ipset=/fifastreet.com/gfwlist +server=/tokyomotion.com/127.0.0.1#5335 +ipset=/tokyomotion.com/gfwlist +server=/tvbusa.com/127.0.0.1#5335 +ipset=/tvbusa.com/gfwlist +server=/xlovecam.com/127.0.0.1#5335 +ipset=/xlovecam.com/gfwlist +server=/cloudflare.net/127.0.0.1#5335 +ipset=/cloudflare.net/gfwlist +server=/fljmh.com/127.0.0.1#5335 +ipset=/fljmh.com/gfwlist +server=/m5ir5np1.shop/127.0.0.1#5335 +ipset=/m5ir5np1.shop/gfwlist +server=/cas.org/127.0.0.1#5335 +ipset=/cas.org/gfwlist +server=/starcraft2.com/127.0.0.1#5335 +ipset=/starcraft2.com/gfwlist +server=/eurogirlsescort.com/127.0.0.1#5335 +ipset=/eurogirlsescort.com/gfwlist +server=/4channel.org/127.0.0.1#5335 +ipset=/4channel.org/gfwlist +server=/cylink0122.icu/127.0.0.1#5335 +ipset=/cylink0122.icu/gfwlist +server=/appl-e.com/127.0.0.1#5335 +ipset=/appl-e.com/gfwlist +server=/6parkbbs.com/127.0.0.1#5335 +ipset=/6parkbbs.com/gfwlist +server=/xsrxpwvg.com/127.0.0.1#5335 +ipset=/xsrxpwvg.com/gfwlist +server=/beatsdrdre-solo.com/127.0.0.1#5335 +ipset=/beatsdrdre-solo.com/gfwlist +server=/porn2018.com/127.0.0.1#5335 +ipset=/porn2018.com/gfwlist +server=/ebaycar.com/127.0.0.1#5335 +ipset=/ebaycar.com/gfwlist +server=/neotokyo.supertop-100.com/127.0.0.1#5335 +ipset=/neotokyo.supertop-100.com/gfwlist +server=/ikea.jp/127.0.0.1#5335 +ipset=/ikea.jp/gfwlist +server=/mageconf.com.ua/127.0.0.1#5335 +ipset=/mageconf.com.ua/gfwlist +server=/uporno.xxx/127.0.0.1#5335 +ipset=/uporno.xxx/gfwlist +server=/nxta.org/127.0.0.1#5335 +ipset=/nxta.org/gfwlist +server=/xcafe.com/127.0.0.1#5335 +ipset=/xcafe.com/gfwlist +server=/root-signing.ch/127.0.0.1#5335 +ipset=/root-signing.ch/gfwlist +server=/lovemstudios.com/127.0.0.1#5335 +ipset=/lovemstudios.com/gfwlist +server=/google.ca/127.0.0.1#5335 +ipset=/google.ca/gfwlist +server=/microsoft.dk/127.0.0.1#5335 +ipset=/microsoft.dk/gfwlist +server=/txcloud.net/127.0.0.1#5335 +ipset=/txcloud.net/gfwlist +server=/ieeeday.org/127.0.0.1#5335 +ipset=/ieeeday.org/gfwlist +server=/scholar.google.nl/127.0.0.1#5335 +ipset=/scholar.google.nl/gfwlist +server=/acs.org/127.0.0.1#5335 +ipset=/acs.org/gfwlist +server=/masterwanker.com/127.0.0.1#5335 +ipset=/masterwanker.com/gfwlist +server=/hardsex8.com/127.0.0.1#5335 +ipset=/hardsex8.com/gfwlist +server=/ebay-vacation.com/127.0.0.1#5335 +ipset=/ebay-vacation.com/gfwlist +server=/qporno.xxx/127.0.0.1#5335 +ipset=/qporno.xxx/gfwlist +server=/playstation.com/127.0.0.1#5335 +ipset=/playstation.com/gfwlist +server=/custombeatsbydrebuy.com/127.0.0.1#5335 +ipset=/custombeatsbydrebuy.com/gfwlist +server=/xnxx-xxx.win/127.0.0.1#5335 +ipset=/xnxx-xxx.win/gfwlist +server=/att.com/127.0.0.1#5335 +ipset=/att.com/gfwlist +server=/pricelesspick.com/127.0.0.1#5335 +ipset=/pricelesspick.com/gfwlist +server=/microsoftreactor.org/127.0.0.1#5335 +ipset=/microsoftreactor.org/gfwlist +server=/tube.bz/127.0.0.1#5335 +ipset=/tube.bz/gfwlist +server=/91rb.com/127.0.0.1#5335 +ipset=/91rb.com/gfwlist +server=/cotweet.com/127.0.0.1#5335 +ipset=/cotweet.com/gfwlist +server=/hentainstream.com/127.0.0.1#5335 +ipset=/hentainstream.com/gfwlist +server=/powerofresolve.com/127.0.0.1#5335 +ipset=/powerofresolve.com/gfwlist +server=/bmwbkk.de/127.0.0.1#5335 +ipset=/bmwbkk.de/gfwlist +server=/s-books.com/127.0.0.1#5335 +ipset=/s-books.com/gfwlist +server=/rrtis.com/127.0.0.1#5335 +ipset=/rrtis.com/gfwlist +server=/xn--9trs65b.com/127.0.0.1#5335 +ipset=/xn--9trs65b.com/gfwlist +server=/desktopmovie.org/127.0.0.1#5335 +ipset=/desktopmovie.org/gfwlist +server=/dotfacebook.com/127.0.0.1#5335 +ipset=/dotfacebook.com/gfwlist +server=/mailonline.com/127.0.0.1#5335 +ipset=/mailonline.com/gfwlist +server=/bridgestone.co.jp/127.0.0.1#5335 +ipset=/bridgestone.co.jp/gfwlist +server=/pornohoo.com.mx/127.0.0.1#5335 +ipset=/pornohoo.com.mx/gfwlist +server=/videosamadoresreais.com/127.0.0.1#5335 +ipset=/videosamadoresreais.com/gfwlist +server=/javleak.com/127.0.0.1#5335 +ipset=/javleak.com/gfwlist +server=/protonmail.ch/127.0.0.1#5335 +ipset=/protonmail.ch/gfwlist +server=/netlifystatus.com/127.0.0.1#5335 +ipset=/netlifystatus.com/gfwlist +server=/pornfind.org/127.0.0.1#5335 +ipset=/pornfind.org/gfwlist +server=/mortein.co.nz/127.0.0.1#5335 +ipset=/mortein.co.nz/gfwlist +server=/honkaistarrail.com/127.0.0.1#5335 +ipset=/honkaistarrail.com/gfwlist +server=/volvogrouptruckcenter.nl/127.0.0.1#5335 +ipset=/volvogrouptruckcenter.nl/gfwlist +server=/rarbggo.org/127.0.0.1#5335 +ipset=/rarbggo.org/gfwlist +server=/joylovedolls.com/127.0.0.1#5335 +ipset=/joylovedolls.com/gfwlist +server=/hentaiverse.org/127.0.0.1#5335 +ipset=/hentaiverse.org/gfwlist +server=/javhd.com/127.0.0.1#5335 +ipset=/javhd.com/gfwlist +server=/playpornogames.com/127.0.0.1#5335 +ipset=/playpornogames.com/gfwlist +server=/blender.org/127.0.0.1#5335 +ipset=/blender.org/gfwlist +server=/topbeatsdealer.com/127.0.0.1#5335 +ipset=/topbeatsdealer.com/gfwlist +server=/bmw-adventskalender.com/127.0.0.1#5335 +ipset=/bmw-adventskalender.com/gfwlist +server=/nytstyle.com/127.0.0.1#5335 +ipset=/nytstyle.com/gfwlist +server=/www-bestbuystores.com/127.0.0.1#5335 +ipset=/www-bestbuystores.com/gfwlist +server=/huluitaly.com/127.0.0.1#5335 +ipset=/huluitaly.com/gfwlist +server=/shopdurex.com/127.0.0.1#5335 +ipset=/shopdurex.com/gfwlist +server=/mini.co.cr/127.0.0.1#5335 +ipset=/mini.co.cr/gfwlist +server=/scholar.google.cn/127.0.0.1#5335 +ipset=/scholar.google.cn/gfwlist +server=/bmw-connecteddrive.com.cy/127.0.0.1#5335 +ipset=/bmw-connecteddrive.com.cy/gfwlist +server=/ministcatharines.ca/127.0.0.1#5335 +ipset=/ministcatharines.ca/gfwlist +server=/thisvidscat.net/127.0.0.1#5335 +ipset=/thisvidscat.net/gfwlist +server=/hbogo.com/127.0.0.1#5335 +ipset=/hbogo.com/gfwlist +server=/ateam-oracle.com/127.0.0.1#5335 +ipset=/ateam-oracle.com/gfwlist +server=/foxnewspodcasts.com/127.0.0.1#5335 +ipset=/foxnewspodcasts.com/gfwlist +server=/ciattackers.com/127.0.0.1#5335 +ipset=/ciattackers.com/gfwlist +server=/pvue2.com/127.0.0.1#5335 +ipset=/pvue2.com/gfwlist +server=/vsassets.io/127.0.0.1#5335 +ipset=/vsassets.io/gfwlist +server=/volvotrucks.com.br/127.0.0.1#5335 +ipset=/volvotrucks.com.br/gfwlist +server=/apple-darwin.org/127.0.0.1#5335 +ipset=/apple-darwin.org/gfwlist +server=/venmo.net/127.0.0.1#5335 +ipset=/venmo.net/gfwlist +server=/z676869.com/127.0.0.1#5335 +ipset=/z676869.com/gfwlist +server=/hoolu.com/127.0.0.1#5335 +ipset=/hoolu.com/gfwlist +server=/hotgaylist.com/127.0.0.1#5335 +ipset=/hotgaylist.com/gfwlist +server=/reachporn.com/127.0.0.1#5335 +ipset=/reachporn.com/gfwlist +server=/blogspot.is/127.0.0.1#5335 +ipset=/blogspot.is/gfwlist +server=/orzqwq.com/127.0.0.1#5335 +ipset=/orzqwq.com/gfwlist +server=/femalestars.com/127.0.0.1#5335 +ipset=/femalestars.com/gfwlist +server=/google.co.in/127.0.0.1#5335 +ipset=/google.co.in/gfwlist +server=/brocaproject.com/127.0.0.1#5335 +ipset=/brocaproject.com/gfwlist +server=/strepsils.com.tw/127.0.0.1#5335 +ipset=/strepsils.com.tw/gfwlist +server=/aerogard.com.au/127.0.0.1#5335 +ipset=/aerogard.com.au/gfwlist +server=/airwick.co.in/127.0.0.1#5335 +ipset=/airwick.co.in/gfwlist +server=/applecentre.info/127.0.0.1#5335 +ipset=/applecentre.info/gfwlist +server=/ecpa.fr/127.0.0.1#5335 +ipset=/ecpa.fr/gfwlist +server=/pornoamateurlatino.net/127.0.0.1#5335 +ipset=/pornoamateurlatino.net/gfwlist +server=/vikiporn.com/127.0.0.1#5335 +ipset=/vikiporn.com/gfwlist +server=/facebook-corp.com/127.0.0.1#5335 +ipset=/facebook-corp.com/gfwlist +server=/scorepass.com/127.0.0.1#5335 +ipset=/scorepass.com/gfwlist +server=/javhub.me/127.0.0.1#5335 +ipset=/javhub.me/gfwlist +server=/16885858.com/127.0.0.1#5335 +ipset=/16885858.com/gfwlist +server=/shemaleporn.fun/127.0.0.1#5335 +ipset=/shemaleporn.fun/gfwlist +server=/xbabe.com/127.0.0.1#5335 +ipset=/xbabe.com/gfwlist +server=/xxxporn123.com/127.0.0.1#5335 +ipset=/xxxporn123.com/gfwlist +server=/volvotrucks.in/127.0.0.1#5335 +ipset=/volvotrucks.in/gfwlist +server=/intel.bo/127.0.0.1#5335 +ipset=/intel.bo/gfwlist +server=/sony.com.mx/127.0.0.1#5335 +ipset=/sony.com.mx/gfwlist +server=/hentaihere.com/127.0.0.1#5335 +ipset=/hentaihere.com/gfwlist +server=/beatsdrdrekaufenschweiz.net/127.0.0.1#5335 +ipset=/beatsdrdrekaufenschweiz.net/gfwlist +server=/apple.net/127.0.0.1#5335 +ipset=/apple.net/gfwlist +server=/riotgames.net/127.0.0.1#5335 +ipset=/riotgames.net/gfwlist +server=/tsyum.com/127.0.0.1#5335 +ipset=/tsyum.com/gfwlist +server=/intel.pl/127.0.0.1#5335 +ipset=/intel.pl/gfwlist +server=/ministjohns.ca/127.0.0.1#5335 +ipset=/ministjohns.ca/gfwlist +server=/aboutamazon.es/127.0.0.1#5335 +ipset=/aboutamazon.es/gfwlist +server=/asianpornonly.com/127.0.0.1#5335 +ipset=/asianpornonly.com/gfwlist +server=/entrust.net/127.0.0.1#5335 +ipset=/entrust.net/gfwlist +server=/foxtel.com.au/127.0.0.1#5335 +ipset=/foxtel.com.au/gfwlist +server=/uwpcommunitytoolkit.com/127.0.0.1#5335 +ipset=/uwpcommunitytoolkit.com/gfwlist +server=/ebay.es/127.0.0.1#5335 +ipset=/ebay.es/gfwlist +server=/getfedora.org/127.0.0.1#5335 +ipset=/getfedora.org/gfwlist +server=/pacopacomama.com/127.0.0.1#5335 +ipset=/pacopacomama.com/gfwlist +server=/blizzard.com/127.0.0.1#5335 +ipset=/blizzard.com/gfwlist +server=/foxpoker.com/127.0.0.1#5335 +ipset=/foxpoker.com/gfwlist +server=/30plusgirls.com/127.0.0.1#5335 +ipset=/30plusgirls.com/gfwlist +server=/iphone-zh.com/127.0.0.1#5335 +ipset=/iphone-zh.com/gfwlist +server=/radiotavisupleba.ge/127.0.0.1#5335 +ipset=/radiotavisupleba.ge/gfwlist +server=/facebook30.org/127.0.0.1#5335 +ipset=/facebook30.org/gfwlist +server=/aliveprofiler.com/127.0.0.1#5335 +ipset=/aliveprofiler.com/gfwlist +server=/1jjdg2.vip/127.0.0.1#5335 +ipset=/1jjdg2.vip/gfwlist +server=/minilat.com/127.0.0.1#5335 +ipset=/minilat.com/gfwlist +server=/9anime.to/127.0.0.1#5335 +ipset=/9anime.to/gfwlist +server=/dmmrex.com/127.0.0.1#5335 +ipset=/dmmrex.com/gfwlist +server=/movetv.com/127.0.0.1#5335 +ipset=/movetv.com/gfwlist +server=/apkmirror.com/127.0.0.1#5335 +ipset=/apkmirror.com/gfwlist +server=/aboutamazon.pl/127.0.0.1#5335 +ipset=/aboutamazon.pl/gfwlist +server=/next.hk/127.0.0.1#5335 +ipset=/next.hk/gfwlist +server=/applepay.co.rs/127.0.0.1#5335 +ipset=/applepay.co.rs/gfwlist +server=/madonna-av.com/127.0.0.1#5335 +ipset=/madonna-av.com/gfwlist +server=/firebaseapp.com/127.0.0.1#5335 +ipset=/firebaseapp.com/gfwlist +server=/yourporn.sexy/127.0.0.1#5335 +ipset=/yourporn.sexy/gfwlist +server=/porngem.com/127.0.0.1#5335 +ipset=/porngem.com/gfwlist +server=/gayheaven.org/127.0.0.1#5335 +ipset=/gayheaven.org/gfwlist +server=/bustymerilyn.com/127.0.0.1#5335 +ipset=/bustymerilyn.com/gfwlist +server=/qqgamedesign.com/127.0.0.1#5335 +ipset=/qqgamedesign.com/gfwlist +server=/ooni.org/127.0.0.1#5335 +ipset=/ooni.org/gfwlist +server=/viralporn.com/127.0.0.1#5335 +ipset=/viralporn.com/gfwlist +server=/imperial.ac.uk/127.0.0.1#5335 +ipset=/imperial.ac.uk/gfwlist +server=/huffpost.com/127.0.0.1#5335 +ipset=/huffpost.com/gfwlist +server=/foxtvdvd.com/127.0.0.1#5335 +ipset=/foxtvdvd.com/gfwlist +server=/fbmessenger.com/127.0.0.1#5335 +ipset=/fbmessenger.com/gfwlist +server=/tracking-location.com/127.0.0.1#5335 +ipset=/tracking-location.com/gfwlist +server=/a2z.com/127.0.0.1#5335 +ipset=/a2z.com/gfwlist +server=/thedreadwolfrises.com/127.0.0.1#5335 +ipset=/thedreadwolfrises.com/gfwlist +server=/9news.com.au/127.0.0.1#5335 +ipset=/9news.com.au/gfwlist +server=/getoutline.org/127.0.0.1#5335 +ipset=/getoutline.org/gfwlist +server=/exs8fkw0.xyz/127.0.0.1#5335 +ipset=/exs8fkw0.xyz/gfwlist +server=/xxeronetxx.info/127.0.0.1#5335 +ipset=/xxeronetxx.info/gfwlist +server=/youtube.com.my/127.0.0.1#5335 +ipset=/youtube.com.my/gfwlist +server=/hdgaytube.xxx/127.0.0.1#5335 +ipset=/hdgaytube.xxx/gfwlist +server=/ntdimg.com/127.0.0.1#5335 +ipset=/ntdimg.com/gfwlist +server=/flagrasamadores.net/127.0.0.1#5335 +ipset=/flagrasamadores.net/gfwlist +server=/jizzonline.com/127.0.0.1#5335 +ipset=/jizzonline.com/gfwlist +server=/visa.com.vi/127.0.0.1#5335 +ipset=/visa.com.vi/gfwlist +server=/xvideos-cdn.com/127.0.0.1#5335 +ipset=/xvideos-cdn.com/gfwlist +server=/nikkei.jp/127.0.0.1#5335 +ipset=/nikkei.jp/gfwlist +server=/pickinguppussy.com/127.0.0.1#5335 +ipset=/pickinguppussy.com/gfwlist +server=/burstly.net/127.0.0.1#5335 +ipset=/burstly.net/gfwlist +server=/intelfreepress.com/127.0.0.1#5335 +ipset=/intelfreepress.com/gfwlist +server=/ikea.co.de/127.0.0.1#5335 +ipset=/ikea.co.de/gfwlist +server=/sonypictures.com/127.0.0.1#5335 +ipset=/sonypictures.com/gfwlist +server=/pornojefe.com/127.0.0.1#5335 +ipset=/pornojefe.com/gfwlist +server=/amd.com.cn/127.0.0.1#5335 +ipset=/amd.com.cn/gfwlist +server=/gigaporn.org/127.0.0.1#5335 +ipset=/gigaporn.org/gfwlist +server=/prpops.com/127.0.0.1#5335 +ipset=/prpops.com/gfwlist +server=/itcfonts.com/127.0.0.1#5335 +ipset=/itcfonts.com/gfwlist +server=/sh-xuxingda.com/127.0.0.1#5335 +ipset=/sh-xuxingda.com/gfwlist +server=/public-sex-porn.com/127.0.0.1#5335 +ipset=/public-sex-porn.com/gfwlist +server=/instagram-press.net/127.0.0.1#5335 +ipset=/instagram-press.net/gfwlist +server=/uun78.com/127.0.0.1#5335 +ipset=/uun78.com/gfwlist +server=/bmwgroupclassic.com/127.0.0.1#5335 +ipset=/bmwgroupclassic.com/gfwlist +server=/beatsbydrdre-store.us/127.0.0.1#5335 +ipset=/beatsbydrdre-store.us/gfwlist +server=/seemygf.com/127.0.0.1#5335 +ipset=/seemygf.com/gfwlist +server=/javdisk.com/127.0.0.1#5335 +ipset=/javdisk.com/gfwlist +server=/castro.fm/127.0.0.1#5335 +ipset=/castro.fm/gfwlist +server=/startupjournal.com/127.0.0.1#5335 +ipset=/startupjournal.com/gfwlist +server=/attonlineoffers.com/127.0.0.1#5335 +ipset=/attonlineoffers.com/gfwlist +server=/protondb.com/127.0.0.1#5335 +ipset=/protondb.com/gfwlist +server=/washingtondcbmw.com/127.0.0.1#5335 +ipset=/washingtondcbmw.com/gfwlist +server=/mings.hk/127.0.0.1#5335 +ipset=/mings.hk/gfwlist +server=/mallheadphone.com/127.0.0.1#5335 +ipset=/mallheadphone.com/gfwlist +server=/fantasiasguatemala.com/127.0.0.1#5335 +ipset=/fantasiasguatemala.com/gfwlist +server=/ahtranny.com/127.0.0.1#5335 +ipset=/ahtranny.com/gfwlist +server=/code.org/127.0.0.1#5335 +ipset=/code.org/gfwlist +server=/niketracking.com/127.0.0.1#5335 +ipset=/niketracking.com/gfwlist +server=/xbahis44.com/127.0.0.1#5335 +ipset=/xbahis44.com/gfwlist +server=/paypal-recargacelular.com/127.0.0.1#5335 +ipset=/paypal-recargacelular.com/gfwlist +server=/ciscospark.com/127.0.0.1#5335 +ipset=/ciscospark.com/gfwlist +server=/18commic.com/127.0.0.1#5335 +ipset=/18commic.com/gfwlist +server=/spankingstudio.com/127.0.0.1#5335 +ipset=/spankingstudio.com/gfwlist +server=/facebookook.com/127.0.0.1#5335 +ipset=/facebookook.com/gfwlist +server=/zeebiz.com/127.0.0.1#5335 +ipset=/zeebiz.com/gfwlist +server=/jwpcdn.com/127.0.0.1#5335 +ipset=/jwpcdn.com/gfwlist +server=/vk-cdn.me/127.0.0.1#5335 +ipset=/vk-cdn.me/gfwlist +server=/zopim.com/127.0.0.1#5335 +ipset=/zopim.com/gfwlist +server=/libgen.is/127.0.0.1#5335 +ipset=/libgen.is/gfwlist +server=/omekinteractive.com/127.0.0.1#5335 +ipset=/omekinteractive.com/gfwlist +server=/bestbuy.info/127.0.0.1#5335 +ipset=/bestbuy.info/gfwlist +server=/huluaction.com/127.0.0.1#5335 +ipset=/huluaction.com/gfwlist +server=/blogspot.be/127.0.0.1#5335 +ipset=/blogspot.be/gfwlist +server=/beatsdre4cheap.com/127.0.0.1#5335 +ipset=/beatsdre4cheap.com/gfwlist +server=/hnext.jp/127.0.0.1#5335 +ipset=/hnext.jp/gfwlist +server=/youtu.be/127.0.0.1#5335 +ipset=/youtu.be/gfwlist +server=/fox51tns.net/127.0.0.1#5335 +ipset=/fox51tns.net/gfwlist +server=/annualreviews.org/127.0.0.1#5335 +ipset=/annualreviews.org/gfwlist +server=/p16-tiktokcdn-com.akamaized.net/127.0.0.1#5335 +ipset=/p16-tiktokcdn-com.akamaized.net/gfwlist +server=/minishop.ca/127.0.0.1#5335 +ipset=/minishop.ca/gfwlist +server=/rude.com/127.0.0.1#5335 +ipset=/rude.com/gfwlist +server=/rbrandlibrary.com/127.0.0.1#5335 +ipset=/rbrandlibrary.com/gfwlist +server=/iyalc.com/127.0.0.1#5335 +ipset=/iyalc.com/gfwlist +server=/sankei-tours.com/127.0.0.1#5335 +ipset=/sankei-tours.com/gfwlist +server=/asexdoll.com/127.0.0.1#5335 +ipset=/asexdoll.com/gfwlist +server=/sibreal.org/127.0.0.1#5335 +ipset=/sibreal.org/gfwlist +server=/myebay.com/127.0.0.1#5335 +ipset=/myebay.com/gfwlist +server=/pokemonsunmoon.com/127.0.0.1#5335 +ipset=/pokemonsunmoon.com/gfwlist +server=/unrealengine.com/127.0.0.1#5335 +ipset=/unrealengine.com/gfwlist +server=/sexemulator.com/127.0.0.1#5335 +ipset=/sexemulator.com/gfwlist +server=/git-scm.com/127.0.0.1#5335 +ipset=/git-scm.com/gfwlist +server=/adobexdplatform.com/127.0.0.1#5335 +ipset=/adobexdplatform.com/gfwlist +server=/hbonow.com/127.0.0.1#5335 +ipset=/hbonow.com/gfwlist +server=/bmw-connecteddrive.gr/127.0.0.1#5335 +ipset=/bmw-connecteddrive.gr/gfwlist +server=/emerald.com/127.0.0.1#5335 +ipset=/emerald.com/gfwlist +server=/kristenbjorn.com/127.0.0.1#5335 +ipset=/kristenbjorn.com/gfwlist +server=/pinterest.es/127.0.0.1#5335 +ipset=/pinterest.es/gfwlist +server=/forbesimg.com/127.0.0.1#5335 +ipset=/forbesimg.com/gfwlist +server=/mtt.org/127.0.0.1#5335 +ipset=/mtt.org/gfwlist +server=/bitnamiapp.com/127.0.0.1#5335 +ipset=/bitnamiapp.com/gfwlist +server=/shahvani.com/127.0.0.1#5335 +ipset=/shahvani.com/gfwlist +server=/hkbn.net/127.0.0.1#5335 +ipset=/hkbn.net/gfwlist +server=/sony.com.ni/127.0.0.1#5335 +ipset=/sony.com.ni/gfwlist +server=/yandex.eu/127.0.0.1#5335 +ipset=/yandex.eu/gfwlist +server=/appdynamics.info/127.0.0.1#5335 +ipset=/appdynamics.info/gfwlist +server=/flutterapp.com/127.0.0.1#5335 +ipset=/flutterapp.com/gfwlist +server=/amazon-fashions.com/127.0.0.1#5335 +ipset=/amazon-fashions.com/gfwlist +server=/iphoto.eu/127.0.0.1#5335 +ipset=/iphoto.eu/gfwlist +server=/facebookpmdcenter.com/127.0.0.1#5335 +ipset=/facebookpmdcenter.com/gfwlist +server=/bigcharts.com/127.0.0.1#5335 +ipset=/bigcharts.com/gfwlist +server=/mybeatsbydreuk.com/127.0.0.1#5335 +ipset=/mybeatsbydreuk.com/gfwlist +server=/emome.net/127.0.0.1#5335 +ipset=/emome.net/gfwlist +server=/pornfu.tv/127.0.0.1#5335 +ipset=/pornfu.tv/gfwlist +server=/sexflexible.com/127.0.0.1#5335 +ipset=/sexflexible.com/gfwlist +server=/kopfhorergunstigshop.com/127.0.0.1#5335 +ipset=/kopfhorergunstigshop.com/gfwlist +server=/bestbuyforbusiness.ca/127.0.0.1#5335 +ipset=/bestbuyforbusiness.ca/gfwlist +server=/sexsiam.com/127.0.0.1#5335 +ipset=/sexsiam.com/gfwlist +server=/hpeclipse.com/127.0.0.1#5335 +ipset=/hpeclipse.com/gfwlist +server=/nowe.hk/127.0.0.1#5335 +ipset=/nowe.hk/gfwlist +server=/xxx18teen.net/127.0.0.1#5335 +ipset=/xxx18teen.net/gfwlist +server=/anypornhd.com/127.0.0.1#5335 +ipset=/anypornhd.com/gfwlist +server=/yahoo.cd/127.0.0.1#5335 +ipset=/yahoo.cd/gfwlist +server=/zeetv.co.uk/127.0.0.1#5335 +ipset=/zeetv.co.uk/gfwlist +server=/9cdn.net/127.0.0.1#5335 +ipset=/9cdn.net/gfwlist +server=/nike.com/127.0.0.1#5335 +ipset=/nike.com/gfwlist +server=/like.com/127.0.0.1#5335 +ipset=/like.com/gfwlist +server=/finishinfo.be/127.0.0.1#5335 +ipset=/finishinfo.be/gfwlist +server=/facebvook.com/127.0.0.1#5335 +ipset=/facebvook.com/gfwlist +server=/drbeatsukmart.com/127.0.0.1#5335 +ipset=/drbeatsukmart.com/gfwlist +server=/cygames.co.jp/127.0.0.1#5335 +ipset=/cygames.co.jp/gfwlist +server=/3dsexplay.xyz/127.0.0.1#5335 +ipset=/3dsexplay.xyz/gfwlist +server=/nudedrawer.com/127.0.0.1#5335 +ipset=/nudedrawer.com/gfwlist +server=/definefetish.com/127.0.0.1#5335 +ipset=/definefetish.com/gfwlist +server=/bmw-lao.la/127.0.0.1#5335 +ipset=/bmw-lao.la/gfwlist +server=/highbolt.net/127.0.0.1#5335 +ipset=/highbolt.net/gfwlist +server=/wirelessreach.com/127.0.0.1#5335 +ipset=/wirelessreach.com/gfwlist +server=/ferabook.com/127.0.0.1#5335 +ipset=/ferabook.com/gfwlist +server=/mini-connected.pt/127.0.0.1#5335 +ipset=/mini-connected.pt/gfwlist +server=/mangahome.com/127.0.0.1#5335 +ipset=/mangahome.com/gfwlist +server=/blubrry.com/127.0.0.1#5335 +ipset=/blubrry.com/gfwlist +server=/toomadporn.pro/127.0.0.1#5335 +ipset=/toomadporn.pro/gfwlist +server=/verisign.com.hk/127.0.0.1#5335 +ipset=/verisign.com.hk/gfwlist +server=/uun85.com/127.0.0.1#5335 +ipset=/uun85.com/gfwlist +server=/tacamateurs.com/127.0.0.1#5335 +ipset=/tacamateurs.com/gfwlist +server=/akam.net/127.0.0.1#5335 +ipset=/akam.net/gfwlist +server=/infura.io/127.0.0.1#5335 +ipset=/infura.io/gfwlist +server=/dtsell.com/127.0.0.1#5335 +ipset=/dtsell.com/gfwlist +server=/missav.com/127.0.0.1#5335 +ipset=/missav.com/gfwlist +server=/mcdonalds.ca/127.0.0.1#5335 +ipset=/mcdonalds.ca/gfwlist +server=/atypi.org/127.0.0.1#5335 +ipset=/atypi.org/gfwlist +server=/msn.net/127.0.0.1#5335 +ipset=/msn.net/gfwlist +server=/nsfw.xxx/127.0.0.1#5335 +ipset=/nsfw.xxx/gfwlist +server=/discord.dev/127.0.0.1#5335 +ipset=/discord.dev/gfwlist +server=/kompoz2.com/127.0.0.1#5335 +ipset=/kompoz2.com/gfwlist +server=/pornovideow.com/127.0.0.1#5335 +ipset=/pornovideow.com/gfwlist +server=/sneakerskick.com/127.0.0.1#5335 +ipset=/sneakerskick.com/gfwlist +server=/firstasianpussy.com/127.0.0.1#5335 +ipset=/firstasianpussy.com/gfwlist +server=/intel.ru/127.0.0.1#5335 +ipset=/intel.ru/gfwlist +server=/bmwgroupinfobahn.com/127.0.0.1#5335 +ipset=/bmwgroupinfobahn.com/gfwlist +server=/metacpan.org/127.0.0.1#5335 +ipset=/metacpan.org/gfwlist +server=/hentaipros.com/127.0.0.1#5335 +ipset=/hentaipros.com/gfwlist +server=/real-mature-porn.com/127.0.0.1#5335 +ipset=/real-mature-porn.com/gfwlist +server=/hsex.men/127.0.0.1#5335 +ipset=/hsex.men/gfwlist +server=/stickofjoy.com/127.0.0.1#5335 +ipset=/stickofjoy.com/gfwlist +server=/wsj.jobs/127.0.0.1#5335 +ipset=/wsj.jobs/gfwlist +server=/dx9527.cc/127.0.0.1#5335 +ipset=/dx9527.cc/gfwlist +server=/studywatchbyverily.com/127.0.0.1#5335 +ipset=/studywatchbyverily.com/gfwlist +server=/mastercard.se/127.0.0.1#5335 +ipset=/mastercard.se/gfwlist +server=/photolia.net/127.0.0.1#5335 +ipset=/photolia.net/gfwlist +server=/hot-gayporn.com/127.0.0.1#5335 +ipset=/hot-gayporn.com/gfwlist +server=/flipfap.com/127.0.0.1#5335 +ipset=/flipfap.com/gfwlist +server=/sukebelinks.com/127.0.0.1#5335 +ipset=/sukebelinks.com/gfwlist +server=/vercel.app/127.0.0.1#5335 +ipset=/vercel.app/gfwlist +server=/imilfs.com/127.0.0.1#5335 +ipset=/imilfs.com/gfwlist +server=/bravotube.tv/127.0.0.1#5335 +ipset=/bravotube.tv/gfwlist +server=/neweconomyforum.com/127.0.0.1#5335 +ipset=/neweconomyforum.com/gfwlist +server=/volvotrucks.com.au/127.0.0.1#5335 +ipset=/volvotrucks.com.au/gfwlist +server=/princesscum.com/127.0.0.1#5335 +ipset=/princesscum.com/gfwlist +server=/my20dc.com/127.0.0.1#5335 +ipset=/my20dc.com/gfwlist +server=/xpornplease.com/127.0.0.1#5335 +ipset=/xpornplease.com/gfwlist +server=/applemusic.hamburg/127.0.0.1#5335 +ipset=/applemusic.hamburg/gfwlist +server=/verizonwireless.com/127.0.0.1#5335 +ipset=/verizonwireless.com/gfwlist +server=/qorno.com/127.0.0.1#5335 +ipset=/qorno.com/gfwlist +server=/issquaredown.com/127.0.0.1#5335 +ipset=/issquaredown.com/gfwlist +server=/nvidia.ch/127.0.0.1#5335 +ipset=/nvidia.ch/gfwlist +server=/ipfs.lain.la/127.0.0.1#5335 +ipset=/ipfs.lain.la/gfwlist +server=/googl.com/127.0.0.1#5335 +ipset=/googl.com/gfwlist +server=/beatsbydretoutlet.com/127.0.0.1#5335 +ipset=/beatsbydretoutlet.com/gfwlist +server=/mucinex.com.cn/127.0.0.1#5335 +ipset=/mucinex.com.cn/gfwlist +server=/bestbeats4u.com/127.0.0.1#5335 +ipset=/bestbeats4u.com/gfwlist +server=/intel.fr/127.0.0.1#5335 +ipset=/intel.fr/gfwlist +server=/imonsterbeats.com/127.0.0.1#5335 +ipset=/imonsterbeats.com/gfwlist +server=/swapsmut.com/127.0.0.1#5335 +ipset=/swapsmut.com/gfwlist +server=/gamepedia.com/127.0.0.1#5335 +ipset=/gamepedia.com/gfwlist +server=/youtube.uy/127.0.0.1#5335 +ipset=/youtube.uy/gfwlist +server=/dirtyasiantube.com/127.0.0.1#5335 +ipset=/dirtyasiantube.com/gfwlist +server=/billpoint.com/127.0.0.1#5335 +ipset=/billpoint.com/gfwlist +server=/q13fox.com/127.0.0.1#5335 +ipset=/q13fox.com/gfwlist +server=/bmwmotorcycles.com/127.0.0.1#5335 +ipset=/bmwmotorcycles.com/gfwlist +server=/mickybells.com/127.0.0.1#5335 +ipset=/mickybells.com/gfwlist +server=/fluidpreview.com/127.0.0.1#5335 +ipset=/fluidpreview.com/gfwlist +server=/vercel.com/127.0.0.1#5335 +ipset=/vercel.com/gfwlist +server=/kikdirty.com/127.0.0.1#5335 +ipset=/kikdirty.com/gfwlist +server=/pccwglobal.com/127.0.0.1#5335 +ipset=/pccwglobal.com/gfwlist +server=/nickscipio.com/127.0.0.1#5335 +ipset=/nickscipio.com/gfwlist +server=/carbon.com/127.0.0.1#5335 +ipset=/carbon.com/gfwlist +server=/ieee.org/127.0.0.1#5335 +ipset=/ieee.org/gfwlist +server=/gigantits.com/127.0.0.1#5335 +ipset=/gigantits.com/gfwlist +server=/nhentai.to/127.0.0.1#5335 +ipset=/nhentai.to/gfwlist +server=/nurofen.ru/127.0.0.1#5335 +ipset=/nurofen.ru/gfwlist +server=/facbeok.com/127.0.0.1#5335 +ipset=/facbeok.com/gfwlist +server=/lucahmelayu.club/127.0.0.1#5335 +ipset=/lucahmelayu.club/gfwlist +server=/conquerwithcharacter.com/127.0.0.1#5335 +ipset=/conquerwithcharacter.com/gfwlist +server=/wnoaissulli1.com/127.0.0.1#5335 +ipset=/wnoaissulli1.com/gfwlist +server=/sexnaweb.net/127.0.0.1#5335 +ipset=/sexnaweb.net/gfwlist +server=/blackmonsterterror.com/127.0.0.1#5335 +ipset=/blackmonsterterror.com/gfwlist +server=/porn-images-xxx.com/127.0.0.1#5335 +ipset=/porn-images-xxx.com/gfwlist +server=/intelcloudfinder.com/127.0.0.1#5335 +ipset=/intelcloudfinder.com/gfwlist +server=/xvideosincesto.com/127.0.0.1#5335 +ipset=/xvideosincesto.com/gfwlist +server=/highdefinitionbeatsbydre.com/127.0.0.1#5335 +ipset=/highdefinitionbeatsbydre.com/gfwlist +server=/eroshiko.net/127.0.0.1#5335 +ipset=/eroshiko.net/gfwlist +server=/momo.dm/127.0.0.1#5335 +ipset=/momo.dm/gfwlist +server=/ads.yahoo.com/127.0.0.1#5335 +ipset=/ads.yahoo.com/gfwlist +server=/lolislove.info/127.0.0.1#5335 +ipset=/lolislove.info/gfwlist +server=/facebookappcenter.info/127.0.0.1#5335 +ipset=/facebookappcenter.info/gfwlist +server=/pornguz.com/127.0.0.1#5335 +ipset=/pornguz.com/gfwlist +server=/hentai.tv/127.0.0.1#5335 +ipset=/hentai.tv/gfwlist +server=/javhard.net/127.0.0.1#5335 +ipset=/javhard.net/gfwlist +server=/facebooklikeexchange.com/127.0.0.1#5335 +ipset=/facebooklikeexchange.com/gfwlist +server=/hcaptchastatus.com/127.0.0.1#5335 +ipset=/hcaptchastatus.com/gfwlist +server=/t66y.com/127.0.0.1#5335 +ipset=/t66y.com/gfwlist +server=/mtalk.google.com/127.0.0.1#5335 +ipset=/mtalk.google.com/gfwlist +server=/9hentai.to/127.0.0.1#5335 +ipset=/9hentai.to/gfwlist +server=/duckduckco.de/127.0.0.1#5335 +ipset=/duckduckco.de/gfwlist +server=/xposed.info/127.0.0.1#5335 +ipset=/xposed.info/gfwlist +server=/pearson.com/127.0.0.1#5335 +ipset=/pearson.com/gfwlist +server=/gofundme.com/127.0.0.1#5335 +ipset=/gofundme.com/gfwlist +server=/onlyindianporn.tv/127.0.0.1#5335 +ipset=/onlyindianporn.tv/gfwlist +server=/apple.cm/127.0.0.1#5335 +ipset=/apple.cm/gfwlist +server=/edgemeplease.com/127.0.0.1#5335 +ipset=/edgemeplease.com/gfwlist +server=/githubstatus.com/127.0.0.1#5335 +ipset=/githubstatus.com/gfwlist +server=/v-has.com/127.0.0.1#5335 +ipset=/v-has.com/gfwlist +server=/documentforce.com/127.0.0.1#5335 +ipset=/documentforce.com/gfwlist +server=/ikea.ro/127.0.0.1#5335 +ipset=/ikea.ro/gfwlist +server=/ebay-course.com/127.0.0.1#5335 +ipset=/ebay-course.com/gfwlist +server=/imac-applecomputer.com/127.0.0.1#5335 +ipset=/imac-applecomputer.com/gfwlist +server=/bridgestonecomercial.co.cr/127.0.0.1#5335 +ipset=/bridgestonecomercial.co.cr/gfwlist +server=/ckck.fun/127.0.0.1#5335 +ipset=/ckck.fun/gfwlist +server=/news.net.au/127.0.0.1#5335 +ipset=/news.net.au/gfwlist +server=/playporngames.com/127.0.0.1#5335 +ipset=/playporngames.com/gfwlist +server=/40shopping.com/127.0.0.1#5335 +ipset=/40shopping.com/gfwlist +server=/businessinsider.es/127.0.0.1#5335 +ipset=/businessinsider.es/gfwlist +server=/erotikaweb.hu/127.0.0.1#5335 +ipset=/erotikaweb.hu/gfwlist +server=/marketing-nirvana.com/127.0.0.1#5335 +ipset=/marketing-nirvana.com/gfwlist +server=/dropboxinsiders.com/127.0.0.1#5335 +ipset=/dropboxinsiders.com/gfwlist +server=/slack-edge.com/127.0.0.1#5335 +ipset=/slack-edge.com/gfwlist +server=/cyyeshb.com/127.0.0.1#5335 +ipset=/cyyeshb.com/gfwlist +server=/hp3dmetals.com/127.0.0.1#5335 +ipset=/hp3dmetals.com/gfwlist +server=/buycheapbeatsbydre.com/127.0.0.1#5335 +ipset=/buycheapbeatsbydre.com/gfwlist +server=/voazimbabwe.com/127.0.0.1#5335 +ipset=/voazimbabwe.com/gfwlist +server=/adultblogranking.com/127.0.0.1#5335 +ipset=/adultblogranking.com/gfwlist +server=/visa.com.ng/127.0.0.1#5335 +ipset=/visa.com.ng/gfwlist +server=/theatlantic.com/127.0.0.1#5335 +ipset=/theatlantic.com/gfwlist +server=/qualcomm.com.br/127.0.0.1#5335 +ipset=/qualcomm.com.br/gfwlist +server=/vmware.tt.omtrdc.net/127.0.0.1#5335 +ipset=/vmware.tt.omtrdc.net/gfwlist +server=/3arabporn.com/127.0.0.1#5335 +ipset=/3arabporn.com/gfwlist +server=/pinterest.cl/127.0.0.1#5335 +ipset=/pinterest.cl/gfwlist +server=/litbus-anime.com/127.0.0.1#5335 +ipset=/litbus-anime.com/gfwlist +server=/hoolu.tv/127.0.0.1#5335 +ipset=/hoolu.tv/gfwlist +server=/directvplans.com/127.0.0.1#5335 +ipset=/directvplans.com/gfwlist +server=/bacsitinhyeu.vn/127.0.0.1#5335 +ipset=/bacsitinhyeu.vn/gfwlist +server=/beatsbydreoslo.com/127.0.0.1#5335 +ipset=/beatsbydreoslo.com/gfwlist +server=/visa.cz/127.0.0.1#5335 +ipset=/visa.cz/gfwlist +server=/youtube.co.ae/127.0.0.1#5335 +ipset=/youtube.co.ae/gfwlist +server=/monsterdrebeats-canada.net/127.0.0.1#5335 +ipset=/monsterdrebeats-canada.net/gfwlist +server=/azurecosmosdb.info/127.0.0.1#5335 +ipset=/azurecosmosdb.info/gfwlist +server=/scholar.google.com.tw/127.0.0.1#5335 +ipset=/scholar.google.com.tw/gfwlist +server=/hbogo.co.th/127.0.0.1#5335 +ipset=/hbogo.co.th/gfwlist +server=/rabbitsreviews.com/127.0.0.1#5335 +ipset=/rabbitsreviews.com/gfwlist +server=/jgg18.xyz/127.0.0.1#5335 +ipset=/jgg18.xyz/gfwlist +server=/vk.design/127.0.0.1#5335 +ipset=/vk.design/gfwlist +server=/xn--90wwvt03e.com/127.0.0.1#5335 +ipset=/xn--90wwvt03e.com/gfwlist +server=/thunderbird.net/127.0.0.1#5335 +ipset=/thunderbird.net/gfwlist +server=/tubxporn.xxx/127.0.0.1#5335 +ipset=/tubxporn.xxx/gfwlist +server=/cloudflarebolt.com/127.0.0.1#5335 +ipset=/cloudflarebolt.com/gfwlist +server=/cencoastbmw.com/127.0.0.1#5335 +ipset=/cencoastbmw.com/gfwlist +server=/bdsmcafe.com/127.0.0.1#5335 +ipset=/bdsmcafe.com/gfwlist +server=/pornogratis.vlog.br/127.0.0.1#5335 +ipset=/pornogratis.vlog.br/gfwlist +server=/appdynamics.de/127.0.0.1#5335 +ipset=/appdynamics.de/gfwlist +server=/erlang.org/127.0.0.1#5335 +ipset=/erlang.org/gfwlist +server=/mastercard.om/127.0.0.1#5335 +ipset=/mastercard.om/gfwlist +server=/sonybsc.com/127.0.0.1#5335 +ipset=/sonybsc.com/gfwlist +server=/groups.com/127.0.0.1#5335 +ipset=/groups.com/gfwlist +server=/go141.com/127.0.0.1#5335 +ipset=/go141.com/gfwlist +server=/nikeinc.com/127.0.0.1#5335 +ipset=/nikeinc.com/gfwlist +server=/awsglobalaccelerator.com/127.0.0.1#5335 +ipset=/awsglobalaccelerator.com/gfwlist +server=/playshowtv.com/127.0.0.1#5335 +ipset=/playshowtv.com/gfwlist +server=/24porn.pro/127.0.0.1#5335 +ipset=/24porn.pro/gfwlist +server=/hippyhillscomix.com/127.0.0.1#5335 +ipset=/hippyhillscomix.com/gfwlist +server=/anyshemale.com/127.0.0.1#5335 +ipset=/anyshemale.com/gfwlist +server=/findvrporn.com/127.0.0.1#5335 +ipset=/findvrporn.com/gfwlist +server=/pearsonclinical.es/127.0.0.1#5335 +ipset=/pearsonclinical.es/gfwlist +server=/monsterbeatsale.com/127.0.0.1#5335 +ipset=/monsterbeatsale.com/gfwlist +server=/porn300.online/127.0.0.1#5335 +ipset=/porn300.online/gfwlist +server=/catalinacruz.com/127.0.0.1#5335 +ipset=/catalinacruz.com/gfwlist +server=/faceboonk.com/127.0.0.1#5335 +ipset=/faceboonk.com/gfwlist +server=/asp-cc.com/127.0.0.1#5335 +ipset=/asp-cc.com/gfwlist +server=/twister.net.co/127.0.0.1#5335 +ipset=/twister.net.co/gfwlist +server=/binancezh.ink/127.0.0.1#5335 +ipset=/binancezh.ink/gfwlist +server=/qualcommhalo.com/127.0.0.1#5335 +ipset=/qualcommhalo.com/gfwlist +server=/visaeurope.at/127.0.0.1#5335 +ipset=/visaeurope.at/gfwlist +server=/porntrex.com/127.0.0.1#5335 +ipset=/porntrex.com/gfwlist +server=/hotteenfreecam.com/127.0.0.1#5335 +ipset=/hotteenfreecam.com/gfwlist +server=/flathub.org/127.0.0.1#5335 +ipset=/flathub.org/gfwlist +server=/fulldesisex.com/127.0.0.1#5335 +ipset=/fulldesisex.com/gfwlist +server=/monstersexporn.net/127.0.0.1#5335 +ipset=/monstersexporn.net/gfwlist +server=/gaito.xyz/127.0.0.1#5335 +ipset=/gaito.xyz/gfwlist +server=/hornybitches.org/127.0.0.1#5335 +ipset=/hornybitches.org/gfwlist +server=/misshotgirls.com/127.0.0.1#5335 +ipset=/misshotgirls.com/gfwlist +server=/icloudads.net/127.0.0.1#5335 +ipset=/icloudads.net/gfwlist +server=/bmw.com.ve/127.0.0.1#5335 +ipset=/bmw.com.ve/gfwlist +server=/airwick.com.au/127.0.0.1#5335 +ipset=/airwick.com.au/gfwlist +server=/heavy-r.com/127.0.0.1#5335 +ipset=/heavy-r.com/gfwlist +server=/amazonlumberyard.wang/127.0.0.1#5335 +ipset=/amazonlumberyard.wang/gfwlist +server=/javynow.com/127.0.0.1#5335 +ipset=/javynow.com/gfwlist +server=/vanish.dk/127.0.0.1#5335 +ipset=/vanish.dk/gfwlist +server=/hoyo.link/127.0.0.1#5335 +ipset=/hoyo.link/gfwlist +server=/inclusivegrowthscore.com/127.0.0.1#5335 +ipset=/inclusivegrowthscore.com/gfwlist +server=/speedfantasybid.com/127.0.0.1#5335 +ipset=/speedfantasybid.com/gfwlist +server=/gayasianxxx.com/127.0.0.1#5335 +ipset=/gayasianxxx.com/gfwlist +server=/tumblr.com/127.0.0.1#5335 +ipset=/tumblr.com/gfwlist +server=/dirtypornvids.com/127.0.0.1#5335 +ipset=/dirtypornvids.com/gfwlist +server=/69tubesex.com/127.0.0.1#5335 +ipset=/69tubesex.com/gfwlist +server=/ibm.us/127.0.0.1#5335 +ipset=/ibm.us/gfwlist +server=/fececbook.com/127.0.0.1#5335 +ipset=/fececbook.com/gfwlist +server=/oiobbs.com/127.0.0.1#5335 +ipset=/oiobbs.com/gfwlist +server=/jerkmate.tv/127.0.0.1#5335 +ipset=/jerkmate.tv/gfwlist +server=/disney-studio.net/127.0.0.1#5335 +ipset=/disney-studio.net/gfwlist +server=/shadowsocks.nl/127.0.0.1#5335 +ipset=/shadowsocks.nl/gfwlist +server=/acebooik.com/127.0.0.1#5335 +ipset=/acebooik.com/gfwlist +server=/appla.com/127.0.0.1#5335 +ipset=/appla.com/gfwlist +server=/mcdonaldsparties.com.au/127.0.0.1#5335 +ipset=/mcdonaldsparties.com.au/gfwlist +server=/www.sb/127.0.0.1#5335 +ipset=/www.sb/gfwlist +server=/vixen.com/127.0.0.1#5335 +ipset=/vixen.com/gfwlist +server=/namethatporn.com/127.0.0.1#5335 +ipset=/namethatporn.com/gfwlist +server=/ieee.tv/127.0.0.1#5335 +ipset=/ieee.tv/gfwlist +server=/dettol.ch/127.0.0.1#5335 +ipset=/dettol.ch/gfwlist +server=/sony.si/127.0.0.1#5335 +ipset=/sony.si/gfwlist +server=/beatsbydrehd.net/127.0.0.1#5335 +ipset=/beatsbydrehd.net/gfwlist +server=/famima.vn/127.0.0.1#5335 +ipset=/famima.vn/gfwlist +server=/office365love.com/127.0.0.1#5335 +ipset=/office365love.com/gfwlist +server=/fox5dc.com/127.0.0.1#5335 +ipset=/fox5dc.com/gfwlist +server=/pubmatic.co.jp/127.0.0.1#5335 +ipset=/pubmatic.co.jp/gfwlist +server=/amateur-cougar.com/127.0.0.1#5335 +ipset=/amateur-cougar.com/gfwlist +server=/beatsbydrdredanmark.com/127.0.0.1#5335 +ipset=/beatsbydrdredanmark.com/gfwlist +server=/pornelephant.com/127.0.0.1#5335 +ipset=/pornelephant.com/gfwlist +server=/vodafone.com.au/127.0.0.1#5335 +ipset=/vodafone.com.au/gfwlist +server=/camsoda.com/127.0.0.1#5335 +ipset=/camsoda.com/gfwlist +server=/appdynamics.com/127.0.0.1#5335 +ipset=/appdynamics.com/gfwlist +server=/scaleflex.com/127.0.0.1#5335 +ipset=/scaleflex.com/gfwlist +server=/absolutewhores.com/127.0.0.1#5335 +ipset=/absolutewhores.com/gfwlist +server=/wixipedia.net/127.0.0.1#5335 +ipset=/wixipedia.net/gfwlist +server=/ironna.jp/127.0.0.1#5335 +ipset=/ironna.jp/gfwlist +server=/google.cz/127.0.0.1#5335 +ipset=/google.cz/gfwlist +server=/cheapbeats4sale.net/127.0.0.1#5335 +ipset=/cheapbeats4sale.net/gfwlist +server=/j2objc.org/127.0.0.1#5335 +ipset=/j2objc.org/gfwlist +server=/beatsshop-usa.com/127.0.0.1#5335 +ipset=/beatsshop-usa.com/gfwlist +server=/greenend.org.uk/127.0.0.1#5335 +ipset=/greenend.org.uk/gfwlist +server=/gifnuki.com/127.0.0.1#5335 +ipset=/gifnuki.com/gfwlist +server=/sway.com/127.0.0.1#5335 +ipset=/sway.com/gfwlist +server=/lanasbigboobs.com/127.0.0.1#5335 +ipset=/lanasbigboobs.com/gfwlist +server=/hotpornfile.org/127.0.0.1#5335 +ipset=/hotpornfile.org/gfwlist +server=/bbcfmt.s.llnwi.net/127.0.0.1#5335 +ipset=/bbcfmt.s.llnwi.net/gfwlist +server=/freesexvideos2k.com/127.0.0.1#5335 +ipset=/freesexvideos2k.com/gfwlist +server=/whatboyswant.com/127.0.0.1#5335 +ipset=/whatboyswant.com/gfwlist +server=/fuckvideos.biz/127.0.0.1#5335 +ipset=/fuckvideos.biz/gfwlist +server=/clinical-videos.com/127.0.0.1#5335 +ipset=/clinical-videos.com/gfwlist +server=/kingkongapp.com/127.0.0.1#5335 +ipset=/kingkongapp.com/gfwlist +server=/wsjplus.com/127.0.0.1#5335 +ipset=/wsjplus.com/gfwlist +server=/content-ause1-ur-discovery1.uplynk.com/127.0.0.1#5335 +ipset=/content-ause1-ur-discovery1.uplynk.com/gfwlist +server=/hayabusa.io/127.0.0.1#5335 +ipset=/hayabusa.io/gfwlist +server=/ciscolearningsociety.org/127.0.0.1#5335 +ipset=/ciscolearningsociety.org/gfwlist +server=/yahoo.no/127.0.0.1#5335 +ipset=/yahoo.no/gfwlist +server=/fapsafari.com/127.0.0.1#5335 +ipset=/fapsafari.com/gfwlist +server=/lewdweb.net/127.0.0.1#5335 +ipset=/lewdweb.net/gfwlist +server=/coursera.org/127.0.0.1#5335 +ipset=/coursera.org/gfwlist +server=/cosplayporntube.com/127.0.0.1#5335 +ipset=/cosplayporntube.com/gfwlist +server=/stackoverflow.com/127.0.0.1#5335 +ipset=/stackoverflow.com/gfwlist +server=/tgtube.com/127.0.0.1#5335 +ipset=/tgtube.com/gfwlist +server=/scholar.google.ca/127.0.0.1#5335 +ipset=/scholar.google.ca/gfwlist +server=/volvotrucks.jp/127.0.0.1#5335 +ipset=/volvotrucks.jp/gfwlist +server=/canon.az/127.0.0.1#5335 +ipset=/canon.az/gfwlist +server=/hktshop.com/127.0.0.1#5335 +ipset=/hktshop.com/gfwlist +server=/hentai-vostfr.net/127.0.0.1#5335 +ipset=/hentai-vostfr.net/gfwlist +server=/manhwa24h.com/127.0.0.1#5335 +ipset=/manhwa24h.com/gfwlist +server=/incesto.blog.br/127.0.0.1#5335 +ipset=/incesto.blog.br/gfwlist +server=/ebay.co.uk/127.0.0.1#5335 +ipset=/ebay.co.uk/gfwlist +server=/rule34.xyz/127.0.0.1#5335 +ipset=/rule34.xyz/gfwlist +server=/xzxxporn.com/127.0.0.1#5335 +ipset=/xzxxporn.com/gfwlist +server=/mi9cdn.com/127.0.0.1#5335 +ipset=/mi9cdn.com/gfwlist +server=/orithegame.com/127.0.0.1#5335 +ipset=/orithegame.com/gfwlist +server=/applepaysupplies.berlin/127.0.0.1#5335 +ipset=/applepaysupplies.berlin/gfwlist +server=/sexypornpictures.org/127.0.0.1#5335 +ipset=/sexypornpictures.org/gfwlist +server=/alfera.my/127.0.0.1#5335 +ipset=/alfera.my/gfwlist +server=/microsoftaccountguard.com/127.0.0.1#5335 +ipset=/microsoftaccountguard.com/gfwlist +server=/mom50.com/127.0.0.1#5335 +ipset=/mom50.com/gfwlist +server=/doi.info/127.0.0.1#5335 +ipset=/doi.info/gfwlist +server=/volvotrucks.com.tr/127.0.0.1#5335 +ipset=/volvotrucks.com.tr/gfwlist +server=/sexjobs.it/127.0.0.1#5335 +ipset=/sexjobs.it/gfwlist +server=/ifuckedtheboss.com/127.0.0.1#5335 +ipset=/ifuckedtheboss.com/gfwlist +server=/bigboobswives.com/127.0.0.1#5335 +ipset=/bigboobswives.com/gfwlist +server=/finishinfo.cz/127.0.0.1#5335 +ipset=/finishinfo.cz/gfwlist +server=/oursexgames.com/127.0.0.1#5335 +ipset=/oursexgames.com/gfwlist +server=/uun83.com/127.0.0.1#5335 +ipset=/uun83.com/gfwlist +server=/bigbuckbunny.org/127.0.0.1#5335 +ipset=/bigbuckbunny.org/gfwlist +server=/myfonts.com/127.0.0.1#5335 +ipset=/myfonts.com/gfwlist +server=/fastindianporn.com/127.0.0.1#5335 +ipset=/fastindianporn.com/gfwlist +server=/kindleoasis.com/127.0.0.1#5335 +ipset=/kindleoasis.com/gfwlist +server=/facebook-privacy.com/127.0.0.1#5335 +ipset=/facebook-privacy.com/gfwlist +server=/enemasexfetish.com/127.0.0.1#5335 +ipset=/enemasexfetish.com/gfwlist +server=/canon.gr/127.0.0.1#5335 +ipset=/canon.gr/gfwlist +server=/burstlyrewards.com/127.0.0.1#5335 +ipset=/burstlyrewards.com/gfwlist +server=/applestore.com.ru/127.0.0.1#5335 +ipset=/applestore.com.ru/gfwlist +server=/cloudlatex.io/127.0.0.1#5335 +ipset=/cloudlatex.io/gfwlist +server=/paypal-signin.com/127.0.0.1#5335 +ipset=/paypal-signin.com/gfwlist +server=/topfantasyart.com/127.0.0.1#5335 +ipset=/topfantasyart.com/gfwlist +server=/intelcloudbuilders.com/127.0.0.1#5335 +ipset=/intelcloudbuilders.com/gfwlist +server=/mysims.com/127.0.0.1#5335 +ipset=/mysims.com/gfwlist +server=/foxsports.com.br/127.0.0.1#5335 +ipset=/foxsports.com.br/gfwlist +server=/mcdonalds.it/127.0.0.1#5335 +ipset=/mcdonalds.it/gfwlist +server=/take2games.com/127.0.0.1#5335 +ipset=/take2games.com/gfwlist +server=/water-and-power.com/127.0.0.1#5335 +ipset=/water-and-power.com/gfwlist +server=/mynike.com/127.0.0.1#5335 +ipset=/mynike.com/gfwlist +server=/binance.co/127.0.0.1#5335 +ipset=/binance.co/gfwlist +server=/milftugs.com/127.0.0.1#5335 +ipset=/milftugs.com/gfwlist +server=/youtube.in/127.0.0.1#5335 +ipset=/youtube.in/gfwlist +server=/sabuibo.net/127.0.0.1#5335 +ipset=/sabuibo.net/gfwlist +server=/ikea.fi/127.0.0.1#5335 +ipset=/ikea.fi/gfwlist +server=/picsee.co/127.0.0.1#5335 +ipset=/picsee.co/gfwlist +server=/zettai-ero.com/127.0.0.1#5335 +ipset=/zettai-ero.com/gfwlist +server=/taradinhos.com/127.0.0.1#5335 +ipset=/taradinhos.com/gfwlist +server=/mastercard.gr/127.0.0.1#5335 +ipset=/mastercard.gr/gfwlist +server=/wankz.com/127.0.0.1#5335 +ipset=/wankz.com/gfwlist +server=/voanews.com/127.0.0.1#5335 +ipset=/voanews.com/gfwlist +server=/sohfrance.org/127.0.0.1#5335 +ipset=/sohfrance.org/gfwlist +server=/madthumbs.com/127.0.0.1#5335 +ipset=/madthumbs.com/gfwlist +server=/bookshome.world/127.0.0.1#5335 +ipset=/bookshome.world/gfwlist +server=/bloombergsef.com/127.0.0.1#5335 +ipset=/bloombergsef.com/gfwlist +server=/flirt4free.com/127.0.0.1#5335 +ipset=/flirt4free.com/gfwlist +server=/letmejerk.com/127.0.0.1#5335 +ipset=/letmejerk.com/gfwlist +server=/microsofteca.com/127.0.0.1#5335 +ipset=/microsofteca.com/gfwlist +server=/beatsbydreaustraliasales.com/127.0.0.1#5335 +ipset=/beatsbydreaustraliasales.com/gfwlist +server=/fappenist.com/127.0.0.1#5335 +ipset=/fappenist.com/gfwlist +server=/paypalhere.net/127.0.0.1#5335 +ipset=/paypalhere.net/gfwlist +server=/calgoncarbon-china.com/127.0.0.1#5335 +ipset=/calgoncarbon-china.com/gfwlist +server=/directvgrandslam.com/127.0.0.1#5335 +ipset=/directvgrandslam.com/gfwlist +server=/primevideo.info/127.0.0.1#5335 +ipset=/primevideo.info/gfwlist +server=/javvids.com/127.0.0.1#5335 +ipset=/javvids.com/gfwlist +server=/mirailab.tech/127.0.0.1#5335 +ipset=/mirailab.tech/gfwlist +server=/cerdas.com/127.0.0.1#5335 +ipset=/cerdas.com/gfwlist +server=/mpweekly.com/127.0.0.1#5335 +ipset=/mpweekly.com/gfwlist +server=/erotic-artsites.com/127.0.0.1#5335 +ipset=/erotic-artsites.com/gfwlist +server=/yandex.org/127.0.0.1#5335 +ipset=/yandex.org/gfwlist +server=/userapi.com/127.0.0.1#5335 +ipset=/userapi.com/gfwlist +server=/amateurpornhouse.com/127.0.0.1#5335 +ipset=/amateurpornhouse.com/gfwlist +server=/myradio.hk/127.0.0.1#5335 +ipset=/myradio.hk/gfwlist +server=/pornstripgames.com/127.0.0.1#5335 +ipset=/pornstripgames.com/gfwlist +server=/100beatscheap.com/127.0.0.1#5335 +ipset=/100beatscheap.com/gfwlist +server=/starbucks.com.co/127.0.0.1#5335 +ipset=/starbucks.com.co/gfwlist +server=/msecnd.net/127.0.0.1#5335 +ipset=/msecnd.net/gfwlist +server=/intel.bi/127.0.0.1#5335 +ipset=/intel.bi/gfwlist +server=/vanishstains.com.au/127.0.0.1#5335 +ipset=/vanishstains.com.au/gfwlist +server=/exiporn.com/127.0.0.1#5335 +ipset=/exiporn.com/gfwlist +server=/bmwcustomapparel.com/127.0.0.1#5335 +ipset=/bmwcustomapparel.com/gfwlist +server=/pornhun.xyz/127.0.0.1#5335 +ipset=/pornhun.xyz/gfwlist +server=/pornoxo.com/127.0.0.1#5335 +ipset=/pornoxo.com/gfwlist +server=/fuckteenvids.com/127.0.0.1#5335 +ipset=/fuckteenvids.com/gfwlist +server=/walmart.pharmacy/127.0.0.1#5335 +ipset=/walmart.pharmacy/gfwlist +server=/facerbook.com/127.0.0.1#5335 +ipset=/facerbook.com/gfwlist +server=/kama-nk.ru/127.0.0.1#5335 +ipset=/kama-nk.ru/gfwlist +server=/cashify.com/127.0.0.1#5335 +ipset=/cashify.com/gfwlist +server=/cuckold69.com/127.0.0.1#5335 +ipset=/cuckold69.com/gfwlist +server=/cool-comics.com/127.0.0.1#5335 +ipset=/cool-comics.com/gfwlist +server=/realtype.co.jp/127.0.0.1#5335 +ipset=/realtype.co.jp/gfwlist +server=/karinahart.com/127.0.0.1#5335 +ipset=/karinahart.com/gfwlist +server=/cs.co/127.0.0.1#5335 +ipset=/cs.co/gfwlist +server=/rb.net/127.0.0.1#5335 +ipset=/rb.net/gfwlist +server=/redxxxvideos.com/127.0.0.1#5335 +ipset=/redxxxvideos.com/gfwlist +server=/dettol.cl/127.0.0.1#5335 +ipset=/dettol.cl/gfwlist +server=/xvideosup.com.br/127.0.0.1#5335 +ipset=/xvideosup.com.br/gfwlist +server=/applebk.net/127.0.0.1#5335 +ipset=/applebk.net/gfwlist +server=/flaru.com/127.0.0.1#5335 +ipset=/flaru.com/gfwlist +server=/intel.eg/127.0.0.1#5335 +ipset=/intel.eg/gfwlist +server=/hentaitk.com/127.0.0.1#5335 +ipset=/hentaitk.com/gfwlist +server=/amazonvideo.cc/127.0.0.1#5335 +ipset=/amazonvideo.cc/gfwlist +server=/applecare.hamburg/127.0.0.1#5335 +ipset=/applecare.hamburg/gfwlist +server=/bestbuy-giftcard.info/127.0.0.1#5335 +ipset=/bestbuy-giftcard.info/gfwlist +server=/scholar.google.com.cu/127.0.0.1#5335 +ipset=/scholar.google.com.cu/gfwlist +server=/drdrebeatsale.com/127.0.0.1#5335 +ipset=/drdrebeatsale.com/gfwlist +server=/sexpornpictures.com/127.0.0.1#5335 +ipset=/sexpornpictures.com/gfwlist +server=/bmw-worldfinal.com/127.0.0.1#5335 +ipset=/bmw-worldfinal.com/gfwlist +server=/chyoa.com/127.0.0.1#5335 +ipset=/chyoa.com/gfwlist +server=/townofsins.com/127.0.0.1#5335 +ipset=/townofsins.com/gfwlist +server=/bdsmsexgame.com/127.0.0.1#5335 +ipset=/bdsmsexgame.com/gfwlist +server=/u.nu/127.0.0.1#5335 +ipset=/u.nu/gfwlist +server=/xxx2022.com/127.0.0.1#5335 +ipset=/xxx2022.com/gfwlist +server=/sheshaft.com/127.0.0.1#5335 +ipset=/sheshaft.com/gfwlist +server=/picasaweb.com/127.0.0.1#5335 +ipset=/picasaweb.com/gfwlist +server=/hummingbird.ms/127.0.0.1#5335 +ipset=/hummingbird.ms/gfwlist +server=/jdavsp.pw/127.0.0.1#5335 +ipset=/jdavsp.pw/gfwlist +server=/bvdinfo.com/127.0.0.1#5335 +ipset=/bvdinfo.com/gfwlist +server=/trycuckold.com/127.0.0.1#5335 +ipset=/trycuckold.com/gfwlist +server=/erocurves.com/127.0.0.1#5335 +ipset=/erocurves.com/gfwlist +server=/onlinefucktube.com/127.0.0.1#5335 +ipset=/onlinefucktube.com/gfwlist +server=/9now.com.au/127.0.0.1#5335 +ipset=/9now.com.au/gfwlist +server=/apple.fi/127.0.0.1#5335 +ipset=/apple.fi/gfwlist +server=/moemax.net/127.0.0.1#5335 +ipset=/moemax.net/gfwlist +server=/whatthefox.com/127.0.0.1#5335 +ipset=/whatthefox.com/gfwlist +server=/terragraph.com/127.0.0.1#5335 +ipset=/terragraph.com/gfwlist +server=/facebook.us/127.0.0.1#5335 +ipset=/facebook.us/gfwlist +server=/logitech.biz/127.0.0.1#5335 +ipset=/logitech.biz/gfwlist +server=/messenger.com/127.0.0.1#5335 +ipset=/messenger.com/gfwlist +server=/wifehomeporn.com/127.0.0.1#5335 +ipset=/wifehomeporn.com/gfwlist +server=/disneymagicmoments.gr/127.0.0.1#5335 +ipset=/disneymagicmoments.gr/gfwlist +server=/mini.ie/127.0.0.1#5335 +ipset=/mini.ie/gfwlist +server=/eromangajukujo.com/127.0.0.1#5335 +ipset=/eromangajukujo.com/gfwlist +server=/39group.info/127.0.0.1#5335 +ipset=/39group.info/gfwlist +server=/ero-labs.site/127.0.0.1#5335 +ipset=/ero-labs.site/gfwlist +server=/womenwill.com.br/127.0.0.1#5335 +ipset=/womenwill.com.br/gfwlist +server=/my13la.com/127.0.0.1#5335 +ipset=/my13la.com/gfwlist +server=/quanben-xiaoshuo.com/127.0.0.1#5335 +ipset=/quanben-xiaoshuo.com/gfwlist +server=/applestore.co.hu/127.0.0.1#5335 +ipset=/applestore.co.hu/gfwlist +server=/mastercard.si/127.0.0.1#5335 +ipset=/mastercard.si/gfwlist +server=/ebay.com/127.0.0.1#5335 +ipset=/ebay.com/gfwlist +server=/intelcapital.net/127.0.0.1#5335 +ipset=/intelcapital.net/gfwlist +server=/beatsbydre-outletsale.net/127.0.0.1#5335 +ipset=/beatsbydre-outletsale.net/gfwlist +server=/nikeswim.com/127.0.0.1#5335 +ipset=/nikeswim.com/gfwlist +server=/adobecc.com/127.0.0.1#5335 +ipset=/adobecc.com/gfwlist +server=/businesstoday.com.tw/127.0.0.1#5335 +ipset=/businesstoday.com.tw/gfwlist +server=/newsprestigenetwork.com.au/127.0.0.1#5335 +ipset=/newsprestigenetwork.com.au/gfwlist +server=/foxcharlotte.com/127.0.0.1#5335 +ipset=/foxcharlotte.com/gfwlist +server=/epochtimes-romania.com/127.0.0.1#5335 +ipset=/epochtimes-romania.com/gfwlist +server=/bustydustystash.com/127.0.0.1#5335 +ipset=/bustydustystash.com/gfwlist +server=/acasadasbrasileirinhas.com.br/127.0.0.1#5335 +ipset=/acasadasbrasileirinhas.com.br/gfwlist +server=/lbtube.com/127.0.0.1#5335 +ipset=/lbtube.com/gfwlist +server=/disneymagicmoments.fr/127.0.0.1#5335 +ipset=/disneymagicmoments.fr/gfwlist +server=/nabtravellercard.com.au/127.0.0.1#5335 +ipset=/nabtravellercard.com.au/gfwlist +server=/paypal-center.net/127.0.0.1#5335 +ipset=/paypal-center.net/gfwlist +server=/watchout.tw/127.0.0.1#5335 +ipset=/watchout.tw/gfwlist +server=/banned.video/127.0.0.1#5335 +ipset=/banned.video/gfwlist +server=/sf.net/127.0.0.1#5335 +ipset=/sf.net/gfwlist +server=/popjav.tv/127.0.0.1#5335 +ipset=/popjav.tv/gfwlist +server=/he.net/127.0.0.1#5335 +ipset=/he.net/gfwlist +server=/xx9.app/127.0.0.1#5335 +ipset=/xx9.app/gfwlist +server=/ebay.co.nz/127.0.0.1#5335 +ipset=/ebay.co.nz/gfwlist +server=/spotifycdn.net/127.0.0.1#5335 +ipset=/spotifycdn.net/gfwlist +server=/blogspot.com.co/127.0.0.1#5335 +ipset=/blogspot.com.co/gfwlist +server=/brandproducts1688.com/127.0.0.1#5335 +ipset=/brandproducts1688.com/gfwlist +server=/sextube.desi/127.0.0.1#5335 +ipset=/sextube.desi/gfwlist +server=/shops-disney.com/127.0.0.1#5335 +ipset=/shops-disney.com/gfwlist +server=/instagram-help.com/127.0.0.1#5335 +ipset=/instagram-help.com/gfwlist +server=/justusboys.com/127.0.0.1#5335 +ipset=/justusboys.com/gfwlist +server=/lnstagram-help.com/127.0.0.1#5335 +ipset=/lnstagram-help.com/gfwlist +server=/sexwithhorse.net/127.0.0.1#5335 +ipset=/sexwithhorse.net/gfwlist +server=/instagramm.com/127.0.0.1#5335 +ipset=/instagramm.com/gfwlist +server=/new3dcomics.com/127.0.0.1#5335 +ipset=/new3dcomics.com/gfwlist +server=/xxxbule.com/127.0.0.1#5335 +ipset=/xxxbule.com/gfwlist +server=/skype.com/127.0.0.1#5335 +ipset=/skype.com/gfwlist +server=/visabusinessinsights.com/127.0.0.1#5335 +ipset=/visabusinessinsights.com/gfwlist +server=/sex-douga.jp/127.0.0.1#5335 +ipset=/sex-douga.jp/gfwlist +server=/appstore.ph/127.0.0.1#5335 +ipset=/appstore.ph/gfwlist +server=/nvidia.com.br/127.0.0.1#5335 +ipset=/nvidia.com.br/gfwlist +server=/topless.com.ua/127.0.0.1#5335 +ipset=/topless.com.ua/gfwlist +server=/coinone.co.kr/127.0.0.1#5335 +ipset=/coinone.co.kr/gfwlist +server=/universalorlando.com/127.0.0.1#5335 +ipset=/universalorlando.com/gfwlist +server=/huobi.pro/127.0.0.1#5335 +ipset=/huobi.pro/gfwlist +server=/steamcommunity-a.akamaihd.net/127.0.0.1#5335 +ipset=/steamcommunity-a.akamaihd.net/gfwlist +server=/volvotrucks.no/127.0.0.1#5335 +ipset=/volvotrucks.no/gfwlist +server=/paisapay.info/127.0.0.1#5335 +ipset=/paisapay.info/gfwlist +server=/vfsco.at/127.0.0.1#5335 +ipset=/vfsco.at/gfwlist +server=/hentaifox.tv/127.0.0.1#5335 +ipset=/hentaifox.tv/gfwlist +server=/sleazyneasy.com/127.0.0.1#5335 +ipset=/sleazyneasy.com/gfwlist +server=/sikiswap.com/127.0.0.1#5335 +ipset=/sikiswap.com/gfwlist +server=/magentocommerce.com/127.0.0.1#5335 +ipset=/magentocommerce.com/gfwlist +server=/xamarin.com/127.0.0.1#5335 +ipset=/xamarin.com/gfwlist +server=/ipfs.fleek.co/127.0.0.1#5335 +ipset=/ipfs.fleek.co/gfwlist +server=/dailymail.com.au/127.0.0.1#5335 +ipset=/dailymail.com.au/gfwlist +server=/mini-clubs-international.com/127.0.0.1#5335 +ipset=/mini-clubs-international.com/gfwlist +server=/paofu.cloud/127.0.0.1#5335 +ipset=/paofu.cloud/gfwlist +server=/bwbx.io/127.0.0.1#5335 +ipset=/bwbx.io/gfwlist +server=/japan18tube.com/127.0.0.1#5335 +ipset=/japan18tube.com/gfwlist +server=/qualphone.com/127.0.0.1#5335 +ipset=/qualphone.com/gfwlist +server=/viacbs.com/127.0.0.1#5335 +ipset=/viacbs.com/gfwlist +server=/ebay.com.ec/127.0.0.1#5335 +ipset=/ebay.com.ec/gfwlist +server=/pussymomsex.com/127.0.0.1#5335 +ipset=/pussymomsex.com/gfwlist +server=/skate2.com/127.0.0.1#5335 +ipset=/skate2.com/gfwlist +server=/faceobok.com/127.0.0.1#5335 +ipset=/faceobok.com/gfwlist +server=/thai69.com/127.0.0.1#5335 +ipset=/thai69.com/gfwlist +server=/aka-ai.com/127.0.0.1#5335 +ipset=/aka-ai.com/gfwlist +server=/boobieblog.com/127.0.0.1#5335 +ipset=/boobieblog.com/gfwlist +server=/askfacebook.net/127.0.0.1#5335 +ipset=/askfacebook.net/gfwlist +server=/minie.com/127.0.0.1#5335 +ipset=/minie.com/gfwlist +server=/hpstore-emea.com/127.0.0.1#5335 +ipset=/hpstore-emea.com/gfwlist +server=/mininanaimo.ca/127.0.0.1#5335 +ipset=/mininanaimo.ca/gfwlist +server=/greatergothammini.com/127.0.0.1#5335 +ipset=/greatergothammini.com/gfwlist +server=/facebookpoke.net/127.0.0.1#5335 +ipset=/facebookpoke.net/gfwlist +server=/gaypornhdfree.com/127.0.0.1#5335 +ipset=/gaypornhdfree.com/gfwlist +server=/dynacw.com.hk/127.0.0.1#5335 +ipset=/dynacw.com.hk/gfwlist +server=/ebayfrance.com/127.0.0.1#5335 +ipset=/ebayfrance.com/gfwlist +server=/bmw-motorrad.uy/127.0.0.1#5335 +ipset=/bmw-motorrad.uy/gfwlist +server=/chinese-porn-videos.com/127.0.0.1#5335 +ipset=/chinese-porn-videos.com/gfwlist +server=/geeksquadcares.com/127.0.0.1#5335 +ipset=/geeksquadcares.com/gfwlist +server=/bmwmc.net/127.0.0.1#5335 +ipset=/bmwmc.net/gfwlist +server=/microbit.org/127.0.0.1#5335 +ipset=/microbit.org/gfwlist +server=/ikea.co.om/127.0.0.1#5335 +ipset=/ikea.co.om/gfwlist +server=/hentai.pink/127.0.0.1#5335 +ipset=/hentai.pink/gfwlist +server=/asto.re/127.0.0.1#5335 +ipset=/asto.re/gfwlist +server=/cern.ch/127.0.0.1#5335 +ipset=/cern.ch/gfwlist +server=/beatscollection2014.com/127.0.0.1#5335 +ipset=/beatscollection2014.com/gfwlist +server=/microsoftdiplomados.com/127.0.0.1#5335 +ipset=/microsoftdiplomados.com/gfwlist +server=/mixasiansex.com/127.0.0.1#5335 +ipset=/mixasiansex.com/gfwlist +server=/literatumonline.com/127.0.0.1#5335 +ipset=/literatumonline.com/gfwlist +server=/facebookpaper.com/127.0.0.1#5335 +ipset=/facebookpaper.com/gfwlist +server=/visa.com.tw/127.0.0.1#5335 +ipset=/visa.com.tw/gfwlist +server=/apple.si/127.0.0.1#5335 +ipset=/apple.si/gfwlist +server=/callersbane.com/127.0.0.1#5335 +ipset=/callersbane.com/gfwlist +server=/agu.org/127.0.0.1#5335 +ipset=/agu.org/gfwlist +server=/ferronetwork.com/127.0.0.1#5335 +ipset=/ferronetwork.com/gfwlist +server=/motherless.com/127.0.0.1#5335 +ipset=/motherless.com/gfwlist +server=/paypal-forward.com/127.0.0.1#5335 +ipset=/paypal-forward.com/gfwlist +server=/xn--6eup7j.com/127.0.0.1#5335 +ipset=/xn--6eup7j.com/gfwlist +server=/londonmithraeum.com/127.0.0.1#5335 +ipset=/londonmithraeum.com/gfwlist +server=/dettol.co.id/127.0.0.1#5335 +ipset=/dettol.co.id/gfwlist +server=/doseofporn.com/127.0.0.1#5335 +ipset=/doseofporn.com/gfwlist +server=/paxful.com/127.0.0.1#5335 +ipset=/paxful.com/gfwlist +server=/vfsco.no/127.0.0.1#5335 +ipset=/vfsco.no/gfwlist +server=/lotcrap.com/127.0.0.1#5335 +ipset=/lotcrap.com/gfwlist +server=/digitalpack.com/127.0.0.1#5335 +ipset=/digitalpack.com/gfwlist +server=/bmwgroup-werke.com/127.0.0.1#5335 +ipset=/bmwgroup-werke.com/gfwlist +server=/finish.co.kr/127.0.0.1#5335 +ipset=/finish.co.kr/gfwlist +server=/mrskin.com/127.0.0.1#5335 +ipset=/mrskin.com/gfwlist +server=/comicunivers.com/127.0.0.1#5335 +ipset=/comicunivers.com/gfwlist +server=/haplorrhini.com/127.0.0.1#5335 +ipset=/haplorrhini.com/gfwlist +server=/intellij.org/127.0.0.1#5335 +ipset=/intellij.org/gfwlist +server=/zhaimankan.com/127.0.0.1#5335 +ipset=/zhaimankan.com/gfwlist +server=/youngamateursporn.com/127.0.0.1#5335 +ipset=/youngamateursporn.com/gfwlist +server=/lbfmaddiction.com/127.0.0.1#5335 +ipset=/lbfmaddiction.com/gfwlist +server=/theclub.com.hk/127.0.0.1#5335 +ipset=/theclub.com.hk/gfwlist +server=/google.com.ai/127.0.0.1#5335 +ipset=/google.com.ai/gfwlist +server=/solarcity.com/127.0.0.1#5335 +ipset=/solarcity.com/gfwlist +server=/kslive.tv/127.0.0.1#5335 +ipset=/kslive.tv/gfwlist +server=/pinimg.com/127.0.0.1#5335 +ipset=/pinimg.com/gfwlist +server=/xnxxarabsex.com/127.0.0.1#5335 +ipset=/xnxxarabsex.com/gfwlist +server=/realpornclip.com/127.0.0.1#5335 +ipset=/realpornclip.com/gfwlist +server=/vimeobusiness.com/127.0.0.1#5335 +ipset=/vimeobusiness.com/gfwlist +server=/eroxia.com/127.0.0.1#5335 +ipset=/eroxia.com/gfwlist +server=/sextube.fm/127.0.0.1#5335 +ipset=/sextube.fm/gfwlist +server=/bmwgroup.at/127.0.0.1#5335 +ipset=/bmwgroup.at/gfwlist +server=/bnetproduct-a.akamaihd.net/127.0.0.1#5335 +ipset=/bnetproduct-a.akamaihd.net/gfwlist +server=/12diasderegalosdeitunes.pe/127.0.0.1#5335 +ipset=/12diasderegalosdeitunes.pe/gfwlist +server=/ebay.pl/127.0.0.1#5335 +ipset=/ebay.pl/gfwlist +server=/fullsexmovs.com/127.0.0.1#5335 +ipset=/fullsexmovs.com/gfwlist +server=/sss.xxx/127.0.0.1#5335 +ipset=/sss.xxx/gfwlist +server=/quatrowireless.com/127.0.0.1#5335 +ipset=/quatrowireless.com/gfwlist +server=/123-hp.com/127.0.0.1#5335 +ipset=/123-hp.com/gfwlist +server=/hotasianbabes.com/127.0.0.1#5335 +ipset=/hotasianbabes.com/gfwlist +server=/acheter-followers-instagram.com/127.0.0.1#5335 +ipset=/acheter-followers-instagram.com/gfwlist +server=/steampowered.com/127.0.0.1#5335 +ipset=/steampowered.com/gfwlist +server=/cumswappingsis.com/127.0.0.1#5335 +ipset=/cumswappingsis.com/gfwlist +server=/dfp6rglgjqszk.cloudfront.net/127.0.0.1#5335 +ipset=/dfp6rglgjqszk.cloudfront.net/gfwlist +server=/clients1.google.com/127.0.0.1#5335 +ipset=/clients1.google.com/gfwlist +server=/vod-hls-uk-live.akamaized.net/127.0.0.1#5335 +ipset=/vod-hls-uk-live.akamaized.net/gfwlist +server=/bmw-motorrad.co.nz/127.0.0.1#5335 +ipset=/bmw-motorrad.co.nz/gfwlist +server=/applecarbon.com/127.0.0.1#5335 +ipset=/applecarbon.com/gfwlist +server=/nudevista.club/127.0.0.1#5335 +ipset=/nudevista.club/gfwlist +server=/amazon.com.tr/127.0.0.1#5335 +ipset=/amazon.com.tr/gfwlist +server=/javtorrent.tk/127.0.0.1#5335 +ipset=/javtorrent.tk/gfwlist +server=/boodigo.com/127.0.0.1#5335 +ipset=/boodigo.com/gfwlist +server=/riotgames.jp/127.0.0.1#5335 +ipset=/riotgames.jp/gfwlist +server=/gordonmoore.com/127.0.0.1#5335 +ipset=/gordonmoore.com/gfwlist +server=/adobecreativityawards.com/127.0.0.1#5335 +ipset=/adobecreativityawards.com/gfwlist +server=/scatvids.club/127.0.0.1#5335 +ipset=/scatvids.club/gfwlist +server=/ebayjob.com/127.0.0.1#5335 +ipset=/ebayjob.com/gfwlist +server=/viacomcbspressexpress.com/127.0.0.1#5335 +ipset=/viacomcbspressexpress.com/gfwlist +server=/nhentai.net/127.0.0.1#5335 +ipset=/nhentai.net/gfwlist +server=/holloporn.com/127.0.0.1#5335 +ipset=/holloporn.com/gfwlist +server=/foxnetworksinfo.com/127.0.0.1#5335 +ipset=/foxnetworksinfo.com/gfwlist +server=/swoo.sh/127.0.0.1#5335 +ipset=/swoo.sh/gfwlist +server=/fox28media.com/127.0.0.1#5335 +ipset=/fox28media.com/gfwlist +server=/desertbmw.com/127.0.0.1#5335 +ipset=/desertbmw.com/gfwlist +server=/voatibetanenglish.com/127.0.0.1#5335 +ipset=/voatibetanenglish.com/gfwlist +server=/arcadewank.com/127.0.0.1#5335 +ipset=/arcadewank.com/gfwlist +server=/epochtime.com/127.0.0.1#5335 +ipset=/epochtime.com/gfwlist +server=/1337xto.to/127.0.0.1#5335 +ipset=/1337xto.to/gfwlist +server=/cnix-gov-cn.com/127.0.0.1#5335 +ipset=/cnix-gov-cn.com/gfwlist +server=/ebaycommercenetwork.com/127.0.0.1#5335 +ipset=/ebaycommercenetwork.com/gfwlist +server=/managedmeetingrooms.com/127.0.0.1#5335 +ipset=/managedmeetingrooms.com/gfwlist +server=/ads-twitter.com/127.0.0.1#5335 +ipset=/ads-twitter.com/gfwlist +server=/myboylove.com/127.0.0.1#5335 +ipset=/myboylove.com/gfwlist +server=/xandr.com/127.0.0.1#5335 +ipset=/xandr.com/gfwlist +server=/mybmw.com/127.0.0.1#5335 +ipset=/mybmw.com/gfwlist +server=/rolls-roycemotorcarsna.com/127.0.0.1#5335 +ipset=/rolls-roycemotorcarsna.com/gfwlist +server=/drebeats-singaporecheap.com/127.0.0.1#5335 +ipset=/drebeats-singaporecheap.com/gfwlist +server=/ladyboypornonly.com/127.0.0.1#5335 +ipset=/ladyboypornonly.com/gfwlist +server=/ijavhd.com/127.0.0.1#5335 +ipset=/ijavhd.com/gfwlist +server=/api-extractor.com/127.0.0.1#5335 +ipset=/api-extractor.com/gfwlist +server=/guardianproject.info/127.0.0.1#5335 +ipset=/guardianproject.info/gfwlist +server=/truyen18.xyz/127.0.0.1#5335 +ipset=/truyen18.xyz/gfwlist +server=/firesidegatherings.com/127.0.0.1#5335 +ipset=/firesidegatherings.com/gfwlist +server=/x6av.com/127.0.0.1#5335 +ipset=/x6av.com/gfwlist +server=/nudistvoyeurbeach.com/127.0.0.1#5335 +ipset=/nudistvoyeurbeach.com/gfwlist +server=/3hentai.net/127.0.0.1#5335 +ipset=/3hentai.net/gfwlist +server=/zee5.in/127.0.0.1#5335 +ipset=/zee5.in/gfwlist +server=/bmw-iraq.com/127.0.0.1#5335 +ipset=/bmw-iraq.com/gfwlist +server=/azure-dns.net/127.0.0.1#5335 +ipset=/azure-dns.net/gfwlist +server=/youtubego.com.br/127.0.0.1#5335 +ipset=/youtubego.com.br/gfwlist +server=/90seconds.asia/127.0.0.1#5335 +ipset=/90seconds.asia/gfwlist +server=/ikea.lt/127.0.0.1#5335 +ipset=/ikea.lt/gfwlist +server=/flexsig.com/127.0.0.1#5335 +ipset=/flexsig.com/gfwlist +server=/babesource.com/127.0.0.1#5335 +ipset=/babesource.com/gfwlist +server=/ubereats.com/127.0.0.1#5335 +ipset=/ubereats.com/gfwlist +server=/facebookporn.net/127.0.0.1#5335 +ipset=/facebookporn.net/gfwlist +server=/smartexpos.com/127.0.0.1#5335 +ipset=/smartexpos.com/gfwlist +server=/hpcomputerservices.com/127.0.0.1#5335 +ipset=/hpcomputerservices.com/gfwlist +server=/avstar07.com/127.0.0.1#5335 +ipset=/avstar07.com/gfwlist +server=/ywbclx.top/127.0.0.1#5335 +ipset=/ywbclx.top/gfwlist +server=/yahoo.com.my/127.0.0.1#5335 +ipset=/yahoo.com.my/gfwlist +server=/egghead.io/127.0.0.1#5335 +ipset=/egghead.io/gfwlist +server=/volvogroup.pl/127.0.0.1#5335 +ipset=/volvogroup.pl/gfwlist +server=/amazon.jobs/127.0.0.1#5335 +ipset=/amazon.jobs/gfwlist +server=/silverchair-cdn.com/127.0.0.1#5335 +ipset=/silverchair-cdn.com/gfwlist +server=/intc.com/127.0.0.1#5335 +ipset=/intc.com/gfwlist +server=/addthis.com/127.0.0.1#5335 +ipset=/addthis.com/gfwlist +server=/bmw.ch/127.0.0.1#5335 +ipset=/bmw.ch/gfwlist +server=/slutdump.com/127.0.0.1#5335 +ipset=/slutdump.com/gfwlist +server=/visa.com.lk/127.0.0.1#5335 +ipset=/visa.com.lk/gfwlist +server=/airav.wiki/127.0.0.1#5335 +ipset=/airav.wiki/gfwlist +server=/accessfacebookfromschool.com/127.0.0.1#5335 +ipset=/accessfacebookfromschool.com/gfwlist +server=/teensloveporn.net/127.0.0.1#5335 +ipset=/teensloveporn.net/gfwlist +server=/fbcdn.net/127.0.0.1#5335 +ipset=/fbcdn.net/gfwlist +server=/edx-cdn.org/127.0.0.1#5335 +ipset=/edx-cdn.org/gfwlist +server=/footseen.com/127.0.0.1#5335 +ipset=/footseen.com/gfwlist +server=/pornoscanner.com/127.0.0.1#5335 +ipset=/pornoscanner.com/gfwlist +server=/javhdporn.net/127.0.0.1#5335 +ipset=/javhdporn.net/gfwlist +server=/ebay-inc.com/127.0.0.1#5335 +ipset=/ebay-inc.com/gfwlist +server=/avstar5.com/127.0.0.1#5335 +ipset=/avstar5.com/gfwlist +server=/topsexart.com/127.0.0.1#5335 +ipset=/topsexart.com/gfwlist +server=/calgon.pt/127.0.0.1#5335 +ipset=/calgon.pt/gfwlist +server=/91se.fun/127.0.0.1#5335 +ipset=/91se.fun/gfwlist +server=/karlajames.com/127.0.0.1#5335 +ipset=/karlajames.com/gfwlist +server=/sexmovies24.com/127.0.0.1#5335 +ipset=/sexmovies24.com/gfwlist +server=/nike.gy/127.0.0.1#5335 +ipset=/nike.gy/gfwlist +server=/milehighmedia.com/127.0.0.1#5335 +ipset=/milehighmedia.com/gfwlist +server=/xn--3et96bj49ahpq.com/127.0.0.1#5335 +ipset=/xn--3et96bj49ahpq.com/gfwlist +server=/trueamateurmodels.com/127.0.0.1#5335 +ipset=/trueamateurmodels.com/gfwlist +server=/volvogroup.pe/127.0.0.1#5335 +ipset=/volvogroup.pe/gfwlist +server=/engineeringvillage.com/127.0.0.1#5335 +ipset=/engineeringvillage.com/gfwlist +server=/youtube.fi/127.0.0.1#5335 +ipset=/youtube.fi/gfwlist +server=/ebay.vn/127.0.0.1#5335 +ipset=/ebay.vn/gfwlist +server=/livecamclips.com/127.0.0.1#5335 +ipset=/livecamclips.com/gfwlist +server=/flirtyhoookup.com/127.0.0.1#5335 +ipset=/flirtyhoookup.com/gfwlist +server=/microsofthouse.com/127.0.0.1#5335 +ipset=/microsofthouse.com/gfwlist +server=/speedxtra.com/127.0.0.1#5335 +ipset=/speedxtra.com/gfwlist +server=/ebayclassifiedsgroup.com/127.0.0.1#5335 +ipset=/ebayclassifiedsgroup.com/gfwlist +server=/bmw-motorrad.co.th/127.0.0.1#5335 +ipset=/bmw-motorrad.co.th/gfwlist +server=/garena.my/127.0.0.1#5335 +ipset=/garena.my/gfwlist +server=/instagramsepeti.com/127.0.0.1#5335 +ipset=/instagramsepeti.com/gfwlist +server=/globalsign.com/127.0.0.1#5335 +ipset=/globalsign.com/gfwlist +server=/iphone.cm/127.0.0.1#5335 +ipset=/iphone.cm/gfwlist +server=/ems-ph.org/127.0.0.1#5335 +ipset=/ems-ph.org/gfwlist +server=/pornwhite.com/127.0.0.1#5335 +ipset=/pornwhite.com/gfwlist +server=/gettyimages.in/127.0.0.1#5335 +ipset=/gettyimages.in/gfwlist +server=/hardcoregayblog.com/127.0.0.1#5335 +ipset=/hardcoregayblog.com/gfwlist +server=/bestescortgirls.nl/127.0.0.1#5335 +ipset=/bestescortgirls.nl/gfwlist +server=/nightclub.eu/127.0.0.1#5335 +ipset=/nightclub.eu/gfwlist +server=/ukwhoswho.com/127.0.0.1#5335 +ipset=/ukwhoswho.com/gfwlist +server=/coitustube.com/127.0.0.1#5335 +ipset=/coitustube.com/gfwlist +server=/beats4salecheap.com/127.0.0.1#5335 +ipset=/beats4salecheap.com/gfwlist +server=/pornmagnet.org/127.0.0.1#5335 +ipset=/pornmagnet.org/gfwlist +server=/applecare.wang/127.0.0.1#5335 +ipset=/applecare.wang/gfwlist +server=/wa.me/127.0.0.1#5335 +ipset=/wa.me/gfwlist +server=/needforspeedtakedown.com/127.0.0.1#5335 +ipset=/needforspeedtakedown.com/gfwlist +server=/cliphayho.com/127.0.0.1#5335 +ipset=/cliphayho.com/gfwlist +server=/runwayescorts.com/127.0.0.1#5335 +ipset=/runwayescorts.com/gfwlist +server=/riotforgegames.com/127.0.0.1#5335 +ipset=/riotforgegames.com/gfwlist +server=/x-fetish.org/127.0.0.1#5335 +ipset=/x-fetish.org/gfwlist +server=/s-xoom.com/127.0.0.1#5335 +ipset=/s-xoom.com/gfwlist +server=/gfleaks.com/127.0.0.1#5335 +ipset=/gfleaks.com/gfwlist +server=/eamythic.com/127.0.0.1#5335 +ipset=/eamythic.com/gfwlist +server=/tiffany-towers.com/127.0.0.1#5335 +ipset=/tiffany-towers.com/gfwlist +server=/hpwellnesscentral.com/127.0.0.1#5335 +ipset=/hpwellnesscentral.com/gfwlist +server=/myradio.com.hk/127.0.0.1#5335 +ipset=/myradio.com.hk/gfwlist +server=/cbsistatic.com/127.0.0.1#5335 +ipset=/cbsistatic.com/gfwlist +server=/hbogoasia.tw/127.0.0.1#5335 +ipset=/hbogoasia.tw/gfwlist +server=/wiifitu.com/127.0.0.1#5335 +ipset=/wiifitu.com/gfwlist +server=/airwatchqa.com/127.0.0.1#5335 +ipset=/airwatchqa.com/gfwlist +server=/futunited.com/127.0.0.1#5335 +ipset=/futunited.com/gfwlist +server=/spermyporn.com/127.0.0.1#5335 +ipset=/spermyporn.com/gfwlist +server=/eskimotube.com/127.0.0.1#5335 +ipset=/eskimotube.com/gfwlist +server=/slutclit.com/127.0.0.1#5335 +ipset=/slutclit.com/gfwlist +server=/adidas.com/127.0.0.1#5335 +ipset=/adidas.com/gfwlist +server=/durex-shop.ch/127.0.0.1#5335 +ipset=/durex-shop.ch/gfwlist +server=/iphonexs.tv/127.0.0.1#5335 +ipset=/iphonexs.tv/gfwlist +server=/yahoo.lu/127.0.0.1#5335 +ipset=/yahoo.lu/gfwlist +server=/myfoxtampabay.com/127.0.0.1#5335 +ipset=/myfoxtampabay.com/gfwlist +server=/gloryholefucking.com/127.0.0.1#5335 +ipset=/gloryholefucking.com/gfwlist +server=/microsoftnews.com/127.0.0.1#5335 +ipset=/microsoftnews.com/gfwlist +server=/standardsuniversity.org/127.0.0.1#5335 +ipset=/standardsuniversity.org/gfwlist +server=/gate.cc/127.0.0.1#5335 +ipset=/gate.cc/gfwlist +server=/iphonecases100.com/127.0.0.1#5335 +ipset=/iphonecases100.com/gfwlist +server=/bmw-pma.com.sg/127.0.0.1#5335 +ipset=/bmw-pma.com.sg/gfwlist +server=/akamaa.com/127.0.0.1#5335 +ipset=/akamaa.com/gfwlist +server=/swiftfinancial.com/127.0.0.1#5335 +ipset=/swiftfinancial.com/gfwlist +server=/zb.app/127.0.0.1#5335 +ipset=/zb.app/gfwlist +server=/sex.sex/127.0.0.1#5335 +ipset=/sex.sex/gfwlist +server=/applefinalcutproworld.net/127.0.0.1#5335 +ipset=/applefinalcutproworld.net/gfwlist +server=/afp.com/127.0.0.1#5335 +ipset=/afp.com/gfwlist +server=/bmw-werk-berlin.de/127.0.0.1#5335 +ipset=/bmw-werk-berlin.de/gfwlist +server=/zb.live/127.0.0.1#5335 +ipset=/zb.live/gfwlist +server=/get.app/127.0.0.1#5335 +ipset=/get.app/gfwlist +server=/scholar.google.ch/127.0.0.1#5335 +ipset=/scholar.google.ch/gfwlist +server=/mylittlenieces.com/127.0.0.1#5335 +ipset=/mylittlenieces.com/gfwlist +server=/megahdporno.net/127.0.0.1#5335 +ipset=/megahdporno.net/gfwlist +server=/adidas.it/127.0.0.1#5335 +ipset=/adidas.it/gfwlist +server=/youngheaven.com/127.0.0.1#5335 +ipset=/youngheaven.com/gfwlist +server=/pearson.com.ar/127.0.0.1#5335 +ipset=/pearson.com.ar/gfwlist +server=/alt4-mtalk.google.com/127.0.0.1#5335 +ipset=/alt4-mtalk.google.com/gfwlist +server=/gettyimages.se/127.0.0.1#5335 +ipset=/gettyimages.se/gfwlist +server=/nuddess.com/127.0.0.1#5335 +ipset=/nuddess.com/gfwlist +server=/onani-daisuki.com/127.0.0.1#5335 +ipset=/onani-daisuki.com/gfwlist +server=/coursera-for-business.org/127.0.0.1#5335 +ipset=/coursera-for-business.org/gfwlist +server=/gamesathletes.com/127.0.0.1#5335 +ipset=/gamesathletes.com/gfwlist +server=/alphabet.com.lv/127.0.0.1#5335 +ipset=/alphabet.com.lv/gfwlist +server=/hdreporn.com/127.0.0.1#5335 +ipset=/hdreporn.com/gfwlist +server=/decrypt.day/127.0.0.1#5335 +ipset=/decrypt.day/gfwlist +server=/espn.co.uk/127.0.0.1#5335 +ipset=/espn.co.uk/gfwlist +server=/sandisk.id/127.0.0.1#5335 +ipset=/sandisk.id/gfwlist +server=/scholar.google.hr/127.0.0.1#5335 +ipset=/scholar.google.hr/gfwlist +server=/beatsbydregot.com/127.0.0.1#5335 +ipset=/beatsbydregot.com/gfwlist +server=/tesla.com/127.0.0.1#5335 +ipset=/tesla.com/gfwlist +server=/dickhardon.com/127.0.0.1#5335 +ipset=/dickhardon.com/gfwlist +server=/imageshack.us/127.0.0.1#5335 +ipset=/imageshack.us/gfwlist +server=/baselinestudy.org/127.0.0.1#5335 +ipset=/baselinestudy.org/gfwlist +server=/mucinex.co.nz/127.0.0.1#5335 +ipset=/mucinex.co.nz/gfwlist +server=/xingrz.me/127.0.0.1#5335 +ipset=/xingrz.me/gfwlist +server=/cash2.com/127.0.0.1#5335 +ipset=/cash2.com/gfwlist +server=/unrealtournament.com/127.0.0.1#5335 +ipset=/unrealtournament.com/gfwlist +server=/travelex.de/127.0.0.1#5335 +ipset=/travelex.de/gfwlist +server=/jwplayer.com/127.0.0.1#5335 +ipset=/jwplayer.com/gfwlist +server=/swingercuckoldporn.com/127.0.0.1#5335 +ipset=/swingercuckoldporn.com/gfwlist +server=/pagespeedmobilizer.com/127.0.0.1#5335 +ipset=/pagespeedmobilizer.com/gfwlist +server=/casquebeatsdre2013.com/127.0.0.1#5335 +ipset=/casquebeatsdre2013.com/gfwlist +server=/homepornking.com/127.0.0.1#5335 +ipset=/homepornking.com/gfwlist +server=/iphone.net.gr/127.0.0.1#5335 +ipset=/iphone.net.gr/gfwlist +server=/blogspot.lu/127.0.0.1#5335 +ipset=/blogspot.lu/gfwlist +server=/intel.com/127.0.0.1#5335 +ipset=/intel.com/gfwlist +server=/bdsm-mov.net/127.0.0.1#5335 +ipset=/bdsm-mov.net/gfwlist +server=/iwaponline.com/127.0.0.1#5335 +ipset=/iwaponline.com/gfwlist +server=/applehongkong.com.hk/127.0.0.1#5335 +ipset=/applehongkong.com.hk/gfwlist +server=/visiontimes.fr/127.0.0.1#5335 +ipset=/visiontimes.fr/gfwlist +server=/69luolie.com/127.0.0.1#5335 +ipset=/69luolie.com/gfwlist +server=/ieee-into-focus.org/127.0.0.1#5335 +ipset=/ieee-into-focus.org/gfwlist +server=/hotladsworld.com/127.0.0.1#5335 +ipset=/hotladsworld.com/gfwlist +server=/edengay.net/127.0.0.1#5335 +ipset=/edengay.net/gfwlist +server=/beatsbydreexecutivesale.com/127.0.0.1#5335 +ipset=/beatsbydreexecutivesale.com/gfwlist +server=/akadns.com/127.0.0.1#5335 +ipset=/akadns.com/gfwlist +server=/googlemail.com/127.0.0.1#5335 +ipset=/googlemail.com/gfwlist +server=/jabcomix.com/127.0.0.1#5335 +ipset=/jabcomix.com/gfwlist +server=/fujinkoron.jp/127.0.0.1#5335 +ipset=/fujinkoron.jp/gfwlist +server=/ponyanimalsex.com/127.0.0.1#5335 +ipset=/ponyanimalsex.com/gfwlist +server=/facebookappcenter.net/127.0.0.1#5335 +ipset=/facebookappcenter.net/gfwlist +server=/bigtitsgallery.net/127.0.0.1#5335 +ipset=/bigtitsgallery.net/gfwlist +server=/crazyxxx3dworld.org/127.0.0.1#5335 +ipset=/crazyxxx3dworld.org/gfwlist +server=/gitbook.com/127.0.0.1#5335 +ipset=/gitbook.com/gfwlist +server=/absoluporn.com/127.0.0.1#5335 +ipset=/absoluporn.com/gfwlist +server=/paypal.com.hk/127.0.0.1#5335 +ipset=/paypal.com.hk/gfwlist +server=/worldpornvideos.com/127.0.0.1#5335 +ipset=/worldpornvideos.com/gfwlist +server=/indiansexstories.net/127.0.0.1#5335 +ipset=/indiansexstories.net/gfwlist +server=/nvidia.com.mx/127.0.0.1#5335 +ipset=/nvidia.com.mx/gfwlist +server=/qdiehzz7.me/127.0.0.1#5335 +ipset=/qdiehzz7.me/gfwlist +server=/arabnek.com/127.0.0.1#5335 +ipset=/arabnek.com/gfwlist +server=/nonktube.com/127.0.0.1#5335 +ipset=/nonktube.com/gfwlist +server=/nlm.io/127.0.0.1#5335 +ipset=/nlm.io/gfwlist +server=/pokemonultrasunmoon.com/127.0.0.1#5335 +ipset=/pokemonultrasunmoon.com/gfwlist +server=/sp.cool/127.0.0.1#5335 +ipset=/sp.cool/gfwlist +server=/facetook.com/127.0.0.1#5335 +ipset=/facetook.com/gfwlist +server=/animalporn.me/127.0.0.1#5335 +ipset=/animalporn.me/gfwlist +server=/desipornfilms.com/127.0.0.1#5335 +ipset=/desipornfilms.com/gfwlist +server=/casquedrdrebeatssfr.com/127.0.0.1#5335 +ipset=/casquedrdrebeatssfr.com/gfwlist +server=/milfmaturesex.net/127.0.0.1#5335 +ipset=/milfmaturesex.net/gfwlist +server=/bbc.in/127.0.0.1#5335 +ipset=/bbc.in/gfwlist +server=/hypnohub.net/127.0.0.1#5335 +ipset=/hypnohub.net/gfwlist +server=/paypal-online.info/127.0.0.1#5335 +ipset=/paypal-online.info/gfwlist +server=/scholar.google.com.bo/127.0.0.1#5335 +ipset=/scholar.google.com.bo/gfwlist +server=/masalabin.com/127.0.0.1#5335 +ipset=/masalabin.com/gfwlist +server=/twttr.com/127.0.0.1#5335 +ipset=/twttr.com/gfwlist +server=/mafia-linkz.to/127.0.0.1#5335 +ipset=/mafia-linkz.to/gfwlist +server=/awscommandlineinterface.com/127.0.0.1#5335 +ipset=/awscommandlineinterface.com/gfwlist +server=/vpro.net/127.0.0.1#5335 +ipset=/vpro.net/gfwlist +server=/bmw.ma/127.0.0.1#5335 +ipset=/bmw.ma/gfwlist +server=/pise.pw/127.0.0.1#5335 +ipset=/pise.pw/gfwlist +server=/pornobae.com/127.0.0.1#5335 +ipset=/pornobae.com/gfwlist +server=/minnano-av.com/127.0.0.1#5335 +ipset=/minnano-av.com/gfwlist +server=/gamesofdesire.com/127.0.0.1#5335 +ipset=/gamesofdesire.com/gfwlist +server=/xxxgratisfilms.com/127.0.0.1#5335 +ipset=/xxxgratisfilms.com/gfwlist +server=/autodesk.com/127.0.0.1#5335 +ipset=/autodesk.com/gfwlist +server=/tearapeak.com/127.0.0.1#5335 +ipset=/tearapeak.com/gfwlist +server=/foxphiladelphia.com/127.0.0.1#5335 +ipset=/foxphiladelphia.com/gfwlist +server=/livejasmin.com/127.0.0.1#5335 +ipset=/livejasmin.com/gfwlist +server=/bmw-motorrad.com.ar/127.0.0.1#5335 +ipset=/bmw-motorrad.com.ar/gfwlist +server=/nudelive.com/127.0.0.1#5335 +ipset=/nudelive.com/gfwlist +server=/gtv.org/127.0.0.1#5335 +ipset=/gtv.org/gfwlist +server=/blizzardgearstore.com/127.0.0.1#5335 +ipset=/blizzardgearstore.com/gfwlist +server=/hotsexydolls.com/127.0.0.1#5335 +ipset=/hotsexydolls.com/gfwlist +server=/thomsonreuters.co.jp/127.0.0.1#5335 +ipset=/thomsonreuters.co.jp/gfwlist +server=/oreilly.com/127.0.0.1#5335 +ipset=/oreilly.com/gfwlist +server=/mysql.com/127.0.0.1#5335 +ipset=/mysql.com/gfwlist +server=/kijji.ca/127.0.0.1#5335 +ipset=/kijji.ca/gfwlist +server=/visa.com.hr/127.0.0.1#5335 +ipset=/visa.com.hr/gfwlist +server=/ig.me/127.0.0.1#5335 +ipset=/ig.me/gfwlist +server=/2mdn.net/127.0.0.1#5335 +ipset=/2mdn.net/gfwlist +server=/steampipe.akamaized.net/127.0.0.1#5335 +ipset=/steampipe.akamaized.net/gfwlist +server=/travelex.com.tr/127.0.0.1#5335 +ipset=/travelex.com.tr/gfwlist +server=/takens.tw/127.0.0.1#5335 +ipset=/takens.tw/gfwlist +server=/moviesanywhere.com/127.0.0.1#5335 +ipset=/moviesanywhere.com/gfwlist +server=/youjizz.com/127.0.0.1#5335 +ipset=/youjizz.com/gfwlist +server=/tubemovies4k.com/127.0.0.1#5335 +ipset=/tubemovies4k.com/gfwlist +server=/superjapanesesex.com/127.0.0.1#5335 +ipset=/superjapanesesex.com/gfwlist +server=/kinklive.com/127.0.0.1#5335 +ipset=/kinklive.com/gfwlist +server=/pornone.com/127.0.0.1#5335 +ipset=/pornone.com/gfwlist +server=/infrapedia.com/127.0.0.1#5335 +ipset=/infrapedia.com/gfwlist +server=/apple.in/127.0.0.1#5335 +ipset=/apple.in/gfwlist +server=/ingka.com/127.0.0.1#5335 +ipset=/ingka.com/gfwlist +server=/facebocke.com/127.0.0.1#5335 +ipset=/facebocke.com/gfwlist +server=/realclearhealth.com/127.0.0.1#5335 +ipset=/realclearhealth.com/gfwlist +server=/rocketfishproducts.com/127.0.0.1#5335 +ipset=/rocketfishproducts.com/gfwlist +server=/facebookbrand.com/127.0.0.1#5335 +ipset=/facebookbrand.com/gfwlist +server=/facebookcheats.com/127.0.0.1#5335 +ipset=/facebookcheats.com/gfwlist +server=/modular.im/127.0.0.1#5335 +ipset=/modular.im/gfwlist +server=/duckduckgo.sg/127.0.0.1#5335 +ipset=/duckduckgo.sg/gfwlist +server=/pearsonassessment.fr/127.0.0.1#5335 +ipset=/pearsonassessment.fr/gfwlist +server=/now.com/127.0.0.1#5335 +ipset=/now.com/gfwlist +server=/bmw-connecteddrive.com.br/127.0.0.1#5335 +ipset=/bmw-connecteddrive.com.br/gfwlist +server=/xnxxporn.de/127.0.0.1#5335 +ipset=/xnxxporn.de/gfwlist +server=/pinterest.fr/127.0.0.1#5335 +ipset=/pinterest.fr/gfwlist +server=/facebooknews.com/127.0.0.1#5335 +ipset=/facebooknews.com/gfwlist +server=/faronics.eu/127.0.0.1#5335 +ipset=/faronics.eu/gfwlist +server=/adultvideotop.com/127.0.0.1#5335 +ipset=/adultvideotop.com/gfwlist +server=/abc.xyz/127.0.0.1#5335 +ipset=/abc.xyz/gfwlist +server=/linuxmint.com/127.0.0.1#5335 +ipset=/linuxmint.com/gfwlist +server=/girlswelustfor.com/127.0.0.1#5335 +ipset=/girlswelustfor.com/gfwlist +server=/wikawika.xyz/127.0.0.1#5335 +ipset=/wikawika.xyz/gfwlist +server=/intel.lu/127.0.0.1#5335 +ipset=/intel.lu/gfwlist +server=/zeit-world.co.uk/127.0.0.1#5335 +ipset=/zeit-world.co.uk/gfwlist +server=/realteengirls.com/127.0.0.1#5335 +ipset=/realteengirls.com/gfwlist +server=/unkoscene.com/127.0.0.1#5335 +ipset=/unkoscene.com/gfwlist +server=/is.gd/127.0.0.1#5335 +ipset=/is.gd/gfwlist +server=/mini-connected.lu/127.0.0.1#5335 +ipset=/mini-connected.lu/gfwlist +server=/47news.jp/127.0.0.1#5335 +ipset=/47news.jp/gfwlist +server=/rbgraduates.com/127.0.0.1#5335 +ipset=/rbgraduates.com/gfwlist +server=/google.lv/127.0.0.1#5335 +ipset=/google.lv/gfwlist +server=/mymasturbators.com/127.0.0.1#5335 +ipset=/mymasturbators.com/gfwlist +server=/8thstreetlatinas.com/127.0.0.1#5335 +ipset=/8thstreetlatinas.com/gfwlist +server=/juliamovies.com/127.0.0.1#5335 +ipset=/juliamovies.com/gfwlist +server=/nmbmw.com/127.0.0.1#5335 +ipset=/nmbmw.com/gfwlist +server=/trellocdn.com/127.0.0.1#5335 +ipset=/trellocdn.com/gfwlist +server=/devtools-paypal.com/127.0.0.1#5335 +ipset=/devtools-paypal.com/gfwlist +server=/swingers.theadulthub.com/127.0.0.1#5335 +ipset=/swingers.theadulthub.com/gfwlist +server=/qwant.de/127.0.0.1#5335 +ipset=/qwant.de/gfwlist +server=/wifewantstoplay.com/127.0.0.1#5335 +ipset=/wifewantstoplay.com/gfwlist +server=/vfsco.ee/127.0.0.1#5335 +ipset=/vfsco.ee/gfwlist +server=/youtube.am/127.0.0.1#5335 +ipset=/youtube.am/gfwlist +server=/pornoreino.com/127.0.0.1#5335 +ipset=/pornoreino.com/gfwlist +server=/vmw.com/127.0.0.1#5335 +ipset=/vmw.com/gfwlist +server=/canon.se/127.0.0.1#5335 +ipset=/canon.se/gfwlist +server=/nikeshoes21.com/127.0.0.1#5335 +ipset=/nikeshoes21.com/gfwlist +server=/beatsbydreaustraliaonlines.com/127.0.0.1#5335 +ipset=/beatsbydreaustraliaonlines.com/gfwlist +server=/flipshare.com/127.0.0.1#5335 +ipset=/flipshare.com/gfwlist +server=/camgirlfinder.net/127.0.0.1#5335 +ipset=/camgirlfinder.net/gfwlist +server=/ssx3.com/127.0.0.1#5335 +ipset=/ssx3.com/gfwlist +server=/candycumcity.com/127.0.0.1#5335 +ipset=/candycumcity.com/gfwlist +server=/scatville.com/127.0.0.1#5335 +ipset=/scatville.com/gfwlist +server=/applewatchseries3.net/127.0.0.1#5335 +ipset=/applewatchseries3.net/gfwlist +server=/mkto-c0100.com/127.0.0.1#5335 +ipset=/mkto-c0100.com/gfwlist +server=/bmw.bm/127.0.0.1#5335 +ipset=/bmw.bm/gfwlist +server=/skyoceanrescue.it/127.0.0.1#5335 +ipset=/skyoceanrescue.it/gfwlist +server=/withyoutube.com/127.0.0.1#5335 +ipset=/withyoutube.com/gfwlist +server=/pornqd.com/127.0.0.1#5335 +ipset=/pornqd.com/gfwlist +server=/moozporn.com/127.0.0.1#5335 +ipset=/moozporn.com/gfwlist +server=/sandisk.ae/127.0.0.1#5335 +ipset=/sandisk.ae/gfwlist +server=/hentaicomics.asia/127.0.0.1#5335 +ipset=/hentaicomics.asia/gfwlist +server=/bmw.co.th/127.0.0.1#5335 +ipset=/bmw.co.th/gfwlist +server=/bestcamsites.net/127.0.0.1#5335 +ipset=/bestcamsites.net/gfwlist +server=/boundhub.com/127.0.0.1#5335 +ipset=/boundhub.com/gfwlist +server=/youtube.hk/127.0.0.1#5335 +ipset=/youtube.hk/gfwlist +server=/pyhapp.com/127.0.0.1#5335 +ipset=/pyhapp.com/gfwlist +server=/xchina.co/127.0.0.1#5335 +ipset=/xchina.co/gfwlist +server=/bmw-i.jp/127.0.0.1#5335 +ipset=/bmw-i.jp/gfwlist +server=/tryengineering.org/127.0.0.1#5335 +ipset=/tryengineering.org/gfwlist +server=/hbogoasia.ph/127.0.0.1#5335 +ipset=/hbogoasia.ph/gfwlist +server=/chinadecoding.com/127.0.0.1#5335 +ipset=/chinadecoding.com/gfwlist +server=/ipoditouch.com/127.0.0.1#5335 +ipset=/ipoditouch.com/gfwlist +server=/faronics.com/127.0.0.1#5335 +ipset=/faronics.com/gfwlist +server=/88gals.com/127.0.0.1#5335 +ipset=/88gals.com/gfwlist +server=/zencdn.net/127.0.0.1#5335 +ipset=/zencdn.net/gfwlist +server=/mini-srilanka.com/127.0.0.1#5335 +ipset=/mini-srilanka.com/gfwlist +server=/mrporngeek.com/127.0.0.1#5335 +ipset=/mrporngeek.com/gfwlist +server=/visafulfillment.com/127.0.0.1#5335 +ipset=/visafulfillment.com/gfwlist +server=/volvobuses.ca/127.0.0.1#5335 +ipset=/volvobuses.ca/gfwlist +server=/selectyourgame.com/127.0.0.1#5335 +ipset=/selectyourgame.com/gfwlist +server=/q10.jp/127.0.0.1#5335 +ipset=/q10.jp/gfwlist +server=/tubetubetube.com/127.0.0.1#5335 +ipset=/tubetubetube.com/gfwlist +server=/tubous.com/127.0.0.1#5335 +ipset=/tubous.com/gfwlist +server=/spotify-everywhere.com/127.0.0.1#5335 +ipset=/spotify-everywhere.com/gfwlist +server=/dvdtrailertube.com/127.0.0.1#5335 +ipset=/dvdtrailertube.com/gfwlist +server=/friendfeed.com/127.0.0.1#5335 +ipset=/friendfeed.com/gfwlist +server=/hifixxx.fun/127.0.0.1#5335 +ipset=/hifixxx.fun/gfwlist +server=/google.co/127.0.0.1#5335 +ipset=/google.co/gfwlist +server=/kichikuou.com/127.0.0.1#5335 +ipset=/kichikuou.com/gfwlist +server=/babes34.com/127.0.0.1#5335 +ipset=/babes34.com/gfwlist +server=/elsevier.com/127.0.0.1#5335 +ipset=/elsevier.com/gfwlist +server=/tsquare.tv/127.0.0.1#5335 +ipset=/tsquare.tv/gfwlist +server=/starbucksslovakia.sk/127.0.0.1#5335 +ipset=/starbucksslovakia.sk/gfwlist +server=/darkageofcamelot.com/127.0.0.1#5335 +ipset=/darkageofcamelot.com/gfwlist +server=/starbucksromania.ro/127.0.0.1#5335 +ipset=/starbucksromania.ro/gfwlist +server=/avstar06.me/127.0.0.1#5335 +ipset=/avstar06.me/gfwlist +server=/cuckoldwifetube.com/127.0.0.1#5335 +ipset=/cuckoldwifetube.com/gfwlist +server=/yzzk.com/127.0.0.1#5335 +ipset=/yzzk.com/gfwlist +server=/mediawiki.org/127.0.0.1#5335 +ipset=/mediawiki.org/gfwlist +server=/starbucksreserve.com/127.0.0.1#5335 +ipset=/starbucksreserve.com/gfwlist +server=/starbucksforlife.ca/127.0.0.1#5335 +ipset=/starbucksforlife.ca/gfwlist +server=/starbuckscoffeegearstore.com/127.0.0.1#5335 +ipset=/starbuckscoffeegearstore.com/gfwlist +server=/sharks-lagoon.fr/127.0.0.1#5335 +ipset=/sharks-lagoon.fr/gfwlist +server=/starbuckscoffee.cz/127.0.0.1#5335 +ipset=/starbuckscoffee.cz/gfwlist +server=/starbuckscardb2b.com/127.0.0.1#5335 +ipset=/starbuckscardb2b.com/gfwlist +server=/volvobrandshop.com/127.0.0.1#5335 +ipset=/volvobrandshop.com/gfwlist +server=/starbucksavie.ca/127.0.0.1#5335 +ipset=/starbucksavie.ca/gfwlist +server=/ebayworlds.com/127.0.0.1#5335 +ipset=/ebayworlds.com/gfwlist +server=/starbucksathome.com/127.0.0.1#5335 +ipset=/starbucksathome.com/gfwlist +server=/insidevoa.com/127.0.0.1#5335 +ipset=/insidevoa.com/gfwlist +server=/starbucks.tt/127.0.0.1#5335 +ipset=/starbucks.tt/gfwlist +server=/webgirlsonline.net/127.0.0.1#5335 +ipset=/webgirlsonline.net/gfwlist +server=/starbucks.se/127.0.0.1#5335 +ipset=/starbucks.se/gfwlist +server=/starbucks.ru/127.0.0.1#5335 +ipset=/starbucks.ru/gfwlist +server=/starbucks.rs/127.0.0.1#5335 +ipset=/starbucks.rs/gfwlist +server=/freecodecamp.org/127.0.0.1#5335 +ipset=/freecodecamp.org/gfwlist +server=/starbucks.pt/127.0.0.1#5335 +ipset=/starbucks.pt/gfwlist +server=/bmw-motorrad.sa/127.0.0.1#5335 +ipset=/bmw-motorrad.sa/gfwlist +server=/paypal-portal.com/127.0.0.1#5335 +ipset=/paypal-portal.com/gfwlist +server=/starbucks.pl/127.0.0.1#5335 +ipset=/starbucks.pl/gfwlist +server=/apple.me/127.0.0.1#5335 +ipset=/apple.me/gfwlist +server=/b-ok.global/127.0.0.1#5335 +ipset=/b-ok.global/gfwlist +server=/kendralist.com/127.0.0.1#5335 +ipset=/kendralist.com/gfwlist +server=/erohentai.net/127.0.0.1#5335 +ipset=/erohentai.net/gfwlist +server=/screenwisetrends.com/127.0.0.1#5335 +ipset=/screenwisetrends.com/gfwlist +server=/starbucks.nl/127.0.0.1#5335 +ipset=/starbucks.nl/gfwlist +server=/cuckoldwifesexxx.com/127.0.0.1#5335 +ipset=/cuckoldwifesexxx.com/gfwlist +server=/sexfilmstube.com/127.0.0.1#5335 +ipset=/sexfilmstube.com/gfwlist +server=/starbucks.it/127.0.0.1#5335 +ipset=/starbucks.it/gfwlist +server=/ebayd.com/127.0.0.1#5335 +ipset=/ebayd.com/gfwlist +server=/xxxhd.pro/127.0.0.1#5335 +ipset=/xxxhd.pro/gfwlist +server=/ebay-fashion.com/127.0.0.1#5335 +ipset=/ebay-fashion.com/gfwlist +server=/starbucks.in/127.0.0.1#5335 +ipset=/starbucks.in/gfwlist +server=/koalaporn.com/127.0.0.1#5335 +ipset=/koalaporn.com/gfwlist +server=/pornofiles.ru/127.0.0.1#5335 +ipset=/pornofiles.ru/gfwlist +server=/zoomobileporn.com/127.0.0.1#5335 +ipset=/zoomobileporn.com/gfwlist +server=/paypalcreditcard.com/127.0.0.1#5335 +ipset=/paypalcreditcard.com/gfwlist +server=/starbucks.hu/127.0.0.1#5335 +ipset=/starbucks.hu/gfwlist +server=/faceboik.com/127.0.0.1#5335 +ipset=/faceboik.com/gfwlist +server=/bestbuyphotoworkshoptours.com/127.0.0.1#5335 +ipset=/bestbuyphotoworkshoptours.com/gfwlist +server=/starbucks.com.uy/127.0.0.1#5335 +ipset=/starbucks.com.uy/gfwlist +server=/starbucks.com.pe/127.0.0.1#5335 +ipset=/starbucks.com.pe/gfwlist +server=/starbucks.com.my/127.0.0.1#5335 +ipset=/starbucks.com.my/gfwlist +server=/starbucks.com.kh/127.0.0.1#5335 +ipset=/starbucks.com.kh/gfwlist +server=/starbucks.com.hk/127.0.0.1#5335 +ipset=/starbucks.com.hk/gfwlist +server=/starbucks.com.cy/127.0.0.1#5335 +ipset=/starbucks.com.cy/gfwlist +server=/durex.fr/127.0.0.1#5335 +ipset=/durex.fr/gfwlist +server=/starbucks.com/127.0.0.1#5335 +ipset=/starbucks.com/gfwlist +server=/hxdoll.com/127.0.0.1#5335 +ipset=/hxdoll.com/gfwlist +server=/starbucks.co.jp/127.0.0.1#5335 +ipset=/starbucks.co.jp/gfwlist +server=/starbucks.bg/127.0.0.1#5335 +ipset=/starbucks.bg/gfwlist +server=/starbucks.be/127.0.0.1#5335 +ipset=/starbucks.be/gfwlist +server=/starbucks.at/127.0.0.1#5335 +ipset=/starbucks.at/gfwlist +server=/apple.my/127.0.0.1#5335 +ipset=/apple.my/gfwlist +server=/disneymagicmoments.co.za/127.0.0.1#5335 +ipset=/disneymagicmoments.co.za/gfwlist +server=/starbucks-stars.com/127.0.0.1#5335 +ipset=/starbucks-stars.com/gfwlist +server=/sbuxcard.com/127.0.0.1#5335 +ipset=/sbuxcard.com/gfwlist +server=/hpto.net/127.0.0.1#5335 +ipset=/hpto.net/gfwlist +server=/sbux.com.my/127.0.0.1#5335 +ipset=/sbux.com.my/gfwlist +server=/hulu.tv/127.0.0.1#5335 +ipset=/hulu.tv/gfwlist +server=/scenesource.me/127.0.0.1#5335 +ipset=/scenesource.me/gfwlist +server=/thinkofliving.com/127.0.0.1#5335 +ipset=/thinkofliving.com/gfwlist +server=/javheroine.com/127.0.0.1#5335 +ipset=/javheroine.com/gfwlist +server=/realtor.com/127.0.0.1#5335 +ipset=/realtor.com/gfwlist +server=/caribbeancompr.com/127.0.0.1#5335 +ipset=/caribbeancompr.com/gfwlist +server=/porn-portal.com/127.0.0.1#5335 +ipset=/porn-portal.com/gfwlist +server=/realcommercial.com.au/127.0.0.1#5335 +ipset=/realcommercial.com.au/gfwlist +server=/rea.tech/127.0.0.1#5335 +ipset=/rea.tech/gfwlist +server=/adblockplus.org/127.0.0.1#5335 +ipset=/adblockplus.org/gfwlist +server=/rea.global/127.0.0.1#5335 +ipset=/rea.global/gfwlist +server=/rea-group.com/127.0.0.1#5335 +ipset=/rea-group.com/gfwlist +server=/iphonecollcase.com/127.0.0.1#5335 +ipset=/iphonecollcase.com/gfwlist +server=/adobe.com/127.0.0.1#5335 +ipset=/adobe.com/gfwlist +server=/8008206616.com/127.0.0.1#5335 +ipset=/8008206616.com/gfwlist +server=/adbkm.com/127.0.0.1#5335 +ipset=/adbkm.com/gfwlist +server=/proptiger.com/127.0.0.1#5335 +ipset=/proptiger.com/gfwlist +server=/myfun.com/127.0.0.1#5335 +ipset=/myfun.com/gfwlist +server=/move.com/127.0.0.1#5335 +ipset=/move.com/gfwlist +server=/technews.tw/127.0.0.1#5335 +ipset=/technews.tw/gfwlist +server=/makaan.com/127.0.0.1#5335 +ipset=/makaan.com/gfwlist +server=/iproperty.com.my/127.0.0.1#5335 +ipset=/iproperty.com.my/gfwlist +server=/housingcdn.com/127.0.0.1#5335 +ipset=/housingcdn.com/gfwlist +server=/hometrack.com.au/127.0.0.1#5335 +ipset=/hometrack.com.au/gfwlist +server=/bmwi.jp/127.0.0.1#5335 +ipset=/bmwi.jp/gfwlist +server=/facesounds.com/127.0.0.1#5335 +ipset=/facesounds.com/gfwlist +server=/azathabar.com/127.0.0.1#5335 +ipset=/azathabar.com/gfwlist +server=/playboyplus.com/127.0.0.1#5335 +ipset=/playboyplus.com/gfwlist +server=/123videos.tv/127.0.0.1#5335 +ipset=/123videos.tv/gfwlist +server=/shemalemodelstube.com/127.0.0.1#5335 +ipset=/shemalemodelstube.com/gfwlist +server=/reckittbenckiser.net/127.0.0.1#5335 +ipset=/reckittbenckiser.net/gfwlist +server=/reckittbenckiser.com/127.0.0.1#5335 +ipset=/reckittbenckiser.com/gfwlist +server=/reckitt.net/127.0.0.1#5335 +ipset=/reckitt.net/gfwlist +server=/rbplc.com/127.0.0.1#5335 +ipset=/rbplc.com/gfwlist +server=/rbgrads.com/127.0.0.1#5335 +ipset=/rbgrads.com/gfwlist +server=/pplusstatic.com/127.0.0.1#5335 +ipset=/pplusstatic.com/gfwlist +server=/rb.com/127.0.0.1#5335 +ipset=/rb.com/gfwlist +server=/porntry.com/127.0.0.1#5335 +ipset=/porntry.com/gfwlist +server=/offerairjordanlebron.com/127.0.0.1#5335 +ipset=/offerairjordanlebron.com/gfwlist +server=/gettr.com/127.0.0.1#5335 +ipset=/gettr.com/gfwlist +server=/avxhm.se/127.0.0.1#5335 +ipset=/avxhm.se/gfwlist +server=/woolite.us/127.0.0.1#5335 +ipset=/woolite.us/gfwlist +server=/kobe-pastel.com/127.0.0.1#5335 +ipset=/kobe-pastel.com/gfwlist +server=/woolite.pl/127.0.0.1#5335 +ipset=/woolite.pl/gfwlist +server=/woolite.ca/127.0.0.1#5335 +ipset=/woolite.ca/gfwlist +server=/veetcentroamerica.com/127.0.0.1#5335 +ipset=/veetcentroamerica.com/gfwlist +server=/veet.ru/127.0.0.1#5335 +ipset=/veet.ru/gfwlist +server=/visa.gp/127.0.0.1#5335 +ipset=/visa.gp/gfwlist +server=/veet.pt/127.0.0.1#5335 +ipset=/veet.pt/gfwlist +server=/veet.nl/127.0.0.1#5335 +ipset=/veet.nl/gfwlist +server=/creativecloud.com/127.0.0.1#5335 +ipset=/creativecloud.com/gfwlist +server=/veet.jp/127.0.0.1#5335 +ipset=/veet.jp/gfwlist +server=/thesffblog.com/127.0.0.1#5335 +ipset=/thesffblog.com/gfwlist +server=/nudevista.com/127.0.0.1#5335 +ipset=/nudevista.com/gfwlist +server=/veet.hu/127.0.0.1#5335 +ipset=/veet.hu/gfwlist +server=/sexbomba.ru/127.0.0.1#5335 +ipset=/sexbomba.ru/gfwlist +server=/veet.fi/127.0.0.1#5335 +ipset=/veet.fi/gfwlist +server=/veet.es/127.0.0.1#5335 +ipset=/veet.es/gfwlist +server=/myhentaicomics.com/127.0.0.1#5335 +ipset=/myhentaicomics.com/gfwlist +server=/newxxx24.cc/127.0.0.1#5335 +ipset=/newxxx24.cc/gfwlist +server=/veet.dk/127.0.0.1#5335 +ipset=/veet.dk/gfwlist +server=/veet.com.tr/127.0.0.1#5335 +ipset=/veet.com.tr/gfwlist +server=/veet.com.ph/127.0.0.1#5335 +ipset=/veet.com.ph/gfwlist +server=/beatsfactoryoutles.com/127.0.0.1#5335 +ipset=/beatsfactoryoutles.com/gfwlist +server=/veet.com.hk/127.0.0.1#5335 +ipset=/veet.com.hk/gfwlist +server=/veet.com.co/127.0.0.1#5335 +ipset=/veet.com.co/gfwlist +server=/veet.com.br/127.0.0.1#5335 +ipset=/veet.com.br/gfwlist +server=/swisssigngroup.com/127.0.0.1#5335 +ipset=/swisssigngroup.com/gfwlist +server=/veet.com.bd/127.0.0.1#5335 +ipset=/veet.com.bd/gfwlist +server=/fox5storm.com/127.0.0.1#5335 +ipset=/fox5storm.com/gfwlist +server=/newsupermariobrosu.com/127.0.0.1#5335 +ipset=/newsupermariobrosu.com/gfwlist +server=/veet.com.au/127.0.0.1#5335 +ipset=/veet.com.au/gfwlist +server=/discordapp.com/127.0.0.1#5335 +ipset=/discordapp.com/gfwlist +server=/veet.co.za/127.0.0.1#5335 +ipset=/veet.co.za/gfwlist +server=/18porncomic.com/127.0.0.1#5335 +ipset=/18porncomic.com/gfwlist +server=/mastercard.com.ve/127.0.0.1#5335 +ipset=/mastercard.com.ve/gfwlist +server=/veet.co.id/127.0.0.1#5335 +ipset=/veet.co.id/gfwlist +server=/veet.ch/127.0.0.1#5335 +ipset=/veet.ch/gfwlist +server=/porndeals.com/127.0.0.1#5335 +ipset=/porndeals.com/gfwlist +server=/icloudo.de/127.0.0.1#5335 +ipset=/icloudo.de/gfwlist +server=/phncdn.com/127.0.0.1#5335 +ipset=/phncdn.com/gfwlist +server=/tubepornup.com/127.0.0.1#5335 +ipset=/tubepornup.com/gfwlist +server=/vanishinfo.cz/127.0.0.1#5335 +ipset=/vanishinfo.cz/gfwlist +server=/vanishbancaseulook.com.br/127.0.0.1#5335 +ipset=/vanishbancaseulook.com.br/gfwlist +server=/vanisharabia.com/127.0.0.1#5335 +ipset=/vanisharabia.com/gfwlist +server=/renovacionxboxlive.com/127.0.0.1#5335 +ipset=/renovacionxboxlive.com/gfwlist +server=/mastercardbusinessnetwork.com/127.0.0.1#5335 +ipset=/mastercardbusinessnetwork.com/gfwlist +server=/vanish.hu/127.0.0.1#5335 +ipset=/vanish.hu/gfwlist +server=/nudefiles.net/127.0.0.1#5335 +ipset=/nudefiles.net/gfwlist +server=/abematv.akamaized.net/127.0.0.1#5335 +ipset=/abematv.akamaized.net/gfwlist +server=/milfthreesomes.com/127.0.0.1#5335 +ipset=/milfthreesomes.com/gfwlist +server=/vanish.fi/127.0.0.1#5335 +ipset=/vanish.fi/gfwlist +server=/xxxgames.biz/127.0.0.1#5335 +ipset=/xxxgames.biz/gfwlist +server=/vanish.de/127.0.0.1#5335 +ipset=/vanish.de/gfwlist +server=/vanish.com.sg/127.0.0.1#5335 +ipset=/vanish.com.sg/gfwlist +server=/nikeproduct.com/127.0.0.1#5335 +ipset=/nikeproduct.com/gfwlist +server=/vanish.com.my/127.0.0.1#5335 +ipset=/vanish.com.my/gfwlist +server=/royalcams.com/127.0.0.1#5335 +ipset=/royalcams.com/gfwlist +server=/niceanimegames.com/127.0.0.1#5335 +ipset=/niceanimegames.com/gfwlist +server=/epochtimestr.com/127.0.0.1#5335 +ipset=/epochtimestr.com/gfwlist +server=/seaporn.org/127.0.0.1#5335 +ipset=/seaporn.org/gfwlist +server=/mail.ru/127.0.0.1#5335 +ipset=/mail.ru/gfwlist +server=/hayabusa.media/127.0.0.1#5335 +ipset=/hayabusa.media/gfwlist +server=/mucinex.ca/127.0.0.1#5335 +ipset=/mucinex.ca/gfwlist +server=/vanish.co.nz/127.0.0.1#5335 +ipset=/vanish.co.nz/gfwlist +server=/game-platform.net/127.0.0.1#5335 +ipset=/game-platform.net/gfwlist +server=/ciscopartnermarketing.com/127.0.0.1#5335 +ipset=/ciscopartnermarketing.com/gfwlist +server=/vanish.co.il/127.0.0.1#5335 +ipset=/vanish.co.il/gfwlist +server=/sexei.net/127.0.0.1#5335 +ipset=/sexei.net/gfwlist +server=/area120.com/127.0.0.1#5335 +ipset=/area120.com/gfwlist +server=/vanish.cl/127.0.0.1#5335 +ipset=/vanish.cl/gfwlist +server=/verisign.co.uk/127.0.0.1#5335 +ipset=/verisign.co.uk/gfwlist +server=/static-hamivideo.cdn.hinet.net/127.0.0.1#5335 +ipset=/static-hamivideo.cdn.hinet.net/gfwlist +server=/bmw-welt.net/127.0.0.1#5335 +ipset=/bmw-welt.net/gfwlist +server=/miniso.uz/127.0.0.1#5335 +ipset=/miniso.uz/gfwlist +server=/vanish.be/127.0.0.1#5335 +ipset=/vanish.be/gfwlist +server=/pornerbros.com/127.0.0.1#5335 +ipset=/pornerbros.com/gfwlist +server=/spraynwash.com/127.0.0.1#5335 +ipset=/spraynwash.com/gfwlist +server=/google.iq/127.0.0.1#5335 +ipset=/google.iq/gfwlist +server=/strepsils.us/127.0.0.1#5335 +ipset=/strepsils.us/gfwlist +server=/xn--hhr917d3fecva.xyz/127.0.0.1#5335 +ipset=/xn--hhr917d3fecva.xyz/gfwlist +server=/ntdca.com/127.0.0.1#5335 +ipset=/ntdca.com/gfwlist +server=/grabpussy.com/127.0.0.1#5335 +ipset=/grabpussy.com/gfwlist +server=/strepsils.ro/127.0.0.1#5335 +ipset=/strepsils.ro/gfwlist +server=/strepsils.pl/127.0.0.1#5335 +ipset=/strepsils.pl/gfwlist +server=/strepsils.net/127.0.0.1#5335 +ipset=/strepsils.net/gfwlist +server=/sextubehub.com/127.0.0.1#5335 +ipset=/sextubehub.com/gfwlist +server=/strepsils.ie/127.0.0.1#5335 +ipset=/strepsils.ie/gfwlist +server=/strepsils.hu/127.0.0.1#5335 +ipset=/strepsils.hu/gfwlist +server=/javfv.com/127.0.0.1#5335 +ipset=/javfv.com/gfwlist +server=/vhx.tv/127.0.0.1#5335 +ipset=/vhx.tv/gfwlist +server=/strepsils.fr/127.0.0.1#5335 +ipset=/strepsils.fr/gfwlist +server=/strepsils.fi/127.0.0.1#5335 +ipset=/strepsils.fi/gfwlist +server=/strepsils.com.au/127.0.0.1#5335 +ipset=/strepsils.com.au/gfwlist +server=/bustynudebabes.com/127.0.0.1#5335 +ipset=/bustynudebabes.com/gfwlist +server=/mastercard.com.bh/127.0.0.1#5335 +ipset=/mastercard.com.bh/gfwlist +server=/getfappy.com/127.0.0.1#5335 +ipset=/getfappy.com/gfwlist +server=/strepsils.com.br/127.0.0.1#5335 +ipset=/strepsils.com.br/gfwlist +server=/strepsils.co.za/127.0.0.1#5335 +ipset=/strepsils.co.za/gfwlist +server=/cdninstagram.com/127.0.0.1#5335 +ipset=/cdninstagram.com/gfwlist +server=/strepsils.co.nz/127.0.0.1#5335 +ipset=/strepsils.co.nz/gfwlist +server=/thtmod1.com/127.0.0.1#5335 +ipset=/thtmod1.com/gfwlist +server=/dobendan.de/127.0.0.1#5335 +ipset=/dobendan.de/gfwlist +server=/cepacol.com/127.0.0.1#5335 +ipset=/cepacol.com/gfwlist +server=/beatsdresolo2013.com/127.0.0.1#5335 +ipset=/beatsdresolo2013.com/gfwlist +server=/minimoncton.com/127.0.0.1#5335 +ipset=/minimoncton.com/gfwlist +server=/linguee.com/127.0.0.1#5335 +ipset=/linguee.com/gfwlist +server=/nurofensk-prod-env.eu-west-1.elasticbeanstalk.com/127.0.0.1#5335 +ipset=/nurofensk-prod-env.eu-west-1.elasticbeanstalk.com/gfwlist +server=/nurofen.sk/127.0.0.1#5335 +ipset=/nurofen.sk/gfwlist +server=/nurofen.ro/127.0.0.1#5335 +ipset=/nurofen.ro/gfwlist +server=/cmhalq.com/127.0.0.1#5335 +ipset=/cmhalq.com/gfwlist +server=/nurofen.pt/127.0.0.1#5335 +ipset=/nurofen.pt/gfwlist +server=/icloud.jp/127.0.0.1#5335 +ipset=/icloud.jp/gfwlist +server=/nurofen.pl/127.0.0.1#5335 +ipset=/nurofen.pl/gfwlist +server=/desktopmovie.com/127.0.0.1#5335 +ipset=/desktopmovie.com/gfwlist +server=/bridgestone.co.cr/127.0.0.1#5335 +ipset=/bridgestone.co.cr/gfwlist +server=/hentaiasmr.moe/127.0.0.1#5335 +ipset=/hentaiasmr.moe/gfwlist +server=/nurofen.co.za/127.0.0.1#5335 +ipset=/nurofen.co.za/gfwlist +server=/beatbydrekopen.com/127.0.0.1#5335 +ipset=/beatbydrekopen.com/gfwlist +server=/puresexmovies.com/127.0.0.1#5335 +ipset=/puresexmovies.com/gfwlist +server=/dldlinks.com/127.0.0.1#5335 +ipset=/dldlinks.com/gfwlist +server=/sorcerersarena.com/127.0.0.1#5335 +ipset=/sorcerersarena.com/gfwlist +server=/nurofen.fr/127.0.0.1#5335 +ipset=/nurofen.fr/gfwlist +server=/sandisk.sg/127.0.0.1#5335 +ipset=/sandisk.sg/gfwlist +server=/nurofen.com.sg/127.0.0.1#5335 +ipset=/nurofen.com.sg/gfwlist +server=/w3schools.com/127.0.0.1#5335 +ipset=/w3schools.com/gfwlist +server=/nurofen.com.au/127.0.0.1#5335 +ipset=/nurofen.com.au/gfwlist +server=/nurofen.net/127.0.0.1#5335 +ipset=/nurofen.net/gfwlist +server=/faceboon.com/127.0.0.1#5335 +ipset=/faceboon.com/gfwlist +server=/google.com.mm/127.0.0.1#5335 +ipset=/google.com.mm/gfwlist +server=/myfreepaysite.com/127.0.0.1#5335 +ipset=/myfreepaysite.com/gfwlist +server=/nurofen.co.il/127.0.0.1#5335 +ipset=/nurofen.co.il/gfwlist +server=/mucinex.tv/127.0.0.1#5335 +ipset=/mucinex.tv/gfwlist +server=/mucinex.net/127.0.0.1#5335 +ipset=/mucinex.net/gfwlist +server=/mucinex.com/127.0.0.1#5335 +ipset=/mucinex.com/gfwlist +server=/faceidglobal.com/127.0.0.1#5335 +ipset=/faceidglobal.com/gfwlist +server=/vanish.com.ar/127.0.0.1#5335 +ipset=/vanish.com.ar/gfwlist +server=/schiffvitamins.com/127.0.0.1#5335 +ipset=/schiffvitamins.com/gfwlist +server=/bestialityvideo.us/127.0.0.1#5335 +ipset=/bestialityvideo.us/gfwlist +server=/pifpafarabia.com/127.0.0.1#5335 +ipset=/pifpafarabia.com/gfwlist +server=/toosexyvaginas.com/127.0.0.1#5335 +ipset=/toosexyvaginas.com/gfwlist +server=/cheapheadphonesland.com/127.0.0.1#5335 +ipset=/cheapheadphonesland.com/gfwlist +server=/iphone-x.tv/127.0.0.1#5335 +ipset=/iphone-x.tv/gfwlist +server=/playnft.es.ht/127.0.0.1#5335 +ipset=/playnft.es.ht/gfwlist +server=/toppornguide.com/127.0.0.1#5335 +ipset=/toppornguide.com/gfwlist +server=/mortein.com/127.0.0.1#5335 +ipset=/mortein.com/gfwlist +server=/foxsportsracing.com/127.0.0.1#5335 +ipset=/foxsportsracing.com/gfwlist +server=/akasha.world/127.0.0.1#5335 +ipset=/akasha.world/gfwlist +server=/meadjohnson.com.hk/127.0.0.1#5335 +ipset=/meadjohnson.com.hk/gfwlist +server=/intel.gr/127.0.0.1#5335 +ipset=/intel.gr/gfwlist +server=/meadjohnson.com/127.0.0.1#5335 +ipset=/meadjohnson.com/gfwlist +server=/sandisk.com.au/127.0.0.1#5335 +ipset=/sandisk.com.au/gfwlist +server=/lysol.ca/127.0.0.1#5335 +ipset=/lysol.ca/gfwlist +server=/finishinfo.fi/127.0.0.1#5335 +ipset=/finishinfo.fi/gfwlist +server=/finishinfo.com.ar/127.0.0.1#5335 +ipset=/finishinfo.com.ar/gfwlist +server=/mini.com.co/127.0.0.1#5335 +ipset=/mini.com.co/gfwlist +server=/registry.google/127.0.0.1#5335 +ipset=/registry.google/gfwlist +server=/finishdishwashing.com/127.0.0.1#5335 +ipset=/finishdishwashing.com/gfwlist +server=/whengirlsplay.com/127.0.0.1#5335 +ipset=/whengirlsplay.com/gfwlist +server=/finishdishwashing.ca/127.0.0.1#5335 +ipset=/finishdishwashing.ca/gfwlist +server=/finisharabia.com/127.0.0.1#5335 +ipset=/finisharabia.com/gfwlist +server=/myfoxboston.com/127.0.0.1#5335 +ipset=/myfoxboston.com/gfwlist +server=/finish.sk/127.0.0.1#5335 +ipset=/finish.sk/gfwlist +server=/japanfist.org/127.0.0.1#5335 +ipset=/japanfist.org/gfwlist +server=/finish.si/127.0.0.1#5335 +ipset=/finish.si/gfwlist +server=/perverse.sex/127.0.0.1#5335 +ipset=/perverse.sex/gfwlist +server=/youtube.com.gr/127.0.0.1#5335 +ipset=/youtube.com.gr/gfwlist +server=/infinitetube.com/127.0.0.1#5335 +ipset=/infinitetube.com/gfwlist +server=/bridgestonegolf.com/127.0.0.1#5335 +ipset=/bridgestonegolf.com/gfwlist +server=/finish.pl/127.0.0.1#5335 +ipset=/finish.pl/gfwlist +server=/finish.hu/127.0.0.1#5335 +ipset=/finish.hu/gfwlist +server=/prostores.com/127.0.0.1#5335 +ipset=/prostores.com/gfwlist +server=/finish.gr/127.0.0.1#5335 +ipset=/finish.gr/gfwlist +server=/grannylovesyoungcock.com/127.0.0.1#5335 +ipset=/grannylovesyoungcock.com/gfwlist +server=/finish.fr/127.0.0.1#5335 +ipset=/finish.fr/gfwlist +server=/finish.es/127.0.0.1#5335 +ipset=/finish.es/gfwlist +server=/finish.de/127.0.0.1#5335 +ipset=/finish.de/gfwlist +server=/hqporner.com/127.0.0.1#5335 +ipset=/hqporner.com/gfwlist +server=/google.co.vi/127.0.0.1#5335 +ipset=/google.co.vi/gfwlist +server=/finish.com.hr/127.0.0.1#5335 +ipset=/finish.com.hr/gfwlist +server=/yahoo.com.tr/127.0.0.1#5335 +ipset=/yahoo.com.tr/gfwlist +server=/finish.co.nz/127.0.0.1#5335 +ipset=/finish.co.nz/gfwlist +server=/youtube.com.bh/127.0.0.1#5335 +ipset=/youtube.com.bh/gfwlist +server=/wpewebkit.org/127.0.0.1#5335 +ipset=/wpewebkit.org/gfwlist +server=/buyminibeatbox.com/127.0.0.1#5335 +ipset=/buyminibeatbox.com/gfwlist +server=/pornobrasil.com/127.0.0.1#5335 +ipset=/pornobrasil.com/gfwlist +server=/nutramigen.pl/127.0.0.1#5335 +ipset=/nutramigen.pl/gfwlist +server=/pornoecuadorxxx.com/127.0.0.1#5335 +ipset=/pornoecuadorxxx.com/gfwlist +server=/enspireformula.com/127.0.0.1#5335 +ipset=/enspireformula.com/gfwlist +server=/huobiasia.vip/127.0.0.1#5335 +ipset=/huobiasia.vip/gfwlist +server=/enfamil.pt/127.0.0.1#5335 +ipset=/enfamil.pt/gfwlist +server=/enfamil.ca/127.0.0.1#5335 +ipset=/enfamil.ca/gfwlist +server=/enfamama.com.ph/127.0.0.1#5335 +ipset=/enfamama.com.ph/gfwlist +server=/facebooll.com/127.0.0.1#5335 +ipset=/facebooll.com/gfwlist +server=/thomsonreuters.ca/127.0.0.1#5335 +ipset=/thomsonreuters.ca/gfwlist +server=/enfagrow.com.sg/127.0.0.1#5335 +ipset=/enfagrow.com.sg/gfwlist +server=/enfagrow.com.my/127.0.0.1#5335 +ipset=/enfagrow.com.my/gfwlist +server=/applestore.net.gr/127.0.0.1#5335 +ipset=/applestore.net.gr/gfwlist +server=/enfagrow.co.in/127.0.0.1#5335 +ipset=/enfagrow.co.in/gfwlist +server=/enfabebe3.com.ar/127.0.0.1#5335 +ipset=/enfabebe3.com.ar/gfwlist +server=/mini.at/127.0.0.1#5335 +ipset=/mini.at/gfwlist +server=/sexhd.pics/127.0.0.1#5335 +ipset=/sexhd.pics/gfwlist +server=/hentaiplay.net/127.0.0.1#5335 +ipset=/hentaiplay.net/gfwlist +server=/enfabebe.com.ve/127.0.0.1#5335 +ipset=/enfabebe.com.ve/gfwlist +server=/enfabebe.com.pe/127.0.0.1#5335 +ipset=/enfabebe.com.pe/gfwlist +server=/enfabebe.com.ec/127.0.0.1#5335 +ipset=/enfabebe.com.ec/gfwlist +server=/enfabebe.com.co/127.0.0.1#5335 +ipset=/enfabebe.com.co/gfwlist +server=/enfabebe.com.br/127.0.0.1#5335 +ipset=/enfabebe.com.br/gfwlist +server=/enfababy.com/127.0.0.1#5335 +ipset=/enfababy.com/gfwlist +server=/enfaaplus.com/127.0.0.1#5335 +ipset=/enfaaplus.com/gfwlist +server=/xxxn.tv/127.0.0.1#5335 +ipset=/xxxn.tv/gfwlist +server=/enfa.co.id/127.0.0.1#5335 +ipset=/enfa.co.id/gfwlist +server=/zoos.gold/127.0.0.1#5335 +ipset=/zoos.gold/gfwlist +server=/bannedbook.org/127.0.0.1#5335 +ipset=/bannedbook.org/gfwlist +server=/bebepremium3.com.bo/127.0.0.1#5335 +ipset=/bebepremium3.com.bo/gfwlist +server=/mrpinks.com/127.0.0.1#5335 +ipset=/mrpinks.com/gfwlist +server=/drdreheadphonebeats.com/127.0.0.1#5335 +ipset=/drdreheadphonebeats.com/gfwlist +server=/trydurex.tv/127.0.0.1#5335 +ipset=/trydurex.tv/gfwlist +server=/trydurex.net/127.0.0.1#5335 +ipset=/trydurex.net/gfwlist +server=/hooloo.tv/127.0.0.1#5335 +ipset=/hooloo.tv/gfwlist +server=/playbydurex.com/127.0.0.1#5335 +ipset=/playbydurex.com/gfwlist +server=/durexchina.com/127.0.0.1#5335 +ipset=/durexchina.com/gfwlist +server=/brutalfetish.com/127.0.0.1#5335 +ipset=/brutalfetish.com/gfwlist +server=/microsoft.it/127.0.0.1#5335 +ipset=/microsoft.it/gfwlist +server=/durexcam.com/127.0.0.1#5335 +ipset=/durexcam.com/gfwlist +server=/amateurarchiver.com/127.0.0.1#5335 +ipset=/amateurarchiver.com/gfwlist +server=/hentai4free.net/127.0.0.1#5335 +ipset=/hentai4free.net/gfwlist +server=/gputechconf.com.tw/127.0.0.1#5335 +ipset=/gputechconf.com.tw/gfwlist +server=/dodgersexcartoons.com/127.0.0.1#5335 +ipset=/dodgersexcartoons.com/gfwlist +server=/watchinese.com/127.0.0.1#5335 +ipset=/watchinese.com/gfwlist +server=/quanben.io/127.0.0.1#5335 +ipset=/quanben.io/gfwlist +server=/docs.com/127.0.0.1#5335 +ipset=/docs.com/gfwlist +server=/marketo.net/127.0.0.1#5335 +ipset=/marketo.net/gfwlist +server=/xxx-videos.tv/127.0.0.1#5335 +ipset=/xxx-videos.tv/gfwlist +server=/durex.mx/127.0.0.1#5335 +ipset=/durex.mx/gfwlist +server=/awsedstart.com/127.0.0.1#5335 +ipset=/awsedstart.com/gfwlist +server=/google.bf/127.0.0.1#5335 +ipset=/google.bf/gfwlist +server=/durex.it/127.0.0.1#5335 +ipset=/durex.it/gfwlist +server=/durex.hu/127.0.0.1#5335 +ipset=/durex.hu/gfwlist +server=/rolls-roycecullinan.com/127.0.0.1#5335 +ipset=/rolls-roycecullinan.com/gfwlist +server=/starbucks.com.ar/127.0.0.1#5335 +ipset=/starbucks.com.ar/gfwlist +server=/amateuranalporn.com/127.0.0.1#5335 +ipset=/amateuranalporn.com/gfwlist +server=/mcdonaldsarabia.com/127.0.0.1#5335 +ipset=/mcdonaldsarabia.com/gfwlist +server=/bmw-motorsport.com/127.0.0.1#5335 +ipset=/bmw-motorsport.com/gfwlist +server=/durex.fi/127.0.0.1#5335 +ipset=/durex.fi/gfwlist +server=/durex.ee/127.0.0.1#5335 +ipset=/durex.ee/gfwlist +server=/verisign.biz/127.0.0.1#5335 +ipset=/verisign.biz/gfwlist +server=/durex.de/127.0.0.1#5335 +ipset=/durex.de/gfwlist +server=/jetbrains.net/127.0.0.1#5335 +ipset=/jetbrains.net/gfwlist +server=/elixir-lang.org/127.0.0.1#5335 +ipset=/elixir-lang.org/gfwlist +server=/fap666.com/127.0.0.1#5335 +ipset=/fap666.com/gfwlist +server=/durex.com.pk/127.0.0.1#5335 +ipset=/durex.com.pk/gfwlist +server=/durex.com.ph/127.0.0.1#5335 +ipset=/durex.com.ph/gfwlist +server=/intel.yt/127.0.0.1#5335 +ipset=/intel.yt/gfwlist +server=/naughtymag.com/127.0.0.1#5335 +ipset=/naughtymag.com/gfwlist +server=/adhelpnews.com/127.0.0.1#5335 +ipset=/adhelpnews.com/gfwlist +server=/durex.com.bd/127.0.0.1#5335 +ipset=/durex.com.bd/gfwlist +server=/bmw.cz/127.0.0.1#5335 +ipset=/bmw.cz/gfwlist +server=/visiontimesjp.com/127.0.0.1#5335 +ipset=/visiontimesjp.com/gfwlist +server=/durex.com.au/127.0.0.1#5335 +ipset=/durex.com.au/gfwlist +server=/disney.com.hk/127.0.0.1#5335 +ipset=/disney.com.hk/gfwlist +server=/2buybeatsbydre.com/127.0.0.1#5335 +ipset=/2buybeatsbydre.com/gfwlist +server=/durex.co.uk/127.0.0.1#5335 +ipset=/durex.co.uk/gfwlist +server=/durex.co.id/127.0.0.1#5335 +ipset=/durex.co.id/gfwlist +server=/aimsciences.org/127.0.0.1#5335 +ipset=/aimsciences.org/gfwlist +server=/popcap.com/127.0.0.1#5335 +ipset=/popcap.com/gfwlist +server=/iphoneclaro.com.br/127.0.0.1#5335 +ipset=/iphoneclaro.com.br/gfwlist +server=/durex.be/127.0.0.1#5335 +ipset=/durex.be/gfwlist +server=/durex.at/127.0.0.1#5335 +ipset=/durex.at/gfwlist +server=/economistgroup.com/127.0.0.1#5335 +ipset=/economistgroup.com/gfwlist +server=/pricelesshonolulu.com/127.0.0.1#5335 +ipset=/pricelesshonolulu.com/gfwlist +server=/durex-shopline.com/127.0.0.1#5335 +ipset=/durex-shopline.com/gfwlist +server=/dotherex.com/127.0.0.1#5335 +ipset=/dotherex.com/gfwlist +server=/dewitwithdurex.com/127.0.0.1#5335 +ipset=/dewitwithdurex.com/gfwlist +server=/bloomberglive.com/127.0.0.1#5335 +ipset=/bloomberglive.com/gfwlist +server=/parler.com/127.0.0.1#5335 +ipset=/parler.com/gfwlist +server=/bmw.cw/127.0.0.1#5335 +ipset=/bmw.cw/gfwlist +server=/dettolcleannaija.com/127.0.0.1#5335 +ipset=/dettolcleannaija.com/gfwlist +server=/dettol.ru/127.0.0.1#5335 +ipset=/dettol.ru/gfwlist +server=/dettol.pl/127.0.0.1#5335 +ipset=/dettol.pl/gfwlist +server=/dettol.pk/127.0.0.1#5335 +ipset=/dettol.pk/gfwlist +server=/dettol.nl/127.0.0.1#5335 +ipset=/dettol.nl/gfwlist +server=/dettol.fr/127.0.0.1#5335 +ipset=/dettol.fr/gfwlist +server=/dettol.com.ng/127.0.0.1#5335 +ipset=/dettol.com.ng/gfwlist +server=/dettol.com.eg/127.0.0.1#5335 +ipset=/dettol.com.eg/gfwlist +server=/dettol.com.bd/127.0.0.1#5335 +ipset=/dettol.com.bd/gfwlist +server=/dettol.com/127.0.0.1#5335 +ipset=/dettol.com/gfwlist +server=/dettol.co.uk/127.0.0.1#5335 +ipset=/dettol.co.uk/gfwlist +server=/dettol.co.in/127.0.0.1#5335 +ipset=/dettol.co.in/gfwlist +server=/dettol.at/127.0.0.1#5335 +ipset=/dettol.at/gfwlist +server=/dettol-prize.com/127.0.0.1#5335 +ipset=/dettol-prize.com/gfwlist +server=/paypalbrasil.com/127.0.0.1#5335 +ipset=/paypalbrasil.com/gfwlist +server=/calgon.nl/127.0.0.1#5335 +ipset=/calgon.nl/gfwlist +server=/goldsexvideos.com/127.0.0.1#5335 +ipset=/goldsexvideos.com/gfwlist +server=/calgon.it/127.0.0.1#5335 +ipset=/calgon.it/gfwlist +server=/calgon.ie/127.0.0.1#5335 +ipset=/calgon.ie/gfwlist +server=/cht.com.tw/127.0.0.1#5335 +ipset=/cht.com.tw/gfwlist +server=/calgon.es/127.0.0.1#5335 +ipset=/calgon.es/gfwlist +server=/famousinternetgirlsgalleries.com/127.0.0.1#5335 +ipset=/famousinternetgirlsgalleries.com/gfwlist +server=/calgon.de/127.0.0.1#5335 +ipset=/calgon.de/gfwlist +server=/swiftbank.info/127.0.0.1#5335 +ipset=/swiftbank.info/gfwlist +server=/calgon.com.tr/127.0.0.1#5335 +ipset=/calgon.com.tr/gfwlist +server=/yahoo.com.nf/127.0.0.1#5335 +ipset=/yahoo.com.nf/gfwlist +server=/mastercardrestaurant.com/127.0.0.1#5335 +ipset=/mastercardrestaurant.com/gfwlist +server=/gamer.com.tw/127.0.0.1#5335 +ipset=/gamer.com.tw/gfwlist +server=/calgon.com/127.0.0.1#5335 +ipset=/calgon.com/gfwlist +server=/calgon.co.uk/127.0.0.1#5335 +ipset=/calgon.co.uk/gfwlist +server=/calgon.be/127.0.0.1#5335 +ipset=/calgon.be/gfwlist +server=/mobatek.net/127.0.0.1#5335 +ipset=/mobatek.net/gfwlist +server=/nvidia.com.pe/127.0.0.1#5335 +ipset=/nvidia.com.pe/gfwlist +server=/calgon.at/127.0.0.1#5335 +ipset=/calgon.at/gfwlist +server=/iphone-sh.com/127.0.0.1#5335 +ipset=/iphone-sh.com/gfwlist +server=/dotfreesex.com/127.0.0.1#5335 +ipset=/dotfreesex.com/gfwlist +server=/ipadair.com.es/127.0.0.1#5335 +ipset=/ipadair.com.es/gfwlist +server=/airwickarabia.com/127.0.0.1#5335 +ipset=/airwickarabia.com/gfwlist +server=/vfsco.mx/127.0.0.1#5335 +ipset=/vfsco.mx/gfwlist +server=/airwick.tv/127.0.0.1#5335 +ipset=/airwick.tv/gfwlist +server=/google.st/127.0.0.1#5335 +ipset=/google.st/gfwlist +server=/macbookair.jp/127.0.0.1#5335 +ipset=/macbookair.jp/gfwlist +server=/airwick.se/127.0.0.1#5335 +ipset=/airwick.se/gfwlist +server=/airwick.ru/127.0.0.1#5335 +ipset=/airwick.ru/gfwlist +server=/airwick.no/127.0.0.1#5335 +ipset=/airwick.no/gfwlist +server=/oxfordreference.com/127.0.0.1#5335 +ipset=/oxfordreference.com/gfwlist +server=/hotnudegirls.net/127.0.0.1#5335 +ipset=/hotnudegirls.net/gfwlist +server=/applecentar.rs/127.0.0.1#5335 +ipset=/applecentar.rs/gfwlist +server=/google.com.bz/127.0.0.1#5335 +ipset=/google.com.bz/gfwlist +server=/applestore.wang/127.0.0.1#5335 +ipset=/applestore.wang/gfwlist +server=/airwick.net/127.0.0.1#5335 +ipset=/airwick.net/gfwlist +server=/wifesexorgy.com/127.0.0.1#5335 +ipset=/wifesexorgy.com/gfwlist +server=/foxcorporation.com/127.0.0.1#5335 +ipset=/foxcorporation.com/gfwlist +server=/volvopenta.nl/127.0.0.1#5335 +ipset=/volvopenta.nl/gfwlist +server=/microsoft-give.com/127.0.0.1#5335 +ipset=/microsoft-give.com/gfwlist +server=/apple-online.com/127.0.0.1#5335 +ipset=/apple-online.com/gfwlist +server=/airwick.ie/127.0.0.1#5335 +ipset=/airwick.ie/gfwlist +server=/cheaperbeatsbydresale.com/127.0.0.1#5335 +ipset=/cheaperbeatsbydresale.com/gfwlist +server=/ethiosex2.wordpress.com/127.0.0.1#5335 +ipset=/ethiosex2.wordpress.com/gfwlist +server=/taknai.com/127.0.0.1#5335 +ipset=/taknai.com/gfwlist +server=/kobbeatssbydredk.com/127.0.0.1#5335 +ipset=/kobbeatssbydredk.com/gfwlist +server=/sony.ie/127.0.0.1#5335 +ipset=/sony.ie/gfwlist +server=/airwick.hr/127.0.0.1#5335 +ipset=/airwick.hr/gfwlist +server=/rarbgmirror.org/127.0.0.1#5335 +ipset=/rarbgmirror.org/gfwlist +server=/airwick.fr/127.0.0.1#5335 +ipset=/airwick.fr/gfwlist +server=/airwick.fi/127.0.0.1#5335 +ipset=/airwick.fi/gfwlist +server=/airwick.dk/127.0.0.1#5335 +ipset=/airwick.dk/gfwlist +server=/redtub3xxx.com/127.0.0.1#5335 +ipset=/redtub3xxx.com/gfwlist +server=/airwick.cz/127.0.0.1#5335 +ipset=/airwick.cz/gfwlist +server=/airwick.com.tr/127.0.0.1#5335 +ipset=/airwick.com.tr/gfwlist +server=/airwick.com.mx/127.0.0.1#5335 +ipset=/airwick.com.mx/gfwlist +server=/chinesespanking.com/127.0.0.1#5335 +ipset=/chinesespanking.com/gfwlist +server=/airwick.com/127.0.0.1#5335 +ipset=/airwick.com/gfwlist +server=/airwick.co.za/127.0.0.1#5335 +ipset=/airwick.co.za/gfwlist +server=/universalpictures.com/127.0.0.1#5335 +ipset=/universalpictures.com/gfwlist +server=/ktvu.com/127.0.0.1#5335 +ipset=/ktvu.com/gfwlist +server=/fafacebook.com/127.0.0.1#5335 +ipset=/fafacebook.com/gfwlist +server=/hpjav.tv/127.0.0.1#5335 +ipset=/hpjav.tv/gfwlist +server=/xn--qhrx81fxh2a.xn--55qx5d.hk/127.0.0.1#5335 +ipset=/xn--qhrx81fxh2a.xn--55qx5d.hk/gfwlist +server=/stackpath.dev/127.0.0.1#5335 +ipset=/stackpath.dev/gfwlist +server=/cnnmoney.ch/127.0.0.1#5335 +ipset=/cnnmoney.ch/gfwlist +server=/steamusercontent-a.akamaihd.net/127.0.0.1#5335 +ipset=/steamusercontent-a.akamaihd.net/gfwlist +server=/akafms.net/127.0.0.1#5335 +ipset=/akafms.net/gfwlist +server=/amazonliterarypartnership.com/127.0.0.1#5335 +ipset=/amazonliterarypartnership.com/gfwlist +server=/mcdonalds.co.uk/127.0.0.1#5335 +ipset=/mcdonalds.co.uk/gfwlist +server=/golang.net/127.0.0.1#5335 +ipset=/golang.net/gfwlist +server=/mcdelivery.com.sg/127.0.0.1#5335 +ipset=/mcdelivery.com.sg/gfwlist +server=/doubleclick.net/127.0.0.1#5335 +ipset=/doubleclick.net/gfwlist +server=/instagor.com/127.0.0.1#5335 +ipset=/instagor.com/gfwlist +server=/aboutmcdonalds.com/127.0.0.1#5335 +ipset=/aboutmcdonalds.com/gfwlist +server=/huanghuagang.org/127.0.0.1#5335 +ipset=/huanghuagang.org/gfwlist +server=/hkreadingcity.net/127.0.0.1#5335 +ipset=/hkreadingcity.net/gfwlist +server=/xn--r8jwklh769h2mc880dk1o431a.com/127.0.0.1#5335 +ipset=/xn--r8jwklh769h2mc880dk1o431a.com/gfwlist +server=/fffdm.com/127.0.0.1#5335 +ipset=/fffdm.com/gfwlist +server=/fzdm.com/127.0.0.1#5335 +ipset=/fzdm.com/gfwlist +server=/familymart.com.ph/127.0.0.1#5335 +ipset=/familymart.com.ph/gfwlist +server=/ebayedu.com/127.0.0.1#5335 +ipset=/ebayedu.com/gfwlist +server=/mastercard.com.tr/127.0.0.1#5335 +ipset=/mastercard.com.tr/gfwlist +server=/family.com.tw/127.0.0.1#5335 +ipset=/family.com.tw/gfwlist +server=/apina.biz/127.0.0.1#5335 +ipset=/apina.biz/gfwlist +server=/ikea.it/127.0.0.1#5335 +ipset=/ikea.it/gfwlist +server=/esp8266.com/127.0.0.1#5335 +ipset=/esp8266.com/gfwlist +server=/nijiyome.jp/127.0.0.1#5335 +ipset=/nijiyome.jp/gfwlist +server=/dlsite.com.tw/127.0.0.1#5335 +ipset=/dlsite.com.tw/gfwlist +server=/dlsite.com/127.0.0.1#5335 +ipset=/dlsite.com/gfwlist +server=/ci-en.net/127.0.0.1#5335 +ipset=/ci-en.net/gfwlist +server=/sankeibiz.jp/127.0.0.1#5335 +ipset=/sankeibiz.jp/gfwlist +server=/114av.xyz/127.0.0.1#5335 +ipset=/114av.xyz/gfwlist +server=/swtor.net/127.0.0.1#5335 +ipset=/swtor.net/gfwlist +server=/lilith-soft.com/127.0.0.1#5335 +ipset=/lilith-soft.com/gfwlist +server=/fackebook.com/127.0.0.1#5335 +ipset=/fackebook.com/gfwlist +server=/itasoftware.com/127.0.0.1#5335 +ipset=/itasoftware.com/gfwlist +server=/avxhm.is/127.0.0.1#5335 +ipset=/avxhm.is/gfwlist +server=/beatsbydrdreus.com/127.0.0.1#5335 +ipset=/beatsbydrdreus.com/gfwlist +server=/paipal.com/127.0.0.1#5335 +ipset=/paipal.com/gfwlist +server=/foxcincy.jobs/127.0.0.1#5335 +ipset=/foxcincy.jobs/gfwlist +server=/youtube.com.gh/127.0.0.1#5335 +ipset=/youtube.com.gh/gfwlist +server=/toolforge.org/127.0.0.1#5335 +ipset=/toolforge.org/gfwlist +server=/wiktionary.org/127.0.0.1#5335 +ipset=/wiktionary.org/gfwlist +server=/globalsign.com.hk/127.0.0.1#5335 +ipset=/globalsign.com.hk/gfwlist +server=/wikivoyage.org/127.0.0.1#5335 +ipset=/wikivoyage.org/gfwlist +server=/expresswifi.com/127.0.0.1#5335 +ipset=/expresswifi.com/gfwlist +server=/exascale-tech.com/127.0.0.1#5335 +ipset=/exascale-tech.com/gfwlist +server=/wikiversity.org/127.0.0.1#5335 +ipset=/wikiversity.org/gfwlist +server=/wikisource.org/127.0.0.1#5335 +ipset=/wikisource.org/gfwlist +server=/wikipedia.org/127.0.0.1#5335 +ipset=/wikipedia.org/gfwlist +server=/cinepornogratis.com/127.0.0.1#5335 +ipset=/cinepornogratis.com/gfwlist +server=/sexharlot.com/127.0.0.1#5335 +ipset=/sexharlot.com/gfwlist +server=/wikimedia.org/127.0.0.1#5335 +ipset=/wikimedia.org/gfwlist +server=/wikimediafoundation.org/127.0.0.1#5335 +ipset=/wikimediafoundation.org/gfwlist +server=/truyenkk1.com/127.0.0.1#5335 +ipset=/truyenkk1.com/gfwlist +server=/wikidata.org/127.0.0.1#5335 +ipset=/wikidata.org/gfwlist +server=/wikibooks.org/127.0.0.1#5335 +ipset=/wikibooks.org/gfwlist +server=/ebc.net.tw/127.0.0.1#5335 +ipset=/ebc.net.tw/gfwlist +server=/starbucksrewardsstarland.ca/127.0.0.1#5335 +ipset=/starbucksrewardsstarland.ca/gfwlist +server=/wdfiles.com/127.0.0.1#5335 +ipset=/wdfiles.com/gfwlist +server=/nftstorage.link/127.0.0.1#5335 +ipset=/nftstorage.link/gfwlist +server=/firstgynexam.com/127.0.0.1#5335 +ipset=/firstgynexam.com/gfwlist +server=/twcomix.com/127.0.0.1#5335 +ipset=/twcomix.com/gfwlist +server=/wholesaleonlinemart.com/127.0.0.1#5335 +ipset=/wholesaleonlinemart.com/gfwlist +server=/cortexrpg.com/127.0.0.1#5335 +ipset=/cortexrpg.com/gfwlist +server=/muthead.com/127.0.0.1#5335 +ipset=/muthead.com/gfwlist +server=/beatscheapforsale.com/127.0.0.1#5335 +ipset=/beatscheapforsale.com/gfwlist +server=/hutao.cloud/127.0.0.1#5335 +ipset=/hutao.cloud/gfwlist +server=/disney.hu/127.0.0.1#5335 +ipset=/disney.hu/gfwlist +server=/sweetsext.com/127.0.0.1#5335 +ipset=/sweetsext.com/gfwlist +server=/yabang.org/127.0.0.1#5335 +ipset=/yabang.org/gfwlist +server=/bmw-connecteddrive.es/127.0.0.1#5335 +ipset=/bmw-connecteddrive.es/gfwlist +server=/pornkai.com/127.0.0.1#5335 +ipset=/pornkai.com/gfwlist +server=/zeeentertainment.com/127.0.0.1#5335 +ipset=/zeeentertainment.com/gfwlist +server=/stc-server.com/127.0.0.1#5335 +ipset=/stc-server.com/gfwlist +server=/paper-attachments.s3.amazonaws.com/127.0.0.1#5335 +ipset=/paper-attachments.s3.amazonaws.com/gfwlist +server=/mailonsunday.ie/127.0.0.1#5335 +ipset=/mailonsunday.ie/gfwlist +server=/ssrpass.pw/127.0.0.1#5335 +ipset=/ssrpass.pw/gfwlist +server=/bmwmyanmar.com/127.0.0.1#5335 +ipset=/bmwmyanmar.com/gfwlist +server=/ssplive.pw/127.0.0.1#5335 +ipset=/ssplive.pw/gfwlist +server=/visa.lt/127.0.0.1#5335 +ipset=/visa.lt/gfwlist +server=/sony.com.gt/127.0.0.1#5335 +ipset=/sony.com.gt/gfwlist +server=/maying.co/127.0.0.1#5335 +ipset=/maying.co/gfwlist +server=/vaultify.net/127.0.0.1#5335 +ipset=/vaultify.net/gfwlist +server=/intel.wf/127.0.0.1#5335 +ipset=/intel.wf/gfwlist +server=/gfw.press/127.0.0.1#5335 +ipset=/gfw.press/gfwlist +server=/geph.io/127.0.0.1#5335 +ipset=/geph.io/gfwlist +server=/hottestheadphonesonline.com/127.0.0.1#5335 +ipset=/hottestheadphonesonline.com/gfwlist +server=/acheterfollowersinstagram.com/127.0.0.1#5335 +ipset=/acheterfollowersinstagram.com/gfwlist +server=/cloudn.me/127.0.0.1#5335 +ipset=/cloudn.me/gfwlist +server=/pinflix.com/127.0.0.1#5335 +ipset=/pinflix.com/gfwlist +server=/ark.to/127.0.0.1#5335 +ipset=/ark.to/gfwlist +server=/amytele.com/127.0.0.1#5335 +ipset=/amytele.com/gfwlist +server=/aaex.uk/127.0.0.1#5335 +ipset=/aaex.uk/gfwlist +server=/slack.com/127.0.0.1#5335 +ipset=/slack.com/gfwlist +server=/xcg123.com/127.0.0.1#5335 +ipset=/xcg123.com/gfwlist +server=/vilavpn7.xyz/127.0.0.1#5335 +ipset=/vilavpn7.xyz/gfwlist +server=/vilavpn5.xyz/127.0.0.1#5335 +ipset=/vilavpn5.xyz/gfwlist +server=/vilavpn4.xyz/127.0.0.1#5335 +ipset=/vilavpn4.xyz/gfwlist +server=/msfteducation.ca/127.0.0.1#5335 +ipset=/msfteducation.ca/gfwlist +server=/mastercard.ru/127.0.0.1#5335 +ipset=/mastercard.ru/gfwlist +server=/nvidia.co.jp/127.0.0.1#5335 +ipset=/nvidia.co.jp/gfwlist +server=/vilavpn1.xyz/127.0.0.1#5335 +ipset=/vilavpn1.xyz/gfwlist +server=/watchdisneyfe.com/127.0.0.1#5335 +ipset=/watchdisneyfe.com/gfwlist +server=/surflite.net/127.0.0.1#5335 +ipset=/surflite.net/gfwlist +server=/molesports.com/127.0.0.1#5335 +ipset=/molesports.com/gfwlist +server=/visa.com.ag/127.0.0.1#5335 +ipset=/visa.com.ag/gfwlist +server=/geek-squad.org/127.0.0.1#5335 +ipset=/geek-squad.org/gfwlist +server=/swisstsa.ch/127.0.0.1#5335 +ipset=/swisstsa.ch/gfwlist +server=/crunchyroll.com/127.0.0.1#5335 +ipset=/crunchyroll.com/gfwlist +server=/nexitcore.com/127.0.0.1#5335 +ipset=/nexitcore.com/gfwlist +server=/sexfilm.al.ru/127.0.0.1#5335 +ipset=/sexfilm.al.ru/gfwlist +server=/nexitallysafe.com/127.0.0.1#5335 +ipset=/nexitallysafe.com/gfwlist +server=/intel.mn/127.0.0.1#5335 +ipset=/intel.mn/gfwlist +server=/gog-statics.com/127.0.0.1#5335 +ipset=/gog-statics.com/gfwlist +server=/n3ro.net/127.0.0.1#5335 +ipset=/n3ro.net/gfwlist +server=/n3ro.lol/127.0.0.1#5335 +ipset=/n3ro.lol/gfwlist +server=/justmysocks2.net/127.0.0.1#5335 +ipset=/justmysocks2.net/gfwlist +server=/justmysocks.net/127.0.0.1#5335 +ipset=/justmysocks.net/gfwlist +server=/hitun.io/127.0.0.1#5335 +ipset=/hitun.io/gfwlist +server=/duyaossr.com/127.0.0.1#5335 +ipset=/duyaossr.com/gfwlist +server=/dleris.best/127.0.0.1#5335 +ipset=/dleris.best/gfwlist +server=/dlercloud.me/127.0.0.1#5335 +ipset=/dlercloud.me/gfwlist +server=/gyakusimei.com/127.0.0.1#5335 +ipset=/gyakusimei.com/gfwlist +server=/cortanaskills.com/127.0.0.1#5335 +ipset=/cortanaskills.com/gfwlist +server=/youtube.com.sa/127.0.0.1#5335 +ipset=/youtube.com.sa/gfwlist +server=/cylink.pro/127.0.0.1#5335 +ipset=/cylink.pro/gfwlist +server=/geeksquad.cc/127.0.0.1#5335 +ipset=/geeksquad.cc/gfwlist +server=/bmw-motorrad-abudhabi.com/127.0.0.1#5335 +ipset=/bmw-motorrad-abudhabi.com/gfwlist +server=/ubisoft-orbit-savegames.s3.amazonaws.com/127.0.0.1#5335 +ipset=/ubisoft-orbit-savegames.s3.amazonaws.com/gfwlist +server=/twinkboyfriends.tv/127.0.0.1#5335 +ipset=/twinkboyfriends.tv/gfwlist +server=/googleblog.com/127.0.0.1#5335 +ipset=/googleblog.com/gfwlist +server=/hpgift.com/127.0.0.1#5335 +ipset=/hpgift.com/gfwlist +server=/springerlink.com/127.0.0.1#5335 +ipset=/springerlink.com/gfwlist +server=/geodesummit.com/127.0.0.1#5335 +ipset=/geodesummit.com/gfwlist +server=/rarbgunblock.com/127.0.0.1#5335 +ipset=/rarbgunblock.com/gfwlist +server=/youtubei.googleapis.com/127.0.0.1#5335 +ipset=/youtubei.googleapis.com/gfwlist +server=/escapestudios.co.uk/127.0.0.1#5335 +ipset=/escapestudios.co.uk/gfwlist +server=/yimg.com/127.0.0.1#5335 +ipset=/yimg.com/gfwlist +server=/rarbgproxy.org/127.0.0.1#5335 +ipset=/rarbgproxy.org/gfwlist +server=/rarbgaccessed.org/127.0.0.1#5335 +ipset=/rarbgaccessed.org/gfwlist +server=/proxyrarbg.org/127.0.0.1#5335 +ipset=/proxyrarbg.org/gfwlist +server=/mamacitaz.com/127.0.0.1#5335 +ipset=/mamacitaz.com/gfwlist +server=/shapelcounset.xyz/127.0.0.1#5335 +ipset=/shapelcounset.xyz/gfwlist +server=/xdporner.com/127.0.0.1#5335 +ipset=/xdporner.com/gfwlist +server=/pornhub00.com/127.0.0.1#5335 +ipset=/pornhub00.com/gfwlist +server=/xjavporn.com/127.0.0.1#5335 +ipset=/xjavporn.com/gfwlist +server=/rarbg.to/127.0.0.1#5335 +ipset=/rarbg.to/gfwlist +server=/thepiratebay.org/127.0.0.1#5335 +ipset=/thepiratebay.org/gfwlist +server=/gayforit.eu/127.0.0.1#5335 +ipset=/gayforit.eu/gfwlist +server=/pirates-forum.org/127.0.0.1#5335 +ipset=/pirates-forum.org/gfwlist +server=/mastercard.com.ge/127.0.0.1#5335 +ipset=/mastercard.com.ge/gfwlist +server=/demonoid.is/127.0.0.1#5335 +ipset=/demonoid.is/gfwlist +server=/btdig.com/127.0.0.1#5335 +ipset=/btdig.com/gfwlist +server=/porntitan.com/127.0.0.1#5335 +ipset=/porntitan.com/gfwlist +server=/1337x.tw/127.0.0.1#5335 +ipset=/1337x.tw/gfwlist +server=/1337x.st/127.0.0.1#5335 +ipset=/1337x.st/gfwlist +server=/truyenwk.com/127.0.0.1#5335 +ipset=/truyenwk.com/gfwlist +server=/1337x.to/127.0.0.1#5335 +ipset=/1337x.to/gfwlist +server=/porkbun.com/127.0.0.1#5335 +ipset=/porkbun.com/gfwlist +server=/volvotrucks.kz/127.0.0.1#5335 +ipset=/volvotrucks.kz/gfwlist +server=/yastatic.net/127.0.0.1#5335 +ipset=/yastatic.net/gfwlist +server=/fcebook.com/127.0.0.1#5335 +ipset=/fcebook.com/gfwlist +server=/ebayaustralia.com/127.0.0.1#5335 +ipset=/ebayaustralia.com/gfwlist +server=/binanceapi.com/127.0.0.1#5335 +ipset=/binanceapi.com/gfwlist +server=/yandex.tm/127.0.0.1#5335 +ipset=/yandex.tm/gfwlist +server=/yandex.net/127.0.0.1#5335 +ipset=/yandex.net/gfwlist +server=/yandex.md/127.0.0.1#5335 +ipset=/yandex.md/gfwlist +server=/cnnikebrand.com/127.0.0.1#5335 +ipset=/cnnikebrand.com/gfwlist +server=/porndish.com/127.0.0.1#5335 +ipset=/porndish.com/gfwlist +server=/yandex.kg/127.0.0.1#5335 +ipset=/yandex.kg/gfwlist +server=/yandex.com.tr/127.0.0.1#5335 +ipset=/yandex.com.tr/gfwlist +server=/yandex.com.ru/127.0.0.1#5335 +ipset=/yandex.com.ru/gfwlist +server=/looporn.com/127.0.0.1#5335 +ipset=/looporn.com/gfwlist +server=/yandex.com/127.0.0.1#5335 +ipset=/yandex.com/gfwlist +server=/yandex.by/127.0.0.1#5335 +ipset=/yandex.by/gfwlist +server=/yandex.az/127.0.0.1#5335 +ipset=/yandex.az/gfwlist +server=/alicloud.com/127.0.0.1#5335 +ipset=/alicloud.com/gfwlist +server=/elephantsdream.org/127.0.0.1#5335 +ipset=/elephantsdream.org/gfwlist +server=/yimg.jp/127.0.0.1#5335 +ipset=/yimg.jp/gfwlist +server=/rarbgprx.org/127.0.0.1#5335 +ipset=/rarbgprx.org/gfwlist +server=/yho.com/127.0.0.1#5335 +ipset=/yho.com/gfwlist +server=/yahoomusic.com/127.0.0.1#5335 +ipset=/yahoomusic.com/gfwlist +server=/xvxx.stream/127.0.0.1#5335 +ipset=/xvxx.stream/gfwlist +server=/yahoohealth.com/127.0.0.1#5335 +ipset=/yahoohealth.com/gfwlist +server=/kavkazr.com/127.0.0.1#5335 +ipset=/kavkazr.com/gfwlist +server=/nikeitaly.com/127.0.0.1#5335 +ipset=/nikeitaly.com/gfwlist +server=/yahooapis.com/127.0.0.1#5335 +ipset=/yahooapis.com/gfwlist +server=/techcrunch.com/127.0.0.1#5335 +ipset=/techcrunch.com/gfwlist +server=/yasarang.net/127.0.0.1#5335 +ipset=/yasarang.net/gfwlist +server=/myguide.hk/127.0.0.1#5335 +ipset=/myguide.hk/gfwlist +server=/yahoo.ws/127.0.0.1#5335 +ipset=/yahoo.ws/gfwlist +server=/yahoo.tn/127.0.0.1#5335 +ipset=/yahoo.tn/gfwlist +server=/yahoo.tm/127.0.0.1#5335 +ipset=/yahoo.tm/gfwlist +server=/yahoo.tk/127.0.0.1#5335 +ipset=/yahoo.tk/gfwlist +server=/mastercardcenter.org/127.0.0.1#5335 +ipset=/mastercardcenter.org/gfwlist +server=/yahoo.sr/127.0.0.1#5335 +ipset=/yahoo.sr/gfwlist +server=/pornobox.net/127.0.0.1#5335 +ipset=/pornobox.net/gfwlist +server=/finish.co.uk/127.0.0.1#5335 +ipset=/finish.co.uk/gfwlist +server=/yahoo.sk/127.0.0.1#5335 +ipset=/yahoo.sk/gfwlist +server=/yahoo.sg/127.0.0.1#5335 +ipset=/yahoo.sg/gfwlist +server=/yahoo.se/127.0.0.1#5335 +ipset=/yahoo.se/gfwlist +server=/yahoo.ru/127.0.0.1#5335 +ipset=/yahoo.ru/gfwlist +server=/ggdiao.com/127.0.0.1#5335 +ipset=/ggdiao.com/gfwlist +server=/yahoo.pn/127.0.0.1#5335 +ipset=/yahoo.pn/gfwlist +server=/pearsonelt.com/127.0.0.1#5335 +ipset=/pearsonelt.com/gfwlist +server=/yahoo.net/127.0.0.1#5335 +ipset=/yahoo.net/gfwlist +server=/dragoniscoming.com/127.0.0.1#5335 +ipset=/dragoniscoming.com/gfwlist +server=/discord.new/127.0.0.1#5335 +ipset=/discord.new/gfwlist +server=/yahoo.mx/127.0.0.1#5335 +ipset=/yahoo.mx/gfwlist +server=/dailymailonline.com/127.0.0.1#5335 +ipset=/dailymailonline.com/gfwlist +server=/llnw.com/127.0.0.1#5335 +ipset=/llnw.com/gfwlist +server=/bmwgroup.com/127.0.0.1#5335 +ipset=/bmwgroup.com/gfwlist +server=/sverigebeatsbydrdre.com/127.0.0.1#5335 +ipset=/sverigebeatsbydrdre.com/gfwlist +server=/elog-ch.com/127.0.0.1#5335 +ipset=/elog-ch.com/gfwlist +server=/igoshopping.net/127.0.0.1#5335 +ipset=/igoshopping.net/gfwlist +server=/cumshotlist.com/127.0.0.1#5335 +ipset=/cumshotlist.com/gfwlist +server=/intel.sr/127.0.0.1#5335 +ipset=/intel.sr/gfwlist +server=/ikea.be/127.0.0.1#5335 +ipset=/ikea.be/gfwlist +server=/yahoo.mk/127.0.0.1#5335 +ipset=/yahoo.mk/gfwlist +server=/yahoo.md/127.0.0.1#5335 +ipset=/yahoo.md/gfwlist +server=/movenetworks.com/127.0.0.1#5335 +ipset=/movenetworks.com/gfwlist +server=/wisekey.com/127.0.0.1#5335 +ipset=/wisekey.com/gfwlist +server=/yahoo.lt/127.0.0.1#5335 +ipset=/yahoo.lt/gfwlist +server=/yahoo.jo/127.0.0.1#5335 +ipset=/yahoo.jo/gfwlist +server=/yahoo.je/127.0.0.1#5335 +ipset=/yahoo.je/gfwlist +server=/blogoverflow.com/127.0.0.1#5335 +ipset=/blogoverflow.com/gfwlist +server=/pigav.com/127.0.0.1#5335 +ipset=/pigav.com/gfwlist +server=/dogecoin.com/127.0.0.1#5335 +ipset=/dogecoin.com/gfwlist +server=/yahoo.in/127.0.0.1#5335 +ipset=/yahoo.in/gfwlist +server=/yahoo.hr/127.0.0.1#5335 +ipset=/yahoo.hr/gfwlist +server=/ahegao.online/127.0.0.1#5335 +ipset=/ahegao.online/gfwlist +server=/yahoo.hk/127.0.0.1#5335 +ipset=/yahoo.hk/gfwlist +server=/apexprint.com.hk/127.0.0.1#5335 +ipset=/apexprint.com.hk/gfwlist +server=/yahoo.gy/127.0.0.1#5335 +ipset=/yahoo.gy/gfwlist +server=/snapkit.co/127.0.0.1#5335 +ipset=/snapkit.co/gfwlist +server=/gettyimages.es/127.0.0.1#5335 +ipset=/gettyimages.es/gfwlist +server=/night.livedoor.biz/127.0.0.1#5335 +ipset=/night.livedoor.biz/gfwlist +server=/bmw.com.py/127.0.0.1#5335 +ipset=/bmw.com.py/gfwlist +server=/yahoo.gr/127.0.0.1#5335 +ipset=/yahoo.gr/gfwlist +server=/yahoo.gp/127.0.0.1#5335 +ipset=/yahoo.gp/gfwlist +server=/verizonfios.com/127.0.0.1#5335 +ipset=/verizonfios.com/gfwlist +server=/yahoo.gm/127.0.0.1#5335 +ipset=/yahoo.gm/gfwlist +server=/pinterest.ch/127.0.0.1#5335 +ipset=/pinterest.ch/gfwlist +server=/rocksdb.com/127.0.0.1#5335 +ipset=/rocksdb.com/gfwlist +server=/meraki.hk/127.0.0.1#5335 +ipset=/meraki.hk/gfwlist +server=/javmany.com/127.0.0.1#5335 +ipset=/javmany.com/gfwlist +server=/drunkenstepfather.com/127.0.0.1#5335 +ipset=/drunkenstepfather.com/gfwlist +server=/520aa.tv/127.0.0.1#5335 +ipset=/520aa.tv/gfwlist +server=/sony.rs/127.0.0.1#5335 +ipset=/sony.rs/gfwlist +server=/yahoo.gg/127.0.0.1#5335 +ipset=/yahoo.gg/gfwlist +server=/yahoo.fm/127.0.0.1#5335 +ipset=/yahoo.fm/gfwlist +server=/fbredex.com/127.0.0.1#5335 +ipset=/fbredex.com/gfwlist +server=/yahoo.ee/127.0.0.1#5335 +ipset=/yahoo.ee/gfwlist +server=/wballiance.com/127.0.0.1#5335 +ipset=/wballiance.com/gfwlist +server=/nvidia.lu/127.0.0.1#5335 +ipset=/nvidia.lu/gfwlist +server=/urukawa.com/127.0.0.1#5335 +ipset=/urukawa.com/gfwlist +server=/roughman.net/127.0.0.1#5335 +ipset=/roughman.net/gfwlist +server=/wapm.io/127.0.0.1#5335 +ipset=/wapm.io/gfwlist +server=/yahoo.com.vc/127.0.0.1#5335 +ipset=/yahoo.com.vc/gfwlist +server=/zlib.life/127.0.0.1#5335 +ipset=/zlib.life/gfwlist +server=/dreambmw.ca/127.0.0.1#5335 +ipset=/dreambmw.ca/gfwlist +server=/yahoo.com.ua/127.0.0.1#5335 +ipset=/yahoo.com.ua/gfwlist +server=/yahoo.sm/127.0.0.1#5335 +ipset=/yahoo.sm/gfwlist +server=/iw8j.cc/127.0.0.1#5335 +ipset=/iw8j.cc/gfwlist +server=/yahoo.com.sv/127.0.0.1#5335 +ipset=/yahoo.com.sv/gfwlist +server=/chickteases.com/127.0.0.1#5335 +ipset=/chickteases.com/gfwlist +server=/jwplatform.com/127.0.0.1#5335 +ipset=/jwplatform.com/gfwlist +server=/mypornolab.click/127.0.0.1#5335 +ipset=/mypornolab.click/gfwlist +server=/yahoo.com.py/127.0.0.1#5335 +ipset=/yahoo.com.py/gfwlist +server=/yahoo.com.ph/127.0.0.1#5335 +ipset=/yahoo.com.ph/gfwlist +server=/proporn.com/127.0.0.1#5335 +ipset=/proporn.com/gfwlist +server=/yahoo.com.pe/127.0.0.1#5335 +ipset=/yahoo.com.pe/gfwlist +server=/youporn-germany.com/127.0.0.1#5335 +ipset=/youporn-germany.com/gfwlist +server=/kubeapps.com/127.0.0.1#5335 +ipset=/kubeapps.com/gfwlist +server=/jerkdude.com/127.0.0.1#5335 +ipset=/jerkdude.com/gfwlist +server=/yahoo.com.ly/127.0.0.1#5335 +ipset=/yahoo.com.ly/gfwlist +server=/uoherald.com/127.0.0.1#5335 +ipset=/uoherald.com/gfwlist +server=/ebahy.com/127.0.0.1#5335 +ipset=/ebahy.com/gfwlist +server=/codecademy.com/127.0.0.1#5335 +ipset=/codecademy.com/gfwlist +server=/squareup.com/127.0.0.1#5335 +ipset=/squareup.com/gfwlist +server=/homedepot.com/127.0.0.1#5335 +ipset=/homedepot.com/gfwlist +server=/visa.com.tt/127.0.0.1#5335 +ipset=/visa.com.tt/gfwlist +server=/dragonagemovie.com/127.0.0.1#5335 +ipset=/dragonagemovie.com/gfwlist +server=/casquemonsterbeats.com/127.0.0.1#5335 +ipset=/casquemonsterbeats.com/gfwlist +server=/yahoo.com.eg/127.0.0.1#5335 +ipset=/yahoo.com.eg/gfwlist +server=/officecdn-microsoft-com.akamaized.net/127.0.0.1#5335 +ipset=/officecdn-microsoft-com.akamaized.net/gfwlist +server=/yahoo.com.co/127.0.0.1#5335 +ipset=/yahoo.com.co/gfwlist +server=/yahoo.com.bz/127.0.0.1#5335 +ipset=/yahoo.com.bz/gfwlist +server=/mastercard.inc/127.0.0.1#5335 +ipset=/mastercard.inc/gfwlist +server=/yahoo.com.br/127.0.0.1#5335 +ipset=/yahoo.com.br/gfwlist +server=/sony.com.tw/127.0.0.1#5335 +ipset=/sony.com.tw/gfwlist +server=/paypal-brandcentral.com/127.0.0.1#5335 +ipset=/paypal-brandcentral.com/gfwlist +server=/trustedanalytics.net/127.0.0.1#5335 +ipset=/trustedanalytics.net/gfwlist +server=/yahoo.com.au/127.0.0.1#5335 +ipset=/yahoo.com.au/gfwlist +server=/yahoo.com.ar/127.0.0.1#5335 +ipset=/yahoo.com.ar/gfwlist +server=/porn1videos.com/127.0.0.1#5335 +ipset=/porn1videos.com/gfwlist +server=/yahoo.com.ai/127.0.0.1#5335 +ipset=/yahoo.com.ai/gfwlist +server=/yahoo.com.af/127.0.0.1#5335 +ipset=/yahoo.com.af/gfwlist +server=/bmw-sudan.com/127.0.0.1#5335 +ipset=/bmw-sudan.com/gfwlist +server=/yahoo.co.za/127.0.0.1#5335 +ipset=/yahoo.co.za/gfwlist +server=/cloudburstresearch.com/127.0.0.1#5335 +ipset=/cloudburstresearch.com/gfwlist +server=/offrezdesipods.com/127.0.0.1#5335 +ipset=/offrezdesipods.com/gfwlist +server=/nude-share.com/127.0.0.1#5335 +ipset=/nude-share.com/gfwlist +server=/yahoo.co.uz/127.0.0.1#5335 +ipset=/yahoo.co.uz/gfwlist +server=/yahoo.co.uk/127.0.0.1#5335 +ipset=/yahoo.co.uk/gfwlist +server=/yahoo.co.nz/127.0.0.1#5335 +ipset=/yahoo.co.nz/gfwlist +server=/yahoo.co.kr/127.0.0.1#5335 +ipset=/yahoo.co.kr/gfwlist +server=/yahoo.co.cr/127.0.0.1#5335 +ipset=/yahoo.co.cr/gfwlist +server=/yahoo.co.ck/127.0.0.1#5335 +ipset=/yahoo.co.ck/gfwlist +server=/cheapwireless04.com/127.0.0.1#5335 +ipset=/cheapwireless04.com/gfwlist +server=/yahoo.co.ao/127.0.0.1#5335 +ipset=/yahoo.co.ao/gfwlist +server=/yahoo.cg/127.0.0.1#5335 +ipset=/yahoo.cg/gfwlist +server=/lustteens.net/127.0.0.1#5335 +ipset=/lustteens.net/gfwlist +server=/themarvelexperiencetour.com/127.0.0.1#5335 +ipset=/themarvelexperiencetour.com/gfwlist +server=/yahoo.cat/127.0.0.1#5335 +ipset=/yahoo.cat/gfwlist +server=/yahoo.ca/127.0.0.1#5335 +ipset=/yahoo.ca/gfwlist +server=/beatsinsingapore.com/127.0.0.1#5335 +ipset=/beatsinsingapore.com/gfwlist +server=/yahoo.bs/127.0.0.1#5335 +ipset=/yahoo.bs/gfwlist +server=/yahoo.bg/127.0.0.1#5335 +ipset=/yahoo.bg/gfwlist +server=/xxxstreams.watch/127.0.0.1#5335 +ipset=/xxxstreams.watch/gfwlist +server=/trannygem.com/127.0.0.1#5335 +ipset=/trannygem.com/gfwlist +server=/yahoo.ba/127.0.0.1#5335 +ipset=/yahoo.ba/gfwlist +server=/riotpoints.com/127.0.0.1#5335 +ipset=/riotpoints.com/gfwlist +server=/xv1.monster/127.0.0.1#5335 +ipset=/xv1.monster/gfwlist +server=/yahoo.am/127.0.0.1#5335 +ipset=/yahoo.am/gfwlist +server=/lanternal.com/127.0.0.1#5335 +ipset=/lanternal.com/gfwlist +server=/javhd.pro/127.0.0.1#5335 +ipset=/javhd.pro/gfwlist +server=/rapefilms.net/127.0.0.1#5335 +ipset=/rapefilms.net/gfwlist +server=/accountpaypal.org/127.0.0.1#5335 +ipset=/accountpaypal.org/gfwlist +server=/nurofen.de/127.0.0.1#5335 +ipset=/nurofen.de/gfwlist +server=/ycombinator.com/127.0.0.1#5335 +ipset=/ycombinator.com/gfwlist +server=/aps.org/127.0.0.1#5335 +ipset=/aps.org/gfwlist +server=/intel.com.ph/127.0.0.1#5335 +ipset=/intel.com.ph/gfwlist +server=/sandisk.nl/127.0.0.1#5335 +ipset=/sandisk.nl/gfwlist +server=/sandisk.hk/127.0.0.1#5335 +ipset=/sandisk.hk/gfwlist +server=/welcometobestbuy.ca/127.0.0.1#5335 +ipset=/welcometobestbuy.ca/gfwlist +server=/mini.co.uk/127.0.0.1#5335 +ipset=/mini.co.uk/gfwlist +server=/sandisk.de/127.0.0.1#5335 +ipset=/sandisk.de/gfwlist +server=/ichineseporn.com/127.0.0.1#5335 +ipset=/ichineseporn.com/gfwlist +server=/sandisk.com.tw/127.0.0.1#5335 +ipset=/sandisk.com.tw/gfwlist +server=/qwapi.com/127.0.0.1#5335 +ipset=/qwapi.com/gfwlist +server=/sandisk.com.tr/127.0.0.1#5335 +ipset=/sandisk.com.tr/gfwlist +server=/attsavings.com/127.0.0.1#5335 +ipset=/attsavings.com/gfwlist +server=/sandisk.com.br/127.0.0.1#5335 +ipset=/sandisk.com.br/gfwlist +server=/lysol.com/127.0.0.1#5335 +ipset=/lysol.com/gfwlist +server=/foxsportsla.com/127.0.0.1#5335 +ipset=/foxsportsla.com/gfwlist +server=/timelinestoryteller.com/127.0.0.1#5335 +ipset=/timelinestoryteller.com/gfwlist +server=/vmware-techcenter.com/127.0.0.1#5335 +ipset=/vmware-techcenter.com/gfwlist +server=/vmworld.com/127.0.0.1#5335 +ipset=/vmworld.com/gfwlist +server=/sonybuilding.jp/127.0.0.1#5335 +ipset=/sonybuilding.jp/gfwlist +server=/g-technology.com/127.0.0.1#5335 +ipset=/g-technology.com/gfwlist +server=/uber.com/127.0.0.1#5335 +ipset=/uber.com/gfwlist +server=/tonec.com/127.0.0.1#5335 +ipset=/tonec.com/gfwlist +server=/registeridm.com/127.0.0.1#5335 +ipset=/registeridm.com/gfwlist +server=/hornyelephant.com/127.0.0.1#5335 +ipset=/hornyelephant.com/gfwlist +server=/hairy-women-pussy.net/127.0.0.1#5335 +ipset=/hairy-women-pussy.net/gfwlist +server=/lewdthots.com/127.0.0.1#5335 +ipset=/lewdthots.com/gfwlist +server=/internetdownloadmanager.com/127.0.0.1#5335 +ipset=/internetdownloadmanager.com/gfwlist +server=/x.com/127.0.0.1#5335 +ipset=/x.com/gfwlist +server=/sonylatvija.com/127.0.0.1#5335 +ipset=/sonylatvija.com/gfwlist +server=/disneymagicmoments.gen.tr/127.0.0.1#5335 +ipset=/disneymagicmoments.gen.tr/gfwlist +server=/sonyglobalsolutions.jp/127.0.0.1#5335 +ipset=/sonyglobalsolutions.jp/gfwlist +server=/monster-beats-by-dr-dre.com/127.0.0.1#5335 +ipset=/monster-beats-by-dr-dre.com/gfwlist +server=/sonydna.com/127.0.0.1#5335 +ipset=/sonydna.com/gfwlist +server=/japanbeast.com/127.0.0.1#5335 +ipset=/japanbeast.com/gfwlist +server=/amazon-lantern.com/127.0.0.1#5335 +ipset=/amazon-lantern.com/gfwlist +server=/sony.se/127.0.0.1#5335 +ipset=/sony.se/gfwlist +server=/cheapbeatsshopbydre.com/127.0.0.1#5335 +ipset=/cheapbeatsshopbydre.com/gfwlist +server=/visakorea.com/127.0.0.1#5335 +ipset=/visakorea.com/gfwlist +server=/sony.nl/127.0.0.1#5335 +ipset=/sony.nl/gfwlist +server=/sony.net/127.0.0.1#5335 +ipset=/sony.net/gfwlist +server=/sony.lv/127.0.0.1#5335 +ipset=/sony.lv/gfwlist +server=/sony.hu/127.0.0.1#5335 +ipset=/sony.hu/gfwlist +server=/sony.hr/127.0.0.1#5335 +ipset=/sony.hr/gfwlist +server=/appexchange.com/127.0.0.1#5335 +ipset=/appexchange.com/gfwlist +server=/sony.gr/127.0.0.1#5335 +ipset=/sony.gr/gfwlist +server=/yaburi.men/127.0.0.1#5335 +ipset=/yaburi.men/gfwlist +server=/cnbeta.com/127.0.0.1#5335 +ipset=/cnbeta.com/gfwlist +server=/sony.fr/127.0.0.1#5335 +ipset=/sony.fr/gfwlist +server=/yibei.org/127.0.0.1#5335 +ipset=/yibei.org/gfwlist +server=/sony.fi/127.0.0.1#5335 +ipset=/sony.fi/gfwlist +server=/realamericanstories.org/127.0.0.1#5335 +ipset=/realamericanstories.org/gfwlist +server=/intel.ro/127.0.0.1#5335 +ipset=/intel.ro/gfwlist +server=/sony.es/127.0.0.1#5335 +ipset=/sony.es/gfwlist +server=/sony.ee/127.0.0.1#5335 +ipset=/sony.ee/gfwlist +server=/boyfriendtv.com/127.0.0.1#5335 +ipset=/boyfriendtv.com/gfwlist +server=/sony.dk/127.0.0.1#5335 +ipset=/sony.dk/gfwlist +server=/onlygayvideo.com/127.0.0.1#5335 +ipset=/onlygayvideo.com/gfwlist +server=/sony.de/127.0.0.1#5335 +ipset=/sony.de/gfwlist +server=/naked-girls.me/127.0.0.1#5335 +ipset=/naked-girls.me/gfwlist +server=/sony.com.tr/127.0.0.1#5335 +ipset=/sony.com.tr/gfwlist +server=/adidas.ch/127.0.0.1#5335 +ipset=/adidas.ch/gfwlist +server=/twvid.com/127.0.0.1#5335 +ipset=/twvid.com/gfwlist +server=/get.page/127.0.0.1#5335 +ipset=/get.page/gfwlist +server=/vmworld2010.com/127.0.0.1#5335 +ipset=/vmworld2010.com/gfwlist +server=/sony.com.ph/127.0.0.1#5335 +ipset=/sony.com.ph/gfwlist +server=/vfsco.fi/127.0.0.1#5335 +ipset=/vfsco.fi/gfwlist +server=/1to1conference.com.au/127.0.0.1#5335 +ipset=/1to1conference.com.au/gfwlist +server=/adultartlinks.supertop-100.com/127.0.0.1#5335 +ipset=/adultartlinks.supertop-100.com/gfwlist +server=/sony.com.pe/127.0.0.1#5335 +ipset=/sony.com.pe/gfwlist +server=/atom.io/127.0.0.1#5335 +ipset=/atom.io/gfwlist +server=/sony.com.pa/127.0.0.1#5335 +ipset=/sony.com.pa/gfwlist +server=/sony.com.my/127.0.0.1#5335 +ipset=/sony.com.my/gfwlist +server=/sony.com.mk/127.0.0.1#5335 +ipset=/sony.com.mk/gfwlist +server=/sony.com.do/127.0.0.1#5335 +ipset=/sony.com.do/gfwlist +server=/dependabot.com/127.0.0.1#5335 +ipset=/dependabot.com/gfwlist +server=/peacocktv.com/127.0.0.1#5335 +ipset=/peacocktv.com/gfwlist +server=/sony.co.uk/127.0.0.1#5335 +ipset=/sony.co.uk/gfwlist +server=/sony.co.th/127.0.0.1#5335 +ipset=/sony.co.th/gfwlist +server=/sony.co.jp/127.0.0.1#5335 +ipset=/sony.co.jp/gfwlist +server=/sony.co.in/127.0.0.1#5335 +ipset=/sony.co.in/gfwlist +server=/sony.co.id/127.0.0.1#5335 +ipset=/sony.co.id/gfwlist +server=/sony.co.cr/127.0.0.1#5335 +ipset=/sony.co.cr/gfwlist +server=/sony.ch/127.0.0.1#5335 +ipset=/sony.ch/gfwlist +server=/sony.ca/127.0.0.1#5335 +ipset=/sony.ca/gfwlist +server=/globalsign.co.uk/127.0.0.1#5335 +ipset=/globalsign.co.uk/gfwlist +server=/verisign.in/127.0.0.1#5335 +ipset=/verisign.in/gfwlist +server=/sony.bg/127.0.0.1#5335 +ipset=/sony.bg/gfwlist +server=/sony.ba/127.0.0.1#5335 +ipset=/sony.ba/gfwlist +server=/sony-promotion.eu/127.0.0.1#5335 +ipset=/sony-promotion.eu/gfwlist +server=/sony-mea.com/127.0.0.1#5335 +ipset=/sony-mea.com/gfwlist +server=/sony-latin.com/127.0.0.1#5335 +ipset=/sony-latin.com/gfwlist +server=/tensorflow.org/127.0.0.1#5335 +ipset=/tensorflow.org/gfwlist +server=/sony-europe.com/127.0.0.1#5335 +ipset=/sony-europe.com/gfwlist +server=/camwhoresbay.com/127.0.0.1#5335 +ipset=/camwhoresbay.com/gfwlist +server=/whychoosevmwareeuc.com/127.0.0.1#5335 +ipset=/whychoosevmwareeuc.com/gfwlist +server=/momsteachsex.info/127.0.0.1#5335 +ipset=/momsteachsex.info/gfwlist +server=/df-bet.com/127.0.0.1#5335 +ipset=/df-bet.com/gfwlist +server=/worldescortindex.com/127.0.0.1#5335 +ipset=/worldescortindex.com/gfwlist +server=/snap.com/127.0.0.1#5335 +ipset=/snap.com/gfwlist +server=/pornaxo.com/127.0.0.1#5335 +ipset=/pornaxo.com/gfwlist +server=/sc-cdn.net/127.0.0.1#5335 +ipset=/sc-cdn.net/gfwlist +server=/wise-research.com/127.0.0.1#5335 +ipset=/wise-research.com/gfwlist +server=/smartonerobotics.com/127.0.0.1#5335 +ipset=/smartonerobotics.com/gfwlist +server=/dialogflow.com/127.0.0.1#5335 +ipset=/dialogflow.com/gfwlist +server=/sony.com.sv/127.0.0.1#5335 +ipset=/sony.com.sv/gfwlist +server=/wiisports.com/127.0.0.1#5335 +ipset=/wiisports.com/gfwlist +server=/s-rewards.hk/127.0.0.1#5335 +ipset=/s-rewards.hk/gfwlist +server=/s-cashonmobile.com/127.0.0.1#5335 +ipset=/s-cashonmobile.com/gfwlist +server=/ip73.com/127.0.0.1#5335 +ipset=/ip73.com/gfwlist +server=/12diasderegalosdeitunes.co.ve/127.0.0.1#5335 +ipset=/12diasderegalosdeitunes.co.ve/gfwlist +server=/hkcircleapp.com/127.0.0.1#5335 +ipset=/hkcircleapp.com/gfwlist +server=/barkadahansasmartone.com/127.0.0.1#5335 +ipset=/barkadahansasmartone.com/gfwlist +server=/appleone.community/127.0.0.1#5335 +ipset=/appleone.community/gfwlist +server=/samsunggalaxyfriends.com/127.0.0.1#5335 +ipset=/samsunggalaxyfriends.com/gfwlist +server=/canon-cee.com/127.0.0.1#5335 +ipset=/canon-cee.com/gfwlist +server=/fcfacebook.com/127.0.0.1#5335 +ipset=/fcfacebook.com/gfwlist +server=/ntc.party/127.0.0.1#5335 +ipset=/ntc.party/gfwlist +server=/nuvid.com/127.0.0.1#5335 +ipset=/nuvid.com/gfwlist +server=/vmwarelearning.com/127.0.0.1#5335 +ipset=/vmwarelearning.com/gfwlist +server=/samsungapps.com/127.0.0.1#5335 +ipset=/samsungapps.com/gfwlist +server=/bloombergprep.com/127.0.0.1#5335 +ipset=/bloombergprep.com/gfwlist +server=/samsung.com/127.0.0.1#5335 +ipset=/samsung.com/gfwlist +server=/vanish.co.in/127.0.0.1#5335 +ipset=/vanish.co.in/gfwlist +server=/galaxyappstore.com/127.0.0.1#5335 +ipset=/galaxyappstore.com/gfwlist +server=/steelbrick.com/127.0.0.1#5335 +ipset=/steelbrick.com/gfwlist +server=/xvideosnovinha.com.br/127.0.0.1#5335 +ipset=/xvideosnovinha.com.br/gfwlist +server=/sforce.com/127.0.0.1#5335 +ipset=/sforce.com/gfwlist +server=/sfdcstatic.com/127.0.0.1#5335 +ipset=/sfdcstatic.com/gfwlist +server=/sequence.com/127.0.0.1#5335 +ipset=/sequence.com/gfwlist +server=/dataliberation.org/127.0.0.1#5335 +ipset=/dataliberation.org/gfwlist +server=/google.com.ni/127.0.0.1#5335 +ipset=/google.com.ni/gfwlist +server=/salesforceliveagent.com/127.0.0.1#5335 +ipset=/salesforceliveagent.com/gfwlist +server=/salesforceiq.com/127.0.0.1#5335 +ipset=/salesforceiq.com/gfwlist +server=/line-apps-beta.com/127.0.0.1#5335 +ipset=/line-apps-beta.com/gfwlist +server=/straightpornstuds.com/127.0.0.1#5335 +ipset=/straightpornstuds.com/gfwlist +server=/2chav.com/127.0.0.1#5335 +ipset=/2chav.com/gfwlist +server=/pearsonclinical.eu/127.0.0.1#5335 +ipset=/pearsonclinical.eu/gfwlist +server=/salesforce.org/127.0.0.1#5335 +ipset=/salesforce.org/gfwlist +server=/faceboook.com/127.0.0.1#5335 +ipset=/faceboook.com/gfwlist +server=/unbrandedproducts.com/127.0.0.1#5335 +ipset=/unbrandedproducts.com/gfwlist +server=/quotable.com/127.0.0.1#5335 +ipset=/quotable.com/gfwlist +server=/pardot.com/127.0.0.1#5335 +ipset=/pardot.com/gfwlist +server=/microsoft.ca/127.0.0.1#5335 +ipset=/microsoft.ca/gfwlist +server=/force.com/127.0.0.1#5335 +ipset=/force.com/gfwlist +server=/exacttarget.com/127.0.0.1#5335 +ipset=/exacttarget.com/gfwlist +server=/liboggirls.net/127.0.0.1#5335 +ipset=/liboggirls.net/gfwlist +server=/minikelowna.ca/127.0.0.1#5335 +ipset=/minikelowna.ca/gfwlist +server=/einstein.com/127.0.0.1#5335 +ipset=/einstein.com/gfwlist +server=/desk.com/127.0.0.1#5335 +ipset=/desk.com/gfwlist +server=/google.mk/127.0.0.1#5335 +ipset=/google.mk/gfwlist +server=/demandware.com/127.0.0.1#5335 +ipset=/demandware.com/gfwlist +server=/drdrebeatsforu.com/127.0.0.1#5335 +ipset=/drdrebeatsforu.com/gfwlist +server=/ilife.gr/127.0.0.1#5335 +ipset=/ilife.gr/gfwlist +server=/cloudcraze.com/127.0.0.1#5335 +ipset=/cloudcraze.com/gfwlist +server=/chatter.com/127.0.0.1#5335 +ipset=/chatter.com/gfwlist +server=/beyondcore.com/127.0.0.1#5335 +ipset=/beyondcore.com/gfwlist +server=/razerzone.jp/127.0.0.1#5335 +ipset=/razerzone.jp/gfwlist +server=/razerzone.com/127.0.0.1#5335 +ipset=/razerzone.com/gfwlist +server=/newhentai.org/127.0.0.1#5335 +ipset=/newhentai.org/gfwlist +server=/qwant.fr/127.0.0.1#5335 +ipset=/qwant.fr/gfwlist +server=/ieee-sensors.org/127.0.0.1#5335 +ipset=/ieee-sensors.org/gfwlist +server=/soso7778.com/127.0.0.1#5335 +ipset=/soso7778.com/gfwlist +server=/shemalestardb.com/127.0.0.1#5335 +ipset=/shemalestardb.com/gfwlist +server=/qwant.com/127.0.0.1#5335 +ipset=/qwant.com/gfwlist +server=/intel.ag/127.0.0.1#5335 +ipset=/intel.ag/gfwlist +server=/mongodb.org/127.0.0.1#5335 +ipset=/mongodb.org/gfwlist +server=/uplinq.com/127.0.0.1#5335 +ipset=/uplinq.com/gfwlist +server=/bestialitysextaboo.com/127.0.0.1#5335 +ipset=/bestialitysextaboo.com/gfwlist +server=/snapdragonbooth.com/127.0.0.1#5335 +ipset=/snapdragonbooth.com/gfwlist +server=/snapdragon.cn/127.0.0.1#5335 +ipset=/snapdragon.cn/gfwlist +server=/minilangley.ca/127.0.0.1#5335 +ipset=/minilangley.ca/gfwlist +server=/qualcommventures.cn/127.0.0.1#5335 +ipset=/qualcommventures.cn/gfwlist +server=/qualcommretail.com/127.0.0.1#5335 +ipset=/qualcommretail.com/gfwlist +server=/avfox.cc/127.0.0.1#5335 +ipset=/avfox.cc/gfwlist +server=/sexxxhd.com/127.0.0.1#5335 +ipset=/sexxxhd.com/gfwlist +server=/volvobuses.pk/127.0.0.1#5335 +ipset=/volvobuses.pk/gfwlist +server=/qualcommmea.com/127.0.0.1#5335 +ipset=/qualcommmea.com/gfwlist +server=/qualcomm.fr/127.0.0.1#5335 +ipset=/qualcomm.fr/gfwlist +server=/lexisnexis.com/127.0.0.1#5335 +ipset=/lexisnexis.com/gfwlist +server=/qualcomm.com.tw/127.0.0.1#5335 +ipset=/qualcomm.com.tw/gfwlist +server=/qualcomm.co.kr/127.0.0.1#5335 +ipset=/qualcomm.co.kr/gfwlist +server=/qualcomm.co.in/127.0.0.1#5335 +ipset=/qualcomm.co.in/gfwlist +server=/whatsapp-plus.net/127.0.0.1#5335 +ipset=/whatsapp-plus.net/gfwlist +server=/mypearson.com/127.0.0.1#5335 +ipset=/mypearson.com/gfwlist +server=/qctconnect.com/127.0.0.1#5335 +ipset=/qctconnect.com/gfwlist +server=/patenttruth.org/127.0.0.1#5335 +ipset=/patenttruth.org/gfwlist +server=/pavpal.com/127.0.0.1#5335 +ipset=/pavpal.com/gfwlist +server=/mhshosting.com/127.0.0.1#5335 +ipset=/mhshosting.com/gfwlist +server=/imod.com/127.0.0.1#5335 +ipset=/imod.com/gfwlist +server=/vip-beats.com/127.0.0.1#5335 +ipset=/vip-beats.com/gfwlist +server=/gobianywhere.com/127.0.0.1#5335 +ipset=/gobianywhere.com/gfwlist +server=/cdmatech.com/127.0.0.1#5335 +ipset=/cdmatech.com/gfwlist +server=/sexgames.xxx/127.0.0.1#5335 +ipset=/sexgames.xxx/gfwlist +server=/donmai.us/127.0.0.1#5335 +ipset=/donmai.us/gfwlist +server=/berkanawireless.com/127.0.0.1#5335 +ipset=/berkanawireless.com/gfwlist +server=/bridgestonemerchandise.com/127.0.0.1#5335 +ipset=/bridgestonemerchandise.com/gfwlist +server=/cheap-nike.com/127.0.0.1#5335 +ipset=/cheap-nike.com/gfwlist +server=/jpg4us.net/127.0.0.1#5335 +ipset=/jpg4us.net/gfwlist +server=/volvotrucks.az/127.0.0.1#5335 +ipset=/volvotrucks.az/gfwlist +server=/stockingfetishvideo.com/127.0.0.1#5335 +ipset=/stockingfetishvideo.com/gfwlist +server=/ebayfashion.com/127.0.0.1#5335 +ipset=/ebayfashion.com/gfwlist +server=/genkai-hounyo.com/127.0.0.1#5335 +ipset=/genkai-hounyo.com/gfwlist +server=/bmw-motorrad.ua/127.0.0.1#5335 +ipset=/bmw-motorrad.ua/gfwlist +server=/pccw.com/127.0.0.1#5335 +ipset=/pccw.com/gfwlist +server=/hktpremier.com/127.0.0.1#5335 +ipset=/hktpremier.com/gfwlist +server=/hkt.com/127.0.0.1#5335 +ipset=/hkt.com/gfwlist +server=/media-rockstargames-com.akamaized.net/127.0.0.1#5335 +ipset=/media-rockstargames-com.akamaized.net/gfwlist +server=/scholar.google.com.hk/127.0.0.1#5335 +ipset=/scholar.google.com.hk/gfwlist +server=/hkt-eye.com/127.0.0.1#5335 +ipset=/hkt-eye.com/gfwlist +server=/esmarthealth.com/127.0.0.1#5335 +ipset=/esmarthealth.com/gfwlist +server=/drdrebeats-headphone.com/127.0.0.1#5335 +ipset=/drdrebeats-headphone.com/gfwlist +server=/panasonic.com/127.0.0.1#5335 +ipset=/panasonic.com/gfwlist +server=/facebookofsex.com/127.0.0.1#5335 +ipset=/facebookofsex.com/gfwlist +server=/oracleinfinity.io/127.0.0.1#5335 +ipset=/oracleinfinity.io/gfwlist +server=/oracleimg.com/127.0.0.1#5335 +ipset=/oracleimg.com/gfwlist +server=/oraclecloud.com/127.0.0.1#5335 +ipset=/oraclecloud.com/gfwlist +server=/oracle.com/127.0.0.1#5335 +ipset=/oracle.com/gfwlist +server=/jquerymobile.com/127.0.0.1#5335 +ipset=/jquerymobile.com/gfwlist +server=/openweathermap.org/127.0.0.1#5335 +ipset=/openweathermap.org/gfwlist +server=/nvidia.tt.omtrdc.net/127.0.0.1#5335 +ipset=/nvidia.tt.omtrdc.net/gfwlist +server=/tegrazone.kr/127.0.0.1#5335 +ipset=/tegrazone.kr/gfwlist +server=/mini.com.pa/127.0.0.1#5335 +ipset=/mini.com.pa/gfwlist +server=/steamstore-a.akamaihd.net/127.0.0.1#5335 +ipset=/steamstore-a.akamaihd.net/gfwlist +server=/tegrazone.com/127.0.0.1#5335 +ipset=/tegrazone.com/gfwlist +server=/deno.land/127.0.0.1#5335 +ipset=/deno.land/gfwlist +server=/hdready.xxx/127.0.0.1#5335 +ipset=/hdready.xxx/gfwlist +server=/pensions-expert.com/127.0.0.1#5335 +ipset=/pensions-expert.com/gfwlist +server=/nvidiagrid.net/127.0.0.1#5335 +ipset=/nvidiagrid.net/gfwlist +server=/fans-here.com/127.0.0.1#5335 +ipset=/fans-here.com/gfwlist +server=/nvidia.tw/127.0.0.1#5335 +ipset=/nvidia.tw/gfwlist +server=/nvidia.se/127.0.0.1#5335 +ipset=/nvidia.se/gfwlist +server=/reckittprofessional.com/127.0.0.1#5335 +ipset=/reckittprofessional.com/gfwlist +server=/pornoprive.xxx/127.0.0.1#5335 +ipset=/pornoprive.xxx/gfwlist +server=/nvidia.mx/127.0.0.1#5335 +ipset=/nvidia.mx/gfwlist +server=/yahoo.de/127.0.0.1#5335 +ipset=/yahoo.de/gfwlist +server=/nvidia.in/127.0.0.1#5335 +ipset=/nvidia.in/gfwlist +server=/microsoft.pt/127.0.0.1#5335 +ipset=/microsoft.pt/gfwlist +server=/nvidia.fi/127.0.0.1#5335 +ipset=/nvidia.fi/gfwlist +server=/candidforum-videos.com/127.0.0.1#5335 +ipset=/candidforum-videos.com/gfwlist +server=/nvidia.de/127.0.0.1#5335 +ipset=/nvidia.de/gfwlist +server=/cncrivals.com/127.0.0.1#5335 +ipset=/cncrivals.com/gfwlist +server=/nvidia.cz/127.0.0.1#5335 +ipset=/nvidia.cz/gfwlist +server=/love-sextoys.co.uk/127.0.0.1#5335 +ipset=/love-sextoys.co.uk/gfwlist +server=/nvidia.com.tw/127.0.0.1#5335 +ipset=/nvidia.com.tw/gfwlist +server=/enemaprocedure.com/127.0.0.1#5335 +ipset=/enemaprocedure.com/gfwlist +server=/thunderbolttechnology.net/127.0.0.1#5335 +ipset=/thunderbolttechnology.net/gfwlist +server=/nvidia.co.uk/127.0.0.1#5335 +ipset=/nvidia.co.uk/gfwlist +server=/nvidia.at/127.0.0.1#5335 +ipset=/nvidia.at/gfwlist +server=/gputechconf.jp/127.0.0.1#5335 +ipset=/gputechconf.jp/gfwlist +server=/gputechconf.in/127.0.0.1#5335 +ipset=/gputechconf.in/gfwlist +server=/durex.se/127.0.0.1#5335 +ipset=/durex.se/gfwlist +server=/anon-v.lol/127.0.0.1#5335 +ipset=/anon-v.lol/gfwlist +server=/lolespor.com/127.0.0.1#5335 +ipset=/lolespor.com/gfwlist +server=/taxidrivermovie.com/127.0.0.1#5335 +ipset=/taxidrivermovie.com/gfwlist +server=/instagramtakipcisatinal.net/127.0.0.1#5335 +ipset=/instagramtakipcisatinal.net/gfwlist +server=/geforce.co.uk/127.0.0.1#5335 +ipset=/geforce.co.uk/gfwlist +server=/hdxx.tv/127.0.0.1#5335 +ipset=/hdxx.tv/gfwlist +server=/megaporno.com.br/127.0.0.1#5335 +ipset=/megaporno.com.br/gfwlist +server=/pstatic.net/127.0.0.1#5335 +ipset=/pstatic.net/gfwlist +server=/famosascalvas.com/127.0.0.1#5335 +ipset=/famosascalvas.com/gfwlist +server=/maxis.com/127.0.0.1#5335 +ipset=/maxis.com/gfwlist +server=/ywoos.com/127.0.0.1#5335 +ipset=/ywoos.com/gfwlist +server=/springernature.com/127.0.0.1#5335 +ipset=/springernature.com/gfwlist +server=/grafolio.com/127.0.0.1#5335 +ipset=/grafolio.com/gfwlist +server=/mxmcdn.net/127.0.0.1#5335 +ipset=/mxmcdn.net/gfwlist +server=/musixmatch.com/127.0.0.1#5335 +ipset=/musixmatch.com/gfwlist +server=/cafr.ca/127.0.0.1#5335 +ipset=/cafr.ca/gfwlist +server=/paypalinsuranceservices.org/127.0.0.1#5335 +ipset=/paypalinsuranceservices.org/gfwlist +server=/poofetish.com/127.0.0.1#5335 +ipset=/poofetish.com/gfwlist +server=/mozilla.org/127.0.0.1#5335 +ipset=/mozilla.org/gfwlist +server=/mozilla.net/127.0.0.1#5335 +ipset=/mozilla.net/gfwlist +server=/crocotube.com/127.0.0.1#5335 +ipset=/crocotube.com/gfwlist +server=/nordstrommedia.com/127.0.0.1#5335 +ipset=/nordstrommedia.com/gfwlist +server=/illusion111.com/127.0.0.1#5335 +ipset=/illusion111.com/gfwlist +server=/mozilla.com/127.0.0.1#5335 +ipset=/mozilla.com/gfwlist +server=/developer.mozilla.org/127.0.0.1#5335 +ipset=/developer.mozilla.org/gfwlist +server=/quoracdn.net/127.0.0.1#5335 +ipset=/quoracdn.net/gfwlist +server=/indiansexstories2.net/127.0.0.1#5335 +ipset=/indiansexstories2.net/gfwlist +server=/yahoo.com.ec/127.0.0.1#5335 +ipset=/yahoo.com.ec/gfwlist +server=/beatsoutletanytime.com/127.0.0.1#5335 +ipset=/beatsoutletanytime.com/gfwlist +server=/img-s-msn-com.akamaized.net/127.0.0.1#5335 +ipset=/img-s-msn-com.akamaized.net/gfwlist +server=/media-imdb.com/127.0.0.1#5335 +ipset=/media-imdb.com/gfwlist +server=/cityoflove.com/127.0.0.1#5335 +ipset=/cityoflove.com/gfwlist +server=/intelinsight.com/127.0.0.1#5335 +ipset=/intelinsight.com/gfwlist +server=/thinkquarterly.co.uk/127.0.0.1#5335 +ipset=/thinkquarterly.co.uk/gfwlist +server=/winhec.net/127.0.0.1#5335 +ipset=/winhec.net/gfwlist +server=/jadult.net/127.0.0.1#5335 +ipset=/jadult.net/gfwlist +server=/jerkmatelive.org/127.0.0.1#5335 +ipset=/jerkmatelive.org/gfwlist +server=/windowssearch.com/127.0.0.1#5335 +ipset=/windowssearch.com/gfwlist +server=/windows.nl/127.0.0.1#5335 +ipset=/windows.nl/gfwlist +server=/alphabet.lt/127.0.0.1#5335 +ipset=/alphabet.lt/gfwlist +server=/windows.com/127.0.0.1#5335 +ipset=/windows.com/gfwlist +server=/windows-int.net/127.0.0.1#5335 +ipset=/windows-int.net/gfwlist +server=/paypal-mainstreet.net/127.0.0.1#5335 +ipset=/paypal-mainstreet.net/gfwlist +server=/wbd.ms/127.0.0.1#5335 +ipset=/wbd.ms/gfwlist +server=/facebooksafety.com/127.0.0.1#5335 +ipset=/facebooksafety.com/gfwlist +server=/hsxhr.cc/127.0.0.1#5335 +ipset=/hsxhr.cc/gfwlist +server=/vsallin.net/127.0.0.1#5335 +ipset=/vsallin.net/gfwlist +server=/userpxt.io/127.0.0.1#5335 +ipset=/userpxt.io/gfwlist +server=/google.az/127.0.0.1#5335 +ipset=/google.az/gfwlist +server=/tfsallin.net/127.0.0.1#5335 +ipset=/tfsallin.net/gfwlist +server=/cruel-furies.com/127.0.0.1#5335 +ipset=/cruel-furies.com/gfwlist +server=/facebookshop.com/127.0.0.1#5335 +ipset=/facebookshop.com/gfwlist +server=/castingcouch-x.com/127.0.0.1#5335 +ipset=/castingcouch-x.com/gfwlist +server=/ipostnaked.com/127.0.0.1#5335 +ipset=/ipostnaked.com/gfwlist +server=/motorshowblog.com/127.0.0.1#5335 +ipset=/motorshowblog.com/gfwlist +server=/headphoneshotsales.com/127.0.0.1#5335 +ipset=/headphoneshotsales.com/gfwlist +server=/perfectjizz.com/127.0.0.1#5335 +ipset=/perfectjizz.com/gfwlist +server=/geceguby.ru/127.0.0.1#5335 +ipset=/geceguby.ru/gfwlist +server=/staffhub.ms/127.0.0.1#5335 +ipset=/staffhub.ms/gfwlist +server=/skypeassets.com/127.0.0.1#5335 +ipset=/skypeassets.com/gfwlist +server=/skype.net/127.0.0.1#5335 +ipset=/skype.net/gfwlist +server=/sharepointonline.com/127.0.0.1#5335 +ipset=/sharepointonline.com/gfwlist +server=/rou.video/127.0.0.1#5335 +ipset=/rou.video/gfwlist +server=/mini.mq/127.0.0.1#5335 +ipset=/mini.mq/gfwlist +server=/girlscanner.cc/127.0.0.1#5335 +ipset=/girlscanner.cc/gfwlist +server=/alt2-mtalk.google.com/127.0.0.1#5335 +ipset=/alt2-mtalk.google.com/gfwlist +server=/viacom.com/127.0.0.1#5335 +ipset=/viacom.com/gfwlist +server=/sfbassets.net/127.0.0.1#5335 +ipset=/sfbassets.net/gfwlist +server=/pinterest.com.ec/127.0.0.1#5335 +ipset=/pinterest.com.ec/gfwlist +server=/eyny.com/127.0.0.1#5335 +ipset=/eyny.com/gfwlist +server=/sfbassets.com/127.0.0.1#5335 +ipset=/sfbassets.com/gfwlist +server=/s-microsoft.com/127.0.0.1#5335 +ipset=/s-microsoft.com/gfwlist +server=/akamaietpcnctest.com/127.0.0.1#5335 +ipset=/akamaietpcnctest.com/gfwlist +server=/beatsbydreonlines-uk.com/127.0.0.1#5335 +ipset=/beatsbydreonlines-uk.com/gfwlist +server=/pearson-schule.ch/127.0.0.1#5335 +ipset=/pearson-schule.ch/gfwlist +server=/projectsangam.com/127.0.0.1#5335 +ipset=/projectsangam.com/gfwlist +server=/pixapp.net/127.0.0.1#5335 +ipset=/pixapp.net/gfwlist +server=/54647.org/127.0.0.1#5335 +ipset=/54647.org/gfwlist +server=/lowergiseries.com/127.0.0.1#5335 +ipset=/lowergiseries.com/gfwlist +server=/nikeshoponline.com/127.0.0.1#5335 +ipset=/nikeshoponline.com/gfwlist +server=/informs.org/127.0.0.1#5335 +ipset=/informs.org/gfwlist +server=/outingsapp.com/127.0.0.1#5335 +ipset=/outingsapp.com/gfwlist +server=/tubepatrol.org/127.0.0.1#5335 +ipset=/tubepatrol.org/gfwlist +server=/opticsforthecloud.net/127.0.0.1#5335 +ipset=/opticsforthecloud.net/gfwlist +server=/runningnike.com/127.0.0.1#5335 +ipset=/runningnike.com/gfwlist +server=/bitballoon.com/127.0.0.1#5335 +ipset=/bitballoon.com/gfwlist +server=/illusionas.com/127.0.0.1#5335 +ipset=/illusionas.com/gfwlist +server=/pugpig-stage.com/127.0.0.1#5335 +ipset=/pugpig-stage.com/gfwlist +server=/niosii.net/127.0.0.1#5335 +ipset=/niosii.net/gfwlist +server=/mymicrosoft.com/127.0.0.1#5335 +ipset=/mymicrosoft.com/gfwlist +server=/bmwgroupdesignworks.com/127.0.0.1#5335 +ipset=/bmwgroupdesignworks.com/gfwlist +server=/msudalosti.com/127.0.0.1#5335 +ipset=/msudalosti.com/gfwlist +server=/msturing.org/127.0.0.1#5335 +ipset=/msturing.org/gfwlist +server=/adanaatikhaber.com/127.0.0.1#5335 +ipset=/adanaatikhaber.com/gfwlist +server=/vilavpn3.xyz/127.0.0.1#5335 +ipset=/vilavpn3.xyz/gfwlist +server=/topporn.me/127.0.0.1#5335 +ipset=/topporn.me/gfwlist +server=/msft.info/127.0.0.1#5335 +ipset=/msft.info/gfwlist +server=/geraldoatlarge.com/127.0.0.1#5335 +ipset=/geraldoatlarge.com/gfwlist +server=/screens-lab.jp/127.0.0.1#5335 +ipset=/screens-lab.jp/gfwlist +server=/kanzhongguo.eu/127.0.0.1#5335 +ipset=/kanzhongguo.eu/gfwlist +server=/msedge.net/127.0.0.1#5335 +ipset=/msedge.net/gfwlist +server=/mschallenge2018.com/127.0.0.1#5335 +ipset=/mschallenge2018.com/gfwlist +server=/binancezh.info/127.0.0.1#5335 +ipset=/binancezh.info/gfwlist +server=/ms365surfaceoffer.com/127.0.0.1#5335 +ipset=/ms365surfaceoffer.com/gfwlist +server=/ms-studiosmedia.com/127.0.0.1#5335 +ipset=/ms-studiosmedia.com/gfwlist +server=/disneymagicmoments.pl/127.0.0.1#5335 +ipset=/disneymagicmoments.pl/gfwlist +server=/mpnevolution.com/127.0.0.1#5335 +ipset=/mpnevolution.com/gfwlist +server=/manoramaonline.com/127.0.0.1#5335 +ipset=/manoramaonline.com/gfwlist +server=/vepornhd.club/127.0.0.1#5335 +ipset=/vepornhd.club/gfwlist +server=/morphcharts.com/127.0.0.1#5335 +ipset=/morphcharts.com/gfwlist +server=/freeviewplus.net.au/127.0.0.1#5335 +ipset=/freeviewplus.net.au/gfwlist +server=/microsoftstream.com/127.0.0.1#5335 +ipset=/microsoftstream.com/gfwlist +server=/microsoftsiteselection.com/127.0.0.1#5335 +ipset=/microsoftsiteselection.com/gfwlist +server=/microsoftready.com/127.0.0.1#5335 +ipset=/microsoftready.com/gfwlist +server=/telegra.ph/127.0.0.1#5335 +ipset=/telegra.ph/gfwlist +server=/microsoftpartnercommunity.com/127.0.0.1#5335 +ipset=/microsoftpartnercommunity.com/gfwlist +server=/microsoftlinc.com/127.0.0.1#5335 +ipset=/microsoftlinc.com/gfwlist +server=/microsofthouse.net/127.0.0.1#5335 +ipset=/microsofthouse.net/gfwlist +server=/beatsdanmark2013.com/127.0.0.1#5335 +ipset=/beatsdanmark2013.com/gfwlist +server=/microsoftcommunitytraining.com/127.0.0.1#5335 +ipset=/microsoftcommunitytraining.com/gfwlist +server=/microsoftcloudworkshop.com/127.0.0.1#5335 +ipset=/microsoftcloudworkshop.com/gfwlist +server=/theporndude.vip/127.0.0.1#5335 +ipset=/theporndude.vip/gfwlist +server=/megacamz.com/127.0.0.1#5335 +ipset=/megacamz.com/gfwlist +server=/microsoftadvertisingregionalawards.com/127.0.0.1#5335 +ipset=/microsoftadvertisingregionalawards.com/gfwlist +server=/microsoft-sbs-domains.com/127.0.0.1#5335 +ipset=/microsoft-sbs-domains.com/gfwlist +server=/easportsfootball.com/127.0.0.1#5335 +ipset=/easportsfootball.com/gfwlist +server=/microsoft-int.com/127.0.0.1#5335 +ipset=/microsoft-int.com/gfwlist +server=/live.net/127.0.0.1#5335 +ipset=/live.net/gfwlist +server=/live.com/127.0.0.1#5335 +ipset=/live.com/gfwlist +server=/ameba.jp/127.0.0.1#5335 +ipset=/ameba.jp/gfwlist +server=/anthemgame.com/127.0.0.1#5335 +ipset=/anthemgame.com/gfwlist +server=/celeron.net/127.0.0.1#5335 +ipset=/celeron.net/gfwlist +server=/figma.com/127.0.0.1#5335 +ipset=/figma.com/gfwlist +server=/applecomputers.co.nz/127.0.0.1#5335 +ipset=/applecomputers.co.nz/gfwlist +server=/rink.hockeyapp.net/127.0.0.1#5335 +ipset=/rink.hockeyapp.net/gfwlist +server=/aka-ai.net/127.0.0.1#5335 +ipset=/aka-ai.net/gfwlist +server=/18comic.cc/127.0.0.1#5335 +ipset=/18comic.cc/gfwlist +server=/lgbtq.games/127.0.0.1#5335 +ipset=/lgbtq.games/gfwlist +server=/hamivideo.hinet.net/127.0.0.1#5335 +ipset=/hamivideo.hinet.net/gfwlist +server=/entrustdatacard.com/127.0.0.1#5335 +ipset=/entrustdatacard.com/gfwlist +server=/fundfire.com/127.0.0.1#5335 +ipset=/fundfire.com/gfwlist +server=/beats-headphones-buy-cheap.com/127.0.0.1#5335 +ipset=/beats-headphones-buy-cheap.com/gfwlist +server=/nintendo.nl/127.0.0.1#5335 +ipset=/nintendo.nl/gfwlist +server=/nubiles.net/127.0.0.1#5335 +ipset=/nubiles.net/gfwlist +server=/tik-tokapi.com/127.0.0.1#5335 +ipset=/tik-tokapi.com/gfwlist +server=/tvmost.com.hk/127.0.0.1#5335 +ipset=/tvmost.com.hk/gfwlist +server=/facebookadvertisingsecrets.com/127.0.0.1#5335 +ipset=/facebookadvertisingsecrets.com/gfwlist +server=/bmw-vancouver.ca/127.0.0.1#5335 +ipset=/bmw-vancouver.ca/gfwlist +server=/ieeeusa.org/127.0.0.1#5335 +ipset=/ieeeusa.org/gfwlist +server=/lspimg.com/127.0.0.1#5335 +ipset=/lspimg.com/gfwlist +server=/hoodamateurs.com/127.0.0.1#5335 +ipset=/hoodamateurs.com/gfwlist +server=/huffpostmaghreb.com/127.0.0.1#5335 +ipset=/huffpostmaghreb.com/gfwlist +server=/ingads.com/127.0.0.1#5335 +ipset=/ingads.com/gfwlist +server=/imaginecup.pl/127.0.0.1#5335 +ipset=/imaginecup.pl/gfwlist +server=/32bm.cc/127.0.0.1#5335 +ipset=/32bm.cc/gfwlist +server=/internetexplorer.com/127.0.0.1#5335 +ipset=/internetexplorer.com/gfwlist +server=/xb18.me/127.0.0.1#5335 +ipset=/xb18.me/gfwlist +server=/beatsbydresolohdonline-canada.com/127.0.0.1#5335 +ipset=/beatsbydresolohdonline-canada.com/gfwlist +server=/touchid.tv/127.0.0.1#5335 +ipset=/touchid.tv/gfwlist +server=/intelserveredge.com/127.0.0.1#5335 +ipset=/intelserveredge.com/gfwlist +server=/scholar.google.cat/127.0.0.1#5335 +ipset=/scholar.google.cat/gfwlist +server=/cambridgemaths.org/127.0.0.1#5335 +ipset=/cambridgemaths.org/gfwlist +server=/beatsbydrdre4sale.com/127.0.0.1#5335 +ipset=/beatsbydrdre4sale.com/gfwlist +server=/drebeatsoldes.com/127.0.0.1#5335 +ipset=/drebeatsoldes.com/gfwlist +server=/onahodouga.com/127.0.0.1#5335 +ipset=/onahodouga.com/gfwlist +server=/bmw.com.gt/127.0.0.1#5335 +ipset=/bmw.com.gt/gfwlist +server=/hotmail.org/127.0.0.1#5335 +ipset=/hotmail.org/gfwlist +server=/tvappstore.net/127.0.0.1#5335 +ipset=/tvappstore.net/gfwlist +server=/hotmail.eu/127.0.0.1#5335 +ipset=/hotmail.eu/gfwlist +server=/foxcredit.com/127.0.0.1#5335 +ipset=/foxcredit.com/gfwlist +server=/adulttoontube.com/127.0.0.1#5335 +ipset=/adulttoontube.com/gfwlist +server=/smutstone.com/127.0.0.1#5335 +ipset=/smutstone.com/gfwlist +server=/hololens.com/127.0.0.1#5335 +ipset=/hololens.com/gfwlist +server=/lepornofrais.com/127.0.0.1#5335 +ipset=/lepornofrais.com/gfwlist +server=/gigjam.com/127.0.0.1#5335 +ipset=/gigjam.com/gfwlist +server=/jpavcom.com/127.0.0.1#5335 +ipset=/jpavcom.com/gfwlist +server=/9to5toys.com/127.0.0.1#5335 +ipset=/9to5toys.com/gfwlist +server=/gearstactics.com/127.0.0.1#5335 +ipset=/gearstactics.com/gfwlist +server=/washingtonpost.com/127.0.0.1#5335 +ipset=/washingtonpost.com/gfwlist +server=/management-azure-devices-int.net/127.0.0.1#5335 +ipset=/management-azure-devices-int.net/gfwlist +server=/applehongkong.com/127.0.0.1#5335 +ipset=/applehongkong.com/gfwlist +server=/gears5.com/127.0.0.1#5335 +ipset=/gears5.com/gfwlist +server=/foxsports.co.ve/127.0.0.1#5335 +ipset=/foxsports.co.ve/gfwlist +server=/gettyimages.ae/127.0.0.1#5335 +ipset=/gettyimages.ae/gfwlist +server=/magento.net/127.0.0.1#5335 +ipset=/magento.net/gfwlist +server=/ulifestyle.com.hk/127.0.0.1#5335 +ipset=/ulifestyle.com.hk/gfwlist +server=/alphabet.at/127.0.0.1#5335 +ipset=/alphabet.at/gfwlist +server=/origin.tv/127.0.0.1#5335 +ipset=/origin.tv/gfwlist +server=/bmw-connecteddrive.com/127.0.0.1#5335 +ipset=/bmw-connecteddrive.com/gfwlist +server=/efproject.net/127.0.0.1#5335 +ipset=/efproject.net/gfwlist +server=/dat.foundation/127.0.0.1#5335 +ipset=/dat.foundation/gfwlist +server=/ebayauction.com/127.0.0.1#5335 +ipset=/ebayauction.com/gfwlist +server=/bookshome.info/127.0.0.1#5335 +ipset=/bookshome.info/gfwlist +server=/am730.com.hk/127.0.0.1#5335 +ipset=/am730.com.hk/gfwlist +server=/beats4outlets.com/127.0.0.1#5335 +ipset=/beats4outlets.com/gfwlist +server=/disney.ch/127.0.0.1#5335 +ipset=/disney.ch/gfwlist +server=/jav01.cc/127.0.0.1#5335 +ipset=/jav01.cc/gfwlist +server=/bmw-rrdays.com/127.0.0.1#5335 +ipset=/bmw-rrdays.com/gfwlist +server=/mini.fr/127.0.0.1#5335 +ipset=/mini.fr/gfwlist +server=/crmdynint.com/127.0.0.1#5335 +ipset=/crmdynint.com/gfwlist +server=/ciscoresearch.com/127.0.0.1#5335 +ipset=/ciscoresearch.com/gfwlist +server=/hentai-moon.com/127.0.0.1#5335 +ipset=/hentai-moon.com/gfwlist +server=/crmdynint-gcc.com/127.0.0.1#5335 +ipset=/crmdynint-gcc.com/gfwlist +server=/entermediadb.net/127.0.0.1#5335 +ipset=/entermediadb.net/gfwlist +server=/gu-web.net/127.0.0.1#5335 +ipset=/gu-web.net/gfwlist +server=/4u4c.com/127.0.0.1#5335 +ipset=/4u4c.com/gfwlist +server=/paypalindia.com/127.0.0.1#5335 +ipset=/paypalindia.com/gfwlist +server=/coreml.net/127.0.0.1#5335 +ipset=/coreml.net/gfwlist +server=/cloudappsecurity.com/127.0.0.1#5335 +ipset=/cloudappsecurity.com/gfwlist +server=/amateurwifefuck.com/127.0.0.1#5335 +ipset=/amateurwifefuck.com/gfwlist +server=/cloudapp.net/127.0.0.1#5335 +ipset=/cloudapp.net/gfwlist +server=/youtube.vn/127.0.0.1#5335 +ipset=/youtube.vn/gfwlist +server=/lubetube.com/127.0.0.1#5335 +ipset=/lubetube.com/gfwlist +server=/applecom.com/127.0.0.1#5335 +ipset=/applecom.com/gfwlist +server=/now-tv.com/127.0.0.1#5335 +ipset=/now-tv.com/gfwlist +server=/coinglass.com/127.0.0.1#5335 +ipset=/coinglass.com/gfwlist +server=/youtube.cz/127.0.0.1#5335 +ipset=/youtube.cz/gfwlist +server=/mini.ua/127.0.0.1#5335 +ipset=/mini.ua/gfwlist +server=/bmw.com.tw/127.0.0.1#5335 +ipset=/bmw.com.tw/gfwlist +server=/applestore.com.au/127.0.0.1#5335 +ipset=/applestore.com.au/gfwlist +server=/mini.ca/127.0.0.1#5335 +ipset=/mini.ca/gfwlist +server=/centralvalidation.com/127.0.0.1#5335 +ipset=/centralvalidation.com/gfwlist +server=/bmwgroup.net/127.0.0.1#5335 +ipset=/bmwgroup.net/gfwlist +server=/thesims4.com/127.0.0.1#5335 +ipset=/thesims4.com/gfwlist +server=/brazilpartneruniversity.com/127.0.0.1#5335 +ipset=/brazilpartneruniversity.com/gfwlist +server=/heroku.com/127.0.0.1#5335 +ipset=/heroku.com/gfwlist +server=/osakamotion.net/127.0.0.1#5335 +ipset=/osakamotion.net/gfwlist +server=/collector.xhamster.com/127.0.0.1#5335 +ipset=/collector.xhamster.com/gfwlist +server=/asp.net/127.0.0.1#5335 +ipset=/asp.net/gfwlist +server=/princeton.edu/127.0.0.1#5335 +ipset=/princeton.edu/gfwlist +server=/gdsrx888.com/127.0.0.1#5335 +ipset=/gdsrx888.com/gfwlist +server=/barelist.com/127.0.0.1#5335 +ipset=/barelist.com/gfwlist +server=/battlelog.com/127.0.0.1#5335 +ipset=/battlelog.com/gfwlist +server=/applicationinsights.net/127.0.0.1#5335 +ipset=/applicationinsights.net/gfwlist +server=/camfinder.com/127.0.0.1#5335 +ipset=/camfinder.com/gfwlist +server=/ebay.at/127.0.0.1#5335 +ipset=/ebay.at/gfwlist +server=/musicbay.net/127.0.0.1#5335 +ipset=/musicbay.net/gfwlist +server=/blogspot.com.ar/127.0.0.1#5335 +ipset=/blogspot.com.ar/gfwlist +server=/aka.ms/127.0.0.1#5335 +ipset=/aka.ms/gfwlist +server=/m12.vc/127.0.0.1#5335 +ipset=/m12.vc/gfwlist +server=/teensnow.link/127.0.0.1#5335 +ipset=/teensnow.link/gfwlist +server=/faceboop.com/127.0.0.1#5335 +ipset=/faceboop.com/gfwlist +server=/playshow.io/127.0.0.1#5335 +ipset=/playshow.io/gfwlist +server=/adobetarget.com/127.0.0.1#5335 +ipset=/adobetarget.com/gfwlist +server=/wwtbam.com/127.0.0.1#5335 +ipset=/wwtbam.com/gfwlist +server=/91sesex.xyz/127.0.0.1#5335 +ipset=/91sesex.xyz/gfwlist +server=/webcammedellin.co/127.0.0.1#5335 +ipset=/webcammedellin.co/gfwlist +server=/paypall.com/127.0.0.1#5335 +ipset=/paypall.com/gfwlist +server=/steam.eca.qtlglb.com/127.0.0.1#5335 +ipset=/steam.eca.qtlglb.com/gfwlist +server=/mini.cc/127.0.0.1#5335 +ipset=/mini.cc/gfwlist +server=/qualcommventures.com/127.0.0.1#5335 +ipset=/qualcommventures.com/gfwlist +server=/hdsexxx.net/127.0.0.1#5335 +ipset=/hdsexxx.net/gfwlist +server=/egotastic.com/127.0.0.1#5335 +ipset=/egotastic.com/gfwlist +server=/xn--hckl3e1e8a8ajin0czf.net/127.0.0.1#5335 +ipset=/xn--hckl3e1e8a8ajin0czf.net/gfwlist +server=/nike.ci/127.0.0.1#5335 +ipset=/nike.ci/gfwlist +server=/naughtyhentai.biz/127.0.0.1#5335 +ipset=/naughtyhentai.biz/gfwlist +server=/microsoft.si/127.0.0.1#5335 +ipset=/microsoft.si/gfwlist +server=/convrgencegame.com/127.0.0.1#5335 +ipset=/convrgencegame.com/gfwlist +server=/yourpelvicultrasound.com/127.0.0.1#5335 +ipset=/yourpelvicultrasound.com/gfwlist +server=/goodporno.cc/127.0.0.1#5335 +ipset=/goodporno.cc/gfwlist +server=/microsoft.red/127.0.0.1#5335 +ipset=/microsoft.red/gfwlist +server=/curbed.com/127.0.0.1#5335 +ipset=/curbed.com/gfwlist +server=/shemaleleaks.com/127.0.0.1#5335 +ipset=/shemaleleaks.com/gfwlist +server=/googlearth.com/127.0.0.1#5335 +ipset=/googlearth.com/gfwlist +server=/urduvoa.com/127.0.0.1#5335 +ipset=/urduvoa.com/gfwlist +server=/mastercardcenterforinclusivegrowth.org/127.0.0.1#5335 +ipset=/mastercardcenterforinclusivegrowth.org/gfwlist +server=/minipetfriendly.com/127.0.0.1#5335 +ipset=/minipetfriendly.com/gfwlist +server=/youtube.pl/127.0.0.1#5335 +ipset=/youtube.pl/gfwlist +server=/microsoft.net/127.0.0.1#5335 +ipset=/microsoft.net/gfwlist +server=/relateiq.com/127.0.0.1#5335 +ipset=/relateiq.com/gfwlist +server=/amateurest.com/127.0.0.1#5335 +ipset=/amateurest.com/gfwlist +server=/paypal-specialoffers.com/127.0.0.1#5335 +ipset=/paypal-specialoffers.com/gfwlist +server=/sandisk.es/127.0.0.1#5335 +ipset=/sandisk.es/gfwlist +server=/cloudlock.com/127.0.0.1#5335 +ipset=/cloudlock.com/gfwlist +server=/nudewifeporn.com/127.0.0.1#5335 +ipset=/nudewifeporn.com/gfwlist +server=/microsoft.lt/127.0.0.1#5335 +ipset=/microsoft.lt/gfwlist +server=/microsoft.jp/127.0.0.1#5335 +ipset=/microsoft.jp/gfwlist +server=/fdiintelligence.com/127.0.0.1#5335 +ipset=/fdiintelligence.com/gfwlist +server=/w3.org/127.0.0.1#5335 +ipset=/w3.org/gfwlist +server=/javlibrary.com/127.0.0.1#5335 +ipset=/javlibrary.com/gfwlist +server=/safechat.com/127.0.0.1#5335 +ipset=/safechat.com/gfwlist +server=/beatsbydre-store.com/127.0.0.1#5335 +ipset=/beatsbydre-store.com/gfwlist +server=/avbebe.com/127.0.0.1#5335 +ipset=/avbebe.com/gfwlist +server=/autodraw.com/127.0.0.1#5335 +ipset=/autodraw.com/gfwlist +server=/microsoft.io/127.0.0.1#5335 +ipset=/microsoft.io/gfwlist +server=/paypal-galactic.com/127.0.0.1#5335 +ipset=/paypal-galactic.com/gfwlist +server=/scholar.google.se/127.0.0.1#5335 +ipset=/scholar.google.se/gfwlist +server=/vaginal-ultrasound.com/127.0.0.1#5335 +ipset=/vaginal-ultrasound.com/gfwlist +server=/mac.com.au/127.0.0.1#5335 +ipset=/mac.com.au/gfwlist +server=/momsboysmovies.net/127.0.0.1#5335 +ipset=/momsboysmovies.net/gfwlist +server=/microsoft.eu/127.0.0.1#5335 +ipset=/microsoft.eu/gfwlist +server=/microsoft.es/127.0.0.1#5335 +ipset=/microsoft.es/gfwlist +server=/google.bg/127.0.0.1#5335 +ipset=/google.bg/gfwlist +server=/voatour.com/127.0.0.1#5335 +ipset=/voatour.com/gfwlist +server=/disneymovieinsiders.com/127.0.0.1#5335 +ipset=/disneymovieinsiders.com/gfwlist +server=/pypl.net/127.0.0.1#5335 +ipset=/pypl.net/gfwlist +server=/swisssign.ch/127.0.0.1#5335 +ipset=/swisssign.ch/gfwlist +server=/fbthirdpartypixel.net/127.0.0.1#5335 +ipset=/fbthirdpartypixel.net/gfwlist +server=/pieceofplastic.com/127.0.0.1#5335 +ipset=/pieceofplastic.com/gfwlist +server=/heaven-burns-red.com/127.0.0.1#5335 +ipset=/heaven-burns-red.com/gfwlist +server=/visa.pl/127.0.0.1#5335 +ipset=/visa.pl/gfwlist +server=/fantasticyoungporn.com/127.0.0.1#5335 +ipset=/fantasticyoungporn.com/gfwlist +server=/rocksdb.net/127.0.0.1#5335 +ipset=/rocksdb.net/gfwlist +server=/sony.com/127.0.0.1#5335 +ipset=/sony.com/gfwlist +server=/b-ok.africa/127.0.0.1#5335 +ipset=/b-ok.africa/gfwlist +server=/nikeincchemistry.com/127.0.0.1#5335 +ipset=/nikeincchemistry.com/gfwlist +server=/pornpair.com/127.0.0.1#5335 +ipset=/pornpair.com/gfwlist +server=/half.com/127.0.0.1#5335 +ipset=/half.com/gfwlist +server=/telegram.me/127.0.0.1#5335 +ipset=/telegram.me/gfwlist +server=/mastercard.by/127.0.0.1#5335 +ipset=/mastercard.by/gfwlist +server=/xxxclub.club/127.0.0.1#5335 +ipset=/xxxclub.club/gfwlist +server=/pornhat.tv/127.0.0.1#5335 +ipset=/pornhat.tv/gfwlist +server=/microsoft.ch/127.0.0.1#5335 +ipset=/microsoft.ch/gfwlist +server=/virtualrealgay.com/127.0.0.1#5335 +ipset=/virtualrealgay.com/gfwlist +server=/cbsnews.com/127.0.0.1#5335 +ipset=/cbsnews.com/gfwlist +server=/metamind.io/127.0.0.1#5335 +ipset=/metamind.io/gfwlist +server=/google.pn/127.0.0.1#5335 +ipset=/google.pn/gfwlist +server=/greginhollywood.com/127.0.0.1#5335 +ipset=/greginhollywood.com/gfwlist +server=/foxsportsgo.com/127.0.0.1#5335 +ipset=/foxsportsgo.com/gfwlist +server=/youtube.com.co/127.0.0.1#5335 +ipset=/youtube.com.co/gfwlist +server=/discountporn.club/127.0.0.1#5335 +ipset=/discountporn.club/gfwlist +server=/areyoucreditwise.com/127.0.0.1#5335 +ipset=/areyoucreditwise.com/gfwlist +server=/enemabasics.com/127.0.0.1#5335 +ipset=/enemabasics.com/gfwlist +server=/amateuroldsluts.com/127.0.0.1#5335 +ipset=/amateuroldsluts.com/gfwlist +server=/walmart.com/127.0.0.1#5335 +ipset=/walmart.com/gfwlist +server=/analpornhouse.com/127.0.0.1#5335 +ipset=/analpornhouse.com/gfwlist +server=/nikekd.com/127.0.0.1#5335 +ipset=/nikekd.com/gfwlist +server=/9to5mac.com/127.0.0.1#5335 +ipset=/9to5mac.com/gfwlist +server=/bubbaporn.com/127.0.0.1#5335 +ipset=/bubbaporn.com/gfwlist +server=/udemy.com/127.0.0.1#5335 +ipset=/udemy.com/gfwlist +server=/ozodi.org/127.0.0.1#5335 +ipset=/ozodi.org/gfwlist +server=/faronicslabs.com/127.0.0.1#5335 +ipset=/faronicslabs.com/gfwlist +server=/playerjs.io/127.0.0.1#5335 +ipset=/playerjs.io/gfwlist +server=/sprinklesapp.com/127.0.0.1#5335 +ipset=/sprinklesapp.com/gfwlist +server=/microsoft.az/127.0.0.1#5335 +ipset=/microsoft.az/gfwlist +server=/canon.de/127.0.0.1#5335 +ipset=/canon.de/gfwlist +server=/naoconto.com/127.0.0.1#5335 +ipset=/naoconto.com/gfwlist +server=/onedrive.org/127.0.0.1#5335 +ipset=/onedrive.org/gfwlist +server=/pvp.net/127.0.0.1#5335 +ipset=/pvp.net/gfwlist +server=/onedrive.net/127.0.0.1#5335 +ipset=/onedrive.net/gfwlist +server=/onedrive.eu/127.0.0.1#5335 +ipset=/onedrive.eu/gfwlist +server=/packagist.org/127.0.0.1#5335 +ipset=/packagist.org/gfwlist +server=/onedrive.com/127.0.0.1#5335 +ipset=/onedrive.com/gfwlist +server=/livefilestore.com/127.0.0.1#5335 +ipset=/livefilestore.com/gfwlist +server=/zoophilist.net/127.0.0.1#5335 +ipset=/zoophilist.net/gfwlist +server=/ebaymotors.ca/127.0.0.1#5335 +ipset=/ebaymotors.ca/gfwlist +server=/msnkids.com/127.0.0.1#5335 +ipset=/msnkids.com/gfwlist +server=/yahoo.az/127.0.0.1#5335 +ipset=/yahoo.az/gfwlist +server=/scholar.google.com.sg/127.0.0.1#5335 +ipset=/scholar.google.com.sg/gfwlist +server=/xnxx.com/127.0.0.1#5335 +ipset=/xnxx.com/gfwlist +server=/msnewskids.org/127.0.0.1#5335 +ipset=/msnewskids.org/gfwlist +server=/fecbook.com/127.0.0.1#5335 +ipset=/fecbook.com/gfwlist +server=/embl-hamburg.de/127.0.0.1#5335 +ipset=/embl-hamburg.de/gfwlist +server=/msnewskids.net/127.0.0.1#5335 +ipset=/msnewskids.net/gfwlist +server=/msnewskids.com/127.0.0.1#5335 +ipset=/msnewskids.com/gfwlist +server=/enjoyfuck.com/127.0.0.1#5335 +ipset=/enjoyfuck.com/gfwlist +server=/bs-awh.ne.jp/127.0.0.1#5335 +ipset=/bs-awh.ne.jp/gfwlist +server=/clannad-movie.jp/127.0.0.1#5335 +ipset=/clannad-movie.jp/gfwlist +server=/microsoftnewskids.org/127.0.0.1#5335 +ipset=/microsoftnewskids.org/gfwlist +server=/microsoftnewskids.net/127.0.0.1#5335 +ipset=/microsoftnewskids.net/gfwlist +server=/kimogirl.cc/127.0.0.1#5335 +ipset=/kimogirl.cc/gfwlist +server=/microsoftnewsforkids.org/127.0.0.1#5335 +ipset=/microsoftnewsforkids.org/gfwlist +server=/swiftfinancial.info/127.0.0.1#5335 +ipset=/swiftfinancial.info/gfwlist +server=/svaboda.org/127.0.0.1#5335 +ipset=/svaboda.org/gfwlist +server=/facbebook.com/127.0.0.1#5335 +ipset=/facbebook.com/gfwlist +server=/foxdeportes.net/127.0.0.1#5335 +ipset=/foxdeportes.net/gfwlist +server=/ahorsecock.com/127.0.0.1#5335 +ipset=/ahorsecock.com/gfwlist +server=/foxnation.com/127.0.0.1#5335 +ipset=/foxnation.com/gfwlist +server=/wiseid.com/127.0.0.1#5335 +ipset=/wiseid.com/gfwlist +server=/microsoftnewsforkids.com/127.0.0.1#5335 +ipset=/microsoftnewsforkids.com/gfwlist +server=/microsoftnews.net/127.0.0.1#5335 +ipset=/microsoftnews.net/gfwlist +server=/renovacionoffice.com/127.0.0.1#5335 +ipset=/renovacionoffice.com/gfwlist +server=/sstatic.net/127.0.0.1#5335 +ipset=/sstatic.net/gfwlist +server=/microsoftmxfilantropia.com/127.0.0.1#5335 +ipset=/microsoftmxfilantropia.com/gfwlist +server=/monsterbeatsbydrdre-nz.com/127.0.0.1#5335 +ipset=/monsterbeatsbydrdre-nz.com/gfwlist +server=/amabitch.com/127.0.0.1#5335 +ipset=/amabitch.com/gfwlist +server=/zeit-world.org/127.0.0.1#5335 +ipset=/zeit-world.org/gfwlist +server=/amateurpages.com/127.0.0.1#5335 +ipset=/amateurpages.com/gfwlist +server=/cilk.net/127.0.0.1#5335 +ipset=/cilk.net/gfwlist +server=/cheapbeatsaustraliasale.com/127.0.0.1#5335 +ipset=/cheapbeatsaustraliasale.com/gfwlist +server=/airwick.it/127.0.0.1#5335 +ipset=/airwick.it/gfwlist +server=/masalladeloslimites.com/127.0.0.1#5335 +ipset=/masalladeloslimites.com/gfwlist +server=/afriboyz.com/127.0.0.1#5335 +ipset=/afriboyz.com/gfwlist +server=/voanoticias.com/127.0.0.1#5335 +ipset=/voanoticias.com/gfwlist +server=/guambmw.com/127.0.0.1#5335 +ipset=/guambmw.com/gfwlist +server=/flipwithsurface.com/127.0.0.1#5335 +ipset=/flipwithsurface.com/gfwlist +server=/dictate.ms/127.0.0.1#5335 +ipset=/dictate.ms/gfwlist +server=/wellfuckedwife.com/127.0.0.1#5335 +ipset=/wellfuckedwife.com/gfwlist +server=/subscene.com/127.0.0.1#5335 +ipset=/subscene.com/gfwlist +server=/hentaix.me/127.0.0.1#5335 +ipset=/hentaix.me/gfwlist +server=/kkbox.com/127.0.0.1#5335 +ipset=/kkbox.com/gfwlist +server=/ads.pubmatic.com/127.0.0.1#5335 +ipset=/ads.pubmatic.com/gfwlist +server=/exgirlfriendmarket.com/127.0.0.1#5335 +ipset=/exgirlfriendmarket.com/gfwlist +server=/lepornochaud.com/127.0.0.1#5335 +ipset=/lepornochaud.com/gfwlist +server=/bisyoujyogyaruge.topaz.ne.jp/127.0.0.1#5335 +ipset=/bisyoujyogyaruge.topaz.ne.jp/gfwlist +server=/adobesign.com/127.0.0.1#5335 +ipset=/adobesign.com/gfwlist +server=/minihalifax.ca/127.0.0.1#5335 +ipset=/minihalifax.ca/gfwlist +server=/dailybasis.com/127.0.0.1#5335 +ipset=/dailybasis.com/gfwlist +server=/harpercollins.co.uk/127.0.0.1#5335 +ipset=/harpercollins.co.uk/gfwlist +server=/bing.net/127.0.0.1#5335 +ipset=/bing.net/gfwlist +server=/theinstagramhack.com/127.0.0.1#5335 +ipset=/theinstagramhack.com/gfwlist +server=/azure-dns.org/127.0.0.1#5335 +ipset=/azure-dns.org/gfwlist +server=/azure-dns.info/127.0.0.1#5335 +ipset=/azure-dns.info/gfwlist +server=/mocloudplus.com/127.0.0.1#5335 +ipset=/mocloudplus.com/gfwlist +server=/ebayincconnectedcommerce.net/127.0.0.1#5335 +ipset=/ebayincconnectedcommerce.net/gfwlist +server=/disney.it/127.0.0.1#5335 +ipset=/disney.it/gfwlist +server=/steamofporn.com/127.0.0.1#5335 +ipset=/steamofporn.com/gfwlist +server=/tomatespodres.com/127.0.0.1#5335 +ipset=/tomatespodres.com/gfwlist +server=/gsuite.com/127.0.0.1#5335 +ipset=/gsuite.com/gfwlist +server=/windowsazure.com/127.0.0.1#5335 +ipset=/windowsazure.com/gfwlist +server=/workspaceone.com/127.0.0.1#5335 +ipset=/workspaceone.com/gfwlist +server=/picacomic.com/127.0.0.1#5335 +ipset=/picacomic.com/gfwlist +server=/trafficmanager.net/127.0.0.1#5335 +ipset=/trafficmanager.net/gfwlist +server=/bestpornsites.eu/127.0.0.1#5335 +ipset=/bestpornsites.eu/gfwlist +server=/awsloft-johannesburg.com/127.0.0.1#5335 +ipset=/awsloft-johannesburg.com/gfwlist +server=/foxsoccermatchpass.com/127.0.0.1#5335 +ipset=/foxsoccermatchpass.com/gfwlist +server=/starbucks.co.za/127.0.0.1#5335 +ipset=/starbucks.co.za/gfwlist +server=/jetbrains.com/127.0.0.1#5335 +ipset=/jetbrains.com/gfwlist +server=/hotcumporn.com/127.0.0.1#5335 +ipset=/hotcumporn.com/gfwlist +server=/huffingtonpost.it/127.0.0.1#5335 +ipset=/huffingtonpost.it/gfwlist +server=/direcpath.com/127.0.0.1#5335 +ipset=/direcpath.com/gfwlist +server=/gotcosmos.com/127.0.0.1#5335 +ipset=/gotcosmos.com/gfwlist +server=/devopsms.com/127.0.0.1#5335 +ipset=/devopsms.com/gfwlist +server=/beats-bydreuk.com/127.0.0.1#5335 +ipset=/beats-bydreuk.com/gfwlist +server=/pricelesssantiago.com/127.0.0.1#5335 +ipset=/pricelesssantiago.com/gfwlist +server=/printeron.com/127.0.0.1#5335 +ipset=/printeron.com/gfwlist +server=/visa.com.ph/127.0.0.1#5335 +ipset=/visa.com.ph/gfwlist +server=/embed-cdn.com/127.0.0.1#5335 +ipset=/embed-cdn.com/gfwlist +server=/minidowntown.com/127.0.0.1#5335 +ipset=/minidowntown.com/gfwlist +server=/azurewebsites.net/127.0.0.1#5335 +ipset=/azurewebsites.net/gfwlist +server=/ebaypark.com/127.0.0.1#5335 +ipset=/ebaypark.com/gfwlist +server=/azuresmartspaces.net/127.0.0.1#5335 +ipset=/azuresmartspaces.net/gfwlist +server=/md.hkgolden.com/127.0.0.1#5335 +ipset=/md.hkgolden.com/gfwlist +server=/ero-mangalife.com/127.0.0.1#5335 +ipset=/ero-mangalife.com/gfwlist +server=/newbrazz.com/127.0.0.1#5335 +ipset=/newbrazz.com/gfwlist +server=/javdb.com/127.0.0.1#5335 +ipset=/javdb.com/gfwlist +server=/azureserviceprofiler.com/127.0.0.1#5335 +ipset=/azureserviceprofiler.com/gfwlist +server=/msgamesresearch.com/127.0.0.1#5335 +ipset=/msgamesresearch.com/gfwlist +server=/youlucky.com/127.0.0.1#5335 +ipset=/youlucky.com/gfwlist +server=/enemahistory.com/127.0.0.1#5335 +ipset=/enemahistory.com/gfwlist +server=/lovemarca.com/127.0.0.1#5335 +ipset=/lovemarca.com/gfwlist +server=/cheapbeatsdrdresolo.com/127.0.0.1#5335 +ipset=/cheapbeatsdrdresolo.com/gfwlist +server=/anal-pantyhose.com/127.0.0.1#5335 +ipset=/anal-pantyhose.com/gfwlist +server=/maddenseason.info/127.0.0.1#5335 +ipset=/maddenseason.info/gfwlist +server=/steampipe-partner.akamaized.net/127.0.0.1#5335 +ipset=/steampipe-partner.akamaized.net/gfwlist +server=/poisontube.com/127.0.0.1#5335 +ipset=/poisontube.com/gfwlist +server=/hpstore.corpmerchandise.com/127.0.0.1#5335 +ipset=/hpstore.corpmerchandise.com/gfwlist +server=/eafootballworld.com/127.0.0.1#5335 +ipset=/eafootballworld.com/gfwlist +server=/yahoo.com.es/127.0.0.1#5335 +ipset=/yahoo.com.es/gfwlist +server=/cam69.com/127.0.0.1#5335 +ipset=/cam69.com/gfwlist +server=/azuredns-prd.info/127.0.0.1#5335 +ipset=/azuredns-prd.info/gfwlist +server=/largecamtube.com/127.0.0.1#5335 +ipset=/largecamtube.com/gfwlist +server=/siri.com/127.0.0.1#5335 +ipset=/siri.com/gfwlist +server=/prd-priconne-redive.akamaized.net/127.0.0.1#5335 +ipset=/prd-priconne-redive.akamaized.net/gfwlist +server=/azuredigitaltwins.com/127.0.0.1#5335 +ipset=/azuredigitaltwins.com/gfwlist +server=/openapiplatform.com/127.0.0.1#5335 +ipset=/openapiplatform.com/gfwlist +server=/azuredigitaltwin.com/127.0.0.1#5335 +ipset=/azuredigitaltwin.com/gfwlist +server=/get.how/127.0.0.1#5335 +ipset=/get.how/gfwlist +server=/azuredatabricks.net/127.0.0.1#5335 +ipset=/azuredatabricks.net/gfwlist +server=/facebkkk.com/127.0.0.1#5335 +ipset=/facebkkk.com/gfwlist +server=/yahoo.lv/127.0.0.1#5335 +ipset=/yahoo.lv/gfwlist +server=/playz.jp/127.0.0.1#5335 +ipset=/playz.jp/gfwlist +server=/veryshortintroductions.com/127.0.0.1#5335 +ipset=/veryshortintroductions.com/gfwlist +server=/typekit.com/127.0.0.1#5335 +ipset=/typekit.com/gfwlist +server=/paypal-exchanges.com/127.0.0.1#5335 +ipset=/paypal-exchanges.com/gfwlist +server=/mini-e.com/127.0.0.1#5335 +ipset=/mini-e.com/gfwlist +server=/azurecosmosdb.com/127.0.0.1#5335 +ipset=/azurecosmosdb.com/gfwlist +server=/mobilepornmovies.com/127.0.0.1#5335 +ipset=/mobilepornmovies.com/gfwlist +server=/azurecosmos.net/127.0.0.1#5335 +ipset=/azurecosmos.net/gfwlist +server=/azurecontainer.io/127.0.0.1#5335 +ipset=/azurecontainer.io/gfwlist +server=/stadia.dev/127.0.0.1#5335 +ipset=/stadia.dev/gfwlist +server=/redkix.com/127.0.0.1#5335 +ipset=/redkix.com/gfwlist +server=/attwatchtv.com/127.0.0.1#5335 +ipset=/attwatchtv.com/gfwlist +server=/pearson.com.au/127.0.0.1#5335 +ipset=/pearson.com.au/gfwlist +server=/brokenteens.com/127.0.0.1#5335 +ipset=/brokenteens.com/gfwlist +server=/bestbuy.com.mx/127.0.0.1#5335 +ipset=/bestbuy.com.mx/gfwlist +server=/ebayclassifies.com/127.0.0.1#5335 +ipset=/ebayclassifies.com/gfwlist +server=/sexycandidgirls.com/127.0.0.1#5335 +ipset=/sexycandidgirls.com/gfwlist +server=/fullbookmm.blogspot.com/127.0.0.1#5335 +ipset=/fullbookmm.blogspot.com/gfwlist +server=/aflamsex.net/127.0.0.1#5335 +ipset=/aflamsex.net/gfwlist +server=/gucci.com/127.0.0.1#5335 +ipset=/gucci.com/gfwlist +server=/thetype.com/127.0.0.1#5335 +ipset=/thetype.com/gfwlist +server=/verilystudyhub.com/127.0.0.1#5335 +ipset=/verilystudyhub.com/gfwlist +server=/2014cheapbeatsbydre.com/127.0.0.1#5335 +ipset=/2014cheapbeatsbydre.com/gfwlist +server=/azure.com/127.0.0.1#5335 +ipset=/azure.com/gfwlist +server=/minivilledequebec.ca/127.0.0.1#5335 +ipset=/minivilledequebec.ca/gfwlist +server=/azure-test.net/127.0.0.1#5335 +ipset=/azure-test.net/gfwlist +server=/pki.goog/127.0.0.1#5335 +ipset=/pki.goog/gfwlist +server=/braintreepayments.com/127.0.0.1#5335 +ipset=/braintreepayments.com/gfwlist +server=/azure-devices-int.net/127.0.0.1#5335 +ipset=/azure-devices-int.net/gfwlist +server=/translatetheweb.com/127.0.0.1#5335 +ipset=/translatetheweb.com/gfwlist +server=/londonhotescort.com/127.0.0.1#5335 +ipset=/londonhotescort.com/gfwlist +server=/oculusvr.com/127.0.0.1#5335 +ipset=/oculusvr.com/gfwlist +server=/inaporn.com/127.0.0.1#5335 +ipset=/inaporn.com/gfwlist +server=/paypal-knowledge.com/127.0.0.1#5335 +ipset=/paypal-knowledge.com/gfwlist +server=/oculusconnect.com/127.0.0.1#5335 +ipset=/oculusconnect.com/gfwlist +server=/managed-pki.de/127.0.0.1#5335 +ipset=/managed-pki.de/gfwlist +server=/wiiugamepad.com/127.0.0.1#5335 +ipset=/wiiugamepad.com/gfwlist +server=/oculusbrand.com/127.0.0.1#5335 +ipset=/oculusbrand.com/gfwlist +server=/googlecompare.co.uk/127.0.0.1#5335 +ipset=/googlecompare.co.uk/gfwlist +server=/nikebetrue.com/127.0.0.1#5335 +ipset=/nikebetrue.com/gfwlist +server=/bmw-pakistan.com/127.0.0.1#5335 +ipset=/bmw-pakistan.com/gfwlist +server=/superadultgames.com/127.0.0.1#5335 +ipset=/superadultgames.com/gfwlist +server=/youtube.googleapis.com/127.0.0.1#5335 +ipset=/youtube.googleapis.com/gfwlist +server=/x18r.com/127.0.0.1#5335 +ipset=/x18r.com/gfwlist +server=/wsjbarrons.com/127.0.0.1#5335 +ipset=/wsjbarrons.com/gfwlist +server=/volvotrucks.com.pt/127.0.0.1#5335 +ipset=/volvotrucks.com.pt/gfwlist +server=/streamate.com/127.0.0.1#5335 +ipset=/streamate.com/gfwlist +server=/thisispolaris.com/127.0.0.1#5335 +ipset=/thisispolaris.com/gfwlist +server=/cloudflarestorage.com/127.0.0.1#5335 +ipset=/cloudflarestorage.com/gfwlist +server=/ikea.co.ca/127.0.0.1#5335 +ipset=/ikea.co.ca/gfwlist +server=/binoculus.com/127.0.0.1#5335 +ipset=/binoculus.com/gfwlist +server=/intel.pa/127.0.0.1#5335 +ipset=/intel.pa/gfwlist +server=/mycdn.me/127.0.0.1#5335 +ipset=/mycdn.me/gfwlist +server=/1degree.com.au/127.0.0.1#5335 +ipset=/1degree.com.au/gfwlist +server=/webgata.net/127.0.0.1#5335 +ipset=/webgata.net/gfwlist +server=/mydirectvchannels.com/127.0.0.1#5335 +ipset=/mydirectvchannels.com/gfwlist +server=/rocksextube.com/127.0.0.1#5335 +ipset=/rocksextube.com/gfwlist +server=/volvobuses.kr/127.0.0.1#5335 +ipset=/volvobuses.kr/gfwlist +server=/tube8.fr/127.0.0.1#5335 +ipset=/tube8.fr/gfwlist +server=/filmeporno.xxx/127.0.0.1#5335 +ipset=/filmeporno.xxx/gfwlist +server=/iutunes.com/127.0.0.1#5335 +ipset=/iutunes.com/gfwlist +server=/cartoontube.com/127.0.0.1#5335 +ipset=/cartoontube.com/gfwlist +server=/logitech.fr/127.0.0.1#5335 +ipset=/logitech.fr/gfwlist +server=/theaustralian.com.au/127.0.0.1#5335 +ipset=/theaustralian.com.au/gfwlist +server=/ieee-ceda.org/127.0.0.1#5335 +ipset=/ieee-ceda.org/gfwlist +server=/voathai.com/127.0.0.1#5335 +ipset=/voathai.com/gfwlist +server=/lolstatic.com/127.0.0.1#5335 +ipset=/lolstatic.com/gfwlist +server=/xxxtubedot.com/127.0.0.1#5335 +ipset=/xxxtubedot.com/gfwlist +server=/logitech.com/127.0.0.1#5335 +ipset=/logitech.com/gfwlist +server=/comicbox.xyz/127.0.0.1#5335 +ipset=/comicbox.xyz/gfwlist +server=/supersexeamateur.com/127.0.0.1#5335 +ipset=/supersexeamateur.com/gfwlist +server=/headphoneses.com/127.0.0.1#5335 +ipset=/headphoneses.com/gfwlist +server=/mini-connected.pl/127.0.0.1#5335 +ipset=/mini-connected.pl/gfwlist +server=/youtube.lv/127.0.0.1#5335 +ipset=/youtube.lv/gfwlist +server=/logi.com/127.0.0.1#5335 +ipset=/logi.com/gfwlist +server=/pinterest.dk/127.0.0.1#5335 +ipset=/pinterest.dk/gfwlist +server=/lgelectronics.122.2o7.net/127.0.0.1#5335 +ipset=/lgelectronics.122.2o7.net/gfwlist +server=/freesexgames.ws/127.0.0.1#5335 +ipset=/freesexgames.ws/gfwlist +server=/vipshoes2.com/127.0.0.1#5335 +ipset=/vipshoes2.com/gfwlist +server=/baazee.com/127.0.0.1#5335 +ipset=/baazee.com/gfwlist +server=/hotfucktube.com/127.0.0.1#5335 +ipset=/hotfucktube.com/gfwlist +server=/lgrecyclingprogram.com/127.0.0.1#5335 +ipset=/lgrecyclingprogram.com/gfwlist +server=/avple.tv/127.0.0.1#5335 +ipset=/avple.tv/gfwlist +server=/lghvac.com/127.0.0.1#5335 +ipset=/lghvac.com/gfwlist +server=/mandatewire.com/127.0.0.1#5335 +ipset=/mandatewire.com/gfwlist +server=/google.com.vc/127.0.0.1#5335 +ipset=/google.com.vc/gfwlist +server=/nintendo.fr/127.0.0.1#5335 +ipset=/nintendo.fr/gfwlist +server=/vcloudair.net/127.0.0.1#5335 +ipset=/vcloudair.net/gfwlist +server=/bmw.nc/127.0.0.1#5335 +ipset=/bmw.nc/gfwlist +server=/jfengtime.com/127.0.0.1#5335 +ipset=/jfengtime.com/gfwlist +server=/erotictube.me/127.0.0.1#5335 +ipset=/erotictube.me/gfwlist +server=/vfsco.com.au/127.0.0.1#5335 +ipset=/vfsco.com.au/gfwlist +server=/lg.com/127.0.0.1#5335 +ipset=/lg.com/gfwlist +server=/trustisfps.com/127.0.0.1#5335 +ipset=/trustisfps.com/gfwlist +server=/public-trust.com/127.0.0.1#5335 +ipset=/public-trust.com/gfwlist +server=/yaoimangaonline.com/127.0.0.1#5335 +ipset=/yaoimangaonline.com/gfwlist +server=/trustedanalytics.com/127.0.0.1#5335 +ipset=/trustedanalytics.com/gfwlist +server=/nvidia.com.au/127.0.0.1#5335 +ipset=/nvidia.com.au/gfwlist +server=/kink.com/127.0.0.1#5335 +ipset=/kink.com/gfwlist +server=/openvinotoolkit.org/127.0.0.1#5335 +ipset=/openvinotoolkit.org/gfwlist +server=/gothdporn.com/127.0.0.1#5335 +ipset=/gothdporn.com/gfwlist +server=/shopee.com.br/127.0.0.1#5335 +ipset=/shopee.com.br/gfwlist +server=/beatsdreus.com/127.0.0.1#5335 +ipset=/beatsdreus.com/gfwlist +server=/nextfilm.com.hk/127.0.0.1#5335 +ipset=/nextfilm.com.hk/gfwlist +server=/2adultflashgames.com/127.0.0.1#5335 +ipset=/2adultflashgames.com/gfwlist +server=/foxcollegesports.com/127.0.0.1#5335 +ipset=/foxcollegesports.com/gfwlist +server=/siport.com/127.0.0.1#5335 +ipset=/siport.com/gfwlist +server=/htvncdn.net/127.0.0.1#5335 +ipset=/htvncdn.net/gfwlist +server=/sensorynetworks.com/127.0.0.1#5335 +ipset=/sensorynetworks.com/gfwlist +server=/patreoncommunity.com/127.0.0.1#5335 +ipset=/patreoncommunity.com/gfwlist +server=/bloombergpolarlake.com/127.0.0.1#5335 +ipset=/bloombergpolarlake.com/gfwlist +server=/azattyq.org/127.0.0.1#5335 +ipset=/azattyq.org/gfwlist +server=/iphoto.se/127.0.0.1#5335 +ipset=/iphoto.se/gfwlist +server=/photonicssociety.org/127.0.0.1#5335 +ipset=/photonicssociety.org/gfwlist +server=/researchintel.com/127.0.0.1#5335 +ipset=/researchintel.com/gfwlist +server=/pintool.com/127.0.0.1#5335 +ipset=/pintool.com/gfwlist +server=/apnews.com/127.0.0.1#5335 +ipset=/apnews.com/gfwlist +server=/pentium.net/127.0.0.1#5335 +ipset=/pentium.net/gfwlist +server=/pc.com/127.0.0.1#5335 +ipset=/pc.com/gfwlist +server=/optanedifference.com/127.0.0.1#5335 +ipset=/optanedifference.com/gfwlist +server=/opendroneid.org/127.0.0.1#5335 +ipset=/opendroneid.org/gfwlist +server=/google.pl/127.0.0.1#5335 +ipset=/google.pl/gfwlist +server=/249dw7.cn/127.0.0.1#5335 +ipset=/249dw7.cn/gfwlist +server=/ibook.co.nz/127.0.0.1#5335 +ipset=/ibook.co.nz/gfwlist +server=/mastercard.com.br/127.0.0.1#5335 +ipset=/mastercard.com.br/gfwlist +server=/booksc.org/127.0.0.1#5335 +ipset=/booksc.org/gfwlist +server=/niken7.com/127.0.0.1#5335 +ipset=/niken7.com/gfwlist +server=/pornoaid.com/127.0.0.1#5335 +ipset=/pornoaid.com/gfwlist +server=/nextgenerationcenter.com/127.0.0.1#5335 +ipset=/nextgenerationcenter.com/gfwlist +server=/ciscocontest.com/127.0.0.1#5335 +ipset=/ciscocontest.com/gfwlist +server=/loverslab.com/127.0.0.1#5335 +ipset=/loverslab.com/gfwlist +server=/hipzoom.net/127.0.0.1#5335 +ipset=/hipzoom.net/gfwlist +server=/nevex.com/127.0.0.1#5335 +ipset=/nevex.com/gfwlist +server=/nist.gov/127.0.0.1#5335 +ipset=/nist.gov/gfwlist +server=/geelongadvertiser.com.au/127.0.0.1#5335 +ipset=/geelongadvertiser.com.au/gfwlist +server=/instantfap.com/127.0.0.1#5335 +ipset=/instantfap.com/gfwlist +server=/movidius.com/127.0.0.1#5335 +ipset=/movidius.com/gfwlist +server=/hpstorethailand.com/127.0.0.1#5335 +ipset=/hpstorethailand.com/gfwlist +server=/headphones-dre.com/127.0.0.1#5335 +ipset=/headphones-dre.com/gfwlist +server=/zeit-world.net/127.0.0.1#5335 +ipset=/zeit-world.net/gfwlist +server=/lookinside.com/127.0.0.1#5335 +ipset=/lookinside.com/gfwlist +server=/inteltechnologyprovider.com/127.0.0.1#5335 +ipset=/inteltechnologyprovider.com/gfwlist +server=/intelstore.com/127.0.0.1#5335 +ipset=/intelstore.com/gfwlist +server=/yaoyaomumu.com/127.0.0.1#5335 +ipset=/yaoyaomumu.com/gfwlist +server=/postimg.cc/127.0.0.1#5335 +ipset=/postimg.cc/gfwlist +server=/eu-consumer-empowerment.com/127.0.0.1#5335 +ipset=/eu-consumer-empowerment.com/gfwlist +server=/monsterbeatssydneyaustralia.com/127.0.0.1#5335 +ipset=/monsterbeatssydneyaustralia.com/gfwlist +server=/intelsoftwarenetwork.com/127.0.0.1#5335 +ipset=/intelsoftwarenetwork.com/gfwlist +server=/myavfun.com/127.0.0.1#5335 +ipset=/myavfun.com/gfwlist +server=/brew.sh/127.0.0.1#5335 +ipset=/brew.sh/gfwlist +server=/blogspot.sn/127.0.0.1#5335 +ipset=/blogspot.sn/gfwlist +server=/porn555.com/127.0.0.1#5335 +ipset=/porn555.com/gfwlist +server=/foxacrossamerica.com/127.0.0.1#5335 +ipset=/foxacrossamerica.com/gfwlist +server=/intelsalestraining.com/127.0.0.1#5335 +ipset=/intelsalestraining.com/gfwlist +server=/costco.com/127.0.0.1#5335 +ipset=/costco.com/gfwlist +server=/tittykings.com/127.0.0.1#5335 +ipset=/tittykings.com/gfwlist +server=/poringa.net/127.0.0.1#5335 +ipset=/poringa.net/gfwlist +server=/pypa.io/127.0.0.1#5335 +ipset=/pypa.io/gfwlist +server=/intelrealsense.com/127.0.0.1#5335 +ipset=/intelrealsense.com/gfwlist +server=/intelquark.com/127.0.0.1#5335 +ipset=/intelquark.com/gfwlist +server=/bmwmotorradhk.com/127.0.0.1#5335 +ipset=/bmwmotorradhk.com/gfwlist +server=/xxxjapanesemovies.com/127.0.0.1#5335 +ipset=/xxxjapanesemovies.com/gfwlist +server=/newsmart.jp/127.0.0.1#5335 +ipset=/newsmart.jp/gfwlist +server=/nhentai.io/127.0.0.1#5335 +ipset=/nhentai.io/gfwlist +server=/thomsonreutersmexico.com/127.0.0.1#5335 +ipset=/thomsonreutersmexico.com/gfwlist +server=/intelnervana.com/127.0.0.1#5335 +ipset=/intelnervana.com/gfwlist +server=/wankgames.com/127.0.0.1#5335 +ipset=/wankgames.com/gfwlist +server=/naughtyblog.org/127.0.0.1#5335 +ipset=/naughtyblog.org/gfwlist +server=/cuntempire.com/127.0.0.1#5335 +ipset=/cuntempire.com/gfwlist +server=/fbsupport-covid.net/127.0.0.1#5335 +ipset=/fbsupport-covid.net/gfwlist +server=/realzoomovies.com/127.0.0.1#5335 +ipset=/realzoomovies.com/gfwlist +server=/avnana5.com/127.0.0.1#5335 +ipset=/avnana5.com/gfwlist +server=/hcpdts.com/127.0.0.1#5335 +ipset=/hcpdts.com/gfwlist +server=/logicool.co.jp/127.0.0.1#5335 +ipset=/logicool.co.jp/gfwlist +server=/sexy3dtoon.com/127.0.0.1#5335 +ipset=/sexy3dtoon.com/gfwlist +server=/intelgo.net/127.0.0.1#5335 +ipset=/intelgo.net/gfwlist +server=/iphone4.com/127.0.0.1#5335 +ipset=/iphone4.com/gfwlist +server=/bandgirlz.com/127.0.0.1#5335 +ipset=/bandgirlz.com/gfwlist +server=/intelforchange.com/127.0.0.1#5335 +ipset=/intelforchange.com/gfwlist +server=/inteleventexpress.com/127.0.0.1#5335 +ipset=/inteleventexpress.com/gfwlist +server=/vpngate.jp/127.0.0.1#5335 +ipset=/vpngate.jp/gfwlist +server=/benliton.com/127.0.0.1#5335 +ipset=/benliton.com/gfwlist +server=/intelcapital.com/127.0.0.1#5335 +ipset=/intelcapital.com/gfwlist +server=/thepornlist.com/127.0.0.1#5335 +ipset=/thepornlist.com/gfwlist +server=/nikelink.com/127.0.0.1#5335 +ipset=/nikelink.com/gfwlist +server=/intelapacstore.com/127.0.0.1#5335 +ipset=/intelapacstore.com/gfwlist +server=/bmw-connecteddrive.ie/127.0.0.1#5335 +ipset=/bmw-connecteddrive.ie/gfwlist +server=/radiomarsho.com/127.0.0.1#5335 +ipset=/radiomarsho.com/gfwlist +server=/intelamericasstore.com/127.0.0.1#5335 +ipset=/intelamericasstore.com/gfwlist +server=/bmwlat.com/127.0.0.1#5335 +ipset=/bmwlat.com/gfwlist +server=/adobepress.ch/127.0.0.1#5335 +ipset=/adobepress.ch/gfwlist +server=/amazon.com.br/127.0.0.1#5335 +ipset=/amazon.com.br/gfwlist +server=/bttzyw.net/127.0.0.1#5335 +ipset=/bttzyw.net/gfwlist +server=/intel-university-collaboration.net/127.0.0.1#5335 +ipset=/intel-university-collaboration.net/gfwlist +server=/payypal.com/127.0.0.1#5335 +ipset=/payypal.com/gfwlist +server=/pornorips.com/127.0.0.1#5335 +ipset=/pornorips.com/gfwlist +server=/dandanzan.cc/127.0.0.1#5335 +ipset=/dandanzan.cc/gfwlist +server=/mini.dk/127.0.0.1#5335 +ipset=/mini.dk/gfwlist +server=/intel.tj/127.0.0.1#5335 +ipset=/intel.tj/gfwlist +server=/comicuniverse.org/127.0.0.1#5335 +ipset=/comicuniverse.org/gfwlist +server=/protonstatus.com/127.0.0.1#5335 +ipset=/protonstatus.com/gfwlist +server=/blogspot.hk/127.0.0.1#5335 +ipset=/blogspot.hk/gfwlist +server=/alterauserforums.net/127.0.0.1#5335 +ipset=/alterauserforums.net/gfwlist +server=/easic.com/127.0.0.1#5335 +ipset=/easic.com/gfwlist +server=/akamai-trials.com/127.0.0.1#5335 +ipset=/akamai-trials.com/gfwlist +server=/foxsoccerplus.net/127.0.0.1#5335 +ipset=/foxsoccerplus.net/gfwlist +server=/machigle-sp.com/127.0.0.1#5335 +ipset=/machigle-sp.com/gfwlist +server=/coreextreme.com/127.0.0.1#5335 +ipset=/coreextreme.com/gfwlist +server=/bmw.kz/127.0.0.1#5335 +ipset=/bmw.kz/gfwlist +server=/amateurcool.com/127.0.0.1#5335 +ipset=/amateurcool.com/gfwlist +server=/faacebook.com/127.0.0.1#5335 +ipset=/faacebook.com/gfwlist +server=/rentaride.com/127.0.0.1#5335 +ipset=/rentaride.com/gfwlist +server=/clusterconnection.com/127.0.0.1#5335 +ipset=/clusterconnection.com/gfwlist +server=/imhentai.xxx/127.0.0.1#5335 +ipset=/imhentai.xxx/gfwlist +server=/mrloli.com/127.0.0.1#5335 +ipset=/mrloli.com/gfwlist +server=/facebookexchange.net/127.0.0.1#5335 +ipset=/facebookexchange.net/gfwlist +server=/mini-connected.ee/127.0.0.1#5335 +ipset=/mini-connected.ee/gfwlist +server=/chips.com/127.0.0.1#5335 +ipset=/chips.com/gfwlist +server=/newyorker.com/127.0.0.1#5335 +ipset=/newyorker.com/gfwlist +server=/akami.com/127.0.0.1#5335 +ipset=/akami.com/gfwlist +server=/marvelsdoubleagent.com/127.0.0.1#5335 +ipset=/marvelsdoubleagent.com/gfwlist +server=/iwantavnow.com/127.0.0.1#5335 +ipset=/iwantavnow.com/gfwlist +server=/alphera.com.my/127.0.0.1#5335 +ipset=/alphera.com.my/gfwlist +server=/bigboss.video/127.0.0.1#5335 +ipset=/bigboss.video/gfwlist +server=/bmw-motorrad.bo/127.0.0.1#5335 +ipset=/bmw-motorrad.bo/gfwlist +server=/ipod.com/127.0.0.1#5335 +ipset=/ipod.com/gfwlist +server=/starbucksrtd.com/127.0.0.1#5335 +ipset=/starbucksrtd.com/gfwlist +server=/celeron.com/127.0.0.1#5335 +ipset=/celeron.com/gfwlist +server=/buyaltera.com/127.0.0.1#5335 +ipset=/buyaltera.com/gfwlist +server=/vfsco.hu/127.0.0.1#5335 +ipset=/vfsco.hu/gfwlist +server=/mini.com.tr/127.0.0.1#5335 +ipset=/mini.com.tr/gfwlist +server=/monsterbeatsalestore.com/127.0.0.1#5335 +ipset=/monsterbeatsalestore.com/gfwlist +server=/alterauserforum.net/127.0.0.1#5335 +ipset=/alterauserforum.net/gfwlist +server=/kingextre.me/127.0.0.1#5335 +ipset=/kingextre.me/gfwlist +server=/alteraforums.net/127.0.0.1#5335 +ipset=/alteraforums.net/gfwlist +server=/volvotrucks.mk/127.0.0.1#5335 +ipset=/volvotrucks.mk/gfwlist +server=/bestbuybusiness.com/127.0.0.1#5335 +ipset=/bestbuybusiness.com/gfwlist +server=/foxfaq.com/127.0.0.1#5335 +ipset=/foxfaq.com/gfwlist +server=/evilangel.com/127.0.0.1#5335 +ipset=/evilangel.com/gfwlist +server=/worldemojiawards.com/127.0.0.1#5335 +ipset=/worldemojiawards.com/gfwlist +server=/mini.com.ar/127.0.0.1#5335 +ipset=/mini.com.ar/gfwlist +server=/crysis.jp/127.0.0.1#5335 +ipset=/crysis.jp/gfwlist +server=/readthedocs-hosted.com/127.0.0.1#5335 +ipset=/readthedocs-hosted.com/gfwlist +server=/beats-bydreoutletsale.net/127.0.0.1#5335 +ipset=/beats-bydreoutletsale.net/gfwlist +server=/cbscorporation.com/127.0.0.1#5335 +ipset=/cbscorporation.com/gfwlist +server=/garenanow.com/127.0.0.1#5335 +ipset=/garenanow.com/gfwlist +server=/overcast.fm/127.0.0.1#5335 +ipset=/overcast.fm/gfwlist +server=/airwatchexpress.com/127.0.0.1#5335 +ipset=/airwatchexpress.com/gfwlist +server=/findmybeats.com/127.0.0.1#5335 +ipset=/findmybeats.com/gfwlist +server=/durex.com.co/127.0.0.1#5335 +ipset=/durex.com.co/gfwlist +server=/yourvoyeurvideos.com/127.0.0.1#5335 +ipset=/yourvoyeurvideos.com/gfwlist +server=/topsexygames.com/127.0.0.1#5335 +ipset=/topsexygames.com/gfwlist +server=/assylum.com/127.0.0.1#5335 +ipset=/assylum.com/gfwlist +server=/paypalcommunity.org/127.0.0.1#5335 +ipset=/paypalcommunity.org/gfwlist +server=/nikebetterworld.net/127.0.0.1#5335 +ipset=/nikebetterworld.net/gfwlist +server=/southfloridamini.com/127.0.0.1#5335 +ipset=/southfloridamini.com/gfwlist +server=/hkgolden.com/127.0.0.1#5335 +ipset=/hkgolden.com/gfwlist +server=/pogo.com/127.0.0.1#5335 +ipset=/pogo.com/gfwlist +server=/intel.vn/127.0.0.1#5335 +ipset=/intel.vn/gfwlist +server=/visualarts.gr.jp/127.0.0.1#5335 +ipset=/visualarts.gr.jp/gfwlist +server=/intel.vg/127.0.0.1#5335 +ipset=/intel.vg/gfwlist +server=/masterpassteststore.com/127.0.0.1#5335 +ipset=/masterpassteststore.com/gfwlist +server=/maximumerotica.com/127.0.0.1#5335 +ipset=/maximumerotica.com/gfwlist +server=/intel.lc/127.0.0.1#5335 +ipset=/intel.lc/gfwlist +server=/nextmgz.com/127.0.0.1#5335 +ipset=/nextmgz.com/gfwlist +server=/intel.uy/127.0.0.1#5335 +ipset=/intel.uy/gfwlist +server=/javscreens.com/127.0.0.1#5335 +ipset=/javscreens.com/gfwlist +server=/digicert-cn.com/127.0.0.1#5335 +ipset=/digicert-cn.com/gfwlist +server=/yahoo.com.hk/127.0.0.1#5335 +ipset=/yahoo.com.hk/gfwlist +server=/voandebele.com/127.0.0.1#5335 +ipset=/voandebele.com/gfwlist +server=/cyber-bay.info/127.0.0.1#5335 +ipset=/cyber-bay.info/gfwlist +server=/intel.tt/127.0.0.1#5335 +ipset=/intel.tt/gfwlist +server=/ebayseller.com/127.0.0.1#5335 +ipset=/ebayseller.com/gfwlist +server=/hentaivideos.net/127.0.0.1#5335 +ipset=/hentaivideos.net/gfwlist +server=/foxnewsgo.net/127.0.0.1#5335 +ipset=/foxnewsgo.net/gfwlist +server=/voyeurpapa.com/127.0.0.1#5335 +ipset=/voyeurpapa.com/gfwlist +server=/disqusservice.com/127.0.0.1#5335 +ipset=/disqusservice.com/gfwlist +server=/scholar.google.com.gt/127.0.0.1#5335 +ipset=/scholar.google.com.gt/gfwlist +server=/intel.tn/127.0.0.1#5335 +ipset=/intel.tn/gfwlist +server=/intel.tm/127.0.0.1#5335 +ipset=/intel.tm/gfwlist +server=/nikeseason.com/127.0.0.1#5335 +ipset=/nikeseason.com/gfwlist +server=/akamaized-staging.net/127.0.0.1#5335 +ipset=/akamaized-staging.net/gfwlist +server=/intel.tl/127.0.0.1#5335 +ipset=/intel.tl/gfwlist +server=/intel.tf/127.0.0.1#5335 +ipset=/intel.tf/gfwlist +server=/foxbet.com/127.0.0.1#5335 +ipset=/foxbet.com/gfwlist +server=/facebookads.com/127.0.0.1#5335 +ipset=/facebookads.com/gfwlist +server=/libgen.life/127.0.0.1#5335 +ipset=/libgen.life/gfwlist +server=/element.io/127.0.0.1#5335 +ipset=/element.io/gfwlist +server=/hentairank.supertop-100.com/127.0.0.1#5335 +ipset=/hentairank.supertop-100.com/gfwlist +server=/amazon.ca/127.0.0.1#5335 +ipset=/amazon.ca/gfwlist +server=/bestfreetube.net/127.0.0.1#5335 +ipset=/bestfreetube.net/gfwlist +server=/intel.st/127.0.0.1#5335 +ipset=/intel.st/gfwlist +server=/gold-gay.com/127.0.0.1#5335 +ipset=/gold-gay.com/gfwlist +server=/theindianleaks.com/127.0.0.1#5335 +ipset=/theindianleaks.com/gfwlist +server=/account-paypal.net/127.0.0.1#5335 +ipset=/account-paypal.net/gfwlist +server=/intel.sk/127.0.0.1#5335 +ipset=/intel.sk/gfwlist +server=/mywifecuckold.com/127.0.0.1#5335 +ipset=/mywifecuckold.com/gfwlist +server=/softbankbb.net/127.0.0.1#5335 +ipset=/softbankbb.net/gfwlist +server=/tex-talk.net/127.0.0.1#5335 +ipset=/tex-talk.net/gfwlist +server=/applecare.eu/127.0.0.1#5335 +ipset=/applecare.eu/gfwlist +server=/icloudpay.net/127.0.0.1#5335 +ipset=/icloudpay.net/gfwlist +server=/otbm.com/127.0.0.1#5335 +ipset=/otbm.com/gfwlist +server=/facevbook.com/127.0.0.1#5335 +ipset=/facevbook.com/gfwlist +server=/huffingtonpost.es/127.0.0.1#5335 +ipset=/huffingtonpost.es/gfwlist +server=/edgefonts.net/127.0.0.1#5335 +ipset=/edgefonts.net/gfwlist +server=/sony.eu/127.0.0.1#5335 +ipset=/sony.eu/gfwlist +server=/20thcenturystudios.jp/127.0.0.1#5335 +ipset=/20thcenturystudios.jp/gfwlist +server=/petardas.com/127.0.0.1#5335 +ipset=/petardas.com/gfwlist +server=/intel.pn/127.0.0.1#5335 +ipset=/intel.pn/gfwlist +server=/ahtops.com/127.0.0.1#5335 +ipset=/ahtops.com/gfwlist +server=/exhentai.org/127.0.0.1#5335 +ipset=/exhentai.org/gfwlist +server=/touchsmartpc.net/127.0.0.1#5335 +ipset=/touchsmartpc.net/gfwlist +server=/hqbutt.com/127.0.0.1#5335 +ipset=/hqbutt.com/gfwlist +server=/iloveinterracial.com/127.0.0.1#5335 +ipset=/iloveinterracial.com/gfwlist +server=/ftcdn.net/127.0.0.1#5335 +ipset=/ftcdn.net/gfwlist +server=/facebook.tv/127.0.0.1#5335 +ipset=/facebook.tv/gfwlist +server=/volvopenta.es/127.0.0.1#5335 +ipset=/volvopenta.es/gfwlist +server=/drdrebeatssale7.com/127.0.0.1#5335 +ipset=/drdrebeatssale7.com/gfwlist +server=/faceabook.com/127.0.0.1#5335 +ipset=/faceabook.com/gfwlist +server=/leagueoflegends.org/127.0.0.1#5335 +ipset=/leagueoflegends.org/gfwlist +server=/foxbusiness.com/127.0.0.1#5335 +ipset=/foxbusiness.com/gfwlist +server=/watchmygirlfriend.tv/127.0.0.1#5335 +ipset=/watchmygirlfriend.tv/gfwlist +server=/yespornplease.com/127.0.0.1#5335 +ipset=/yespornplease.com/gfwlist +server=/blpcareers.com/127.0.0.1#5335 +ipset=/blpcareers.com/gfwlist +server=/headphonepubs.com/127.0.0.1#5335 +ipset=/headphonepubs.com/gfwlist +server=/womenwill.id/127.0.0.1#5335 +ipset=/womenwill.id/gfwlist +server=/pearsonclinical.de/127.0.0.1#5335 +ipset=/pearsonclinical.de/gfwlist +server=/brazzers.xxx/127.0.0.1#5335 +ipset=/brazzers.xxx/gfwlist +server=/paxlicense.org/127.0.0.1#5335 +ipset=/paxlicense.org/gfwlist +server=/intel.mu/127.0.0.1#5335 +ipset=/intel.mu/gfwlist +server=/experiencebillmelater.com/127.0.0.1#5335 +ipset=/experiencebillmelater.com/gfwlist +server=/intel.mt/127.0.0.1#5335 +ipset=/intel.mt/gfwlist +server=/wixsite.com/127.0.0.1#5335 +ipset=/wixsite.com/gfwlist +server=/bmw.kg/127.0.0.1#5335 +ipset=/bmw.kg/gfwlist +server=/truefi.io/127.0.0.1#5335 +ipset=/truefi.io/gfwlist +server=/applestore.com.eg/127.0.0.1#5335 +ipset=/applestore.com.eg/gfwlist +server=/nexitally.com/127.0.0.1#5335 +ipset=/nexitally.com/gfwlist +server=/bmwlifestyle.ca/127.0.0.1#5335 +ipset=/bmwlifestyle.ca/gfwlist +server=/erabaru.net/127.0.0.1#5335 +ipset=/erabaru.net/gfwlist +server=/discord.co/127.0.0.1#5335 +ipset=/discord.co/gfwlist +server=/nhentaihaven.com/127.0.0.1#5335 +ipset=/nhentaihaven.com/gfwlist +server=/buyfast-paysmart.net/127.0.0.1#5335 +ipset=/buyfast-paysmart.net/gfwlist +server=/intel.mg/127.0.0.1#5335 +ipset=/intel.mg/gfwlist +server=/instagramci.com/127.0.0.1#5335 +ipset=/instagramci.com/gfwlist +server=/facebooknude.com/127.0.0.1#5335 +ipset=/facebooknude.com/gfwlist +server=/gauleporno.xxx/127.0.0.1#5335 +ipset=/gauleporno.xxx/gfwlist +server=/orlandohurricane.com/127.0.0.1#5335 +ipset=/orlandohurricane.com/gfwlist +server=/intel.me/127.0.0.1#5335 +ipset=/intel.me/gfwlist +server=/volvobuses.pl/127.0.0.1#5335 +ipset=/volvobuses.pl/gfwlist +server=/porndoepremium.com/127.0.0.1#5335 +ipset=/porndoepremium.com/gfwlist +server=/knovel.com/127.0.0.1#5335 +ipset=/knovel.com/gfwlist +server=/intel.ke/127.0.0.1#5335 +ipset=/intel.ke/gfwlist +server=/intel.jp/127.0.0.1#5335 +ipset=/intel.jp/gfwlist +server=/stripe.com/127.0.0.1#5335 +ipset=/stripe.com/gfwlist +server=/ebaytechblog.com/127.0.0.1#5335 +ipset=/ebaytechblog.com/gfwlist +server=/intel.je/127.0.0.1#5335 +ipset=/intel.je/gfwlist +server=/intel.io/127.0.0.1#5335 +ipset=/intel.io/gfwlist +server=/nivod.tv/127.0.0.1#5335 +ipset=/nivod.tv/gfwlist +server=/avcar.vip/127.0.0.1#5335 +ipset=/avcar.vip/gfwlist +server=/bingvisualsearch.com/127.0.0.1#5335 +ipset=/bingvisualsearch.com/gfwlist +server=/fucktube.com/127.0.0.1#5335 +ipset=/fucktube.com/gfwlist +server=/huffingtonpost.jp/127.0.0.1#5335 +ipset=/huffingtonpost.jp/gfwlist +server=/intel.ht/127.0.0.1#5335 +ipset=/intel.ht/gfwlist +server=/intel.hn/127.0.0.1#5335 +ipset=/intel.hn/gfwlist +server=/monitrix.net/127.0.0.1#5335 +ipset=/monitrix.net/gfwlist +server=/intel.hk/127.0.0.1#5335 +ipset=/intel.hk/gfwlist +server=/microsoft.cl/127.0.0.1#5335 +ipset=/microsoft.cl/gfwlist +server=/intel.gy/127.0.0.1#5335 +ipset=/intel.gy/gfwlist +server=/466453.com/127.0.0.1#5335 +ipset=/466453.com/gfwlist +server=/theguardian.com/127.0.0.1#5335 +ipset=/theguardian.com/gfwlist +server=/intel.gt/127.0.0.1#5335 +ipset=/intel.gt/gfwlist +server=/alphabet.uk/127.0.0.1#5335 +ipset=/alphabet.uk/gfwlist +server=/xshaker.net/127.0.0.1#5335 +ipset=/xshaker.net/gfwlist +server=/viralcum.com/127.0.0.1#5335 +ipset=/viralcum.com/gfwlist +server=/ebay.ch/127.0.0.1#5335 +ipset=/ebay.ch/gfwlist +server=/youtube.com.ni/127.0.0.1#5335 +ipset=/youtube.com.ni/gfwlist +server=/intel.gm/127.0.0.1#5335 +ipset=/intel.gm/gfwlist +server=/walmartimages.com/127.0.0.1#5335 +ipset=/walmartimages.com/gfwlist +server=/intel.ge/127.0.0.1#5335 +ipset=/intel.ge/gfwlist +server=/intel.gd/127.0.0.1#5335 +ipset=/intel.gd/gfwlist +server=/fc2ppv.tv/127.0.0.1#5335 +ipset=/fc2ppv.tv/gfwlist +server=/startpath.com/127.0.0.1#5335 +ipset=/startpath.com/gfwlist +server=/smartcommunitiescoalition.org/127.0.0.1#5335 +ipset=/smartcommunitiescoalition.org/gfwlist +server=/applepaysupplies.info/127.0.0.1#5335 +ipset=/applepaysupplies.info/gfwlist +server=/avstar02.me/127.0.0.1#5335 +ipset=/avstar02.me/gfwlist +server=/jav-legend.com/127.0.0.1#5335 +ipset=/jav-legend.com/gfwlist +server=/enterprisessl.com/127.0.0.1#5335 +ipset=/enterprisessl.com/gfwlist +server=/intel.es/127.0.0.1#5335 +ipset=/intel.es/gfwlist +server=/vitukali.com/127.0.0.1#5335 +ipset=/vitukali.com/gfwlist +server=/cheapbeatsbydre-au.com/127.0.0.1#5335 +ipset=/cheapbeatsbydre-au.com/gfwlist +server=/fssta.com/127.0.0.1#5335 +ipset=/fssta.com/gfwlist +server=/facebooksecurity.net/127.0.0.1#5335 +ipset=/facebooksecurity.net/gfwlist +server=/anaconda.cloud/127.0.0.1#5335 +ipset=/anaconda.cloud/gfwlist +server=/madvagina.com/127.0.0.1#5335 +ipset=/madvagina.com/gfwlist +server=/gigabyte.com/127.0.0.1#5335 +ipset=/gigabyte.com/gfwlist +server=/serving-sys.com/127.0.0.1#5335 +ipset=/serving-sys.com/gfwlist +server=/babes.com/127.0.0.1#5335 +ipset=/babes.com/gfwlist +server=/intel.com.ve/127.0.0.1#5335 +ipset=/intel.com.ve/gfwlist +server=/dachix.com/127.0.0.1#5335 +ipset=/dachix.com/gfwlist +server=/intel.com.uy/127.0.0.1#5335 +ipset=/intel.com.uy/gfwlist +server=/intel.com.tw/127.0.0.1#5335 +ipset=/intel.com.tw/gfwlist +server=/intel.com.tr/127.0.0.1#5335 +ipset=/intel.com.tr/gfwlist +server=/icloudo.com/127.0.0.1#5335 +ipset=/icloudo.com/gfwlist +server=/pichunter.com/127.0.0.1#5335 +ipset=/pichunter.com/gfwlist +server=/amzn.asia/127.0.0.1#5335 +ipset=/amzn.asia/gfwlist +server=/nunuyy.cc/127.0.0.1#5335 +ipset=/nunuyy.cc/gfwlist +server=/jav.guru/127.0.0.1#5335 +ipset=/jav.guru/gfwlist +server=/tellmewhygame.com/127.0.0.1#5335 +ipset=/tellmewhygame.com/gfwlist +server=/kemono.party/127.0.0.1#5335 +ipset=/kemono.party/gfwlist +server=/bridge-studio.co.uk/127.0.0.1#5335 +ipset=/bridge-studio.co.uk/gfwlist +server=/intel.com.pr/127.0.0.1#5335 +ipset=/intel.com.pr/gfwlist +server=/visaglobalfinance.com/127.0.0.1#5335 +ipset=/visaglobalfinance.com/gfwlist +server=/sxyprn.com/127.0.0.1#5335 +ipset=/sxyprn.com/gfwlist +server=/malvastudios.com/127.0.0.1#5335 +ipset=/malvastudios.com/gfwlist +server=/needforspeedproven.com/127.0.0.1#5335 +ipset=/needforspeedproven.com/gfwlist +server=/fxporn.net/127.0.0.1#5335 +ipset=/fxporn.net/gfwlist +server=/intel.com.mx/127.0.0.1#5335 +ipset=/intel.com.mx/gfwlist +server=/intel.com.jm/127.0.0.1#5335 +ipset=/intel.com.jm/gfwlist +server=/bmw.ro/127.0.0.1#5335 +ipset=/bmw.ro/gfwlist +server=/intel.com.hk/127.0.0.1#5335 +ipset=/intel.com.hk/gfwlist +server=/intel.com.co/127.0.0.1#5335 +ipset=/intel.com.co/gfwlist +server=/google.tt/127.0.0.1#5335 +ipset=/google.tt/gfwlist +server=/nuita.net/127.0.0.1#5335 +ipset=/nuita.net/gfwlist +server=/intel.com.bo/127.0.0.1#5335 +ipset=/intel.com.bo/gfwlist +server=/vercel.pub/127.0.0.1#5335 +ipset=/vercel.pub/gfwlist +server=/intel.com.au/127.0.0.1#5335 +ipset=/intel.com.au/gfwlist +server=/google.mw/127.0.0.1#5335 +ipset=/google.mw/gfwlist +server=/mangahentai.me/127.0.0.1#5335 +ipset=/mangahentai.me/gfwlist +server=/bmwgroupna.com/127.0.0.1#5335 +ipset=/bmwgroupna.com/gfwlist +server=/monsterbeatsbydrdre-usa.com/127.0.0.1#5335 +ipset=/monsterbeatsbydrdre-usa.com/gfwlist +server=/pugpig.com/127.0.0.1#5335 +ipset=/pugpig.com/gfwlist +server=/intel.co.il/127.0.0.1#5335 +ipset=/intel.co.il/gfwlist +server=/toget.com.tw/127.0.0.1#5335 +ipset=/toget.com.tw/gfwlist +server=/fapphub.com/127.0.0.1#5335 +ipset=/fapphub.com/gfwlist +server=/skypedata.akadns.net/127.0.0.1#5335 +ipset=/skypedata.akadns.net/gfwlist +server=/qmov.net/127.0.0.1#5335 +ipset=/qmov.net/gfwlist +server=/intel.co.id/127.0.0.1#5335 +ipset=/intel.co.id/gfwlist +server=/pornxxxplace.com/127.0.0.1#5335 +ipset=/pornxxxplace.com/gfwlist +server=/creativecommons.org/127.0.0.1#5335 +ipset=/creativecommons.org/gfwlist +server=/volvotrucks.at/127.0.0.1#5335 +ipset=/volvotrucks.at/gfwlist +server=/adobesc.com/127.0.0.1#5335 +ipset=/adobesc.com/gfwlist +server=/intel.co.ae/127.0.0.1#5335 +ipset=/intel.co.ae/gfwlist +server=/redtube.com.br/127.0.0.1#5335 +ipset=/redtube.com.br/gfwlist +server=/ieee-uffc.org/127.0.0.1#5335 +ipset=/ieee-uffc.org/gfwlist +server=/intel.cm/127.0.0.1#5335 +ipset=/intel.cm/gfwlist +server=/iphone-vip4.com/127.0.0.1#5335 +ipset=/iphone-vip4.com/gfwlist +server=/intel.cg/127.0.0.1#5335 +ipset=/intel.cg/gfwlist +server=/intel.cc/127.0.0.1#5335 +ipset=/intel.cc/gfwlist +server=/huobi.me/127.0.0.1#5335 +ipset=/huobi.me/gfwlist +server=/stackexchange.com/127.0.0.1#5335 +ipset=/stackexchange.com/gfwlist +server=/seamonkey-project.org/127.0.0.1#5335 +ipset=/seamonkey-project.org/gfwlist +server=/bmw.com.sg/127.0.0.1#5335 +ipset=/bmw.com.sg/gfwlist +server=/appleafrica.com/127.0.0.1#5335 +ipset=/appleafrica.com/gfwlist +server=/brepolis.net/127.0.0.1#5335 +ipset=/brepolis.net/gfwlist +server=/paypalcommunity.com/127.0.0.1#5335 +ipset=/paypalcommunity.com/gfwlist +server=/vagabundasdoorkut.net/127.0.0.1#5335 +ipset=/vagabundasdoorkut.net/gfwlist +server=/gayporno.fm/127.0.0.1#5335 +ipset=/gayporno.fm/gfwlist +server=/whoreteensex.com/127.0.0.1#5335 +ipset=/whoreteensex.com/gfwlist +server=/intel.bg/127.0.0.1#5335 +ipset=/intel.bg/gfwlist +server=/akamci.com/127.0.0.1#5335 +ipset=/akamci.com/gfwlist +server=/peach-cherry.com/127.0.0.1#5335 +ipset=/peach-cherry.com/gfwlist +server=/intel.at/127.0.0.1#5335 +ipset=/intel.at/gfwlist +server=/analdin.com/127.0.0.1#5335 +ipset=/analdin.com/gfwlist +server=/intel.ai/127.0.0.1#5335 +ipset=/intel.ai/gfwlist +server=/brewmp.com/127.0.0.1#5335 +ipset=/brewmp.com/gfwlist +server=/cocktailsandcocktalk.com/127.0.0.1#5335 +ipset=/cocktailsandcocktalk.com/gfwlist +server=/1vwapi4d.xyz/127.0.0.1#5335 +ipset=/1vwapi4d.xyz/gfwlist +server=/mgo.com/127.0.0.1#5335 +ipset=/mgo.com/gfwlist +server=/dailymail.dk/127.0.0.1#5335 +ipset=/dailymail.dk/gfwlist +server=/stripcamfun.com/127.0.0.1#5335 +ipset=/stripcamfun.com/gfwlist +server=/echosign.com/127.0.0.1#5335 +ipset=/echosign.com/gfwlist +server=/haskellstack.org/127.0.0.1#5335 +ipset=/haskellstack.org/gfwlist +server=/intel.ac/127.0.0.1#5335 +ipset=/intel.ac/gfwlist +server=/s81c.com/127.0.0.1#5335 +ipset=/s81c.com/gfwlist +server=/haveibeenpwned.com/127.0.0.1#5335 +ipset=/haveibeenpwned.com/gfwlist +server=/bmw.com.ec/127.0.0.1#5335 +ipset=/bmw.com.ec/gfwlist +server=/wwwapple.net/127.0.0.1#5335 +ipset=/wwwapple.net/gfwlist +server=/ibm.net/127.0.0.1#5335 +ipset=/ibm.net/gfwlist +server=/hq69.com/127.0.0.1#5335 +ipset=/hq69.com/gfwlist +server=/minuporno.com/127.0.0.1#5335 +ipset=/minuporno.com/gfwlist +server=/bnext.com.tw/127.0.0.1#5335 +ipset=/bnext.com.tw/gfwlist +server=/driving.co.uk/127.0.0.1#5335 +ipset=/driving.co.uk/gfwlist +server=/ivintageporn.com/127.0.0.1#5335 +ipset=/ivintageporn.com/gfwlist +server=/sunbingo.co.uk/127.0.0.1#5335 +ipset=/sunbingo.co.uk/gfwlist +server=/voakorea.com/127.0.0.1#5335 +ipset=/voakorea.com/gfwlist +server=/hpbundle.com/127.0.0.1#5335 +ipset=/hpbundle.com/gfwlist +server=/miktex.org/127.0.0.1#5335 +ipset=/miktex.org/gfwlist +server=/www8-hp.com/127.0.0.1#5335 +ipset=/www8-hp.com/gfwlist +server=/mini-me.com/127.0.0.1#5335 +ipset=/mini-me.com/gfwlist +server=/hbogoasia.com/127.0.0.1#5335 +ipset=/hbogoasia.com/gfwlist +server=/touchsmartpc.org/127.0.0.1#5335 +ipset=/touchsmartpc.org/gfwlist +server=/bmw-clubs-international.com/127.0.0.1#5335 +ipset=/bmw-clubs-international.com/gfwlist +server=/oup.com/127.0.0.1#5335 +ipset=/oup.com/gfwlist +server=/nine.com.au/127.0.0.1#5335 +ipset=/nine.com.au/gfwlist +server=/premobay.com/127.0.0.1#5335 +ipset=/premobay.com/gfwlist +server=/pornmz.com/127.0.0.1#5335 +ipset=/pornmz.com/gfwlist +server=/adulters.org/127.0.0.1#5335 +ipset=/adulters.org/gfwlist +server=/pinterest.id/127.0.0.1#5335 +ipset=/pinterest.id/gfwlist +server=/serviceshp.com/127.0.0.1#5335 +ipset=/serviceshp.com/gfwlist +server=/printspots.net/127.0.0.1#5335 +ipset=/printspots.net/gfwlist +server=/printspots.com/127.0.0.1#5335 +ipset=/printspots.com/gfwlist +server=/jenporno.cz/127.0.0.1#5335 +ipset=/jenporno.cz/gfwlist +server=/bmw-ksa.com/127.0.0.1#5335 +ipset=/bmw-ksa.com/gfwlist +server=/printersetupsupport.com/127.0.0.1#5335 +ipset=/printersetupsupport.com/gfwlist +server=/wholefoodsmarket.co.uk/127.0.0.1#5335 +ipset=/wholefoodsmarket.co.uk/gfwlist +server=/intel.by/127.0.0.1#5335 +ipset=/intel.by/gfwlist +server=/starbucks.no/127.0.0.1#5335 +ipset=/starbucks.no/gfwlist +server=/heads-ak-spotify-com.akamaized.net/127.0.0.1#5335 +ipset=/heads-ak-spotify-com.akamaized.net/gfwlist +server=/porstoporno.site/127.0.0.1#5335 +ipset=/porstoporno.site/gfwlist +server=/instantink.com/127.0.0.1#5335 +ipset=/instantink.com/gfwlist +server=/i-123-hp.com/127.0.0.1#5335 +ipset=/i-123-hp.com/gfwlist +server=/vivaldi.com/127.0.0.1#5335 +ipset=/vivaldi.com/gfwlist +server=/hpwallart.com/127.0.0.1#5335 +ipset=/hpwallart.com/gfwlist +server=/wsj.net/127.0.0.1#5335 +ipset=/wsj.net/gfwlist +server=/fbmarketing.com/127.0.0.1#5335 +ipset=/fbmarketing.com/gfwlist +server=/google.com.ly/127.0.0.1#5335 +ipset=/google.com.ly/gfwlist +server=/hpveer.com/127.0.0.1#5335 +ipset=/hpveer.com/gfwlist +server=/freeav.tv/127.0.0.1#5335 +ipset=/freeav.tv/gfwlist +server=/hptrainingcenter.com/127.0.0.1#5335 +ipset=/hptrainingcenter.com/gfwlist +server=/chatwhores.tv/127.0.0.1#5335 +ipset=/chatwhores.tv/gfwlist +server=/hptouch.com/127.0.0.1#5335 +ipset=/hptouch.com/gfwlist +server=/scholar.google.co.kr/127.0.0.1#5335 +ipset=/scholar.google.co.kr/gfwlist +server=/deiightfuidates.net/127.0.0.1#5335 +ipset=/deiightfuidates.net/gfwlist +server=/didilist.com/127.0.0.1#5335 +ipset=/didilist.com/gfwlist +server=/acces-vod.com/127.0.0.1#5335 +ipset=/acces-vod.com/gfwlist +server=/amodoll.com/127.0.0.1#5335 +ipset=/amodoll.com/gfwlist +server=/azureplanetscale.net/127.0.0.1#5335 +ipset=/azureplanetscale.net/gfwlist +server=/scnsrc.me/127.0.0.1#5335 +ipset=/scnsrc.me/gfwlist +server=/privatemarketplaces.net/127.0.0.1#5335 +ipset=/privatemarketplaces.net/gfwlist +server=/mobilemarketo.com/127.0.0.1#5335 +ipset=/mobilemarketo.com/gfwlist +server=/addthiscdn.com/127.0.0.1#5335 +ipset=/addthiscdn.com/gfwlist +server=/xvidzz.com/127.0.0.1#5335 +ipset=/xvidzz.com/gfwlist +server=/elog-ch.net/127.0.0.1#5335 +ipset=/elog-ch.net/gfwlist +server=/hpstore-china.com/127.0.0.1#5335 +ipset=/hpstore-china.com/gfwlist +server=/aflamporn.com/127.0.0.1#5335 +ipset=/aflamporn.com/gfwlist +server=/thanksloyalty.com/127.0.0.1#5335 +ipset=/thanksloyalty.com/gfwlist +server=/beatsireland.net/127.0.0.1#5335 +ipset=/beatsireland.net/gfwlist +server=/my29tv.com/127.0.0.1#5335 +ipset=/my29tv.com/gfwlist +server=/mini-ksa.com/127.0.0.1#5335 +ipset=/mini-ksa.com/gfwlist +server=/badvirtue.com/127.0.0.1#5335 +ipset=/badvirtue.com/gfwlist +server=/nextmedia.com/127.0.0.1#5335 +ipset=/nextmedia.com/gfwlist +server=/hpsprocket.com/127.0.0.1#5335 +ipset=/hpsprocket.com/gfwlist +server=/sandisk.it/127.0.0.1#5335 +ipset=/sandisk.it/gfwlist +server=/bby.com/127.0.0.1#5335 +ipset=/bby.com/gfwlist +server=/lolstatic-a.akamaihd.net/127.0.0.1#5335 +ipset=/lolstatic-a.akamaihd.net/gfwlist +server=/inikesneakers.com/127.0.0.1#5335 +ipset=/inikesneakers.com/gfwlist +server=/ghostgames.com/127.0.0.1#5335 +ipset=/ghostgames.com/gfwlist +server=/omafotze.com/127.0.0.1#5335 +ipset=/omafotze.com/gfwlist +server=/youtube.sk/127.0.0.1#5335 +ipset=/youtube.sk/gfwlist +server=/91tv.tw/127.0.0.1#5335 +ipset=/91tv.tw/gfwlist +server=/hpsmartupdate.com/127.0.0.1#5335 +ipset=/hpsmartupdate.com/gfwlist +server=/youtube.pe/127.0.0.1#5335 +ipset=/youtube.pe/gfwlist +server=/foxhq.com/127.0.0.1#5335 +ipset=/foxhq.com/gfwlist +server=/fedoramagazine.org/127.0.0.1#5335 +ipset=/fedoramagazine.org/gfwlist +server=/volvogroup.de/127.0.0.1#5335 +ipset=/volvogroup.de/gfwlist +server=/bridgestone.com.ar/127.0.0.1#5335 +ipset=/bridgestone.com.ar/gfwlist +server=/niketradeweb.com/127.0.0.1#5335 +ipset=/niketradeweb.com/gfwlist +server=/nsfw247.to/127.0.0.1#5335 +ipset=/nsfw247.to/gfwlist +server=/fosebook.com/127.0.0.1#5335 +ipset=/fosebook.com/gfwlist +server=/hpsmarts.com/127.0.0.1#5335 +ipset=/hpsmarts.com/gfwlist +server=/symcb.com/127.0.0.1#5335 +ipset=/symcb.com/gfwlist +server=/adsense.com/127.0.0.1#5335 +ipset=/adsense.com/gfwlist +server=/hpsmart.com/127.0.0.1#5335 +ipset=/hpsmart.com/gfwlist +server=/want-media.com/127.0.0.1#5335 +ipset=/want-media.com/gfwlist +server=/hpshopping.hk/127.0.0.1#5335 +ipset=/hpshopping.hk/gfwlist +server=/nikeairmax.com/127.0.0.1#5335 +ipset=/nikeairmax.com/gfwlist +server=/ratedgross.com/127.0.0.1#5335 +ipset=/ratedgross.com/gfwlist +server=/hpshoping.com/127.0.0.1#5335 +ipset=/hpshoping.com/gfwlist +server=/toppornoduro.com/127.0.0.1#5335 +ipset=/toppornoduro.com/gfwlist +server=/inmediahk.net/127.0.0.1#5335 +ipset=/inmediahk.net/gfwlist +server=/pcmarket.com.hk/127.0.0.1#5335 +ipset=/pcmarket.com.hk/gfwlist +server=/cometotheduckside.com/127.0.0.1#5335 +ipset=/cometotheduckside.com/gfwlist +server=/hpshop.com/127.0.0.1#5335 +ipset=/hpshop.com/gfwlist +server=/hpdesignjetl25500.com/127.0.0.1#5335 +ipset=/hpdesignjetl25500.com/gfwlist +server=/asiancamgirllive.com/127.0.0.1#5335 +ipset=/asiancamgirllive.com/gfwlist +server=/fapmovz.com/127.0.0.1#5335 +ipset=/fapmovz.com/gfwlist +server=/crowdtangle.com/127.0.0.1#5335 +ipset=/crowdtangle.com/gfwlist +server=/currenttime.tv/127.0.0.1#5335 +ipset=/currenttime.tv/gfwlist +server=/hpserver.com/127.0.0.1#5335 +ipset=/hpserver.com/gfwlist +server=/hpsalescentral.com/127.0.0.1#5335 +ipset=/hpsalescentral.com/gfwlist +server=/volvobuses.co/127.0.0.1#5335 +ipset=/volvobuses.co/gfwlist +server=/pornocomic.net/127.0.0.1#5335 +ipset=/pornocomic.net/gfwlist +server=/ipfs.io/127.0.0.1#5335 +ipset=/ipfs.io/gfwlist +server=/directvadsales.com/127.0.0.1#5335 +ipset=/directvadsales.com/gfwlist +server=/volvotrucks.com/127.0.0.1#5335 +ipset=/volvotrucks.com/gfwlist +server=/hentaiz.vip/127.0.0.1#5335 +ipset=/hentaiz.vip/gfwlist +server=/hpprinterdrivers.com/127.0.0.1#5335 +ipset=/hpprinterdrivers.com/gfwlist +server=/hpphotoscanners.com/127.0.0.1#5335 +ipset=/hpphotoscanners.com/gfwlist +server=/hppage5000.com/127.0.0.1#5335 +ipset=/hppage5000.com/gfwlist +server=/slack-redir.net/127.0.0.1#5335 +ipset=/slack-redir.net/gfwlist +server=/youtube.com.by/127.0.0.1#5335 +ipset=/youtube.com.by/gfwlist +server=/thaicuties.com/127.0.0.1#5335 +ipset=/thaicuties.com/gfwlist +server=/hponlinehelp.com/127.0.0.1#5335 +ipset=/hponlinehelp.com/gfwlist +server=/dengeamerika.com/127.0.0.1#5335 +ipset=/dengeamerika.com/gfwlist +server=/mastercardmoments.com/127.0.0.1#5335 +ipset=/mastercardmoments.com/gfwlist +server=/fesebook.com/127.0.0.1#5335 +ipset=/fesebook.com/gfwlist +server=/hpmobile.com/127.0.0.1#5335 +ipset=/hpmobile.com/gfwlist +server=/twitcomike.jp/127.0.0.1#5335 +ipset=/twitcomike.jp/gfwlist +server=/mut.ch/127.0.0.1#5335 +ipset=/mut.ch/gfwlist +server=/hpmicrcartridge.com/127.0.0.1#5335 +ipset=/hpmicrcartridge.com/gfwlist +server=/hpmemorychips.com/127.0.0.1#5335 +ipset=/hpmemorychips.com/gfwlist +server=/apple.be/127.0.0.1#5335 +ipset=/apple.be/gfwlist +server=/youtube.com.uy/127.0.0.1#5335 +ipset=/youtube.com.uy/gfwlist +server=/verizonbusinessfios.com/127.0.0.1#5335 +ipset=/verizonbusinessfios.com/gfwlist +server=/iphone4s.com/127.0.0.1#5335 +ipset=/iphone4s.com/gfwlist +server=/eporner.com/127.0.0.1#5335 +ipset=/eporner.com/gfwlist +server=/alibabacloud.com/127.0.0.1#5335 +ipset=/alibabacloud.com/gfwlist +server=/dettolthailand.com/127.0.0.1#5335 +ipset=/dettolthailand.com/gfwlist +server=/mastercard.qa/127.0.0.1#5335 +ipset=/mastercard.qa/gfwlist +server=/mythicentertainment.com/127.0.0.1#5335 +ipset=/mythicentertainment.com/gfwlist +server=/hpkeyboard.com/127.0.0.1#5335 +ipset=/hpkeyboard.com/gfwlist +server=/hpinstantink.com/127.0.0.1#5335 +ipset=/hpinstantink.com/gfwlist +server=/facebooklive.com/127.0.0.1#5335 +ipset=/facebooklive.com/gfwlist +server=/hpinc.net/127.0.0.1#5335 +ipset=/hpinc.net/gfwlist +server=/foxsports.com.gt/127.0.0.1#5335 +ipset=/foxsports.com.gt/gfwlist +server=/hpinc.info/127.0.0.1#5335 +ipset=/hpinc.info/gfwlist +server=/crystalmiss.com/127.0.0.1#5335 +ipset=/crystalmiss.com/gfwlist +server=/ekhokavkaza.com/127.0.0.1#5335 +ipset=/ekhokavkaza.com/gfwlist +server=/paypaly.com/127.0.0.1#5335 +ipset=/paypaly.com/gfwlist +server=/images-amazon.com/127.0.0.1#5335 +ipset=/images-amazon.com/gfwlist +server=/hpgpas.com/127.0.0.1#5335 +ipset=/hpgpas.com/gfwlist +server=/pornovesem.tv/127.0.0.1#5335 +ipset=/pornovesem.tv/gfwlist +server=/visaplus.com/127.0.0.1#5335 +ipset=/visaplus.com/gfwlist +server=/cheap-beats-by-dre.net/127.0.0.1#5335 +ipset=/cheap-beats-by-dre.net/gfwlist +server=/tube188.com/127.0.0.1#5335 +ipset=/tube188.com/gfwlist +server=/pornmate.com/127.0.0.1#5335 +ipset=/pornmate.com/gfwlist +server=/facebookmobile.com/127.0.0.1#5335 +ipset=/facebookmobile.com/gfwlist +server=/cashpassport.net/127.0.0.1#5335 +ipset=/cashpassport.net/gfwlist +server=/cheapdrebeats8.net/127.0.0.1#5335 +ipset=/cheapdrebeats8.net/gfwlist +server=/cnnmoney.com/127.0.0.1#5335 +ipset=/cnnmoney.com/gfwlist +server=/ntdtv.kr/127.0.0.1#5335 +ipset=/ntdtv.kr/gfwlist +server=/hpfaqs.com/127.0.0.1#5335 +ipset=/hpfaqs.com/gfwlist +server=/itunes.com/127.0.0.1#5335 +ipset=/itunes.com/gfwlist +server=/stripe.network/127.0.0.1#5335 +ipset=/stripe.network/gfwlist +server=/hpeprint.com/127.0.0.1#5335 +ipset=/hpeprint.com/gfwlist +server=/hpengage.com/127.0.0.1#5335 +ipset=/hpengage.com/gfwlist +server=/auricularemonsterbeats.com/127.0.0.1#5335 +ipset=/auricularemonsterbeats.com/gfwlist +server=/amazon-launchpad.com/127.0.0.1#5335 +ipset=/amazon-launchpad.com/gfwlist +server=/ubistatic3-a.akamaihd.net/127.0.0.1#5335 +ipset=/ubistatic3-a.akamaihd.net/gfwlist +server=/hpdownloadstore.com/127.0.0.1#5335 +ipset=/hpdownloadstore.com/gfwlist +server=/datawav.club/127.0.0.1#5335 +ipset=/datawav.club/gfwlist +server=/asus.com/127.0.0.1#5335 +ipset=/asus.com/gfwlist +server=/hpdesktopcomputer.com/127.0.0.1#5335 +ipset=/hpdesktopcomputer.com/gfwlist +server=/hpdaas.com/127.0.0.1#5335 +ipset=/hpdaas.com/gfwlist +server=/tvcastlive-hamivideo.cdn.hinet.net/127.0.0.1#5335 +ipset=/tvcastlive-hamivideo.cdn.hinet.net/gfwlist +server=/bridgestone.cl/127.0.0.1#5335 +ipset=/bridgestone.cl/gfwlist +server=/hpcustomersupport.com/127.0.0.1#5335 +ipset=/hpcustomersupport.com/gfwlist +server=/hpcu.org/127.0.0.1#5335 +ipset=/hpcu.org/gfwlist +server=/your-server.de/127.0.0.1#5335 +ipset=/your-server.de/gfwlist +server=/bingads.com/127.0.0.1#5335 +ipset=/bingads.com/gfwlist +server=/scholar.google.is/127.0.0.1#5335 +ipset=/scholar.google.is/gfwlist +server=/eilieili.cc/127.0.0.1#5335 +ipset=/eilieili.cc/gfwlist +server=/scholar.google.com.pe/127.0.0.1#5335 +ipset=/scholar.google.com.pe/gfwlist +server=/foxsports.uy/127.0.0.1#5335 +ipset=/foxsports.uy/gfwlist +server=/jav19.com/127.0.0.1#5335 +ipset=/jav19.com/gfwlist +server=/faceid99.com/127.0.0.1#5335 +ipset=/faceid99.com/gfwlist +server=/voxfieldguide.com/127.0.0.1#5335 +ipset=/voxfieldguide.com/gfwlist +server=/hpconnectedstage.com/127.0.0.1#5335 +ipset=/hpconnectedstage.com/gfwlist +server=/bikaios.xyz/127.0.0.1#5335 +ipset=/bikaios.xyz/gfwlist +server=/freeporn.com/127.0.0.1#5335 +ipset=/freeporn.com/gfwlist +server=/dvdstudiopro.org/127.0.0.1#5335 +ipset=/dvdstudiopro.org/gfwlist +server=/hpconnected.org/127.0.0.1#5335 +ipset=/hpconnected.org/gfwlist +server=/coova.org/127.0.0.1#5335 +ipset=/coova.org/gfwlist +server=/kundun1069.com/127.0.0.1#5335 +ipset=/kundun1069.com/gfwlist +server=/hpcmw.net/127.0.0.1#5335 +ipset=/hpcmw.net/gfwlist +server=/ikea.co.il/127.0.0.1#5335 +ipset=/ikea.co.il/gfwlist +server=/shoers.com/127.0.0.1#5335 +ipset=/shoers.com/gfwlist +server=/vnanchoi.ca/127.0.0.1#5335 +ipset=/vnanchoi.ca/gfwlist +server=/change.org/127.0.0.1#5335 +ipset=/change.org/gfwlist +server=/google.so/127.0.0.1#5335 +ipset=/google.so/gfwlist +server=/paily.net/127.0.0.1#5335 +ipset=/paily.net/gfwlist +server=/wsjwine.com/127.0.0.1#5335 +ipset=/wsjwine.com/gfwlist +server=/hpbluecarpet.net/127.0.0.1#5335 +ipset=/hpbluecarpet.net/gfwlist +server=/hpbluecarpet.com/127.0.0.1#5335 +ipset=/hpbluecarpet.com/gfwlist +server=/ecert.gov.hk/127.0.0.1#5335 +ipset=/ecert.gov.hk/gfwlist +server=/9hentai.ru/127.0.0.1#5335 +ipset=/9hentai.ru/gfwlist +server=/fuckbookecuador.com/127.0.0.1#5335 +ipset=/fuckbookecuador.com/gfwlist +server=/hpallinoneprinter.com/127.0.0.1#5335 +ipset=/hpallinoneprinter.com/gfwlist +server=/mastercard.co.il/127.0.0.1#5335 +ipset=/mastercard.co.il/gfwlist +server=/bmw-motorrad.ca/127.0.0.1#5335 +ipset=/bmw-motorrad.ca/gfwlist +server=/adultcamslover.com/127.0.0.1#5335 +ipset=/adultcamslover.com/gfwlist +server=/ikea.hk/127.0.0.1#5335 +ipset=/ikea.hk/gfwlist +server=/api.viu.now.com/127.0.0.1#5335 +ipset=/api.viu.now.com/gfwlist +server=/disney.co.uk/127.0.0.1#5335 +ipset=/disney.co.uk/gfwlist +server=/mofos.com/127.0.0.1#5335 +ipset=/mofos.com/gfwlist +server=/mwf-service.akamaized.net/127.0.0.1#5335 +ipset=/mwf-service.akamaized.net/gfwlist +server=/unusualporn.net/127.0.0.1#5335 +ipset=/unusualporn.net/gfwlist +server=/financeleadsonline.com/127.0.0.1#5335 +ipset=/financeleadsonline.com/gfwlist +server=/hp.io/127.0.0.1#5335 +ipset=/hp.io/gfwlist +server=/adultmagazinespdf.com/127.0.0.1#5335 +ipset=/adultmagazinespdf.com/gfwlist +server=/4myminicard.com/127.0.0.1#5335 +ipset=/4myminicard.com/gfwlist +server=/69vj.com/127.0.0.1#5335 +ipset=/69vj.com/gfwlist +server=/sa78gs.wpc.edgecastcdn.net/127.0.0.1#5335 +ipset=/sa78gs.wpc.edgecastcdn.net/gfwlist +server=/alpherafs.in/127.0.0.1#5335 +ipset=/alpherafs.in/gfwlist +server=/duckduckgo.org/127.0.0.1#5335 +ipset=/duckduckgo.org/gfwlist +server=/hotmail.com/127.0.0.1#5335 +ipset=/hotmail.com/gfwlist +server=/hp-mns.com/127.0.0.1#5335 +ipset=/hp-mns.com/gfwlist +server=/hp-invent.info/127.0.0.1#5335 +ipset=/hp-invent.info/gfwlist +server=/hp-infolab.com/127.0.0.1#5335 +ipset=/hp-infolab.com/gfwlist +server=/nhentaihaven.org/127.0.0.1#5335 +ipset=/nhentaihaven.org/gfwlist +server=/hp-imagine.com/127.0.0.1#5335 +ipset=/hp-imagine.com/gfwlist +server=/gaming-notebooks.com/127.0.0.1#5335 +ipset=/gaming-notebooks.com/gfwlist +server=/e-cba.org/127.0.0.1#5335 +ipset=/e-cba.org/gfwlist +server=/cheapshoesvip.com/127.0.0.1#5335 +ipset=/cheapshoesvip.com/gfwlist +server=/optica.org/127.0.0.1#5335 +ipset=/optica.org/gfwlist +server=/businessinsider.de/127.0.0.1#5335 +ipset=/businessinsider.de/gfwlist +server=/compaq.org/127.0.0.1#5335 +ipset=/compaq.org/gfwlist +server=/filesmonster.vip/127.0.0.1#5335 +ipset=/filesmonster.vip/gfwlist +server=/dianepoppos.com/127.0.0.1#5335 +ipset=/dianepoppos.com/gfwlist +server=/campushp.com/127.0.0.1#5335 +ipset=/campushp.com/gfwlist +server=/pornlistdude.com/127.0.0.1#5335 +ipset=/pornlistdude.com/gfwlist +server=/diyarbakirescort.com/127.0.0.1#5335 +ipset=/diyarbakirescort.com/gfwlist +server=/supermariorun.com/127.0.0.1#5335 +ipset=/supermariorun.com/gfwlist +server=/faebookc.com/127.0.0.1#5335 +ipset=/faebookc.com/gfwlist +server=/fox5atlanta.com/127.0.0.1#5335 +ipset=/fox5atlanta.com/gfwlist +server=/fecbbok.com/127.0.0.1#5335 +ipset=/fecbbok.com/gfwlist +server=/hexdocs.pm/127.0.0.1#5335 +ipset=/hexdocs.pm/gfwlist +server=/travelex.qa/127.0.0.1#5335 +ipset=/travelex.qa/gfwlist +server=/nudeeroticteens.com/127.0.0.1#5335 +ipset=/nudeeroticteens.com/gfwlist +server=/scdn.co/127.0.0.1#5335 +ipset=/scdn.co/gfwlist +server=/fantasti.cc/127.0.0.1#5335 +ipset=/fantasti.cc/gfwlist +server=/ntdtv.com.tw/127.0.0.1#5335 +ipset=/ntdtv.com.tw/gfwlist +server=/fawgaf.xyz/127.0.0.1#5335 +ipset=/fawgaf.xyz/gfwlist +server=/jos.com/127.0.0.1#5335 +ipset=/jos.com/gfwlist +server=/coupang.com/127.0.0.1#5335 +ipset=/coupang.com/gfwlist +server=/bmw.ps/127.0.0.1#5335 +ipset=/bmw.ps/gfwlist +server=/analvids.com/127.0.0.1#5335 +ipset=/analvids.com/gfwlist +server=/fpacebook.com/127.0.0.1#5335 +ipset=/fpacebook.com/gfwlist +server=/damduc.org/127.0.0.1#5335 +ipset=/damduc.org/gfwlist +server=/vod-thumb-ww-live.akamaized.net/127.0.0.1#5335 +ipset=/vod-thumb-ww-live.akamaized.net/gfwlist +server=/kraken.com/127.0.0.1#5335 +ipset=/kraken.com/gfwlist +server=/instagramtips.com/127.0.0.1#5335 +ipset=/instagramtips.com/gfwlist +server=/csifund.org/127.0.0.1#5335 +ipset=/csifund.org/gfwlist +server=/durex.co.za/127.0.0.1#5335 +ipset=/durex.co.za/gfwlist +server=/shopminiusa.com/127.0.0.1#5335 +ipset=/shopminiusa.com/gfwlist +server=/thepervs.com/127.0.0.1#5335 +ipset=/thepervs.com/gfwlist +server=/chtf.org.tw/127.0.0.1#5335 +ipset=/chtf.org.tw/gfwlist +server=/steam.cdn.webra.ru/127.0.0.1#5335 +ipset=/steam.cdn.webra.ru/gfwlist +server=/onlyprime.ru/127.0.0.1#5335 +ipset=/onlyprime.ru/gfwlist +server=/orgyxxxhub.com/127.0.0.1#5335 +ipset=/orgyxxxhub.com/gfwlist +server=/16honeys.com/127.0.0.1#5335 +ipset=/16honeys.com/gfwlist +server=/appleiservices.com/127.0.0.1#5335 +ipset=/appleiservices.com/gfwlist +server=/love6.tv/127.0.0.1#5335 +ipset=/love6.tv/gfwlist +server=/kimchi.tv/127.0.0.1#5335 +ipset=/kimchi.tv/gfwlist +server=/bedstegratisporno.com/127.0.0.1#5335 +ipset=/bedstegratisporno.com/gfwlist +server=/hetzner.com/127.0.0.1#5335 +ipset=/hetzner.com/gfwlist +server=/hetzner.cloud/127.0.0.1#5335 +ipset=/hetzner.cloud/gfwlist +server=/dropboxusercontent.com/127.0.0.1#5335 +ipset=/dropboxusercontent.com/gfwlist +server=/quicktime.tv/127.0.0.1#5335 +ipset=/quicktime.tv/gfwlist +server=/att-idns.net/127.0.0.1#5335 +ipset=/att-idns.net/gfwlist +server=/lollipopescorts.com/127.0.0.1#5335 +ipset=/lollipopescorts.com/gfwlist +server=/nbcudigitaladops.com/127.0.0.1#5335 +ipset=/nbcudigitaladops.com/gfwlist +server=/authy.com/127.0.0.1#5335 +ipset=/authy.com/gfwlist +server=/mini-stjohns.com/127.0.0.1#5335 +ipset=/mini-stjohns.com/gfwlist +server=/bmw-motorrad.at/127.0.0.1#5335 +ipset=/bmw-motorrad.at/gfwlist +server=/xn--ggle-55da.com/127.0.0.1#5335 +ipset=/xn--ggle-55da.com/gfwlist +server=/xn--flw351e.com/127.0.0.1#5335 +ipset=/xn--flw351e.com/gfwlist +server=/mastercard.ie/127.0.0.1#5335 +ipset=/mastercard.ie/gfwlist +server=/swisssign.li/127.0.0.1#5335 +ipset=/swisssign.li/gfwlist +server=/pinkporno.com/127.0.0.1#5335 +ipset=/pinkporno.com/gfwlist +server=/oreil.ly/127.0.0.1#5335 +ipset=/oreil.ly/gfwlist +server=/intellinuxgraphics.net/127.0.0.1#5335 +ipset=/intellinuxgraphics.net/gfwlist +server=/lencr.org/127.0.0.1#5335 +ipset=/lencr.org/gfwlist +server=/avstar04.me/127.0.0.1#5335 +ipset=/avstar04.me/gfwlist +server=/waterdamagesandiego.org/127.0.0.1#5335 +ipset=/waterdamagesandiego.org/gfwlist +server=/ibeats-uk.com/127.0.0.1#5335 +ipset=/ibeats-uk.com/gfwlist +server=/homepornvideo.net/127.0.0.1#5335 +ipset=/homepornvideo.net/gfwlist +server=/reactjs.com/127.0.0.1#5335 +ipset=/reactjs.com/gfwlist +server=/apornotube.net/127.0.0.1#5335 +ipset=/apornotube.net/gfwlist +server=/ebay.com.au/127.0.0.1#5335 +ipset=/ebay.com.au/gfwlist +server=/gay.bingo/127.0.0.1#5335 +ipset=/gay.bingo/gfwlist +server=/withgoogle.com/127.0.0.1#5335 +ipset=/withgoogle.com/gfwlist +server=/hentai01.com/127.0.0.1#5335 +ipset=/hentai01.com/gfwlist +server=/apple.us/127.0.0.1#5335 +ipset=/apple.us/gfwlist +server=/keiba.net/127.0.0.1#5335 +ipset=/keiba.net/gfwlist +server=/dns.sb/127.0.0.1#5335 +ipset=/dns.sb/gfwlist +server=/erolabs.game/127.0.0.1#5335 +ipset=/erolabs.game/gfwlist +server=/launchpad.wang/127.0.0.1#5335 +ipset=/launchpad.wang/gfwlist +server=/forhertube.com/127.0.0.1#5335 +ipset=/forhertube.com/gfwlist +server=/teamskeet.com/127.0.0.1#5335 +ipset=/teamskeet.com/gfwlist +server=/mac-mini.com/127.0.0.1#5335 +ipset=/mac-mini.com/gfwlist +server=/stripecdn.com/127.0.0.1#5335 +ipset=/stripecdn.com/gfwlist +server=/koreanpornmovie.com/127.0.0.1#5335 +ipset=/koreanpornmovie.com/gfwlist +server=/vscode-sync-insiders.trafficmanager.net/127.0.0.1#5335 +ipset=/vscode-sync-insiders.trafficmanager.net/gfwlist +server=/bmw-motorrad-dubai.com/127.0.0.1#5335 +ipset=/bmw-motorrad-dubai.com/gfwlist +server=/webappfieldguide.com/127.0.0.1#5335 +ipset=/webappfieldguide.com/gfwlist +server=/vmwidm.com/127.0.0.1#5335 +ipset=/vmwidm.com/gfwlist +server=/waze.com/127.0.0.1#5335 +ipset=/waze.com/gfwlist +server=/waymo.com/127.0.0.1#5335 +ipset=/waymo.com/gfwlist +server=/fnacebook.com/127.0.0.1#5335 +ipset=/fnacebook.com/gfwlist +server=/fox10.tv/127.0.0.1#5335 +ipset=/fox10.tv/gfwlist +server=/fox7.com/127.0.0.1#5335 +ipset=/fox7.com/gfwlist +server=/ebayclub.com/127.0.0.1#5335 +ipset=/ebayclub.com/gfwlist +server=/bmw-grouparchiv.de/127.0.0.1#5335 +ipset=/bmw-grouparchiv.de/gfwlist +server=/verilystudywatch.org/127.0.0.1#5335 +ipset=/verilystudywatch.org/gfwlist +server=/casoneexchange.com/127.0.0.1#5335 +ipset=/casoneexchange.com/gfwlist +server=/verilystudywatch.com/127.0.0.1#5335 +ipset=/verilystudywatch.com/gfwlist +server=/aokwholesale.net/127.0.0.1#5335 +ipset=/aokwholesale.net/gfwlist +server=/fapcat.com/127.0.0.1#5335 +ipset=/fapcat.com/gfwlist +server=/cobatt.com/127.0.0.1#5335 +ipset=/cobatt.com/gfwlist +server=/soccerfinancier.ca/127.0.0.1#5335 +ipset=/soccerfinancier.ca/gfwlist +server=/cumteenporn.com/127.0.0.1#5335 +ipset=/cumteenporn.com/gfwlist +server=/seiroganmania.com/127.0.0.1#5335 +ipset=/seiroganmania.com/gfwlist +server=/watchindianporn.net/127.0.0.1#5335 +ipset=/watchindianporn.net/gfwlist +server=/discord.com/127.0.0.1#5335 +ipset=/discord.com/gfwlist +server=/hotmonsterbeats.com/127.0.0.1#5335 +ipset=/hotmonsterbeats.com/gfwlist +server=/bienvenuechezbestbuy.ca/127.0.0.1#5335 +ipset=/bienvenuechezbestbuy.ca/gfwlist +server=/minifs.com/127.0.0.1#5335 +ipset=/minifs.com/gfwlist +server=/pornaroma.com/127.0.0.1#5335 +ipset=/pornaroma.com/gfwlist +server=/unfiltered.news/127.0.0.1#5335 +ipset=/unfiltered.news/gfwlist +server=/aclweb.org/127.0.0.1#5335 +ipset=/aclweb.org/gfwlist +server=/ffprofile.com/127.0.0.1#5335 +ipset=/ffprofile.com/gfwlist +server=/scholar.google.com.ni/127.0.0.1#5335 +ipset=/scholar.google.com.ni/gfwlist +server=/txvia.com/127.0.0.1#5335 +ipset=/txvia.com/gfwlist +server=/cbsiam.com/127.0.0.1#5335 +ipset=/cbsiam.com/gfwlist +server=/vbejeyv.shop/127.0.0.1#5335 +ipset=/vbejeyv.shop/gfwlist +server=/youtube.com.mk/127.0.0.1#5335 +ipset=/youtube.com.mk/gfwlist +server=/mysocialworklab.com/127.0.0.1#5335 +ipset=/mysocialworklab.com/gfwlist +server=/thinkquarterly.com/127.0.0.1#5335 +ipset=/thinkquarterly.com/gfwlist +server=/youtube.co.ve/127.0.0.1#5335 +ipset=/youtube.co.ve/gfwlist +server=/vscode.dev/127.0.0.1#5335 +ipset=/vscode.dev/gfwlist +server=/yammer.com/127.0.0.1#5335 +ipset=/yammer.com/gfwlist +server=/analpornonly.com/127.0.0.1#5335 +ipset=/analpornonly.com/gfwlist +server=/02weqj32.com/127.0.0.1#5335 +ipset=/02weqj32.com/gfwlist +server=/volvogroup.jp/127.0.0.1#5335 +ipset=/volvogroup.jp/gfwlist +server=/launchpadlibrarian.com/127.0.0.1#5335 +ipset=/launchpadlibrarian.com/gfwlist +server=/vs-cmaf-push-uk-live.akamaized.net/127.0.0.1#5335 +ipset=/vs-cmaf-push-uk-live.akamaized.net/gfwlist +server=/hath.network/127.0.0.1#5335 +ipset=/hath.network/gfwlist +server=/mathoverflow.net/127.0.0.1#5335 +ipset=/mathoverflow.net/gfwlist +server=/sony-hes.co.jp/127.0.0.1#5335 +ipset=/sony-hes.co.jp/gfwlist +server=/synergyse.com/127.0.0.1#5335 +ipset=/synergyse.com/gfwlist +server=/blogspot.sg/127.0.0.1#5335 +ipset=/blogspot.sg/gfwlist +server=/matureladiesxxx.com/127.0.0.1#5335 +ipset=/matureladiesxxx.com/gfwlist +server=/casque-fr.com/127.0.0.1#5335 +ipset=/casque-fr.com/gfwlist +server=/stxmosquitoproject.com/127.0.0.1#5335 +ipset=/stxmosquitoproject.com/gfwlist +server=/beatsbydreausale.net/127.0.0.1#5335 +ipset=/beatsbydreausale.net/gfwlist +server=/amamanualofstyle.com/127.0.0.1#5335 +ipset=/amamanualofstyle.com/gfwlist +server=/getbraintree.com/127.0.0.1#5335 +ipset=/getbraintree.com/gfwlist +server=/realclearpublicaffairs.com/127.0.0.1#5335 +ipset=/realclearpublicaffairs.com/gfwlist +server=/webex.co.kr/127.0.0.1#5335 +ipset=/webex.co.kr/gfwlist +server=/animalpornxxx.me/127.0.0.1#5335 +ipset=/animalpornxxx.me/gfwlist +server=/faceboo.com/127.0.0.1#5335 +ipset=/faceboo.com/gfwlist +server=/stcroixmosquitoproject.com/127.0.0.1#5335 +ipset=/stcroixmosquitoproject.com/gfwlist +server=/beddit.tv/127.0.0.1#5335 +ipset=/beddit.tv/gfwlist +server=/stcroixmosquito.com/127.0.0.1#5335 +ipset=/stcroixmosquito.com/gfwlist +server=/mottainai.info/127.0.0.1#5335 +ipset=/mottainai.info/gfwlist +server=/mirrorsedge.com/127.0.0.1#5335 +ipset=/mirrorsedge.com/gfwlist +server=/realclearscience.com/127.0.0.1#5335 +ipset=/realclearscience.com/gfwlist +server=/fictionmania.tv/127.0.0.1#5335 +ipset=/fictionmania.tv/gfwlist +server=/solveforx.com/127.0.0.1#5335 +ipset=/solveforx.com/gfwlist +server=/cashpassport.com.br/127.0.0.1#5335 +ipset=/cashpassport.com.br/gfwlist +server=/alohatube.com/127.0.0.1#5335 +ipset=/alohatube.com/gfwlist +server=/xnxx18.pro/127.0.0.1#5335 +ipset=/xnxx18.pro/gfwlist +server=/screenwisetrendspanel.com/127.0.0.1#5335 +ipset=/screenwisetrendspanel.com/gfwlist +server=/webobjects.de/127.0.0.1#5335 +ipset=/webobjects.de/gfwlist +server=/saynow.com/127.0.0.1#5335 +ipset=/saynow.com/gfwlist +server=/fi11.cn/127.0.0.1#5335 +ipset=/fi11.cn/gfwlist +server=/run.app/127.0.0.1#5335 +ipset=/run.app/gfwlist +server=/ridepenguin.com/127.0.0.1#5335 +ipset=/ridepenguin.com/gfwlist +server=/setn.com/127.0.0.1#5335 +ipset=/setn.com/gfwlist +server=/revolv.com/127.0.0.1#5335 +ipset=/revolv.com/gfwlist +server=/gettyimages.de/127.0.0.1#5335 +ipset=/gettyimages.de/gfwlist +server=/bmwmotorsport.com/127.0.0.1#5335 +ipset=/bmwmotorsport.com/gfwlist +server=/colegialasdeverdad.com/127.0.0.1#5335 +ipset=/colegialasdeverdad.com/gfwlist +server=/pvr-hamivideo.cdn.hinet.net/127.0.0.1#5335 +ipset=/pvr-hamivideo.cdn.hinet.net/gfwlist +server=/adwordsexpress.com/127.0.0.1#5335 +ipset=/adwordsexpress.com/gfwlist +server=/ajplus.net/127.0.0.1#5335 +ipset=/ajplus.net/gfwlist +server=/muji.tw/127.0.0.1#5335 +ipset=/muji.tw/gfwlist +server=/publishproxy.com/127.0.0.1#5335 +ipset=/publishproxy.com/gfwlist +server=/google.com.au/127.0.0.1#5335 +ipset=/google.com.au/gfwlist +server=/heavyfetish.com/127.0.0.1#5335 +ipset=/heavyfetish.com/gfwlist +server=/thehealthsite.com/127.0.0.1#5335 +ipset=/thehealthsite.com/gfwlist +server=/21naturals.com/127.0.0.1#5335 +ipset=/21naturals.com/gfwlist +server=/mytokenapi.com/127.0.0.1#5335 +ipset=/mytokenapi.com/gfwlist +server=/projectara.com/127.0.0.1#5335 +ipset=/projectara.com/gfwlist +server=/privacysandbox.com/127.0.0.1#5335 +ipset=/privacysandbox.com/gfwlist +server=/arewereadyyet.com/127.0.0.1#5335 +ipset=/arewereadyyet.com/gfwlist +server=/pixate.com/127.0.0.1#5335 +ipset=/pixate.com/gfwlist +server=/canon.com.au/127.0.0.1#5335 +ipset=/canon.com.au/gfwlist +server=/sorairi.info/127.0.0.1#5335 +ipset=/sorairi.info/gfwlist +server=/picnik.com/127.0.0.1#5335 +ipset=/picnik.com/gfwlist +server=/bejav.net/127.0.0.1#5335 +ipset=/bejav.net/gfwlist +server=/pornma.com/127.0.0.1#5335 +ipset=/pornma.com/gfwlist +server=/myyoungmomisnude.com/127.0.0.1#5335 +ipset=/myyoungmomisnude.com/gfwlist +server=/economistgroupcareers.com/127.0.0.1#5335 +ipset=/economistgroupcareers.com/gfwlist +server=/charmescorts.com/127.0.0.1#5335 +ipset=/charmescorts.com/gfwlist +server=/kijijii.ca/127.0.0.1#5335 +ipset=/kijijii.ca/gfwlist +server=/dogofcum.com/127.0.0.1#5335 +ipset=/dogofcum.com/gfwlist +server=/guo.media/127.0.0.1#5335 +ipset=/guo.media/gfwlist +server=/youtube.cl/127.0.0.1#5335 +ipset=/youtube.cl/gfwlist +server=/botframework.com/127.0.0.1#5335 +ipset=/botframework.com/gfwlist +server=/epochtimes.se/127.0.0.1#5335 +ipset=/epochtimes.se/gfwlist +server=/singlelogin.me/127.0.0.1#5335 +ipset=/singlelogin.me/gfwlist +server=/visiontimes.com/127.0.0.1#5335 +ipset=/visiontimes.com/gfwlist +server=/actalis.it/127.0.0.1#5335 +ipset=/actalis.it/gfwlist +server=/google.is/127.0.0.1#5335 +ipset=/google.is/gfwlist +server=/riot.com/127.0.0.1#5335 +ipset=/riot.com/gfwlist +server=/bmw-rp.com/127.0.0.1#5335 +ipset=/bmw-rp.com/gfwlist +server=/ebayca.org/127.0.0.1#5335 +ipset=/ebayca.org/gfwlist +server=/grandfuckauto.xxx/127.0.0.1#5335 +ipset=/grandfuckauto.xxx/gfwlist +server=/18schoolgirlz.me/127.0.0.1#5335 +ipset=/18schoolgirlz.me/gfwlist +server=/oneworldmanystories.com/127.0.0.1#5335 +ipset=/oneworldmanystories.com/gfwlist +server=/hpapplicationscenter.com/127.0.0.1#5335 +ipset=/hpapplicationscenter.com/gfwlist +server=/mastercard.com.my/127.0.0.1#5335 +ipset=/mastercard.com.my/gfwlist +server=/pornfuck.net/127.0.0.1#5335 +ipset=/pornfuck.net/gfwlist +server=/on2.com/127.0.0.1#5335 +ipset=/on2.com/gfwlist +server=/on.here/127.0.0.1#5335 +ipset=/on.here/gfwlist +server=/cbsi.com/127.0.0.1#5335 +ipset=/cbsi.com/gfwlist +server=/avseesee.com/127.0.0.1#5335 +ipset=/avseesee.com/gfwlist +server=/titsbox.com/127.0.0.1#5335 +ipset=/titsbox.com/gfwlist +server=/nest.com/127.0.0.1#5335 +ipset=/nest.com/gfwlist +server=/near.by/127.0.0.1#5335 +ipset=/near.by/gfwlist +server=/6sextube.com/127.0.0.1#5335 +ipset=/6sextube.com/gfwlist +server=/girlfur.com/127.0.0.1#5335 +ipset=/girlfur.com/gfwlist +server=/moodstocks.com/127.0.0.1#5335 +ipset=/moodstocks.com/gfwlist +server=/appleclub.com.hk/127.0.0.1#5335 +ipset=/appleclub.com.hk/gfwlist +server=/beatsdrdre-headphones.com/127.0.0.1#5335 +ipset=/beatsdrdre-headphones.com/gfwlist +server=/mfg-inspector.com/127.0.0.1#5335 +ipset=/mfg-inspector.com/gfwlist +server=/fucksexhub.com/127.0.0.1#5335 +ipset=/fucksexhub.com/gfwlist +server=/dragonhentai.net/127.0.0.1#5335 +ipset=/dragonhentai.net/gfwlist +server=/meet.new/127.0.0.1#5335 +ipset=/meet.new/gfwlist +server=/hifiporn.fun/127.0.0.1#5335 +ipset=/hifiporn.fun/gfwlist +server=/tx5ptbp7.com/127.0.0.1#5335 +ipset=/tx5ptbp7.com/gfwlist +server=/customizedbeatsbydre.com/127.0.0.1#5335 +ipset=/customizedbeatsbydre.com/gfwlist +server=/rapidssl.com/127.0.0.1#5335 +ipset=/rapidssl.com/gfwlist +server=/madewithcode.com/127.0.0.1#5335 +ipset=/madewithcode.com/gfwlist +server=/listinganalytics.net/127.0.0.1#5335 +ipset=/listinganalytics.net/gfwlist +server=/yahoo.ae/127.0.0.1#5335 +ipset=/yahoo.ae/gfwlist +server=/keytransparency.org/127.0.0.1#5335 +ipset=/keytransparency.org/gfwlist +server=/xcity.jp/127.0.0.1#5335 +ipset=/xcity.jp/gfwlist +server=/sexcord.com/127.0.0.1#5335 +ipset=/sexcord.com/gfwlist +server=/alpherafs.com.my/127.0.0.1#5335 +ipset=/alpherafs.com.my/gfwlist +server=/joeswall.com/127.0.0.1#5335 +ipset=/joeswall.com/gfwlist +server=/plantsvszombies2.com/127.0.0.1#5335 +ipset=/plantsvszombies2.com/gfwlist +server=/op.gg/127.0.0.1#5335 +ipset=/op.gg/gfwlist +server=/ebaya.com/127.0.0.1#5335 +ipset=/ebaya.com/gfwlist +server=/impermium.com/127.0.0.1#5335 +ipset=/impermium.com/gfwlist +server=/only3x.com/127.0.0.1#5335 +ipset=/only3x.com/gfwlist +server=/topadultgames.biz/127.0.0.1#5335 +ipset=/topadultgames.biz/gfwlist +server=/amateurbdsmporn.com/127.0.0.1#5335 +ipset=/amateurbdsmporn.com/gfwlist +server=/hwgo.com/127.0.0.1#5335 +ipset=/hwgo.com/gfwlist +server=/hereistheporn.com/127.0.0.1#5335 +ipset=/hereistheporn.com/gfwlist +server=/hentailabs.com/127.0.0.1#5335 +ipset=/hentailabs.com/gfwlist +server=/playforceone.com/127.0.0.1#5335 +ipset=/playforceone.com/gfwlist +server=/deepfake-porn.com/127.0.0.1#5335 +ipset=/deepfake-porn.com/gfwlist +server=/adorable-teens.net/127.0.0.1#5335 +ipset=/adorable-teens.net/gfwlist +server=/metro.co.uk/127.0.0.1#5335 +ipset=/metro.co.uk/gfwlist +server=/ikea.com.kw/127.0.0.1#5335 +ipset=/ikea.com.kw/gfwlist +server=/bmw-motorrad.it/127.0.0.1#5335 +ipset=/bmw-motorrad.it/gfwlist +server=/beatbydreheadphonesonsale.com/127.0.0.1#5335 +ipset=/beatbydreheadphonesonsale.com/gfwlist +server=/girls.xyz/127.0.0.1#5335 +ipset=/girls.xyz/gfwlist +server=/hobonichielog.com/127.0.0.1#5335 +ipset=/hobonichielog.com/gfwlist +server=/scholar.google.co.in/127.0.0.1#5335 +ipset=/scholar.google.co.in/gfwlist +server=/luscious.net/127.0.0.1#5335 +ipset=/luscious.net/gfwlist +server=/blogspot.ch/127.0.0.1#5335 +ipset=/blogspot.ch/gfwlist +server=/smartone.com/127.0.0.1#5335 +ipset=/smartone.com/gfwlist +server=/mobilelive-hamivideo.cdn.hinet.net/127.0.0.1#5335 +ipset=/mobilelive-hamivideo.cdn.hinet.net/gfwlist +server=/gvt9.com/127.0.0.1#5335 +ipset=/gvt9.com/gfwlist +server=/funshemale.com/127.0.0.1#5335 +ipset=/funshemale.com/gfwlist +server=/wwwapplemusic.com/127.0.0.1#5335 +ipset=/wwwapplemusic.com/gfwlist +server=/elephantlist.com/127.0.0.1#5335 +ipset=/elephantlist.com/gfwlist +server=/tidal.com/127.0.0.1#5335 +ipset=/tidal.com/gfwlist +server=/gvt6.com/127.0.0.1#5335 +ipset=/gvt6.com/gfwlist +server=/bmwmotorrad.co.kr/127.0.0.1#5335 +ipset=/bmwmotorrad.co.kr/gfwlist +server=/2013newbeatsworld.com/127.0.0.1#5335 +ipset=/2013newbeatsworld.com/gfwlist +server=/springer.com/127.0.0.1#5335 +ipset=/springer.com/gfwlist +server=/battlefield1943.com/127.0.0.1#5335 +ipset=/battlefield1943.com/gfwlist +server=/gvt2.com/127.0.0.1#5335 +ipset=/gvt2.com/gfwlist +server=/volvobuses.my/127.0.0.1#5335 +ipset=/volvobuses.my/gfwlist +server=/4everland.io/127.0.0.1#5335 +ipset=/4everland.io/gfwlist +server=/gvt1.com/127.0.0.1#5335 +ipset=/gvt1.com/gfwlist +server=/bmw.dz/127.0.0.1#5335 +ipset=/bmw.dz/gfwlist +server=/gstatic.com/127.0.0.1#5335 +ipset=/gstatic.com/gfwlist +server=/friendfed.com/127.0.0.1#5335 +ipset=/friendfed.com/gfwlist +server=/buyitnow.tv/127.0.0.1#5335 +ipset=/buyitnow.tv/gfwlist +server=/ysporn.com/127.0.0.1#5335 +ipset=/ysporn.com/gfwlist +server=/gooogle.com/127.0.0.1#5335 +ipset=/gooogle.com/gfwlist +server=/6twseb.com/127.0.0.1#5335 +ipset=/6twseb.com/gfwlist +server=/goolge.com/127.0.0.1#5335 +ipset=/goolge.com/gfwlist +server=/googlr.com/127.0.0.1#5335 +ipset=/googlr.com/gfwlist +server=/espadoldettol.com.ar/127.0.0.1#5335 +ipset=/espadoldettol.com.ar/gfwlist +server=/pornobrasil.blog.br/127.0.0.1#5335 +ipset=/pornobrasil.blog.br/gfwlist +server=/e621.net/127.0.0.1#5335 +ipset=/e621.net/gfwlist +server=/mini-connected.be/127.0.0.1#5335 +ipset=/mini-connected.be/gfwlist +server=/fasebook.com/127.0.0.1#5335 +ipset=/fasebook.com/gfwlist +server=/cloudflarewarp.com/127.0.0.1#5335 +ipset=/cloudflarewarp.com/gfwlist +server=/googlesverige.com/127.0.0.1#5335 +ipset=/googlesverige.com/gfwlist +server=/indaznlab.com/127.0.0.1#5335 +ipset=/indaznlab.com/gfwlist +server=/nikesku.com/127.0.0.1#5335 +ipset=/nikesku.com/gfwlist +server=/projectapex.com/127.0.0.1#5335 +ipset=/projectapex.com/gfwlist +server=/anime-pictures.net/127.0.0.1#5335 +ipset=/anime-pictures.net/gfwlist +server=/cheapnikedunks.com/127.0.0.1#5335 +ipset=/cheapnikedunks.com/gfwlist +server=/wariolandshakeit.com/127.0.0.1#5335 +ipset=/wariolandshakeit.com/gfwlist +server=/hentai24h.tv/127.0.0.1#5335 +ipset=/hentai24h.tv/gfwlist +server=/teenrave.org/127.0.0.1#5335 +ipset=/teenrave.org/gfwlist +server=/primeindianporn.com/127.0.0.1#5335 +ipset=/primeindianporn.com/gfwlist +server=/ebaypakistan.net/127.0.0.1#5335 +ipset=/ebaypakistan.net/gfwlist +server=/ebay.mn/127.0.0.1#5335 +ipset=/ebay.mn/gfwlist +server=/firestonebpco.com/127.0.0.1#5335 +ipset=/firestonebpco.com/gfwlist +server=/herringnetwork.com/127.0.0.1#5335 +ipset=/herringnetwork.com/gfwlist +server=/opinionjournal.com/127.0.0.1#5335 +ipset=/opinionjournal.com/gfwlist +server=/rule34.us/127.0.0.1#5335 +ipset=/rule34.us/gfwlist +server=/monsterbeatscommunity.com/127.0.0.1#5335 +ipset=/monsterbeatscommunity.com/gfwlist +server=/dynafleetonline.com/127.0.0.1#5335 +ipset=/dynafleetonline.com/gfwlist +server=/googleplus.com/127.0.0.1#5335 +ipset=/googleplus.com/gfwlist +server=/googleplay.com/127.0.0.1#5335 +ipset=/googleplay.com/gfwlist +server=/googlephotos.com/127.0.0.1#5335 +ipset=/googlephotos.com/gfwlist +server=/playmation.com/127.0.0.1#5335 +ipset=/playmation.com/gfwlist +server=/googlepagecreator.com/127.0.0.1#5335 +ipset=/googlepagecreator.com/gfwlist +server=/googlemaps.com/127.0.0.1#5335 +ipset=/googlemaps.com/gfwlist +server=/fgacebook.com/127.0.0.1#5335 +ipset=/fgacebook.com/gfwlist +server=/bestbuycanada.ca/127.0.0.1#5335 +ipset=/bestbuycanada.ca/gfwlist +server=/xfockers.com/127.0.0.1#5335 +ipset=/xfockers.com/gfwlist +server=/avinetworks.com/127.0.0.1#5335 +ipset=/avinetworks.com/gfwlist +server=/googlefiber.com/127.0.0.1#5335 +ipset=/googlefiber.com/gfwlist +server=/weiyuksj.com/127.0.0.1#5335 +ipset=/weiyuksj.com/gfwlist +server=/volvotrucks.net/127.0.0.1#5335 +ipset=/volvotrucks.net/gfwlist +server=/nikeoutletstores.com/127.0.0.1#5335 +ipset=/nikeoutletstores.com/gfwlist +server=/mastercardacademy.com/127.0.0.1#5335 +ipset=/mastercardacademy.com/gfwlist +server=/thefappeningblog.com/127.0.0.1#5335 +ipset=/thefappeningblog.com/gfwlist +server=/visabank.org/127.0.0.1#5335 +ipset=/visabank.org/gfwlist +server=/apple.news/127.0.0.1#5335 +ipset=/apple.news/gfwlist +server=/wenzhao.ca/127.0.0.1#5335 +ipset=/wenzhao.ca/gfwlist +server=/microad.co.jp/127.0.0.1#5335 +ipset=/microad.co.jp/gfwlist +server=/neow.in/127.0.0.1#5335 +ipset=/neow.in/gfwlist +server=/ocbmwdealers.com/127.0.0.1#5335 +ipset=/ocbmwdealers.com/gfwlist +server=/myfoxhouston.com/127.0.0.1#5335 +ipset=/myfoxhouston.com/gfwlist +server=/bmw.tm/127.0.0.1#5335 +ipset=/bmw.tm/gfwlist +server=/bitstream.com/127.0.0.1#5335 +ipset=/bitstream.com/gfwlist +server=/savitabhabhi.com/127.0.0.1#5335 +ipset=/savitabhabhi.com/gfwlist +server=/googlecommerce.com/127.0.0.1#5335 +ipset=/googlecommerce.com/gfwlist +server=/ikea.com.hk/127.0.0.1#5335 +ipset=/ikea.com.hk/gfwlist +server=/facebol.com/127.0.0.1#5335 +ipset=/facebol.com/gfwlist +server=/libraryofthumbs.com/127.0.0.1#5335 +ipset=/libraryofthumbs.com/gfwlist +server=/statuspage.io/127.0.0.1#5335 +ipset=/statuspage.io/gfwlist +server=/epochtimes.jp/127.0.0.1#5335 +ipset=/epochtimes.jp/gfwlist +server=/googlebot.com/127.0.0.1#5335 +ipset=/googlebot.com/gfwlist +server=/google.ventures/127.0.0.1#5335 +ipset=/google.ventures/gfwlist +server=/google.dev/127.0.0.1#5335 +ipset=/google.dev/gfwlist +server=/google.berlin/127.0.0.1#5335 +ipset=/google.berlin/gfwlist +server=/google-access.net/127.0.0.1#5335 +ipset=/google-access.net/gfwlist +server=/pornoincreible.com/127.0.0.1#5335 +ipset=/pornoincreible.com/gfwlist +server=/priceless.org/127.0.0.1#5335 +ipset=/priceless.org/gfwlist +server=/ffacebook.com/127.0.0.1#5335 +ipset=/ffacebook.com/gfwlist +server=/goo.gl/127.0.0.1#5335 +ipset=/goo.gl/gfwlist +server=/napiszex.com/127.0.0.1#5335 +ipset=/napiszex.com/gfwlist +server=/gonglchuangl.net/127.0.0.1#5335 +ipset=/gonglchuangl.net/gfwlist +server=/gogle.com/127.0.0.1#5335 +ipset=/gogle.com/gfwlist +server=/instagramtr.com/127.0.0.1#5335 +ipset=/instagramtr.com/gfwlist +server=/gmodules.com/127.0.0.1#5335 +ipset=/gmodules.com/gfwlist +server=/awsautopilot.com/127.0.0.1#5335 +ipset=/awsautopilot.com/gfwlist +server=/gipscorp.com/127.0.0.1#5335 +ipset=/gipscorp.com/gfwlist +server=/c-span.org/127.0.0.1#5335 +ipset=/c-span.org/gfwlist +server=/getbumptop.com/127.0.0.1#5335 +ipset=/getbumptop.com/gfwlist +server=/gerritcodereview.com/127.0.0.1#5335 +ipset=/gerritcodereview.com/gfwlist +server=/videodelivery.net/127.0.0.1#5335 +ipset=/videodelivery.net/gfwlist +server=/gimy.tv/127.0.0.1#5335 +ipset=/gimy.tv/gfwlist +server=/g.page/127.0.0.1#5335 +ipset=/g.page/gfwlist +server=/ctv.com.tw/127.0.0.1#5335 +ipset=/ctv.com.tw/gfwlist +server=/porngameshub.com/127.0.0.1#5335 +ipset=/porngameshub.com/gfwlist +server=/g-tun.com/127.0.0.1#5335 +ipset=/g-tun.com/gfwlist +server=/fuchsia.dev/127.0.0.1#5335 +ipset=/fuchsia.dev/gfwlist +server=/volvopenta.se/127.0.0.1#5335 +ipset=/volvopenta.se/gfwlist +server=/enf-cmnf.com/127.0.0.1#5335 +ipset=/enf-cmnf.com/gfwlist +server=/zooporn.video/127.0.0.1#5335 +ipset=/zooporn.video/gfwlist +server=/ad.games.dmm.com/127.0.0.1#5335 +ipset=/ad.games.dmm.com/gfwlist +server=/ikea.com/127.0.0.1#5335 +ipset=/ikea.com/gfwlist +server=/pinyinxiang.com/127.0.0.1#5335 +ipset=/pinyinxiang.com/gfwlist +server=/workplaceusecases.com/127.0.0.1#5335 +ipset=/workplaceusecases.com/gfwlist +server=/okkisokuho.com/127.0.0.1#5335 +ipset=/okkisokuho.com/gfwlist +server=/fflick.com/127.0.0.1#5335 +ipset=/fflick.com/gfwlist +server=/episodic.com/127.0.0.1#5335 +ipset=/episodic.com/gfwlist +server=/udndata.com/127.0.0.1#5335 +ipset=/udndata.com/gfwlist +server=/paidpornsites.com/127.0.0.1#5335 +ipset=/paidpornsites.com/gfwlist +server=/ganjingworld.com/127.0.0.1#5335 +ipset=/ganjingworld.com/gfwlist +server=/needforspeedoverdrive.com/127.0.0.1#5335 +ipset=/needforspeedoverdrive.com/gfwlist +server=/myfappening.org/127.0.0.1#5335 +ipset=/myfappening.org/gfwlist +server=/bmwchampionshipusa.com/127.0.0.1#5335 +ipset=/bmwchampionshipusa.com/gfwlist +server=/mastercard.hu/127.0.0.1#5335 +ipset=/mastercard.hu/gfwlist +server=/cherrynudes.com/127.0.0.1#5335 +ipset=/cherrynudes.com/gfwlist +server=/icloud.lv/127.0.0.1#5335 +ipset=/icloud.lv/gfwlist +server=/twnextdigital.com/127.0.0.1#5335 +ipset=/twnextdigital.com/gfwlist +server=/2013beatshdcybermonday.com/127.0.0.1#5335 +ipset=/2013beatshdcybermonday.com/gfwlist +server=/acgdg.com/127.0.0.1#5335 +ipset=/acgdg.com/gfwlist +server=/fuckmypakistanigf.com/127.0.0.1#5335 +ipset=/fuckmypakistanigf.com/gfwlist +server=/salesforcemarketingcloud.com/127.0.0.1#5335 +ipset=/salesforcemarketingcloud.com/gfwlist +server=/nubilesunscripted.com/127.0.0.1#5335 +ipset=/nubilesunscripted.com/gfwlist +server=/crossmediapanel.com/127.0.0.1#5335 +ipset=/crossmediapanel.com/gfwlist +server=/coova.net/127.0.0.1#5335 +ipset=/coova.net/gfwlist +server=/purelyceleb.com/127.0.0.1#5335 +ipset=/purelyceleb.com/gfwlist +server=/cookiechoices.org/127.0.0.1#5335 +ipset=/cookiechoices.org/gfwlist +server=/nekora.main.jp/127.0.0.1#5335 +ipset=/nekora.main.jp/gfwlist +server=/ieeecsc.org/127.0.0.1#5335 +ipset=/ieeecsc.org/gfwlist +server=/smpte.org/127.0.0.1#5335 +ipset=/smpte.org/gfwlist +server=/google.gr/127.0.0.1#5335 +ipset=/google.gr/gfwlist +server=/codespot.com/127.0.0.1#5335 +ipset=/codespot.com/gfwlist +server=/cobrasearch.com/127.0.0.1#5335 +ipset=/cobrasearch.com/gfwlist +server=/ciscowebseminars.com/127.0.0.1#5335 +ipset=/ciscowebseminars.com/gfwlist +server=/ixxx.com/127.0.0.1#5335 +ipset=/ixxx.com/gfwlist +server=/chronicle.security/127.0.0.1#5335 +ipset=/chronicle.security/gfwlist +server=/intel.sg/127.0.0.1#5335 +ipset=/intel.sg/gfwlist +server=/onlinemonsterbeatsonsale.com/127.0.0.1#5335 +ipset=/onlinemonsterbeatsonsale.com/gfwlist +server=/steam.cdn.orcon.net.nz/127.0.0.1#5335 +ipset=/steam.cdn.orcon.net.nz/gfwlist +server=/mastercard.md/127.0.0.1#5335 +ipset=/mastercard.md/gfwlist +server=/hbrowse.com/127.0.0.1#5335 +ipset=/hbrowse.com/gfwlist +server=/nutramigen.net/127.0.0.1#5335 +ipset=/nutramigen.net/gfwlist +server=/2ch.net/127.0.0.1#5335 +ipset=/2ch.net/gfwlist +server=/mini-antilles.fr/127.0.0.1#5335 +ipset=/mini-antilles.fr/gfwlist +server=/grandepornogratis.com/127.0.0.1#5335 +ipset=/grandepornogratis.com/gfwlist +server=/5ch.net/127.0.0.1#5335 +ipset=/5ch.net/gfwlist +server=/mzstatic.com/127.0.0.1#5335 +ipset=/mzstatic.com/gfwlist +server=/winticket.jp/127.0.0.1#5335 +ipset=/winticket.jp/gfwlist +server=/bumptunes.com/127.0.0.1#5335 +ipset=/bumptunes.com/gfwlist +server=/buycheapbeatsdreuk.com/127.0.0.1#5335 +ipset=/buycheapbeatsdreuk.com/gfwlist +server=/foxnewsradio.com/127.0.0.1#5335 +ipset=/foxnewsradio.com/gfwlist +server=/bumptop.net/127.0.0.1#5335 +ipset=/bumptop.net/gfwlist +server=/bumptop.com/127.0.0.1#5335 +ipset=/bumptop.com/gfwlist +server=/javpost.net/127.0.0.1#5335 +ipset=/javpost.net/gfwlist +server=/adulterfree.com/127.0.0.1#5335 +ipset=/adulterfree.com/gfwlist +server=/bumptop.ca/127.0.0.1#5335 +ipset=/bumptop.ca/gfwlist +server=/javcl.com/127.0.0.1#5335 +ipset=/javcl.com/gfwlist +server=/foxtelevisionstations.com/127.0.0.1#5335 +ipset=/foxtelevisionstations.com/gfwlist +server=/bmw-world.com/127.0.0.1#5335 +ipset=/bmw-world.com/gfwlist +server=/binance.cc/127.0.0.1#5335 +ipset=/binance.cc/gfwlist +server=/doujinland.info/127.0.0.1#5335 +ipset=/doujinland.info/gfwlist +server=/streamxxx.tv/127.0.0.1#5335 +ipset=/streamxxx.tv/gfwlist +server=/ebay.com.hk/127.0.0.1#5335 +ipset=/ebay.com.hk/gfwlist +server=/apture.com/127.0.0.1#5335 +ipset=/apture.com/gfwlist +server=/zooskoolvideos.com/127.0.0.1#5335 +ipset=/zooskoolvideos.com/gfwlist +server=/6park.com/127.0.0.1#5335 +ipset=/6park.com/gfwlist +server=/himalaya-exchange.zendesk.com/127.0.0.1#5335 +ipset=/himalaya-exchange.zendesk.com/gfwlist +server=/appbridge.it/127.0.0.1#5335 +ipset=/appbridge.it/gfwlist +server=/twinkybf.com/127.0.0.1#5335 +ipset=/twinkybf.com/gfwlist +server=/ipod.eu/127.0.0.1#5335 +ipset=/ipod.eu/gfwlist +server=/nikeshoes4u.com/127.0.0.1#5335 +ipset=/nikeshoes4u.com/gfwlist +server=/foxdeportes.tv/127.0.0.1#5335 +ipset=/foxdeportes.tv/gfwlist +server=/triballo.net/127.0.0.1#5335 +ipset=/triballo.net/gfwlist +server=/scholar.google.si/127.0.0.1#5335 +ipset=/scholar.google.si/gfwlist +server=/curvyerotic.com/127.0.0.1#5335 +ipset=/curvyerotic.com/gfwlist +server=/arabidopsis.org/127.0.0.1#5335 +ipset=/arabidopsis.org/gfwlist +server=/nflxso.net/127.0.0.1#5335 +ipset=/nflxso.net/gfwlist +server=/1ucrs.com/127.0.0.1#5335 +ipset=/1ucrs.com/gfwlist +server=/dreammovies.com/127.0.0.1#5335 +ipset=/dreammovies.com/gfwlist +server=/ciscokinetic.com/127.0.0.1#5335 +ipset=/ciscokinetic.com/gfwlist +server=/shopee.ph/127.0.0.1#5335 +ipset=/shopee.ph/gfwlist +server=/6xxxvideos.com/127.0.0.1#5335 +ipset=/6xxxvideos.com/gfwlist +server=/stonefoxproductions.com/127.0.0.1#5335 +ipset=/stonefoxproductions.com/gfwlist +server=/google.to/127.0.0.1#5335 +ipset=/google.to/gfwlist +server=/myoctocat.com/127.0.0.1#5335 +ipset=/myoctocat.com/gfwlist +server=/google.tn/127.0.0.1#5335 +ipset=/google.tn/gfwlist +server=/google.tm/127.0.0.1#5335 +ipset=/google.tm/gfwlist +server=/tubexclips.com/127.0.0.1#5335 +ipset=/tubexclips.com/gfwlist +server=/beatdrdres.com/127.0.0.1#5335 +ipset=/beatdrdres.com/gfwlist +server=/vmwareidentity.com/127.0.0.1#5335 +ipset=/vmwareidentity.com/gfwlist +server=/paypalhere.org/127.0.0.1#5335 +ipset=/paypalhere.org/gfwlist +server=/firestone.com.br/127.0.0.1#5335 +ipset=/firestone.com.br/gfwlist +server=/pornhub.org/127.0.0.1#5335 +ipset=/pornhub.org/gfwlist +server=/91avfuli.com/127.0.0.1#5335 +ipset=/91avfuli.com/gfwlist +server=/korewaeroi.com/127.0.0.1#5335 +ipset=/korewaeroi.com/gfwlist +server=/pchomeec.tw/127.0.0.1#5335 +ipset=/pchomeec.tw/gfwlist +server=/google.si/127.0.0.1#5335 +ipset=/google.si/gfwlist +server=/eromazofu.com/127.0.0.1#5335 +ipset=/eromazofu.com/gfwlist +server=/familysimulator.com/127.0.0.1#5335 +ipset=/familysimulator.com/gfwlist +server=/xn--7hv594h.com/127.0.0.1#5335 +ipset=/xn--7hv594h.com/gfwlist +server=/internetofeverything.com/127.0.0.1#5335 +ipset=/internetofeverything.com/gfwlist +server=/casquebeatssolo.net/127.0.0.1#5335 +ipset=/casquebeatssolo.net/gfwlist +server=/google.pt/127.0.0.1#5335 +ipset=/google.pt/gfwlist +server=/gtlsca.nat.gov.tw/127.0.0.1#5335 +ipset=/gtlsca.nat.gov.tw/gfwlist +server=/fracebook.com/127.0.0.1#5335 +ipset=/fracebook.com/gfwlist +server=/webofknowledge.com/127.0.0.1#5335 +ipset=/webofknowledge.com/gfwlist +server=/sextubespot.com/127.0.0.1#5335 +ipset=/sextubespot.com/gfwlist +server=/applemasters.info/127.0.0.1#5335 +ipset=/applemasters.info/gfwlist +server=/bestbuystores.com/127.0.0.1#5335 +ipset=/bestbuystores.com/gfwlist +server=/nikebetterworld.com/127.0.0.1#5335 +ipset=/nikebetterworld.com/gfwlist +server=/pearsoned.com/127.0.0.1#5335 +ipset=/pearsoned.com/gfwlist +server=/init.shop/127.0.0.1#5335 +ipset=/init.shop/gfwlist +server=/4kporn.xxx/127.0.0.1#5335 +ipset=/4kporn.xxx/gfwlist +server=/1lib.pl/127.0.0.1#5335 +ipset=/1lib.pl/gfwlist +server=/google.nu/127.0.0.1#5335 +ipset=/google.nu/gfwlist +server=/visa.co.cr/127.0.0.1#5335 +ipset=/visa.co.cr/gfwlist +server=/monster-beats-headphones.com/127.0.0.1#5335 +ipset=/monster-beats-headphones.com/gfwlist +server=/videochampion.com/127.0.0.1#5335 +ipset=/videochampion.com/gfwlist +server=/strepsils.hr/127.0.0.1#5335 +ipset=/strepsils.hr/gfwlist +server=/google.nl/127.0.0.1#5335 +ipset=/google.nl/gfwlist +server=/kidspot.com.au/127.0.0.1#5335 +ipset=/kidspot.com.au/gfwlist +server=/gitbook.io/127.0.0.1#5335 +ipset=/gitbook.io/gfwlist +server=/intel.com.ar/127.0.0.1#5335 +ipset=/intel.com.ar/gfwlist +server=/smashed.xxx/127.0.0.1#5335 +ipset=/smashed.xxx/gfwlist +server=/verisign.fr/127.0.0.1#5335 +ipset=/verisign.fr/gfwlist +server=/google.mg/127.0.0.1#5335 +ipset=/google.mg/gfwlist +server=/waterfox.net/127.0.0.1#5335 +ipset=/waterfox.net/gfwlist +server=/javfree.sh/127.0.0.1#5335 +ipset=/javfree.sh/gfwlist +server=/marketo.com/127.0.0.1#5335 +ipset=/marketo.com/gfwlist +server=/onlyindianporn2.com/127.0.0.1#5335 +ipset=/onlyindianporn2.com/gfwlist +server=/disney.com.au/127.0.0.1#5335 +ipset=/disney.com.au/gfwlist +server=/mini.com/127.0.0.1#5335 +ipset=/mini.com/gfwlist +server=/ebay.org/127.0.0.1#5335 +ipset=/ebay.org/gfwlist +server=/thesundaytimes.co.uk/127.0.0.1#5335 +ipset=/thesundaytimes.co.uk/gfwlist +server=/xxvideo.mobi/127.0.0.1#5335 +ipset=/xxvideo.mobi/gfwlist +server=/javqd.com/127.0.0.1#5335 +ipset=/javqd.com/gfwlist +server=/gfpornvideos.com/127.0.0.1#5335 +ipset=/gfpornvideos.com/gfwlist +server=/guccitimeless.com/127.0.0.1#5335 +ipset=/guccitimeless.com/gfwlist +server=/google.kz/127.0.0.1#5335 +ipset=/google.kz/gfwlist +server=/google.ki/127.0.0.1#5335 +ipset=/google.ki/gfwlist +server=/shufflesex.com/127.0.0.1#5335 +ipset=/shufflesex.com/gfwlist +server=/hentaimama.io/127.0.0.1#5335 +ipset=/hentaimama.io/gfwlist +server=/ieeesmc.org/127.0.0.1#5335 +ipset=/ieeesmc.org/gfwlist +server=/google.jo/127.0.0.1#5335 +ipset=/google.jo/gfwlist +server=/beatsbydrecasquesfr.com/127.0.0.1#5335 +ipset=/beatsbydrecasquesfr.com/gfwlist +server=/applestore.com.my/127.0.0.1#5335 +ipset=/applestore.com.my/gfwlist +server=/powerofresolve.ca/127.0.0.1#5335 +ipset=/powerofresolve.ca/gfwlist +server=/google.im/127.0.0.1#5335 +ipset=/google.im/gfwlist +server=/google.ie/127.0.0.1#5335 +ipset=/google.ie/gfwlist +server=/showybeauty.com/127.0.0.1#5335 +ipset=/showybeauty.com/gfwlist +server=/pinterest.ph/127.0.0.1#5335 +ipset=/pinterest.ph/gfwlist +server=/travelex.com/127.0.0.1#5335 +ipset=/travelex.com/gfwlist +server=/bmwccrc.ca/127.0.0.1#5335 +ipset=/bmwccrc.ca/gfwlist +server=/foxsoccer.net/127.0.0.1#5335 +ipset=/foxsoccer.net/gfwlist +server=/google.hr/127.0.0.1#5335 +ipset=/google.hr/gfwlist +server=/visa.co.ve/127.0.0.1#5335 +ipset=/visa.co.ve/gfwlist +server=/google.gl/127.0.0.1#5335 +ipset=/google.gl/gfwlist +server=/anigema.jp/127.0.0.1#5335 +ipset=/anigema.jp/gfwlist +server=/google.gg/127.0.0.1#5335 +ipset=/google.gg/gfwlist +server=/google.ge/127.0.0.1#5335 +ipset=/google.ge/gfwlist +server=/yahoo.dm/127.0.0.1#5335 +ipset=/yahoo.dm/gfwlist +server=/repo.new/127.0.0.1#5335 +ipset=/repo.new/gfwlist +server=/duckduckgo.co/127.0.0.1#5335 +ipset=/duckduckgo.co/gfwlist +server=/softbank-ipo.com/127.0.0.1#5335 +ipset=/softbank-ipo.com/gfwlist +server=/eroero69.work/127.0.0.1#5335 +ipset=/eroero69.work/gfwlist +server=/google.fi/127.0.0.1#5335 +ipset=/google.fi/gfwlist +server=/ebaysocial.com/127.0.0.1#5335 +ipset=/ebaysocial.com/gfwlist +server=/cartoon3thumbs.com/127.0.0.1#5335 +ipset=/cartoon3thumbs.com/gfwlist +server=/pornper.com/127.0.0.1#5335 +ipset=/pornper.com/gfwlist +server=/pearsonclinical.com.br/127.0.0.1#5335 +ipset=/pearsonclinical.com.br/gfwlist +server=/google.es/127.0.0.1#5335 +ipset=/google.es/gfwlist +server=/boyloves.cc/127.0.0.1#5335 +ipset=/boyloves.cc/gfwlist +server=/fbf8.com/127.0.0.1#5335 +ipset=/fbf8.com/gfwlist +server=/automobile.fr/127.0.0.1#5335 +ipset=/automobile.fr/gfwlist +server=/applestore.co.jp/127.0.0.1#5335 +ipset=/applestore.co.jp/gfwlist +server=/similar-porn.fun/127.0.0.1#5335 +ipset=/similar-porn.fun/gfwlist +server=/scat-enema.com/127.0.0.1#5335 +ipset=/scat-enema.com/gfwlist +server=/secom.co.jp/127.0.0.1#5335 +ipset=/secom.co.jp/gfwlist +server=/foxfdm.com/127.0.0.1#5335 +ipset=/foxfdm.com/gfwlist +server=/pornheed.com/127.0.0.1#5335 +ipset=/pornheed.com/gfwlist +server=/bmw-special-sales.com/127.0.0.1#5335 +ipset=/bmw-special-sales.com/gfwlist +server=/google.dj/127.0.0.1#5335 +ipset=/google.dj/gfwlist +server=/skysports.ie/127.0.0.1#5335 +ipset=/skysports.ie/gfwlist +server=/remirepo.net/127.0.0.1#5335 +ipset=/remirepo.net/gfwlist +server=/tubedna.com/127.0.0.1#5335 +ipset=/tubedna.com/gfwlist +server=/myfoxlubbock.com/127.0.0.1#5335 +ipset=/myfoxlubbock.com/gfwlist +server=/acaric.co.jp/127.0.0.1#5335 +ipset=/acaric.co.jp/gfwlist +server=/apple.ch/127.0.0.1#5335 +ipset=/apple.ch/gfwlist +server=/opensource.guide/127.0.0.1#5335 +ipset=/opensource.guide/gfwlist +server=/kindindianporn.com/127.0.0.1#5335 +ipset=/kindindianporn.com/gfwlist +server=/pvp.tv/127.0.0.1#5335 +ipset=/pvp.tv/gfwlist +server=/scholar.google.cl/127.0.0.1#5335 +ipset=/scholar.google.cl/gfwlist +server=/bmw-connecteddrive.hu/127.0.0.1#5335 +ipset=/bmw-connecteddrive.hu/gfwlist +server=/youtube.iq/127.0.0.1#5335 +ipset=/youtube.iq/gfwlist +server=/chomp.com/127.0.0.1#5335 +ipset=/chomp.com/gfwlist +server=/nikefootballcleats.com/127.0.0.1#5335 +ipset=/nikefootballcleats.com/gfwlist +server=/blznav.akamaized.net/127.0.0.1#5335 +ipset=/blznav.akamaized.net/gfwlist +server=/google.com.tr/127.0.0.1#5335 +ipset=/google.com.tr/gfwlist +server=/collegepornonly.com/127.0.0.1#5335 +ipset=/collegepornonly.com/gfwlist +server=/bloombergtradingchallenge.com/127.0.0.1#5335 +ipset=/bloombergtradingchallenge.com/gfwlist +server=/4ertik.one/127.0.0.1#5335 +ipset=/4ertik.one/gfwlist +server=/leagueoflegendsscripts.com/127.0.0.1#5335 +ipset=/leagueoflegendsscripts.com/gfwlist +server=/filmsexeporno.com/127.0.0.1#5335 +ipset=/filmsexeporno.com/gfwlist +server=/bridgestonevan.com/127.0.0.1#5335 +ipset=/bridgestonevan.com/gfwlist +server=/ipod.co.nz/127.0.0.1#5335 +ipset=/ipod.co.nz/gfwlist +server=/teen-lover.net/127.0.0.1#5335 +ipset=/teen-lover.net/gfwlist +server=/facebook.br/127.0.0.1#5335 +ipset=/facebook.br/gfwlist +server=/google.com.pr/127.0.0.1#5335 +ipset=/google.com.pr/gfwlist +server=/sweetandmaxwell.co.uk/127.0.0.1#5335 +ipset=/sweetandmaxwell.co.uk/gfwlist +server=/pinterest.ie/127.0.0.1#5335 +ipset=/pinterest.ie/gfwlist +server=/peachyforum.com/127.0.0.1#5335 +ipset=/peachyforum.com/gfwlist +server=/google.com.pk/127.0.0.1#5335 +ipset=/google.com.pk/gfwlist +server=/google.com.ph/127.0.0.1#5335 +ipset=/google.com.ph/gfwlist +server=/xnxx-teens.com/127.0.0.1#5335 +ipset=/xnxx-teens.com/gfwlist +server=/pornheli.com/127.0.0.1#5335 +ipset=/pornheli.com/gfwlist +server=/google.com.pa/127.0.0.1#5335 +ipset=/google.com.pa/gfwlist +server=/google.com.om/127.0.0.1#5335 +ipset=/google.com.om/gfwlist +server=/google.com.ng/127.0.0.1#5335 +ipset=/google.com.ng/gfwlist +server=/top100sexgames.com/127.0.0.1#5335 +ipset=/top100sexgames.com/gfwlist +server=/horse4sex.com/127.0.0.1#5335 +ipset=/horse4sex.com/gfwlist +server=/ebay.ph/127.0.0.1#5335 +ipset=/ebay.ph/gfwlist +server=/bookmark.xxx/127.0.0.1#5335 +ipset=/bookmark.xxx/gfwlist +server=/ero-manga-platinum.net/127.0.0.1#5335 +ipset=/ero-manga-platinum.net/gfwlist +server=/applecomputer.com.tw/127.0.0.1#5335 +ipset=/applecomputer.com.tw/gfwlist +server=/javdove8.xyz/127.0.0.1#5335 +ipset=/javdove8.xyz/gfwlist +server=/visa.co.id/127.0.0.1#5335 +ipset=/visa.co.id/gfwlist +server=/imoviegallery.com/127.0.0.1#5335 +ipset=/imoviegallery.com/gfwlist +server=/getlantern.org/127.0.0.1#5335 +ipset=/getlantern.org/gfwlist +server=/pleasuregirl.net/127.0.0.1#5335 +ipset=/pleasuregirl.net/gfwlist +server=/macmini.com/127.0.0.1#5335 +ipset=/macmini.com/gfwlist +server=/data.com/127.0.0.1#5335 +ipset=/data.com/gfwlist +server=/google.com.jm/127.0.0.1#5335 +ipset=/google.com.jm/gfwlist +server=/static9.net.au/127.0.0.1#5335 +ipset=/static9.net.au/gfwlist +server=/google.com.gi/127.0.0.1#5335 +ipset=/google.com.gi/gfwlist +server=/iphine.com/127.0.0.1#5335 +ipset=/iphine.com/gfwlist +server=/sexgamesclub.com/127.0.0.1#5335 +ipset=/sexgamesclub.com/gfwlist +server=/graphengine.io/127.0.0.1#5335 +ipset=/graphengine.io/gfwlist +server=/alivevue.com/127.0.0.1#5335 +ipset=/alivevue.com/gfwlist +server=/google.com.fj/127.0.0.1#5335 +ipset=/google.com.fj/gfwlist +server=/zooporno.biz/127.0.0.1#5335 +ipset=/zooporno.biz/gfwlist +server=/needforspeedshowdown.com/127.0.0.1#5335 +ipset=/needforspeedshowdown.com/gfwlist +server=/miniargentina.com/127.0.0.1#5335 +ipset=/miniargentina.com/gfwlist +server=/google.com.et/127.0.0.1#5335 +ipset=/google.com.et/gfwlist +server=/meijinsen.jp/127.0.0.1#5335 +ipset=/meijinsen.jp/gfwlist +server=/volvotrucks.ma/127.0.0.1#5335 +ipset=/volvotrucks.ma/gfwlist +server=/headset987.com/127.0.0.1#5335 +ipset=/headset987.com/gfwlist +server=/attinternetservice.com/127.0.0.1#5335 +ipset=/attinternetservice.com/gfwlist +server=/google.com.ec/127.0.0.1#5335 +ipset=/google.com.ec/gfwlist +server=/mobileinternational.com/127.0.0.1#5335 +ipset=/mobileinternational.com/gfwlist +server=/mini-connected.fr/127.0.0.1#5335 +ipset=/mini-connected.fr/gfwlist +server=/bridgestonecomercial.com.co/127.0.0.1#5335 +ipset=/bridgestonecomercial.com.co/gfwlist +server=/staticflickr.com/127.0.0.1#5335 +ipset=/staticflickr.com/gfwlist +server=/illusion.co.jp/127.0.0.1#5335 +ipset=/illusion.co.jp/gfwlist +server=/hdtube.co/127.0.0.1#5335 +ipset=/hdtube.co/gfwlist +server=/linuxfoundation.org/127.0.0.1#5335 +ipset=/linuxfoundation.org/gfwlist +server=/ciscoturk.net/127.0.0.1#5335 +ipset=/ciscoturk.net/gfwlist +server=/hentaistream.com/127.0.0.1#5335 +ipset=/hentaistream.com/gfwlist +server=/xn--ztsq84g.cn/127.0.0.1#5335 +ipset=/xn--ztsq84g.cn/gfwlist +server=/ladybaba.net/127.0.0.1#5335 +ipset=/ladybaba.net/gfwlist +server=/google.com.co/127.0.0.1#5335 +ipset=/google.com.co/gfwlist +server=/doubleclick.com/127.0.0.1#5335 +ipset=/doubleclick.com/gfwlist +server=/illusionl.com/127.0.0.1#5335 +ipset=/illusionl.com/gfwlist +server=/sbnation.com/127.0.0.1#5335 +ipset=/sbnation.com/gfwlist +server=/outdoorpublicsex.com/127.0.0.1#5335 +ipset=/outdoorpublicsex.com/gfwlist +server=/bmw.com.br/127.0.0.1#5335 +ipset=/bmw.com.br/gfwlist +server=/mox.moe/127.0.0.1#5335 +ipset=/mox.moe/gfwlist +server=/wifi-mx.com/127.0.0.1#5335 +ipset=/wifi-mx.com/gfwlist +server=/rpmfusion.org/127.0.0.1#5335 +ipset=/rpmfusion.org/gfwlist +server=/pornsites.com/127.0.0.1#5335 +ipset=/pornsites.com/gfwlist +server=/eastweek.com.hk/127.0.0.1#5335 +ipset=/eastweek.com.hk/gfwlist +server=/vl4x.net/127.0.0.1#5335 +ipset=/vl4x.net/gfwlist +server=/ouroath.com/127.0.0.1#5335 +ipset=/ouroath.com/gfwlist +server=/google.com.ar/127.0.0.1#5335 +ipset=/google.com.ar/gfwlist +server=/quatrum.com.br/127.0.0.1#5335 +ipset=/quatrum.com.br/gfwlist +server=/cybermondaybeats4sale.com/127.0.0.1#5335 +ipset=/cybermondaybeats4sale.com/gfwlist +server=/clipcake.com/127.0.0.1#5335 +ipset=/clipcake.com/gfwlist +server=/pagecdn.com/127.0.0.1#5335 +ipset=/pagecdn.com/gfwlist +server=/deviantart.net/127.0.0.1#5335 +ipset=/deviantart.net/gfwlist +server=/8teenxxx.com/127.0.0.1#5335 +ipset=/8teenxxx.com/gfwlist +server=/videos-rockstargames-com.akamaized.net/127.0.0.1#5335 +ipset=/videos-rockstargames-com.akamaized.net/gfwlist +server=/google.co.zw/127.0.0.1#5335 +ipset=/google.co.zw/gfwlist +server=/nikegolf.ca/127.0.0.1#5335 +ipset=/nikegolf.ca/gfwlist +server=/egta.com/127.0.0.1#5335 +ipset=/egta.com/gfwlist +server=/dungeonkeeper.com.cn/127.0.0.1#5335 +ipset=/dungeonkeeper.com.cn/gfwlist +server=/coinonecore.com/127.0.0.1#5335 +ipset=/coinonecore.com/gfwlist +server=/google.co.za/127.0.0.1#5335 +ipset=/google.co.za/gfwlist +server=/mini.md/127.0.0.1#5335 +ipset=/mini.md/gfwlist +server=/verizon.net/127.0.0.1#5335 +ipset=/verizon.net/gfwlist +server=/porntube.com/127.0.0.1#5335 +ipset=/porntube.com/gfwlist +server=/google.co.ve/127.0.0.1#5335 +ipset=/google.co.ve/gfwlist +server=/flashtranny.com/127.0.0.1#5335 +ipset=/flashtranny.com/gfwlist +server=/minisovietam.vn/127.0.0.1#5335 +ipset=/minisovietam.vn/gfwlist +server=/google.co.tz/127.0.0.1#5335 +ipset=/google.co.tz/gfwlist +server=/verygoodnike.com/127.0.0.1#5335 +ipset=/verygoodnike.com/gfwlist +server=/google.co.nz/127.0.0.1#5335 +ipset=/google.co.nz/gfwlist +server=/facebookhub.com/127.0.0.1#5335 +ipset=/facebookhub.com/gfwlist +server=/google.co.ls/127.0.0.1#5335 +ipset=/google.co.ls/gfwlist +server=/google.co.kr/127.0.0.1#5335 +ipset=/google.co.kr/gfwlist +server=/paypal-hrsystem.com/127.0.0.1#5335 +ipset=/paypal-hrsystem.com/gfwlist +server=/sexpornimg.com/127.0.0.1#5335 +ipset=/sexpornimg.com/gfwlist +server=/google.com.vn/127.0.0.1#5335 +ipset=/google.com.vn/gfwlist +server=/cloudvolumes.com/127.0.0.1#5335 +ipset=/cloudvolumes.com/gfwlist +server=/geinoueroch.com/127.0.0.1#5335 +ipset=/geinoueroch.com/gfwlist +server=/bloombergmedia.com/127.0.0.1#5335 +ipset=/bloombergmedia.com/gfwlist +server=/thesun.co.uk/127.0.0.1#5335 +ipset=/thesun.co.uk/gfwlist +server=/bokepseks.org/127.0.0.1#5335 +ipset=/bokepseks.org/gfwlist +server=/everia.club/127.0.0.1#5335 +ipset=/everia.club/gfwlist +server=/moxing.mobi/127.0.0.1#5335 +ipset=/moxing.mobi/gfwlist +server=/itaeromanga.com/127.0.0.1#5335 +ipset=/itaeromanga.com/gfwlist +server=/vidspornoduro.com/127.0.0.1#5335 +ipset=/vidspornoduro.com/gfwlist +server=/vfsco.lt/127.0.0.1#5335 +ipset=/vfsco.lt/gfwlist +server=/negoziomonsterbeats.com/127.0.0.1#5335 +ipset=/negoziomonsterbeats.com/gfwlist +server=/pirouvr.com/127.0.0.1#5335 +ipset=/pirouvr.com/gfwlist +server=/xnxx-sex-videos.com/127.0.0.1#5335 +ipset=/xnxx-sex-videos.com/gfwlist +server=/video.fc2.com/127.0.0.1#5335 +ipset=/video.fc2.com/gfwlist +server=/google.cm/127.0.0.1#5335 +ipset=/google.cm/gfwlist +server=/origin.com/127.0.0.1#5335 +ipset=/origin.com/gfwlist +server=/appleid.com/127.0.0.1#5335 +ipset=/appleid.com/gfwlist +server=/monsterproduct.net/127.0.0.1#5335 +ipset=/monsterproduct.net/gfwlist +server=/google.ch/127.0.0.1#5335 +ipset=/google.ch/gfwlist +server=/skyporn.online/127.0.0.1#5335 +ipset=/skyporn.online/gfwlist +server=/babestube.com/127.0.0.1#5335 +ipset=/babestube.com/gfwlist +server=/masturbate2gether.com/127.0.0.1#5335 +ipset=/masturbate2gether.com/gfwlist +server=/7tb.cc/127.0.0.1#5335 +ipset=/7tb.cc/gfwlist +server=/porn-bokep.com/127.0.0.1#5335 +ipset=/porn-bokep.com/gfwlist +server=/moapi1.online/127.0.0.1#5335 +ipset=/moapi1.online/gfwlist +server=/google.cf/127.0.0.1#5335 +ipset=/google.cf/gfwlist +server=/newscareers.co.uk/127.0.0.1#5335 +ipset=/newscareers.co.uk/gfwlist +server=/scholar.google.co.il/127.0.0.1#5335 +ipset=/scholar.google.co.il/gfwlist +server=/google.cd/127.0.0.1#5335 +ipset=/google.cd/gfwlist +server=/redzonechannel.com/127.0.0.1#5335 +ipset=/redzonechannel.com/gfwlist +server=/google.bi/127.0.0.1#5335 +ipset=/google.bi/gfwlist +server=/elpadrote.com/127.0.0.1#5335 +ipset=/elpadrote.com/gfwlist +server=/bridgestone-bandag.com/127.0.0.1#5335 +ipset=/bridgestone-bandag.com/gfwlist +server=/google.ba/127.0.0.1#5335 +ipset=/google.ba/gfwlist +server=/bmwcitychallenge.com/127.0.0.1#5335 +ipset=/bmwcitychallenge.com/gfwlist +server=/meta.com/127.0.0.1#5335 +ipset=/meta.com/gfwlist +server=/illusionn3.com/127.0.0.1#5335 +ipset=/illusionn3.com/gfwlist +server=/dobbyporn.com/127.0.0.1#5335 +ipset=/dobbyporn.com/gfwlist +server=/google.am/127.0.0.1#5335 +ipset=/google.am/gfwlist +server=/shopee.co.th/127.0.0.1#5335 +ipset=/shopee.co.th/gfwlist +server=/facebookck.com/127.0.0.1#5335 +ipset=/facebookck.com/gfwlist +server=/ministeagathe.com/127.0.0.1#5335 +ipset=/ministeagathe.com/gfwlist +server=/google.al/127.0.0.1#5335 +ipset=/google.al/gfwlist +server=/lih.kg/127.0.0.1#5335 +ipset=/lih.kg/gfwlist +server=/google.ad/127.0.0.1#5335 +ipset=/google.ad/gfwlist +server=/travelex.co.jp/127.0.0.1#5335 +ipset=/travelex.co.jp/gfwlist +server=/51pincha.cc/127.0.0.1#5335 +ipset=/51pincha.cc/gfwlist +server=/volvobuses.ph/127.0.0.1#5335 +ipset=/volvobuses.ph/gfwlist +server=/visagiftcard.us/127.0.0.1#5335 +ipset=/visagiftcard.us/gfwlist +server=/starbucks.ph/127.0.0.1#5335 +ipset=/starbucks.ph/gfwlist +server=/mirrorsedge.jp/127.0.0.1#5335 +ipset=/mirrorsedge.jp/gfwlist +server=/ebayheels.com/127.0.0.1#5335 +ipset=/ebayheels.com/gfwlist +server=/douwriteright.com/127.0.0.1#5335 +ipset=/douwriteright.com/gfwlist +server=/fdacebook.info/127.0.0.1#5335 +ipset=/fdacebook.info/gfwlist +server=/nintendonyc.com/127.0.0.1#5335 +ipset=/nintendonyc.com/gfwlist +server=/hentaidirectory.org/127.0.0.1#5335 +ipset=/hentaidirectory.org/gfwlist +server=/r18.clickme.net/127.0.0.1#5335 +ipset=/r18.clickme.net/gfwlist +server=/hnalady.com/127.0.0.1#5335 +ipset=/hnalady.com/gfwlist +server=/svscomics.com/127.0.0.1#5335 +ipset=/svscomics.com/gfwlist +server=/collection-3d.com/127.0.0.1#5335 +ipset=/collection-3d.com/gfwlist +server=/barium-enema.com/127.0.0.1#5335 +ipset=/barium-enema.com/gfwlist +server=/elrepo.org/127.0.0.1#5335 +ipset=/elrepo.org/gfwlist +server=/milfbundle.com/127.0.0.1#5335 +ipset=/milfbundle.com/gfwlist +server=/new.day/127.0.0.1#5335 +ipset=/new.day/gfwlist +server=/gfx.ms/127.0.0.1#5335 +ipset=/gfx.ms/gfwlist +server=/brazzers.com/127.0.0.1#5335 +ipset=/brazzers.com/gfwlist +server=/cougarsexmovies.com/127.0.0.1#5335 +ipset=/cougarsexmovies.com/gfwlist +server=/iam.soy/127.0.0.1#5335 +ipset=/iam.soy/gfwlist +server=/passiontimes.hk/127.0.0.1#5335 +ipset=/passiontimes.hk/gfwlist +server=/hey.boo/127.0.0.1#5335 +ipset=/hey.boo/gfwlist +server=/sony.com.sg/127.0.0.1#5335 +ipset=/sony.com.sg/gfwlist +server=/xoteens.com/127.0.0.1#5335 +ipset=/xoteens.com/gfwlist +server=/youtube.es/127.0.0.1#5335 +ipset=/youtube.es/gfwlist +server=/illianacomputerrecycling.com/127.0.0.1#5335 +ipset=/illianacomputerrecycling.com/gfwlist +server=/yahoo.nu/127.0.0.1#5335 +ipset=/yahoo.nu/gfwlist +server=/apole.com/127.0.0.1#5335 +ipset=/apole.com/gfwlist +server=/visa.ie/127.0.0.1#5335 +ipset=/visa.ie/gfwlist +server=/mini.co.id/127.0.0.1#5335 +ipset=/mini.co.id/gfwlist +server=/zooredtube.com/127.0.0.1#5335 +ipset=/zooredtube.com/gfwlist +server=/fireemblemawakening.com/127.0.0.1#5335 +ipset=/fireemblemawakening.com/gfwlist +server=/easports.jp/127.0.0.1#5335 +ipset=/easports.jp/gfwlist +server=/oxfordartonline.com/127.0.0.1#5335 +ipset=/oxfordartonline.com/gfwlist +server=/finishinfo.com/127.0.0.1#5335 +ipset=/finishinfo.com/gfwlist +server=/durex.nl/127.0.0.1#5335 +ipset=/durex.nl/gfwlist +server=/sfx.ms/127.0.0.1#5335 +ipset=/sfx.ms/gfwlist +server=/telega.one/127.0.0.1#5335 +ipset=/telega.one/gfwlist +server=/googlesyndication.com/127.0.0.1#5335 +ipset=/googlesyndication.com/gfwlist +server=/bigtitsmodelsdirectory.com/127.0.0.1#5335 +ipset=/bigtitsmodelsdirectory.com/gfwlist +server=/cbsaavideo.com/127.0.0.1#5335 +ipset=/cbsaavideo.com/gfwlist +server=/googleadservices.com/127.0.0.1#5335 +ipset=/googleadservices.com/gfwlist +server=/wikisexguide.com/127.0.0.1#5335 +ipset=/wikisexguide.com/gfwlist +server=/esbeatsbydrebuy.com/127.0.0.1#5335 +ipset=/esbeatsbydrebuy.com/gfwlist +server=/google-analytics.com/127.0.0.1#5335 +ipset=/google-analytics.com/gfwlist +server=/happymeal.co.nz/127.0.0.1#5335 +ipset=/happymeal.co.nz/gfwlist +server=/v2ray.com/127.0.0.1#5335 +ipset=/v2ray.com/gfwlist +server=/ragnaporn.com/127.0.0.1#5335 +ipset=/ragnaporn.com/gfwlist +server=/foxrobots.com/127.0.0.1#5335 +ipset=/foxrobots.com/gfwlist +server=/dtci.co/127.0.0.1#5335 +ipset=/dtci.co/gfwlist +server=/blogspot.ro/127.0.0.1#5335 +ipset=/blogspot.ro/gfwlist +server=/bmw-connecteddrive.mx/127.0.0.1#5335 +ipset=/bmw-connecteddrive.mx/gfwlist +server=/bmwmagazine.de/127.0.0.1#5335 +ipset=/bmwmagazine.de/gfwlist +server=/spiritclubs.com/127.0.0.1#5335 +ipset=/spiritclubs.com/gfwlist +server=/adservice.google.com/127.0.0.1#5335 +ipset=/adservice.google.com/gfwlist +server=/mt-ssul1.com/127.0.0.1#5335 +ipset=/mt-ssul1.com/gfwlist +server=/kindleoasis.us/127.0.0.1#5335 +ipset=/kindleoasis.us/gfwlist +server=/bmw-motorrad.de/127.0.0.1#5335 +ipset=/bmw-motorrad.de/gfwlist +server=/applestore.co.ug/127.0.0.1#5335 +ipset=/applestore.co.ug/gfwlist +server=/ntdtv.ca/127.0.0.1#5335 +ipset=/ntdtv.ca/gfwlist +server=/100shmar.net/127.0.0.1#5335 +ipset=/100shmar.net/gfwlist +server=/xxxshame.com/127.0.0.1#5335 +ipset=/xxxshame.com/gfwlist +server=/vox.com/127.0.0.1#5335 +ipset=/vox.com/gfwlist +server=/icloud.org/127.0.0.1#5335 +ipset=/icloud.org/gfwlist +server=/brand-protection-team.com/127.0.0.1#5335 +ipset=/brand-protection-team.com/gfwlist +server=/potenza.jp/127.0.0.1#5335 +ipset=/potenza.jp/gfwlist +server=/pornhuub.xyz/127.0.0.1#5335 +ipset=/pornhuub.xyz/gfwlist +server=/acer-group.com/127.0.0.1#5335 +ipset=/acer-group.com/gfwlist +server=/colorprotechnology.com/127.0.0.1#5335 +ipset=/colorprotechnology.com/gfwlist +server=/disney.de/127.0.0.1#5335 +ipset=/disney.de/gfwlist +server=/porntop.com/127.0.0.1#5335 +ipset=/porntop.com/gfwlist +server=/youav.com/127.0.0.1#5335 +ipset=/youav.com/gfwlist +server=/blackfridaydrebeatsnew.com/127.0.0.1#5335 +ipset=/blackfridaydrebeatsnew.com/gfwlist +server=/monsterheadphone.net/127.0.0.1#5335 +ipset=/monsterheadphone.net/gfwlist +server=/thegeorgiascene.com/127.0.0.1#5335 +ipset=/thegeorgiascene.com/gfwlist +server=/tubemature.tv/127.0.0.1#5335 +ipset=/tubemature.tv/gfwlist +server=/mundomais.com.br/127.0.0.1#5335 +ipset=/mundomais.com.br/gfwlist +server=/tug.org/127.0.0.1#5335 +ipset=/tug.org/gfwlist +server=/blogspot.ru/127.0.0.1#5335 +ipset=/blogspot.ru/gfwlist +server=/graias.com/127.0.0.1#5335 +ipset=/graias.com/gfwlist +server=/businessinsider.in/127.0.0.1#5335 +ipset=/businessinsider.in/gfwlist +server=/blogspot.qa/127.0.0.1#5335 +ipset=/blogspot.qa/gfwlist +server=/milfvr.com/127.0.0.1#5335 +ipset=/milfvr.com/gfwlist +server=/marranazas.com/127.0.0.1#5335 +ipset=/marranazas.com/gfwlist +server=/itunes.co/127.0.0.1#5335 +ipset=/itunes.co/gfwlist +server=/blogspot.mx/127.0.0.1#5335 +ipset=/blogspot.mx/gfwlist +server=/gettyimages.com.au/127.0.0.1#5335 +ipset=/gettyimages.com.au/gfwlist +server=/blogspot.md/127.0.0.1#5335 +ipset=/blogspot.md/gfwlist +server=/shemaleporn.xxx/127.0.0.1#5335 +ipset=/shemaleporn.xxx/gfwlist +server=/virtualrealtrans.com/127.0.0.1#5335 +ipset=/virtualrealtrans.com/gfwlist +server=/nikefree.com/127.0.0.1#5335 +ipset=/nikefree.com/gfwlist +server=/paypal-media.com/127.0.0.1#5335 +ipset=/paypal-media.com/gfwlist +server=/applecare.berlin/127.0.0.1#5335 +ipset=/applecare.berlin/gfwlist +server=/blogspot.li/127.0.0.1#5335 +ipset=/blogspot.li/gfwlist +server=/blogspot.it/127.0.0.1#5335 +ipset=/blogspot.it/gfwlist +server=/beatsbydredanmarks.com/127.0.0.1#5335 +ipset=/beatsbydredanmarks.com/gfwlist +server=/blogspot.in/127.0.0.1#5335 +ipset=/blogspot.in/gfwlist +server=/bmw-motorrad.cz/127.0.0.1#5335 +ipset=/bmw-motorrad.cz/gfwlist +server=/garena.live/127.0.0.1#5335 +ipset=/garena.live/gfwlist +server=/blogspot.hu/127.0.0.1#5335 +ipset=/blogspot.hu/gfwlist +server=/appleiphonecell.com/127.0.0.1#5335 +ipset=/appleiphonecell.com/gfwlist +server=/justporn.link/127.0.0.1#5335 +ipset=/justporn.link/gfwlist +server=/blogspot.gr/127.0.0.1#5335 +ipset=/blogspot.gr/gfwlist +server=/youtube.at/127.0.0.1#5335 +ipset=/youtube.at/gfwlist +server=/blogspot.fr/127.0.0.1#5335 +ipset=/blogspot.fr/gfwlist +server=/newsnowfox.com/127.0.0.1#5335 +ipset=/newsnowfox.com/gfwlist +server=/blogspot.fi/127.0.0.1#5335 +ipset=/blogspot.fi/gfwlist +server=/blogspot.dk/127.0.0.1#5335 +ipset=/blogspot.dk/gfwlist +server=/blogspot.de/127.0.0.1#5335 +ipset=/blogspot.de/gfwlist +server=/pricelessaruba.com/127.0.0.1#5335 +ipset=/pricelessaruba.com/gfwlist +server=/momo5188.com/127.0.0.1#5335 +ipset=/momo5188.com/gfwlist +server=/scholar.google.co.id/127.0.0.1#5335 +ipset=/scholar.google.co.id/gfwlist +server=/nudity911.com/127.0.0.1#5335 +ipset=/nudity911.com/gfwlist +server=/blogspot.com.tr/127.0.0.1#5335 +ipset=/blogspot.com.tr/gfwlist +server=/mofosex.com/127.0.0.1#5335 +ipset=/mofosex.com/gfwlist +server=/bwh88.net/127.0.0.1#5335 +ipset=/bwh88.net/gfwlist +server=/hentaihaven.red/127.0.0.1#5335 +ipset=/hentaihaven.red/gfwlist +server=/duckduckhack.com/127.0.0.1#5335 +ipset=/duckduckhack.com/gfwlist +server=/camsoda1.com/127.0.0.1#5335 +ipset=/camsoda1.com/gfwlist +server=/ninemsn.com.au/127.0.0.1#5335 +ipset=/ninemsn.com.au/gfwlist +server=/visa.dk/127.0.0.1#5335 +ipset=/visa.dk/gfwlist +server=/cc18tv.com/127.0.0.1#5335 +ipset=/cc18tv.com/gfwlist +server=/szwinnertechnology.com/127.0.0.1#5335 +ipset=/szwinnertechnology.com/gfwlist +server=/officialdrdre.com/127.0.0.1#5335 +ipset=/officialdrdre.com/gfwlist +server=/jiuse904.com/127.0.0.1#5335 +ipset=/jiuse904.com/gfwlist +server=/blogspot.com.cy/127.0.0.1#5335 +ipset=/blogspot.com.cy/gfwlist +server=/botorch.org/127.0.0.1#5335 +ipset=/botorch.org/gfwlist +server=/blogspot.com.br/127.0.0.1#5335 +ipset=/blogspot.com.br/gfwlist +server=/capitalgames.com/127.0.0.1#5335 +ipset=/capitalgames.com/gfwlist +server=/nurofen.no/127.0.0.1#5335 +ipset=/nurofen.no/gfwlist +server=/joyourself.com/127.0.0.1#5335 +ipset=/joyourself.com/gfwlist +server=/openapiservice.com/127.0.0.1#5335 +ipset=/openapiservice.com/gfwlist +server=/bannedbook.net/127.0.0.1#5335 +ipset=/bannedbook.net/gfwlist +server=/finish.pt/127.0.0.1#5335 +ipset=/finish.pt/gfwlist +server=/akamaitechnologies.net/127.0.0.1#5335 +ipset=/akamaitechnologies.net/gfwlist +server=/foxdeportes.com/127.0.0.1#5335 +ipset=/foxdeportes.com/gfwlist +server=/lsnzxzy1.com/127.0.0.1#5335 +ipset=/lsnzxzy1.com/gfwlist +server=/asiangirlsnextdoor.com/127.0.0.1#5335 +ipset=/asiangirlsnextdoor.com/gfwlist +server=/petardashd.com.ve/127.0.0.1#5335 +ipset=/petardashd.com.ve/gfwlist +server=/primeday.info/127.0.0.1#5335 +ipset=/primeday.info/gfwlist +server=/beatsbydredealscybermonday.com/127.0.0.1#5335 +ipset=/beatsbydredealscybermonday.com/gfwlist +server=/paypal-prepagata.net/127.0.0.1#5335 +ipset=/paypal-prepagata.net/gfwlist +server=/yale.edu/127.0.0.1#5335 +ipset=/yale.edu/gfwlist +server=/blogspot.am/127.0.0.1#5335 +ipset=/blogspot.am/gfwlist +server=/boobsrealm.com/127.0.0.1#5335 +ipset=/boobsrealm.com/gfwlist +server=/ecoforme.jp/127.0.0.1#5335 +ipset=/ecoforme.jp/gfwlist +server=/igpublish.com/127.0.0.1#5335 +ipset=/igpublish.com/gfwlist +server=/blogspot.ae/127.0.0.1#5335 +ipset=/blogspot.ae/gfwlist +server=/blogger.com/127.0.0.1#5335 +ipset=/blogger.com/gfwlist +server=/comixzilla.com/127.0.0.1#5335 +ipset=/comixzilla.com/gfwlist +server=/macintosh.eu/127.0.0.1#5335 +ipset=/macintosh.eu/gfwlist +server=/gigabyte2.azureedge.net/127.0.0.1#5335 +ipset=/gigabyte2.azureedge.net/gfwlist +server=/jokerlu1.info/127.0.0.1#5335 +ipset=/jokerlu1.info/gfwlist +server=/faronicswise.com/127.0.0.1#5335 +ipset=/faronicswise.com/gfwlist +server=/myclitgames.com/127.0.0.1#5335 +ipset=/myclitgames.com/gfwlist +server=/blogterest.net/127.0.0.1#5335 +ipset=/blogterest.net/gfwlist +server=/nikegrid.com/127.0.0.1#5335 +ipset=/nikegrid.com/gfwlist +server=/etwealth.com/127.0.0.1#5335 +ipset=/etwealth.com/gfwlist +server=/facebookinc.com/127.0.0.1#5335 +ipset=/facebookinc.com/gfwlist +server=/intelatom.net/127.0.0.1#5335 +ipset=/intelatom.net/gfwlist +server=/faronics.com.sg/127.0.0.1#5335 +ipset=/faronics.com.sg/gfwlist +server=/strepsils.com.co/127.0.0.1#5335 +ipset=/strepsils.com.co/gfwlist +server=/faronics.ca/127.0.0.1#5335 +ipset=/faronics.ca/gfwlist +server=/deepfreeze.net/127.0.0.1#5335 +ipset=/deepfreeze.net/gfwlist +server=/volvobuses.ch/127.0.0.1#5335 +ipset=/volvobuses.ch/gfwlist +server=/pornbraze.com/127.0.0.1#5335 +ipset=/pornbraze.com/gfwlist +server=/sci-hub.ee/127.0.0.1#5335 +ipset=/sci-hub.ee/gfwlist +server=/deepfreeze.eu/127.0.0.1#5335 +ipset=/deepfreeze.eu/gfwlist +server=/pornoingyen.hu/127.0.0.1#5335 +ipset=/pornoingyen.hu/gfwlist +server=/nvidia.pl/127.0.0.1#5335 +ipset=/nvidia.pl/gfwlist +server=/techliquidators.com/127.0.0.1#5335 +ipset=/techliquidators.com/gfwlist +server=/lolpcs.com/127.0.0.1#5335 +ipset=/lolpcs.com/gfwlist +server=/mainichi-athletepartners.jp/127.0.0.1#5335 +ipset=/mainichi-athletepartners.jp/gfwlist +server=/disney.com.br/127.0.0.1#5335 +ipset=/disney.com.br/gfwlist +server=/getwsone.com/127.0.0.1#5335 +ipset=/getwsone.com/gfwlist +server=/adultgamescollector.com/127.0.0.1#5335 +ipset=/adultgamescollector.com/gfwlist +server=/beatbd.com/127.0.0.1#5335 +ipset=/beatbd.com/gfwlist +server=/account-paypal.org/127.0.0.1#5335 +ipset=/account-paypal.org/gfwlist +server=/volvotrucks.co.il/127.0.0.1#5335 +ipset=/volvotrucks.co.il/gfwlist +server=/limertw.cc/127.0.0.1#5335 +ipset=/limertw.cc/gfwlist +server=/air-watch.com/127.0.0.1#5335 +ipset=/air-watch.com/gfwlist +server=/vsphere.net/127.0.0.1#5335 +ipset=/vsphere.net/gfwlist +server=/nfscdict.com/127.0.0.1#5335 +ipset=/nfscdict.com/gfwlist +server=/rakuya.com.tw/127.0.0.1#5335 +ipset=/rakuya.com.tw/gfwlist +server=/fox23maine.com/127.0.0.1#5335 +ipset=/fox23maine.com/gfwlist +server=/vsphere.com/127.0.0.1#5335 +ipset=/vsphere.com/gfwlist +server=/hyper.is/127.0.0.1#5335 +ipset=/hyper.is/gfwlist +server=/ghcr.io/127.0.0.1#5335 +ipset=/ghcr.io/gfwlist +server=/bmw.com.tr/127.0.0.1#5335 +ipset=/bmw.com.tr/gfwlist +server=/physiology.org/127.0.0.1#5335 +ipset=/physiology.org/gfwlist +server=/xbahis33.com/127.0.0.1#5335 +ipset=/xbahis33.com/gfwlist +server=/disney.cz/127.0.0.1#5335 +ipset=/disney.cz/gfwlist +server=/hentaicore.org/127.0.0.1#5335 +ipset=/hentaicore.org/gfwlist +server=/erofights.com/127.0.0.1#5335 +ipset=/erofights.com/gfwlist +server=/rakuten.ne.jp/127.0.0.1#5335 +ipset=/rakuten.ne.jp/gfwlist +server=/beatsbydrdre-officials5.com/127.0.0.1#5335 +ipset=/beatsbydrdre-officials5.com/gfwlist +server=/dombosco.com.br/127.0.0.1#5335 +ipset=/dombosco.com.br/gfwlist +server=/livesexasian.com/127.0.0.1#5335 +ipset=/livesexasian.com/gfwlist +server=/100classicbooks.com/127.0.0.1#5335 +ipset=/100classicbooks.com/gfwlist +server=/yahoo.com.na/127.0.0.1#5335 +ipset=/yahoo.com.na/gfwlist +server=/cloudhealthtech.com/127.0.0.1#5335 +ipset=/cloudhealthtech.com/gfwlist +server=/cloudcredibility.com/127.0.0.1#5335 +ipset=/cloudcredibility.com/gfwlist +server=/visa.de/127.0.0.1#5335 +ipset=/visa.de/gfwlist +server=/dockerizer.com/127.0.0.1#5335 +ipset=/dockerizer.com/gfwlist +server=/bitnamistudio.com/127.0.0.1#5335 +ipset=/bitnamistudio.com/gfwlist +server=/nikechosen.com/127.0.0.1#5335 +ipset=/nikechosen.com/gfwlist +server=/drkogyi.com/127.0.0.1#5335 +ipset=/drkogyi.com/gfwlist +server=/corporatecashpassport.com/127.0.0.1#5335 +ipset=/corporatecashpassport.com/gfwlist +server=/illusionh.com/127.0.0.1#5335 +ipset=/illusionh.com/gfwlist +server=/youtube.com.pa/127.0.0.1#5335 +ipset=/youtube.com.pa/gfwlist +server=/bitnami.com/127.0.0.1#5335 +ipset=/bitnami.com/gfwlist +server=/2kcoretech.online/127.0.0.1#5335 +ipset=/2kcoretech.online/gfwlist +server=/disneymagicmoments.es/127.0.0.1#5335 +ipset=/disneymagicmoments.es/gfwlist +server=/cosplayworld.net/127.0.0.1#5335 +ipset=/cosplayworld.net/gfwlist +server=/nginxconfig.io/127.0.0.1#5335 +ipset=/nginxconfig.io/gfwlist +server=/workspaceair.com/127.0.0.1#5335 +ipset=/workspaceair.com/gfwlist +server=/oranum.com/127.0.0.1#5335 +ipset=/oranum.com/gfwlist +server=/cashback69.com/127.0.0.1#5335 +ipset=/cashback69.com/gfwlist +server=/fox5ny.com/127.0.0.1#5335 +ipset=/fox5ny.com/gfwlist +server=/legsex.com/127.0.0.1#5335 +ipset=/legsex.com/gfwlist +server=/ikea.bh/127.0.0.1#5335 +ipset=/ikea.bh/gfwlist +server=/oculusrift.com/127.0.0.1#5335 +ipset=/oculusrift.com/gfwlist +server=/fffucked.com/127.0.0.1#5335 +ipset=/fffucked.com/gfwlist +server=/animalsporn.net/127.0.0.1#5335 +ipset=/animalsporn.net/gfwlist +server=/sony-africa.com/127.0.0.1#5335 +ipset=/sony-africa.com/gfwlist +server=/ncl.edu.tw/127.0.0.1#5335 +ipset=/ncl.edu.tw/gfwlist +server=/tabootube.xxx/127.0.0.1#5335 +ipset=/tabootube.xxx/gfwlist +server=/bloombergchina.com/127.0.0.1#5335 +ipset=/bloombergchina.com/gfwlist +server=/binancezh.net/127.0.0.1#5335 +ipset=/binancezh.net/gfwlist +server=/whychoosehorizon.com/127.0.0.1#5335 +ipset=/whychoosehorizon.com/gfwlist +server=/vmwservices.com/127.0.0.1#5335 +ipset=/vmwservices.com/gfwlist +server=/ebayshop111.com/127.0.0.1#5335 +ipset=/ebayshop111.com/gfwlist +server=/t21.nikkei.co.jp/127.0.0.1#5335 +ipset=/t21.nikkei.co.jp/gfwlist +server=/buyaple.com/127.0.0.1#5335 +ipset=/buyaple.com/gfwlist +server=/12diasdepresentesdeitunes.com/127.0.0.1#5335 +ipset=/12diasdepresentesdeitunes.com/gfwlist +server=/5mo.fun/127.0.0.1#5335 +ipset=/5mo.fun/gfwlist +server=/line.naver.jp/127.0.0.1#5335 +ipset=/line.naver.jp/gfwlist +server=/socialmediagirls.com/127.0.0.1#5335 +ipset=/socialmediagirls.com/gfwlist +server=/bmwcenternet.com/127.0.0.1#5335 +ipset=/bmwcenternet.com/gfwlist +server=/amazondevicesupport.com/127.0.0.1#5335 +ipset=/amazondevicesupport.com/gfwlist +server=/rclon.com/127.0.0.1#5335 +ipset=/rclon.com/gfwlist +server=/ikea.ma/127.0.0.1#5335 +ipset=/ikea.ma/gfwlist +server=/bmw-mdrivetour.com/127.0.0.1#5335 +ipset=/bmw-mdrivetour.com/gfwlist +server=/vmwlearningplatform.com/127.0.0.1#5335 +ipset=/vmwlearningplatform.com/gfwlist +server=/tteshop.com/127.0.0.1#5335 +ipset=/tteshop.com/gfwlist +server=/stateofthemap.com/127.0.0.1#5335 +ipset=/stateofthemap.com/gfwlist +server=/scatsite.com/127.0.0.1#5335 +ipset=/scatsite.com/gfwlist +server=/prodrive-japan.com/127.0.0.1#5335 +ipset=/prodrive-japan.com/gfwlist +server=/thomsonreuters.in/127.0.0.1#5335 +ipset=/thomsonreuters.in/gfwlist +server=/visa.co.ni/127.0.0.1#5335 +ipset=/visa.co.ni/gfwlist +server=/ikea.com.in/127.0.0.1#5335 +ipset=/ikea.com.in/gfwlist +server=/placemyad.com.au/127.0.0.1#5335 +ipset=/placemyad.com.au/gfwlist +server=/vmwarelearningplatform.com/127.0.0.1#5335 +ipset=/vmwarelearningplatform.com/gfwlist +server=/samsungcloud.com/127.0.0.1#5335 +ipset=/samsungcloud.com/gfwlist +server=/paypal-comunidad.com/127.0.0.1#5335 +ipset=/paypal-comunidad.com/gfwlist +server=/appleoriginalproductions.com/127.0.0.1#5335 +ipset=/appleoriginalproductions.com/gfwlist +server=/mirrorsedge.net/127.0.0.1#5335 +ipset=/mirrorsedge.net/gfwlist +server=/carcare-and-tireshop.jp/127.0.0.1#5335 +ipset=/carcare-and-tireshop.jp/gfwlist +server=/vmwaregrid.com/127.0.0.1#5335 +ipset=/vmwaregrid.com/gfwlist +server=/facebookbrand.net/127.0.0.1#5335 +ipset=/facebookbrand.net/gfwlist +server=/foxsoccer.tv/127.0.0.1#5335 +ipset=/foxsoccer.tv/gfwlist +server=/clubseventeen.com/127.0.0.1#5335 +ipset=/clubseventeen.com/gfwlist +server=/vmwaredemandcenter.com/127.0.0.1#5335 +ipset=/vmwaredemandcenter.com/gfwlist +server=/yande.re/127.0.0.1#5335 +ipset=/yande.re/gfwlist +server=/cindymovies.com/127.0.0.1#5335 +ipset=/cindymovies.com/gfwlist +server=/applefinalcutproworld.com/127.0.0.1#5335 +ipset=/applefinalcutproworld.com/gfwlist +server=/camfox.com/127.0.0.1#5335 +ipset=/camfox.com/gfwlist +server=/vmwareausnews.com/127.0.0.1#5335 +ipset=/vmwareausnews.com/gfwlist +server=/verisign.de/127.0.0.1#5335 +ipset=/verisign.de/gfwlist +server=/yahoo.ps/127.0.0.1#5335 +ipset=/yahoo.ps/gfwlist +server=/bamtoki.com/127.0.0.1#5335 +ipset=/bamtoki.com/gfwlist +server=/dlercloud.org/127.0.0.1#5335 +ipset=/dlercloud.org/gfwlist +server=/akamai-staging.net/127.0.0.1#5335 +ipset=/akamai-staging.net/gfwlist +server=/viet69.link/127.0.0.1#5335 +ipset=/viet69.link/gfwlist +server=/microsofttranslator.com/127.0.0.1#5335 +ipset=/microsofttranslator.com/gfwlist +server=/softbankrobotics.com/127.0.0.1#5335 +ipset=/softbankrobotics.com/gfwlist +server=/vmware-cloudmanagement.com/127.0.0.1#5335 +ipset=/vmware-cloudmanagement.com/gfwlist +server=/babesofindia.com/127.0.0.1#5335 +ipset=/babesofindia.com/gfwlist +server=/vmmark.com/127.0.0.1#5335 +ipset=/vmmark.com/gfwlist +server=/business-i.jp/127.0.0.1#5335 +ipset=/business-i.jp/gfwlist +server=/facebook30.com/127.0.0.1#5335 +ipset=/facebook30.com/gfwlist +server=/enemaexperiences.com/127.0.0.1#5335 +ipset=/enemaexperiences.com/gfwlist +server=/vmglobal.net/127.0.0.1#5335 +ipset=/vmglobal.net/gfwlist +server=/vfabric.net/127.0.0.1#5335 +ipset=/vfabric.net/gfwlist +server=/maxgo.com/127.0.0.1#5335 +ipset=/maxgo.com/gfwlist +server=/termux.com/127.0.0.1#5335 +ipset=/termux.com/gfwlist +server=/vcanedge.com/127.0.0.1#5335 +ipset=/vcanedge.com/gfwlist +server=/ssdevrd.com/127.0.0.1#5335 +ipset=/ssdevrd.com/gfwlist +server=/blackamateursvideos.com/127.0.0.1#5335 +ipset=/blackamateursvideos.com/gfwlist +server=/bmwusfactory.com/127.0.0.1#5335 +ipset=/bmwusfactory.com/gfwlist +server=/youtube.bo/127.0.0.1#5335 +ipset=/youtube.bo/gfwlist +server=/drdre-beats.com/127.0.0.1#5335 +ipset=/drdre-beats.com/gfwlist +server=/electbabe.com/127.0.0.1#5335 +ipset=/electbabe.com/gfwlist +server=/klik.me/127.0.0.1#5335 +ipset=/klik.me/gfwlist +server=/hwslabs.com/127.0.0.1#5335 +ipset=/hwslabs.com/gfwlist +server=/greenplum.net/127.0.0.1#5335 +ipset=/greenplum.net/gfwlist +server=/beatsbydre-club.com/127.0.0.1#5335 +ipset=/beatsbydre-club.com/gfwlist +server=/cisconetapp.com/127.0.0.1#5335 +ipset=/cisconetapp.com/gfwlist +server=/gelbooru.wjcodes.com/127.0.0.1#5335 +ipset=/gelbooru.wjcodes.com/gfwlist +server=/eliteindianporn.com/127.0.0.1#5335 +ipset=/eliteindianporn.com/gfwlist +server=/hochi.news/127.0.0.1#5335 +ipset=/hochi.news/gfwlist +server=/hentairead.info/127.0.0.1#5335 +ipset=/hentairead.info/gfwlist +server=/youngmommyfucksme.com/127.0.0.1#5335 +ipset=/youngmommyfucksme.com/gfwlist +server=/rarbgunblock.org/127.0.0.1#5335 +ipset=/rarbgunblock.org/gfwlist +server=/cpedge.com/127.0.0.1#5335 +ipset=/cpedge.com/gfwlist +server=/bollywoodlife.com/127.0.0.1#5335 +ipset=/bollywoodlife.com/gfwlist +server=/pornhubapparel.com/127.0.0.1#5335 +ipset=/pornhubapparel.com/gfwlist +server=/rolls-roycemotorcars.com/127.0.0.1#5335 +ipset=/rolls-roycemotorcars.com/gfwlist +server=/archiveofourown.org/127.0.0.1#5335 +ipset=/archiveofourown.org/gfwlist +server=/bookmybridgestonetyre.com/127.0.0.1#5335 +ipset=/bookmybridgestonetyre.com/gfwlist +server=/cfblob.com/127.0.0.1#5335 +ipset=/cfblob.com/gfwlist +server=/costco-static.com/127.0.0.1#5335 +ipset=/costco-static.com/gfwlist +server=/duckduckgo.pl/127.0.0.1#5335 +ipset=/duckduckgo.pl/gfwlist +server=/filmeleporno.xxx/127.0.0.1#5335 +ipset=/filmeleporno.xxx/gfwlist +server=/monsterbeatssales.com/127.0.0.1#5335 +ipset=/monsterbeatssales.com/gfwlist +server=/4cdn.org/127.0.0.1#5335 +ipset=/4cdn.org/gfwlist +server=/akamai.co.kr/127.0.0.1#5335 +ipset=/akamai.co.kr/gfwlist +server=/telegram.dog/127.0.0.1#5335 +ipset=/telegram.dog/gfwlist +server=/collabora.co.uk/127.0.0.1#5335 +ipset=/collabora.co.uk/gfwlist +server=/cloudcone.net/127.0.0.1#5335 +ipset=/cloudcone.net/gfwlist +server=/besthentaitube.com/127.0.0.1#5335 +ipset=/besthentaitube.com/gfwlist +server=/cnyes.com/127.0.0.1#5335 +ipset=/cnyes.com/gfwlist +server=/cloudcone.com/127.0.0.1#5335 +ipset=/cloudcone.com/gfwlist +server=/ikea.is/127.0.0.1#5335 +ipset=/ikea.is/gfwlist +server=/aweencore.com/127.0.0.1#5335 +ipset=/aweencore.com/gfwlist +server=/melonstube.com/127.0.0.1#5335 +ipset=/melonstube.com/gfwlist +server=/jilhub.com/127.0.0.1#5335 +ipset=/jilhub.com/gfwlist +server=/armovs.com/127.0.0.1#5335 +ipset=/armovs.com/gfwlist +server=/hitxhot.com/127.0.0.1#5335 +ipset=/hitxhot.com/gfwlist +server=/cisco.evergage.com/127.0.0.1#5335 +ipset=/cisco.evergage.com/gfwlist +server=/nikeshoesgroup.com/127.0.0.1#5335 +ipset=/nikeshoesgroup.com/gfwlist +server=/tettediferro.it/127.0.0.1#5335 +ipset=/tettediferro.it/gfwlist +server=/tailf.com/127.0.0.1#5335 +ipset=/tailf.com/gfwlist +server=/hindawi.com/127.0.0.1#5335 +ipset=/hindawi.com/gfwlist +server=/thomsonreuters.com.hk/127.0.0.1#5335 +ipset=/thomsonreuters.com.hk/gfwlist +server=/thecamdude.com/127.0.0.1#5335 +ipset=/thecamdude.com/gfwlist +server=/wet-ass-pussy.com/127.0.0.1#5335 +ipset=/wet-ass-pussy.com/gfwlist +server=/toplayerserver.com/127.0.0.1#5335 +ipset=/toplayerserver.com/gfwlist +server=/appdynamics.org/127.0.0.1#5335 +ipset=/appdynamics.org/gfwlist +server=/dmm.co.jp/127.0.0.1#5335 +ipset=/dmm.co.jp/gfwlist +server=/climateone.blogspot.co.id/127.0.0.1#5335 +ipset=/climateone.blogspot.co.id/gfwlist +server=/appdynamics.jp/127.0.0.1#5335 +ipset=/appdynamics.jp/gfwlist +server=/foxandfriends.com/127.0.0.1#5335 +ipset=/foxandfriends.com/gfwlist +server=/beatsbydre-sell.com/127.0.0.1#5335 +ipset=/beatsbydre-sell.com/gfwlist +server=/appdynamics.co.uk/127.0.0.1#5335 +ipset=/appdynamics.co.uk/gfwlist +server=/rule34.asia/127.0.0.1#5335 +ipset=/rule34.asia/gfwlist +server=/facebookcom.com/127.0.0.1#5335 +ipset=/facebookcom.com/gfwlist +server=/konachan.wjcodes.com/127.0.0.1#5335 +ipset=/konachan.wjcodes.com/gfwlist +server=/nytco.com/127.0.0.1#5335 +ipset=/nytco.com/gfwlist +server=/boylove.cc/127.0.0.1#5335 +ipset=/boylove.cc/gfwlist +server=/elite.com/127.0.0.1#5335 +ipset=/elite.com/gfwlist +server=/vfsco.pe/127.0.0.1#5335 +ipset=/vfsco.pe/gfwlist +server=/bcovlive-a.akamaihd.net/127.0.0.1#5335 +ipset=/bcovlive-a.akamaihd.net/gfwlist +server=/virtuata.com/127.0.0.1#5335 +ipset=/virtuata.com/gfwlist +server=/ssl.com/127.0.0.1#5335 +ipset=/ssl.com/gfwlist +server=/ciscoinvestments.com/127.0.0.1#5335 +ipset=/ciscoinvestments.com/gfwlist +server=/worldofwarcraft.com/127.0.0.1#5335 +ipset=/worldofwarcraft.com/gfwlist +server=/versly.com/127.0.0.1#5335 +ipset=/versly.com/gfwlist +server=/cowboom.com/127.0.0.1#5335 +ipset=/cowboom.com/gfwlist +server=/accountpaypal.com/127.0.0.1#5335 +ipset=/accountpaypal.com/gfwlist +server=/tandberg-china.com/127.0.0.1#5335 +ipset=/tandberg-china.com/gfwlist +server=/myfoxtampa.com/127.0.0.1#5335 +ipset=/myfoxtampa.com/gfwlist +server=/hoyolab.com/127.0.0.1#5335 +ipset=/hoyolab.com/gfwlist +server=/nintendo.no/127.0.0.1#5335 +ipset=/nintendo.no/gfwlist +server=/mornporn.com/127.0.0.1#5335 +ipset=/mornporn.com/gfwlist +server=/regiongold.com/127.0.0.1#5335 +ipset=/regiongold.com/gfwlist +server=/parstream.org/127.0.0.1#5335 +ipset=/parstream.org/gfwlist +server=/top100nl.net/127.0.0.1#5335 +ipset=/top100nl.net/gfwlist +server=/greatfire.org/127.0.0.1#5335 +ipset=/greatfire.org/gfwlist +server=/free-sns.com/127.0.0.1#5335 +ipset=/free-sns.com/gfwlist +server=/camelspaceeffect.com/127.0.0.1#5335 +ipset=/camelspaceeffect.com/gfwlist +server=/githubusercontent.com/127.0.0.1#5335 +ipset=/githubusercontent.com/gfwlist +server=/obsrvbl.com/127.0.0.1#5335 +ipset=/obsrvbl.com/gfwlist +server=/allporncomic.com/127.0.0.1#5335 +ipset=/allporncomic.com/gfwlist +server=/netacad.com/127.0.0.1#5335 +ipset=/netacad.com/gfwlist +server=/cloudflare.com/127.0.0.1#5335 +ipset=/cloudflare.com/gfwlist +server=/mysdn.info/127.0.0.1#5335 +ipset=/mysdn.info/gfwlist +server=/zoofiction.com/127.0.0.1#5335 +ipset=/zoofiction.com/gfwlist +server=/mysdn.com/127.0.0.1#5335 +ipset=/mysdn.com/gfwlist +server=/myciscobenefits.com/127.0.0.1#5335 +ipset=/myciscobenefits.com/gfwlist +server=/multiplydiversity.com/127.0.0.1#5335 +ipset=/multiplydiversity.com/gfwlist +server=/adultgames.games/127.0.0.1#5335 +ipset=/adultgames.games/gfwlist +server=/securepaypal.info/127.0.0.1#5335 +ipset=/securepaypal.info/gfwlist +server=/beatsbydrefriday.com/127.0.0.1#5335 +ipset=/beatsbydrefriday.com/gfwlist +server=/bmw-motorrad.ch/127.0.0.1#5335 +ipset=/bmw-motorrad.ch/gfwlist +server=/onlyams.com/127.0.0.1#5335 +ipset=/onlyams.com/gfwlist +server=/matters.news/127.0.0.1#5335 +ipset=/matters.news/gfwlist +server=/facebookdevelopergarage.com/127.0.0.1#5335 +ipset=/facebookdevelopergarage.com/gfwlist +server=/scholar.google.it/127.0.0.1#5335 +ipset=/scholar.google.it/gfwlist +server=/gpstheseries.com/127.0.0.1#5335 +ipset=/gpstheseries.com/gfwlist +server=/devm2m.com/127.0.0.1#5335 +ipset=/devm2m.com/gfwlist +server=/xxxdinotube.com/127.0.0.1#5335 +ipset=/xxxdinotube.com/gfwlist +server=/careerfundas.com/127.0.0.1#5335 +ipset=/careerfundas.com/gfwlist +server=/badsexygirl.com/127.0.0.1#5335 +ipset=/badsexygirl.com/gfwlist +server=/coreoptics.net/127.0.0.1#5335 +ipset=/coreoptics.net/gfwlist +server=/managedpki.ne.jp/127.0.0.1#5335 +ipset=/managedpki.ne.jp/gfwlist +server=/beatthatquote.com/127.0.0.1#5335 +ipset=/beatthatquote.com/gfwlist +server=/foxnewshealth.com/127.0.0.1#5335 +ipset=/foxnewshealth.com/gfwlist +server=/connect-in-canada.com/127.0.0.1#5335 +ipset=/connect-in-canada.com/gfwlist +server=/celebritygay.com/127.0.0.1#5335 +ipset=/celebritygay.com/gfwlist +server=/mdialog.com/127.0.0.1#5335 +ipset=/mdialog.com/gfwlist +server=/seancody.com/127.0.0.1#5335 +ipset=/seancody.com/gfwlist +server=/ciscovideo.com/127.0.0.1#5335 +ipset=/ciscovideo.com/gfwlist +server=/ciscotaccc.com/127.0.0.1#5335 +ipset=/ciscotaccc.com/gfwlist +server=/psiphon3.com/127.0.0.1#5335 +ipset=/psiphon3.com/gfwlist +server=/ciscospark.jp/127.0.0.1#5335 +ipset=/ciscospark.jp/gfwlist +server=/dutrai.com/127.0.0.1#5335 +ipset=/dutrai.com/gfwlist +server=/severreal.org/127.0.0.1#5335 +ipset=/severreal.org/gfwlist +server=/mini.co.me/127.0.0.1#5335 +ipset=/mini.co.me/gfwlist +server=/bmw-oman.com/127.0.0.1#5335 +ipset=/bmw-oman.com/gfwlist +server=/acheterdesfollowersinstagram.com/127.0.0.1#5335 +ipset=/acheterdesfollowersinstagram.com/gfwlist +server=/beatsdresale2013.com/127.0.0.1#5335 +ipset=/beatsdresale2013.com/gfwlist +server=/fbwat.ch/127.0.0.1#5335 +ipset=/fbwat.ch/gfwlist +server=/volvotrucks.it/127.0.0.1#5335 +ipset=/volvotrucks.it/gfwlist +server=/sex-teen.net/127.0.0.1#5335 +ipset=/sex-teen.net/gfwlist +server=/ciscoprice.com/127.0.0.1#5335 +ipset=/ciscoprice.com/gfwlist +server=/gfrevenge.com/127.0.0.1#5335 +ipset=/gfrevenge.com/gfwlist +server=/ciscopowercube.com/127.0.0.1#5335 +ipset=/ciscopowercube.com/gfwlist +server=/cisconetspace.net/127.0.0.1#5335 +ipset=/cisconetspace.net/gfwlist +server=/cisconetspace.com/127.0.0.1#5335 +ipset=/cisconetspace.com/gfwlist +server=/ciscolearningsystem.com/127.0.0.1#5335 +ipset=/ciscolearningsystem.com/gfwlist +server=/horsedick.net/127.0.0.1#5335 +ipset=/horsedick.net/gfwlist +server=/mol.im/127.0.0.1#5335 +ipset=/mol.im/gfwlist +server=/mastercardidtheftalerts.com/127.0.0.1#5335 +ipset=/mastercardidtheftalerts.com/gfwlist +server=/777xporn.com/127.0.0.1#5335 +ipset=/777xporn.com/gfwlist +server=/ciscoerate.com/127.0.0.1#5335 +ipset=/ciscoerate.com/gfwlist +server=/ciscoconnectcloud.org/127.0.0.1#5335 +ipset=/ciscoconnectcloud.org/gfwlist +server=/ciscoconnectcloud.net/127.0.0.1#5335 +ipset=/ciscoconnectcloud.net/gfwlist +server=/myporngay.com/127.0.0.1#5335 +ipset=/myporngay.com/gfwlist +server=/ciscoccservice.com/127.0.0.1#5335 +ipset=/ciscoccservice.com/gfwlist +server=/twitchcdn.net/127.0.0.1#5335 +ipset=/twitchcdn.net/gfwlist +server=/airav.cc/127.0.0.1#5335 +ipset=/airav.cc/gfwlist +server=/tssp.best/127.0.0.1#5335 +ipset=/tssp.best/gfwlist +server=/cdnlab.live/127.0.0.1#5335 +ipset=/cdnlab.live/gfwlist +server=/barrons-advisor.com/127.0.0.1#5335 +ipset=/barrons-advisor.com/gfwlist +server=/beatsheadphonesale.com/127.0.0.1#5335 +ipset=/beatsheadphonesale.com/gfwlist +server=/cciesecuritylabs.com/127.0.0.1#5335 +ipset=/cciesecuritylabs.com/gfwlist +server=/disneynewseries.com/127.0.0.1#5335 +ipset=/disneynewseries.com/gfwlist +server=/pornodoido.com/127.0.0.1#5335 +ipset=/pornodoido.com/gfwlist +server=/cciernslabs.com/127.0.0.1#5335 +ipset=/cciernslabs.com/gfwlist +server=/academynetriders.com/127.0.0.1#5335 +ipset=/academynetriders.com/gfwlist +server=/volvotrucks.com.co/127.0.0.1#5335 +ipset=/volvotrucks.com.co/gfwlist +server=/dierectv.com/127.0.0.1#5335 +ipset=/dierectv.com/gfwlist +server=/webex.com.br/127.0.0.1#5335 +ipset=/webex.com.br/gfwlist +server=/discord.gift/127.0.0.1#5335 +ipset=/discord.gift/gfwlist +server=/evgld7cg58l8.com/127.0.0.1#5335 +ipset=/evgld7cg58l8.com/gfwlist +server=/womensnikeshox.com/127.0.0.1#5335 +ipset=/womensnikeshox.com/gfwlist +server=/bmw-security-vehicles.com/127.0.0.1#5335 +ipset=/bmw-security-vehicles.com/gfwlist +server=/beatsbydre-outletstore.com/127.0.0.1#5335 +ipset=/beatsbydre-outletstore.com/gfwlist +server=/finish.at/127.0.0.1#5335 +ipset=/finish.at/gfwlist +server=/shemalez.com/127.0.0.1#5335 +ipset=/shemalez.com/gfwlist +server=/webex.co.jp/127.0.0.1#5335 +ipset=/webex.co.jp/gfwlist +server=/webex.co.it/127.0.0.1#5335 +ipset=/webex.co.it/gfwlist +server=/as-dash-uk-live.akamaized.net/127.0.0.1#5335 +ipset=/as-dash-uk-live.akamaized.net/gfwlist +server=/webex.co.in/127.0.0.1#5335 +ipset=/webex.co.in/gfwlist +server=/faceebot.com/127.0.0.1#5335 +ipset=/faceebot.com/gfwlist +server=/instagainer.com/127.0.0.1#5335 +ipset=/instagainer.com/gfwlist +server=/platinumlinks.org/127.0.0.1#5335 +ipset=/platinumlinks.org/gfwlist +server=/hp.company/127.0.0.1#5335 +ipset=/hp.company/gfwlist +server=/vpejey.xyz/127.0.0.1#5335 +ipset=/vpejey.xyz/gfwlist +server=/tradevip1.com/127.0.0.1#5335 +ipset=/tradevip1.com/gfwlist +server=/canon.si/127.0.0.1#5335 +ipset=/canon.si/gfwlist +server=/uux68.com/127.0.0.1#5335 +ipset=/uux68.com/gfwlist +server=/papermc.io/127.0.0.1#5335 +ipset=/papermc.io/gfwlist +server=/blizzak-juken.jp/127.0.0.1#5335 +ipset=/blizzak-juken.jp/gfwlist +server=/xvirtual.com/127.0.0.1#5335 +ipset=/xvirtual.com/gfwlist +server=/foxinc.com/127.0.0.1#5335 +ipset=/foxinc.com/gfwlist +server=/free-avx.jp/127.0.0.1#5335 +ipset=/free-avx.jp/gfwlist +server=/nintendo.se/127.0.0.1#5335 +ipset=/nintendo.se/gfwlist +server=/hentai-gamer.com/127.0.0.1#5335 +ipset=/hentai-gamer.com/gfwlist +server=/appstore.co.id/127.0.0.1#5335 +ipset=/appstore.co.id/gfwlist +server=/newsukadops.com/127.0.0.1#5335 +ipset=/newsukadops.com/gfwlist +server=/akamaitech.com/127.0.0.1#5335 +ipset=/akamaitech.com/gfwlist +server=/applehealth.com.hk/127.0.0.1#5335 +ipset=/applehealth.com.hk/gfwlist +server=/canon.no/127.0.0.1#5335 +ipset=/canon.no/gfwlist +server=/wiisportsresort.com/127.0.0.1#5335 +ipset=/wiisportsresort.com/gfwlist +server=/nverxs.xyz/127.0.0.1#5335 +ipset=/nverxs.xyz/gfwlist +server=/binancezh.com/127.0.0.1#5335 +ipset=/binancezh.com/gfwlist +server=/visadigital.com/127.0.0.1#5335 +ipset=/visadigital.com/gfwlist +server=/riotpin.com/127.0.0.1#5335 +ipset=/riotpin.com/gfwlist +server=/canon.it/127.0.0.1#5335 +ipset=/canon.it/gfwlist +server=/google.dz/127.0.0.1#5335 +ipset=/google.dz/gfwlist +server=/canon.ie/127.0.0.1#5335 +ipset=/canon.ie/gfwlist +server=/adobetcstrialdvd.com/127.0.0.1#5335 +ipset=/adobetcstrialdvd.com/gfwlist +server=/nfscofficial.com/127.0.0.1#5335 +ipset=/nfscofficial.com/gfwlist +server=/monsterbeats8beatsbydre.com/127.0.0.1#5335 +ipset=/monsterbeats8beatsbydre.com/gfwlist +server=/bmw.com.my/127.0.0.1#5335 +ipset=/bmw.com.my/gfwlist +server=/gfysex.com/127.0.0.1#5335 +ipset=/gfysex.com/gfwlist +server=/dogatch.jp/127.0.0.1#5335 +ipset=/dogatch.jp/gfwlist +server=/otokonokoland.com/127.0.0.1#5335 +ipset=/otokonokoland.com/gfwlist +server=/amakings.com/127.0.0.1#5335 +ipset=/amakings.com/gfwlist +server=/visaeurope.ch/127.0.0.1#5335 +ipset=/visaeurope.ch/gfwlist +server=/geileomas.com/127.0.0.1#5335 +ipset=/geileomas.com/gfwlist +server=/canon.es/127.0.0.1#5335 +ipset=/canon.es/gfwlist +server=/canon-cna.com/127.0.0.1#5335 +ipset=/canon-cna.com/gfwlist +server=/beatsbydrdre-onsale.com/127.0.0.1#5335 +ipset=/beatsbydrdre-onsale.com/gfwlist +server=/amazonprimevideos.com/127.0.0.1#5335 +ipset=/amazonprimevideos.com/gfwlist +server=/kaktuz.com/127.0.0.1#5335 +ipset=/kaktuz.com/gfwlist +server=/sexyhub.com/127.0.0.1#5335 +ipset=/sexyhub.com/gfwlist +server=/forbes.com/127.0.0.1#5335 +ipset=/forbes.com/gfwlist +server=/debugproject.com/127.0.0.1#5335 +ipset=/debugproject.com/gfwlist +server=/firestonecompleteautocare.com/127.0.0.1#5335 +ipset=/firestonecompleteautocare.com/gfwlist +server=/canon.com.tw/127.0.0.1#5335 +ipset=/canon.com.tw/gfwlist +server=/canon.com.tr/127.0.0.1#5335 +ipset=/canon.com.tr/gfwlist +server=/canon.com.my/127.0.0.1#5335 +ipset=/canon.com.my/gfwlist +server=/javjunkies.com/127.0.0.1#5335 +ipset=/javjunkies.com/gfwlist +server=/ebayenterprise.com/127.0.0.1#5335 +ipset=/ebayenterprise.com/gfwlist +server=/brourou.com/127.0.0.1#5335 +ipset=/brourou.com/gfwlist +server=/deutschewelle.h-cdn.com/127.0.0.1#5335 +ipset=/deutschewelle.h-cdn.com/gfwlist +server=/canon.com/127.0.0.1#5335 +ipset=/canon.com/gfwlist +server=/canon.co.uk/127.0.0.1#5335 +ipset=/canon.co.uk/gfwlist +server=/aiasahi.jp/127.0.0.1#5335 +ipset=/aiasahi.jp/gfwlist +server=/canon.be/127.0.0.1#5335 +ipset=/canon.be/gfwlist +server=/mini.com.br/127.0.0.1#5335 +ipset=/mini.com.br/gfwlist +server=/applestor.com/127.0.0.1#5335 +ipset=/applestor.com/gfwlist +server=/google.com.bh/127.0.0.1#5335 +ipset=/google.com.bh/gfwlist +server=/canon.at/127.0.0.1#5335 +ipset=/canon.at/gfwlist +server=/mainichi.jp/127.0.0.1#5335 +ipset=/mainichi.jp/gfwlist +server=/canon.am/127.0.0.1#5335 +ipset=/canon.am/gfwlist +server=/scholar.google.ro/127.0.0.1#5335 +ipset=/scholar.google.ro/gfwlist +server=/virginpornlinks.com/127.0.0.1#5335 +ipset=/virginpornlinks.com/gfwlist +server=/verisign.jobs/127.0.0.1#5335 +ipset=/verisign.jobs/gfwlist +server=/mini-connected.cz/127.0.0.1#5335 +ipset=/mini-connected.cz/gfwlist +server=/canon-se.com.tw/127.0.0.1#5335 +ipset=/canon-se.com.tw/gfwlist +server=/macbook.co/127.0.0.1#5335 +ipset=/macbook.co/gfwlist +server=/enema-videos.com/127.0.0.1#5335 +ipset=/enema-videos.com/gfwlist +server=/ero-ma-nia.com/127.0.0.1#5335 +ipset=/ero-ma-nia.com/gfwlist +server=/canon-europa.com/127.0.0.1#5335 +ipset=/canon-europa.com/gfwlist +server=/magicmovies.com/127.0.0.1#5335 +ipset=/magicmovies.com/gfwlist +server=/canon.pl/127.0.0.1#5335 +ipset=/canon.pl/gfwlist +server=/scatkings.com/127.0.0.1#5335 +ipset=/scatkings.com/gfwlist +server=/kijjiji.ca/127.0.0.1#5335 +ipset=/kijjiji.ca/gfwlist +server=/repswing.com/127.0.0.1#5335 +ipset=/repswing.com/gfwlist +server=/xvideos.red/127.0.0.1#5335 +ipset=/xvideos.red/gfwlist +server=/canon-emirates.ae/127.0.0.1#5335 +ipset=/canon-emirates.ae/gfwlist +server=/canon-ebm.com.hk/127.0.0.1#5335 +ipset=/canon-ebm.com.hk/gfwlist +server=/paypal-redeem.com/127.0.0.1#5335 +ipset=/paypal-redeem.com/gfwlist +server=/18av.pro/127.0.0.1#5335 +ipset=/18av.pro/gfwlist +server=/brilliant.org/127.0.0.1#5335 +ipset=/brilliant.org/gfwlist +server=/facebook-texas-holdem.net/127.0.0.1#5335 +ipset=/facebook-texas-holdem.net/gfwlist +server=/mastercardbiz.ca/127.0.0.1#5335 +ipset=/mastercardbiz.ca/gfwlist +server=/adultism.com/127.0.0.1#5335 +ipset=/adultism.com/gfwlist +server=/avstar4.com/127.0.0.1#5335 +ipset=/avstar4.com/gfwlist +server=/samsungdm.com/127.0.0.1#5335 +ipset=/samsungdm.com/gfwlist +server=/puripuriunkomura.com/127.0.0.1#5335 +ipset=/puripuriunkomura.com/gfwlist +server=/asianprivatetube.com/127.0.0.1#5335 +ipset=/asianprivatetube.com/gfwlist +server=/scienceonline.org/127.0.0.1#5335 +ipset=/scienceonline.org/gfwlist +server=/wifeinterracialfuck.com/127.0.0.1#5335 +ipset=/wifeinterracialfuck.com/gfwlist +server=/sony.ru/127.0.0.1#5335 +ipset=/sony.ru/gfwlist +server=/bwh1.net/127.0.0.1#5335 +ipset=/bwh1.net/gfwlist +server=/pugetsoundmini.com/127.0.0.1#5335 +ipset=/pugetsoundmini.com/gfwlist +server=/mega.co.nz/127.0.0.1#5335 +ipset=/mega.co.nz/gfwlist +server=/google.com.sg/127.0.0.1#5335 +ipset=/google.com.sg/gfwlist +server=/googleanalytics.com/127.0.0.1#5335 +ipset=/googleanalytics.com/gfwlist +server=/mydirectgroove.com/127.0.0.1#5335 +ipset=/mydirectgroove.com/gfwlist +server=/le-direct.tv/127.0.0.1#5335 +ipset=/le-direct.tv/gfwlist +server=/youtube.mk/127.0.0.1#5335 +ipset=/youtube.mk/gfwlist +server=/newsprinters.co.uk/127.0.0.1#5335 +ipset=/newsprinters.co.uk/gfwlist +server=/dropboxcaptcha.com/127.0.0.1#5335 +ipset=/dropboxcaptcha.com/gfwlist +server=/successwithteams.com/127.0.0.1#5335 +ipset=/successwithteams.com/gfwlist +server=/diretv.com/127.0.0.1#5335 +ipset=/diretv.com/gfwlist +server=/directvsundayticket.com/127.0.0.1#5335 +ipset=/directvsundayticket.com/gfwlist +server=/paypalservice.com/127.0.0.1#5335 +ipset=/paypalservice.com/gfwlist +server=/bestbhy.com/127.0.0.1#5335 +ipset=/bestbhy.com/gfwlist +server=/directvrebate.com/127.0.0.1#5335 +ipset=/directvrebate.com/gfwlist +server=/directvpromotions.com/127.0.0.1#5335 +ipset=/directvpromotions.com/gfwlist +server=/directvpromise.com/127.0.0.1#5335 +ipset=/directvpromise.com/gfwlist +server=/barrons.com/127.0.0.1#5335 +ipset=/barrons.com/gfwlist +server=/directvnow.com/127.0.0.1#5335 +ipset=/directvnow.com/gfwlist +server=/airwick.be/127.0.0.1#5335 +ipset=/airwick.be/gfwlist +server=/directvnewhampshire.com/127.0.0.1#5335 +ipset=/directvnewhampshire.com/gfwlist +server=/superearsenjoy.com/127.0.0.1#5335 +ipset=/superearsenjoy.com/gfwlist +server=/kijii.ca/127.0.0.1#5335 +ipset=/kijii.ca/gfwlist +server=/myfoxtwincities.com/127.0.0.1#5335 +ipset=/myfoxtwincities.com/gfwlist +server=/directvkentucky.com/127.0.0.1#5335 +ipset=/directvkentucky.com/gfwlist +server=/cashpassport.ca/127.0.0.1#5335 +ipset=/cashpassport.ca/gfwlist +server=/grannylister.com/127.0.0.1#5335 +ipset=/grannylister.com/gfwlist +server=/fritchy.com/127.0.0.1#5335 +ipset=/fritchy.com/gfwlist +server=/attstadium.com/127.0.0.1#5335 +ipset=/attstadium.com/gfwlist +server=/moov.hk/127.0.0.1#5335 +ipset=/moov.hk/gfwlist +server=/toonsexblog.com/127.0.0.1#5335 +ipset=/toonsexblog.com/gfwlist +server=/laracasts.com/127.0.0.1#5335 +ipset=/laracasts.com/gfwlist +server=/directvdsl.tv/127.0.0.1#5335 +ipset=/directvdsl.tv/gfwlist +server=/tiktok.com/127.0.0.1#5335 +ipset=/tiktok.com/gfwlist +server=/yogify.com/127.0.0.1#5335 +ipset=/yogify.com/gfwlist +server=/directvdealsnow.com/127.0.0.1#5335 +ipset=/directvdealsnow.com/gfwlist +server=/fox32chicago.com/127.0.0.1#5335 +ipset=/fox32chicago.com/gfwlist +server=/hentairox.com/127.0.0.1#5335 +ipset=/hentairox.com/gfwlist +server=/realclearpolitics.com/127.0.0.1#5335 +ipset=/realclearpolitics.com/gfwlist +server=/directvbusiness.com/127.0.0.1#5335 +ipset=/directvbusiness.com/gfwlist +server=/nikestyles.com/127.0.0.1#5335 +ipset=/nikestyles.com/gfwlist +server=/routledgehandbooks.com/127.0.0.1#5335 +ipset=/routledgehandbooks.com/gfwlist +server=/book.com.tw/127.0.0.1#5335 +ipset=/book.com.tw/gfwlist +server=/ajtalk.com/127.0.0.1#5335 +ipset=/ajtalk.com/gfwlist +server=/verizondigitalmedia.com/127.0.0.1#5335 +ipset=/verizondigitalmedia.com/gfwlist +server=/directvboston.com/127.0.0.1#5335 +ipset=/directvboston.com/gfwlist +server=/bestbuys.com/127.0.0.1#5335 +ipset=/bestbuys.com/gfwlist +server=/directv-newyork.com/127.0.0.1#5335 +ipset=/directv-newyork.com/gfwlist +server=/instafallow.com/127.0.0.1#5335 +ipset=/instafallow.com/gfwlist +server=/firstsearch.oclc.org/127.0.0.1#5335 +ipset=/firstsearch.oclc.org/gfwlist +server=/freeb.com/127.0.0.1#5335 +ipset=/freeb.com/gfwlist +server=/dkrecttv.com/127.0.0.1#5335 +ipset=/dkrecttv.com/gfwlist +server=/young-xxx.net/127.0.0.1#5335 +ipset=/young-xxx.net/gfwlist +server=/meme111.com/127.0.0.1#5335 +ipset=/meme111.com/gfwlist +server=/hdvideosporn.net/127.0.0.1#5335 +ipset=/hdvideosporn.net/gfwlist +server=/direcpath.net/127.0.0.1#5335 +ipset=/direcpath.net/gfwlist +server=/hentaistream.tv/127.0.0.1#5335 +ipset=/hentaistream.tv/gfwlist +server=/mcdonalds.hk/127.0.0.1#5335 +ipset=/mcdonalds.hk/gfwlist +server=/softbanktelecom.com/127.0.0.1#5335 +ipset=/softbanktelecom.com/gfwlist +server=/hotgoo.com/127.0.0.1#5335 +ipset=/hotgoo.com/gfwlist +server=/boylove.com/127.0.0.1#5335 +ipset=/boylove.com/gfwlist +server=/zorglist.com/127.0.0.1#5335 +ipset=/zorglist.com/gfwlist +server=/loveamateurfacials.com/127.0.0.1#5335 +ipset=/loveamateurfacials.com/gfwlist +server=/booru.org/127.0.0.1#5335 +ipset=/booru.org/gfwlist +server=/3danimeworld.com/127.0.0.1#5335 +ipset=/3danimeworld.com/gfwlist +server=/infocert.digital/127.0.0.1#5335 +ipset=/infocert.digital/gfwlist +server=/mini.si/127.0.0.1#5335 +ipset=/mini.si/gfwlist +server=/tvpromise.com/127.0.0.1#5335 +ipset=/tvpromise.com/gfwlist +server=/porngames.tv/127.0.0.1#5335 +ipset=/porngames.tv/gfwlist +server=/pinkworld.com/127.0.0.1#5335 +ipset=/pinkworld.com/gfwlist +server=/yes123.com.tw/127.0.0.1#5335 +ipset=/yes123.com.tw/gfwlist +server=/synaptic.net/127.0.0.1#5335 +ipset=/synaptic.net/gfwlist +server=/safebooru.org/127.0.0.1#5335 +ipset=/safebooru.org/gfwlist +server=/sundayready.com/127.0.0.1#5335 +ipset=/sundayready.com/gfwlist +server=/susiewildin.com/127.0.0.1#5335 +ipset=/susiewildin.com/gfwlist +server=/girlsdelta.com/127.0.0.1#5335 +ipset=/girlsdelta.com/gfwlist +server=/hotbeatsonsale.com/127.0.0.1#5335 +ipset=/hotbeatsonsale.com/gfwlist +server=/bmw-motorrad.ro/127.0.0.1#5335 +ipset=/bmw-motorrad.ro/gfwlist +server=/visa.com.cy/127.0.0.1#5335 +ipset=/visa.com.cy/gfwlist +server=/8xxx.net/127.0.0.1#5335 +ipset=/8xxx.net/gfwlist +server=/bmwsafari.com/127.0.0.1#5335 +ipset=/bmwsafari.com/gfwlist +server=/enterprisepaging.com/127.0.0.1#5335 +ipset=/enterprisepaging.com/gfwlist +server=/foxaffiliateportal.com/127.0.0.1#5335 +ipset=/foxaffiliateportal.com/gfwlist +server=/directvbusinessmarket.com/127.0.0.1#5335 +ipset=/directvbusinessmarket.com/gfwlist +server=/naizitv.top/127.0.0.1#5335 +ipset=/naizitv.top/gfwlist +server=/swissstick.com/127.0.0.1#5335 +ipset=/swissstick.com/gfwlist +server=/bmw-connecteddrive.sk/127.0.0.1#5335 +ipset=/bmw-connecteddrive.sk/gfwlist +server=/microsoft.ro/127.0.0.1#5335 +ipset=/microsoft.ro/gfwlist +server=/cbs.com/127.0.0.1#5335 +ipset=/cbs.com/gfwlist +server=/customdrdrebeats.com/127.0.0.1#5335 +ipset=/customdrdrebeats.com/gfwlist +server=/currently.net/127.0.0.1#5335 +ipset=/currently.net/gfwlist +server=/ntdtv.com/127.0.0.1#5335 +ipset=/ntdtv.com/gfwlist +server=/oudoll.com/127.0.0.1#5335 +ipset=/oudoll.com/gfwlist +server=/ebaychina.net/127.0.0.1#5335 +ipset=/ebaychina.net/gfwlist +server=/enablementadobe.com/127.0.0.1#5335 +ipset=/enablementadobe.com/gfwlist +server=/18comic.vip/127.0.0.1#5335 +ipset=/18comic.vip/gfwlist +server=/acgvipss.com/127.0.0.1#5335 +ipset=/acgvipss.com/gfwlist +server=/nexpart.com/127.0.0.1#5335 +ipset=/nexpart.com/gfwlist +server=/headphonesol.com/127.0.0.1#5335 +ipset=/headphonesol.com/gfwlist +server=/pearsonvue.com/127.0.0.1#5335 +ipset=/pearsonvue.com/gfwlist +server=/beatsmonstersales.com/127.0.0.1#5335 +ipset=/beatsmonstersales.com/gfwlist +server=/attuverseonline.com/127.0.0.1#5335 +ipset=/attuverseonline.com/gfwlist +server=/attuverseoffers.com/127.0.0.1#5335 +ipset=/attuverseoffers.com/gfwlist +server=/attsuppliers.com/127.0.0.1#5335 +ipset=/attsuppliers.com/gfwlist +server=/opencollective.com/127.0.0.1#5335 +ipset=/opencollective.com/gfwlist +server=/anidom.com/127.0.0.1#5335 +ipset=/anidom.com/gfwlist +server=/slackb.com/127.0.0.1#5335 +ipset=/slackb.com/gfwlist +server=/niketaiwan.net/127.0.0.1#5335 +ipset=/niketaiwan.net/gfwlist +server=/m.me/127.0.0.1#5335 +ipset=/m.me/gfwlist +server=/matures-loving-sex.com/127.0.0.1#5335 +ipset=/matures-loving-sex.com/gfwlist +server=/musickit.net/127.0.0.1#5335 +ipset=/musickit.net/gfwlist +server=/attpublicpolicy.com/127.0.0.1#5335 +ipset=/attpublicpolicy.com/gfwlist +server=/gitlab-assets.oss-cn-hongkong.aliyuncs.com/127.0.0.1#5335 +ipset=/gitlab-assets.oss-cn-hongkong.aliyuncs.com/gfwlist +server=/attnetclient.com/127.0.0.1#5335 +ipset=/attnetclient.com/gfwlist +server=/attjoy.com/127.0.0.1#5335 +ipset=/attjoy.com/gfwlist +server=/attcollaborate.com/127.0.0.1#5335 +ipset=/attcollaborate.com/gfwlist +server=/goldengate.hu/127.0.0.1#5335 +ipset=/goldengate.hu/gfwlist +server=/attbusiness.net/127.0.0.1#5335 +ipset=/attbusiness.net/gfwlist +server=/sexbebin.com/127.0.0.1#5335 +ipset=/sexbebin.com/gfwlist +server=/iphoneimessage.com/127.0.0.1#5335 +ipset=/iphoneimessage.com/gfwlist +server=/1pornlist.com/127.0.0.1#5335 +ipset=/1pornlist.com/gfwlist +server=/eadultgames.com/127.0.0.1#5335 +ipset=/eadultgames.com/gfwlist +server=/fameregistry.com/127.0.0.1#5335 +ipset=/fameregistry.com/gfwlist +server=/cumfox.com/127.0.0.1#5335 +ipset=/cumfox.com/gfwlist +server=/att.jobs/127.0.0.1#5335 +ipset=/att.jobs/gfwlist +server=/gwktravelex.nl/127.0.0.1#5335 +ipset=/gwktravelex.nl/gfwlist +server=/youngermommy.com/127.0.0.1#5335 +ipset=/youngermommy.com/gfwlist +server=/porn-discounts.xxx/127.0.0.1#5335 +ipset=/porn-discounts.xxx/gfwlist +server=/pixnet.cc/127.0.0.1#5335 +ipset=/pixnet.cc/gfwlist +server=/att-promotions.com/127.0.0.1#5335 +ipset=/att-promotions.com/gfwlist +server=/digital-id.ch/127.0.0.1#5335 +ipset=/digital-id.ch/gfwlist +server=/t.me/127.0.0.1#5335 +ipset=/t.me/gfwlist +server=/att-mail.com/127.0.0.1#5335 +ipset=/att-mail.com/gfwlist +server=/f-droid.org/127.0.0.1#5335 +ipset=/f-droid.org/gfwlist +server=/sarapbabe.com/127.0.0.1#5335 +ipset=/sarapbabe.com/gfwlist +server=/att-bundles.com/127.0.0.1#5335 +ipset=/att-bundles.com/gfwlist +server=/accbusiness.com/127.0.0.1#5335 +ipset=/accbusiness.com/gfwlist +server=/miohentai.com/127.0.0.1#5335 +ipset=/miohentai.com/gfwlist +server=/bitbucket.org/127.0.0.1#5335 +ipset=/bitbucket.org/gfwlist +server=/volvobuses.in/127.0.0.1#5335 +ipset=/volvobuses.in/gfwlist +server=/person.com/127.0.0.1#5335 +ipset=/person.com/gfwlist +server=/xn--kput3imi374g.xn--hxt814e/127.0.0.1#5335 +ipset=/xn--kput3imi374g.xn--hxt814e/gfwlist +server=/ebayhots.com/127.0.0.1#5335 +ipset=/ebayhots.com/gfwlist +server=/mini.tm/127.0.0.1#5335 +ipset=/mini.tm/gfwlist +server=/line-cdn.net/127.0.0.1#5335 +ipset=/line-cdn.net/gfwlist +server=/beatsallsale.com/127.0.0.1#5335 +ipset=/beatsallsale.com/gfwlist +server=/ao3.org/127.0.0.1#5335 +ipset=/ao3.org/gfwlist +server=/xn--fiqs8sxootzz.cn/127.0.0.1#5335 +ipset=/xn--fiqs8sxootzz.cn/gfwlist +server=/qinav.com/127.0.0.1#5335 +ipset=/qinav.com/gfwlist +server=/wwapple.net/127.0.0.1#5335 +ipset=/wwapple.net/gfwlist +server=/gobuyonlinestore.net/127.0.0.1#5335 +ipset=/gobuyonlinestore.net/gfwlist +server=/pornhub.com/127.0.0.1#5335 +ipset=/pornhub.com/gfwlist +server=/applestore.com.pt/127.0.0.1#5335 +ipset=/applestore.com.pt/gfwlist +server=/webobjects.eu/127.0.0.1#5335 +ipset=/webobjects.eu/gfwlist +server=/freeomovie.to/127.0.0.1#5335 +ipset=/freeomovie.to/gfwlist +server=/kubakuba.global/127.0.0.1#5335 +ipset=/kubakuba.global/gfwlist +server=/freearabsexx.com/127.0.0.1#5335 +ipset=/freearabsexx.com/gfwlist +server=/canon-me.com/127.0.0.1#5335 +ipset=/canon-me.com/gfwlist +server=/pearsonclinical.fr/127.0.0.1#5335 +ipset=/pearsonclinical.fr/gfwlist +server=/etbc.com.hk/127.0.0.1#5335 +ipset=/etbc.com.hk/gfwlist +server=/quicktime.net/127.0.0.1#5335 +ipset=/quicktime.net/gfwlist +server=/rprimelab.com/127.0.0.1#5335 +ipset=/rprimelab.com/gfwlist +server=/speedhunters.com/127.0.0.1#5335 +ipset=/speedhunters.com/gfwlist +server=/177picyy.com/127.0.0.1#5335 +ipset=/177picyy.com/gfwlist +server=/pornovenezolanox.com/127.0.0.1#5335 +ipset=/pornovenezolanox.com/gfwlist +server=/quicktime.com.au/127.0.0.1#5335 +ipset=/quicktime.com.au/gfwlist +server=/quicktime.cc/127.0.0.1#5335 +ipset=/quicktime.cc/gfwlist +server=/camelot-europe.com/127.0.0.1#5335 +ipset=/camelot-europe.com/gfwlist +server=/xn--xsq959n.com/127.0.0.1#5335 +ipset=/xn--xsq959n.com/gfwlist +server=/xn--gmq92kd2rm1kx34a.com/127.0.0.1#5335 +ipset=/xn--gmq92kd2rm1kx34a.com/gfwlist +server=/catmiimi.com/127.0.0.1#5335 +ipset=/catmiimi.com/gfwlist +server=/la-mama.ru/127.0.0.1#5335 +ipset=/la-mama.ru/gfwlist +server=/oanencore.com/127.0.0.1#5335 +ipset=/oanencore.com/gfwlist +server=/newton.com/127.0.0.1#5335 +ipset=/newton.com/gfwlist +server=/achat-followers-instagram.com/127.0.0.1#5335 +ipset=/achat-followers-instagram.com/gfwlist +server=/macreach.net/127.0.0.1#5335 +ipset=/macreach.net/gfwlist +server=/macpazar.com/127.0.0.1#5335 +ipset=/macpazar.com/gfwlist +server=/practicalbusinessskills.com/127.0.0.1#5335 +ipset=/practicalbusinessskills.com/gfwlist +server=/kphimsex.net/127.0.0.1#5335 +ipset=/kphimsex.net/gfwlist +server=/macosx.info/127.0.0.1#5335 +ipset=/macosx.info/gfwlist +server=/volvobuses.fr/127.0.0.1#5335 +ipset=/volvobuses.fr/gfwlist +server=/visa.so/127.0.0.1#5335 +ipset=/visa.so/gfwlist +server=/youtube.com.az/127.0.0.1#5335 +ipset=/youtube.com.az/gfwlist +server=/bikac.xyz/127.0.0.1#5335 +ipset=/bikac.xyz/gfwlist +server=/google.com.lb/127.0.0.1#5335 +ipset=/google.com.lb/gfwlist +server=/icashpassport.com.mx/127.0.0.1#5335 +ipset=/icashpassport.com.mx/gfwlist +server=/bmw-motorrad.dk/127.0.0.1#5335 +ipset=/bmw-motorrad.dk/gfwlist +server=/bmw-int1.com/127.0.0.1#5335 +ipset=/bmw-int1.com/gfwlist +server=/yomiuri-systec.co.jp/127.0.0.1#5335 +ipset=/yomiuri-systec.co.jp/gfwlist +server=/disney.fi/127.0.0.1#5335 +ipset=/disney.fi/gfwlist +server=/disney.io/127.0.0.1#5335 +ipset=/disney.io/gfwlist +server=/eac-cdn.com/127.0.0.1#5335 +ipset=/eac-cdn.com/gfwlist +server=/supercell.com/127.0.0.1#5335 +ipset=/supercell.com/gfwlist +server=/macboxset.com/127.0.0.1#5335 +ipset=/macboxset.com/gfwlist +server=/scholar.google.com/127.0.0.1#5335 +ipset=/scholar.google.com/gfwlist +server=/emblstatic.net/127.0.0.1#5335 +ipset=/emblstatic.net/gfwlist +server=/mac.rs/127.0.0.1#5335 +ipset=/mac.rs/gfwlist +server=/singpao.com.hk/127.0.0.1#5335 +ipset=/singpao.com.hk/gfwlist +server=/oxfordhandbooks.com/127.0.0.1#5335 +ipset=/oxfordhandbooks.com/gfwlist +server=/mac.eu/127.0.0.1#5335 +ipset=/mac.eu/gfwlist +server=/javpub.me/127.0.0.1#5335 +ipset=/javpub.me/gfwlist +server=/familypornhd.com/127.0.0.1#5335 +ipset=/familypornhd.com/gfwlist +server=/mac.com/127.0.0.1#5335 +ipset=/mac.com/gfwlist +server=/milfporn.pro/127.0.0.1#5335 +ipset=/milfporn.pro/gfwlist +server=/noodlemagazine.com/127.0.0.1#5335 +ipset=/noodlemagazine.com/gfwlist +server=/bangyourwife.com/127.0.0.1#5335 +ipset=/bangyourwife.com/gfwlist +server=/facebookblueprint.net/127.0.0.1#5335 +ipset=/facebookblueprint.net/gfwlist +server=/ksd235qw.com/127.0.0.1#5335 +ipset=/ksd235qw.com/gfwlist +server=/bmwmagazine.com/127.0.0.1#5335 +ipset=/bmwmagazine.com/gfwlist +server=/vgcareers.net/127.0.0.1#5335 +ipset=/vgcareers.net/gfwlist +server=/anyxxx.pro/127.0.0.1#5335 +ipset=/anyxxx.pro/gfwlist +server=/instaplayer.net/127.0.0.1#5335 +ipset=/instaplayer.net/gfwlist +server=/volvotrucks.qa/127.0.0.1#5335 +ipset=/volvotrucks.qa/gfwlist +server=/foxsportsuniversity.com/127.0.0.1#5335 +ipset=/foxsportsuniversity.com/gfwlist +server=/nudecams.cam/127.0.0.1#5335 +ipset=/nudecams.cam/gfwlist +server=/minivictoria.ca/127.0.0.1#5335 +ipset=/minivictoria.ca/gfwlist +server=/yahoo.co.vi/127.0.0.1#5335 +ipset=/yahoo.co.vi/gfwlist +server=/iwork.wang/127.0.0.1#5335 +ipset=/iwork.wang/gfwlist +server=/ischool.com/127.0.0.1#5335 +ipset=/ischool.com/gfwlist +server=/applenews.hamburg/127.0.0.1#5335 +ipset=/applenews.hamburg/gfwlist +server=/ipa-iphone.net/127.0.0.1#5335 +ipset=/ipa-iphone.net/gfwlist +server=/akamaimagicmath.net/127.0.0.1#5335 +ipset=/akamaimagicmath.net/gfwlist +server=/iosinthecar.com/127.0.0.1#5335 +ipset=/iosinthecar.com/gfwlist +server=/voxmedia.com/127.0.0.1#5335 +ipset=/voxmedia.com/gfwlist +server=/hentaipapa.com/127.0.0.1#5335 +ipset=/hentaipapa.com/gfwlist +server=/bestiphonestuff.com/127.0.0.1#5335 +ipset=/bestiphonestuff.com/gfwlist +server=/amerikaovozi.com/127.0.0.1#5335 +ipset=/amerikaovozi.com/gfwlist +server=/imessage.tv/127.0.0.1#5335 +ipset=/imessage.tv/gfwlist +server=/ikids.com/127.0.0.1#5335 +ipset=/ikids.com/gfwlist +server=/epochstories.com/127.0.0.1#5335 +ipset=/epochstories.com/gfwlist +server=/beatsbydrecheap-outletstore.com/127.0.0.1#5335 +ipset=/beatsbydrecheap-outletstore.com/gfwlist +server=/swisstsa.li/127.0.0.1#5335 +ipset=/swisstsa.li/gfwlist +server=/firewire.cl/127.0.0.1#5335 +ipset=/firewire.cl/gfwlist +server=/finalcutpro.com/127.0.0.1#5335 +ipset=/finalcutpro.com/gfwlist +server=/freefacebook.net/127.0.0.1#5335 +ipset=/freefacebook.net/gfwlist +server=/facetime.net/127.0.0.1#5335 +ipset=/facetime.net/gfwlist +server=/hulunetwork.com/127.0.0.1#5335 +ipset=/hulunetwork.com/gfwlist +server=/promonsterbeatsbydre.com/127.0.0.1#5335 +ipset=/promonsterbeatsbydre.com/gfwlist +server=/shopbeatsdre.com/127.0.0.1#5335 +ipset=/shopbeatsdre.com/gfwlist +server=/lostbetsgames.com/127.0.0.1#5335 +ipset=/lostbetsgames.com/gfwlist +server=/park-now.com/127.0.0.1#5335 +ipset=/park-now.com/gfwlist +server=/bbyintl.com/127.0.0.1#5335 +ipset=/bbyintl.com/gfwlist +server=/bdsmbunker.com/127.0.0.1#5335 +ipset=/bdsmbunker.com/gfwlist +server=/google.com.bd/127.0.0.1#5335 +ipset=/google.com.bd/gfwlist +server=/leaguesharp.info/127.0.0.1#5335 +ipset=/leaguesharp.info/gfwlist +server=/ipfs.eth.aragon.network/127.0.0.1#5335 +ipset=/ipfs.eth.aragon.network/gfwlist +server=/emac.in/127.0.0.1#5335 +ipset=/emac.in/gfwlist +server=/pogobeta.com/127.0.0.1#5335 +ipset=/pogobeta.com/gfwlist +server=/uun95.com/127.0.0.1#5335 +ipset=/uun95.com/gfwlist +server=/dvdstudiopro.us/127.0.0.1#5335 +ipset=/dvdstudiopro.us/gfwlist +server=/only-xxx-porn.com/127.0.0.1#5335 +ipset=/only-xxx-porn.com/gfwlist +server=/mini.com.py/127.0.0.1#5335 +ipset=/mini.com.py/gfwlist +server=/azure.net/127.0.0.1#5335 +ipset=/azure.net/gfwlist +server=/embl.de/127.0.0.1#5335 +ipset=/embl.de/gfwlist +server=/dvdstudiopro.com/127.0.0.1#5335 +ipset=/dvdstudiopro.com/gfwlist +server=/beatsbydre2081.com/127.0.0.1#5335 +ipset=/beatsbydre2081.com/gfwlist +server=/whonix.org/127.0.0.1#5335 +ipset=/whonix.org/gfwlist +server=/dvdstudiopro.biz/127.0.0.1#5335 +ipset=/dvdstudiopro.biz/gfwlist +server=/macrumors.com/127.0.0.1#5335 +ipset=/macrumors.com/gfwlist +server=/dotmac.de/127.0.0.1#5335 +ipset=/dotmac.de/gfwlist +server=/bmw-m.com/127.0.0.1#5335 +ipset=/bmw-m.com/gfwlist +server=/digitalhub.com/127.0.0.1#5335 +ipset=/digitalhub.com/gfwlist +server=/cheapestbeatsdrdre.com/127.0.0.1#5335 +ipset=/cheapestbeatsdrdre.com/gfwlist +server=/nextechafrica.net/127.0.0.1#5335 +ipset=/nextechafrica.net/gfwlist +server=/appcenter.ms/127.0.0.1#5335 +ipset=/appcenter.ms/gfwlist +server=/desktopmovies.net/127.0.0.1#5335 +ipset=/desktopmovies.net/gfwlist +server=/gcrtires.com/127.0.0.1#5335 +ipset=/gcrtires.com/gfwlist +server=/desktopmovie.net/127.0.0.1#5335 +ipset=/desktopmovie.net/gfwlist +server=/online-deals.net/127.0.0.1#5335 +ipset=/online-deals.net/gfwlist +server=/dashwood360.com/127.0.0.1#5335 +ipset=/dashwood360.com/gfwlist +server=/fotolia.tv/127.0.0.1#5335 +ipset=/fotolia.tv/gfwlist +server=/niziero.info/127.0.0.1#5335 +ipset=/niziero.info/gfwlist +server=/parstream.com/127.0.0.1#5335 +ipset=/parstream.com/gfwlist +server=/boxun.com/127.0.0.1#5335 +ipset=/boxun.com/gfwlist +server=/disneyinternationalhd.com/127.0.0.1#5335 +ipset=/disneyinternationalhd.com/gfwlist +server=/dropboxbusiness.com/127.0.0.1#5335 +ipset=/dropboxbusiness.com/gfwlist +server=/nurofen.ie/127.0.0.1#5335 +ipset=/nurofen.ie/gfwlist +server=/faccebook.com/127.0.0.1#5335 +ipset=/faccebook.com/gfwlist +server=/ssl-certificate.ch/127.0.0.1#5335 +ipset=/ssl-certificate.ch/gfwlist +server=/volvotruckcenter.se/127.0.0.1#5335 +ipset=/volvotruckcenter.se/gfwlist +server=/xxnxx-sex.com/127.0.0.1#5335 +ipset=/xxnxx-sex.com/gfwlist +server=/alphabet.biz/127.0.0.1#5335 +ipset=/alphabet.biz/gfwlist +server=/faacebok.com/127.0.0.1#5335 +ipset=/faacebok.com/gfwlist +server=/duckduckgo.com/127.0.0.1#5335 +ipset=/duckduckgo.com/gfwlist +server=/forzamotorsport.net/127.0.0.1#5335 +ipset=/forzamotorsport.net/gfwlist +server=/paypal-search.com/127.0.0.1#5335 +ipset=/paypal-search.com/gfwlist +server=/dreamteamfc.com/127.0.0.1#5335 +ipset=/dreamteamfc.com/gfwlist +server=/apyle.com/127.0.0.1#5335 +ipset=/apyle.com/gfwlist +server=/epochtimes.co.uk/127.0.0.1#5335 +ipset=/epochtimes.co.uk/gfwlist +server=/appye.com/127.0.0.1#5335 +ipset=/appye.com/gfwlist +server=/appmediagroup.com/127.0.0.1#5335 +ipset=/appmediagroup.com/gfwlist +server=/12diasderegalosdeitunes.com.hn/127.0.0.1#5335 +ipset=/12diasderegalosdeitunes.com.hn/gfwlist +server=/blogebay.com/127.0.0.1#5335 +ipset=/blogebay.com/gfwlist +server=/indian-pornstars.com/127.0.0.1#5335 +ipset=/indian-pornstars.com/gfwlist +server=/applle.com/127.0.0.1#5335 +ipset=/applle.com/gfwlist +server=/xxx-fap.com/127.0.0.1#5335 +ipset=/xxx-fap.com/gfwlist +server=/swisssign.net/127.0.0.1#5335 +ipset=/swisssign.net/gfwlist +server=/applezh.com/127.0.0.1#5335 +ipset=/applezh.com/gfwlist +server=/ebayt.com/127.0.0.1#5335 +ipset=/ebayt.com/gfwlist +server=/paisapay.cc/127.0.0.1#5335 +ipset=/paisapay.cc/gfwlist +server=/appleweb.net/127.0.0.1#5335 +ipset=/appleweb.net/gfwlist +server=/statics-marketingsites-eus-ms-com.akamaized.net/127.0.0.1#5335 +ipset=/statics-marketingsites-eus-ms-com.akamaized.net/gfwlist +server=/ctwant.com/127.0.0.1#5335 +ipset=/ctwant.com/gfwlist +server=/gonike.com/127.0.0.1#5335 +ipset=/gonike.com/gfwlist +server=/facebookclub.com/127.0.0.1#5335 +ipset=/facebookclub.com/gfwlist +server=/bowsersinsidestory.com/127.0.0.1#5335 +ipset=/bowsersinsidestory.com/gfwlist +server=/orgypornonly.com/127.0.0.1#5335 +ipset=/orgypornonly.com/gfwlist +server=/boslife.net/127.0.0.1#5335 +ipset=/boslife.net/gfwlist +server=/appleshop.co.uk/127.0.0.1#5335 +ipset=/appleshop.co.uk/gfwlist +server=/appleshare.info/127.0.0.1#5335 +ipset=/appleshare.info/gfwlist +server=/cpan.org/127.0.0.1#5335 +ipset=/cpan.org/gfwlist +server=/pricelesstv.com/127.0.0.1#5335 +ipset=/pricelesstv.com/gfwlist +server=/ntnews.com.au/127.0.0.1#5335 +ipset=/ntnews.com.au/gfwlist +server=/apples-msk.ru/127.0.0.1#5335 +ipset=/apples-msk.ru/gfwlist +server=/minidealernet.com/127.0.0.1#5335 +ipset=/minidealernet.com/gfwlist +server=/bestxxxsites.com/127.0.0.1#5335 +ipset=/bestxxxsites.com/gfwlist +server=/secretbabes.co.uk/127.0.0.1#5335 +ipset=/secretbabes.co.uk/gfwlist +server=/applereach.net/127.0.0.1#5335 +ipset=/applereach.net/gfwlist +server=/applepremiumresellers.com.au/127.0.0.1#5335 +ipset=/applepremiumresellers.com.au/gfwlist +server=/amazon.co.uk/127.0.0.1#5335 +ipset=/amazon.co.uk/gfwlist +server=/visiontimes.net/127.0.0.1#5335 +ipset=/visiontimes.net/gfwlist +server=/biomedcentral.com/127.0.0.1#5335 +ipset=/biomedcentral.com/gfwlist +server=/iceporn.com/127.0.0.1#5335 +ipset=/iceporn.com/gfwlist +server=/bossagency.co.uk/127.0.0.1#5335 +ipset=/bossagency.co.uk/gfwlist +server=/appleonline.net/127.0.0.1#5335 +ipset=/appleonline.net/gfwlist +server=/applemagickeyboard.com/127.0.0.1#5335 +ipset=/applemagickeyboard.com/gfwlist +server=/ygugu4.com/127.0.0.1#5335 +ipset=/ygugu4.com/gfwlist +server=/pearsoncanada.ca/127.0.0.1#5335 +ipset=/pearsoncanada.ca/gfwlist +server=/brazzersnetwork.com/127.0.0.1#5335 +ipset=/brazzersnetwork.com/gfwlist +server=/yourlust.com/127.0.0.1#5335 +ipset=/yourlust.com/gfwlist +server=/huffingtonpost.ca/127.0.0.1#5335 +ipset=/huffingtonpost.ca/gfwlist +server=/mtvnservices.com/127.0.0.1#5335 +ipset=/mtvnservices.com/gfwlist +server=/muji.com.hk/127.0.0.1#5335 +ipset=/muji.com.hk/gfwlist +server=/huloo.cc/127.0.0.1#5335 +ipset=/huloo.cc/gfwlist +server=/oreno3d.com/127.0.0.1#5335 +ipset=/oreno3d.com/gfwlist +server=/httpwwwfacebook.com/127.0.0.1#5335 +ipset=/httpwwwfacebook.com/gfwlist +server=/omgteens.com/127.0.0.1#5335 +ipset=/omgteens.com/gfwlist +server=/vmwarecloud.com/127.0.0.1#5335 +ipset=/vmwarecloud.com/gfwlist +server=/sharepoint.com/127.0.0.1#5335 +ipset=/sharepoint.com/gfwlist +server=/pornmaturetube.com/127.0.0.1#5335 +ipset=/pornmaturetube.com/gfwlist +server=/applefilmmaker.com/127.0.0.1#5335 +ipset=/applefilmmaker.com/gfwlist +server=/iamakamai.net/127.0.0.1#5335 +ipset=/iamakamai.net/gfwlist +server=/monsterbeatshere.com/127.0.0.1#5335 +ipset=/monsterbeatshere.com/gfwlist +server=/disneytvajobs.com/127.0.0.1#5335 +ipset=/disneytvajobs.com/gfwlist +server=/animesex.me/127.0.0.1#5335 +ipset=/animesex.me/gfwlist +server=/appleexpo.eu/127.0.0.1#5335 +ipset=/appleexpo.eu/gfwlist +server=/secretchina.com/127.0.0.1#5335 +ipset=/secretchina.com/gfwlist +server=/foxredeem.com/127.0.0.1#5335 +ipset=/foxredeem.com/gfwlist +server=/belamionline.com/127.0.0.1#5335 +ipset=/belamionline.com/gfwlist +server=/dojinmanga.net/127.0.0.1#5335 +ipset=/dojinmanga.net/gfwlist +server=/applecomputerinc.info/127.0.0.1#5335 +ipset=/applecomputerinc.info/gfwlist +server=/ebayetc.com/127.0.0.1#5335 +ipset=/ebayetc.com/gfwlist +server=/pornnetworkdeals.com/127.0.0.1#5335 +ipset=/pornnetworkdeals.com/gfwlist +server=/ikea.ca/127.0.0.1#5335 +ipset=/ikea.ca/gfwlist +server=/applecomputerimac.com/127.0.0.1#5335 +ipset=/applecomputerimac.com/gfwlist +server=/applecomputer.kr/127.0.0.1#5335 +ipset=/applecomputer.kr/gfwlist +server=/hhtdq17.com/127.0.0.1#5335 +ipset=/hhtdq17.com/gfwlist +server=/magento.com/127.0.0.1#5335 +ipset=/magento.com/gfwlist +server=/google.com.mt/127.0.0.1#5335 +ipset=/google.com.mt/gfwlist +server=/bridgestonegz.com/127.0.0.1#5335 +ipset=/bridgestonegz.com/gfwlist +server=/applecomputer.com/127.0.0.1#5335 +ipset=/applecomputer.com/gfwlist +server=/applecomputer.co.nz/127.0.0.1#5335 +ipset=/applecomputer.co.nz/gfwlist +server=/applecomputer-imac.com/127.0.0.1#5335 +ipset=/applecomputer-imac.com/gfwlist +server=/borwap.com/127.0.0.1#5335 +ipset=/borwap.com/gfwlist +server=/disneyplus.bn5x.net/127.0.0.1#5335 +ipset=/disneyplus.bn5x.net/gfwlist +server=/mobileview.page/127.0.0.1#5335 +ipset=/mobileview.page/gfwlist +server=/youtube.co.za/127.0.0.1#5335 +ipset=/youtube.co.za/gfwlist +server=/simility.com/127.0.0.1#5335 +ipset=/simility.com/gfwlist +server=/beatsbydreblackfridaypro.com/127.0.0.1#5335 +ipset=/beatsbydreblackfridaypro.com/gfwlist +server=/pinkcore.net/127.0.0.1#5335 +ipset=/pinkcore.net/gfwlist +server=/now-ashare.com/127.0.0.1#5335 +ipset=/now-ashare.com/gfwlist +server=/reurl.cc/127.0.0.1#5335 +ipset=/reurl.cc/gfwlist +server=/rockettube.com/127.0.0.1#5335 +ipset=/rockettube.com/gfwlist +server=/evernote.com/127.0.0.1#5335 +ipset=/evernote.com/gfwlist +server=/voacambodia.com/127.0.0.1#5335 +ipset=/voacambodia.com/gfwlist +server=/appleaustralia.com.au/127.0.0.1#5335 +ipset=/appleaustralia.com.au/gfwlist +server=/talentlens.com/127.0.0.1#5335 +ipset=/talentlens.com/gfwlist +server=/electricluxury.com/127.0.0.1#5335 +ipset=/electricluxury.com/gfwlist +server=/ebaydlassifieds.com/127.0.0.1#5335 +ipset=/ebaydlassifieds.com/gfwlist +server=/gay0day.com/127.0.0.1#5335 +ipset=/gay0day.com/gfwlist +server=/thotbook.tv/127.0.0.1#5335 +ipset=/thotbook.tv/gfwlist +server=/realamericanstories.tv/127.0.0.1#5335 +ipset=/realamericanstories.tv/gfwlist +server=/bmw-gta.ca/127.0.0.1#5335 +ipset=/bmw-gta.ca/gfwlist +server=/kisscos.net/127.0.0.1#5335 +ipset=/kisscos.net/gfwlist +server=/apple-usa.net/127.0.0.1#5335 +ipset=/apple-usa.net/gfwlist +server=/beatsbydre-headphones.com/127.0.0.1#5335 +ipset=/beatsbydre-headphones.com/gfwlist +server=/youtube.com.jo/127.0.0.1#5335 +ipset=/youtube.com.jo/gfwlist +server=/tubesafari.com/127.0.0.1#5335 +ipset=/tubesafari.com/gfwlist +server=/forzarc.com/127.0.0.1#5335 +ipset=/forzarc.com/gfwlist +server=/erogazopple.com/127.0.0.1#5335 +ipset=/erogazopple.com/gfwlist +server=/bml.info/127.0.0.1#5335 +ipset=/bml.info/gfwlist +server=/duckduckgo.de/127.0.0.1#5335 +ipset=/duckduckgo.de/gfwlist +server=/ebaysoho.com/127.0.0.1#5335 +ipset=/ebaysoho.com/gfwlist +server=/itunes-radio.net/127.0.0.1#5335 +ipset=/itunes-radio.net/gfwlist +server=/apple-livephotoskit.com/127.0.0.1#5335 +ipset=/apple-livephotoskit.com/gfwlist +server=/rgpub.io/127.0.0.1#5335 +ipset=/rgpub.io/gfwlist +server=/savethedate.foo/127.0.0.1#5335 +ipset=/savethedate.foo/gfwlist +server=/apple-inc.net/127.0.0.1#5335 +ipset=/apple-inc.net/gfwlist +server=/apple-hk.com/127.0.0.1#5335 +ipset=/apple-hk.com/gfwlist +server=/illusiongw.com/127.0.0.1#5335 +ipset=/illusiongw.com/gfwlist +server=/adultsexgames.biz/127.0.0.1#5335 +ipset=/adultsexgames.biz/gfwlist +server=/ebayuae.net/127.0.0.1#5335 +ipset=/ebayuae.net/gfwlist +server=/thenewgirlspooping.com/127.0.0.1#5335 +ipset=/thenewgirlspooping.com/gfwlist +server=/apple-dns.net/127.0.0.1#5335 +ipset=/apple-dns.net/gfwlist +server=/alliancesages.com/127.0.0.1#5335 +ipset=/alliancesages.com/gfwlist +server=/apple-dns.com/127.0.0.1#5335 +ipset=/apple-dns.com/gfwlist +server=/vintage-erotica-forum.com/127.0.0.1#5335 +ipset=/vintage-erotica-forum.com/gfwlist +server=/apple-darwin.net/127.0.0.1#5335 +ipset=/apple-darwin.net/gfwlist +server=/cdngarenanow-a.akamaihd.net/127.0.0.1#5335 +ipset=/cdngarenanow-a.akamaihd.net/gfwlist +server=/apple-darwin.com/127.0.0.1#5335 +ipset=/apple-darwin.com/gfwlist +server=/nijiclamp.com/127.0.0.1#5335 +ipset=/nijiclamp.com/gfwlist +server=/mystrikingly.com/127.0.0.1#5335 +ipset=/mystrikingly.com/gfwlist +server=/mastercard.co.za/127.0.0.1#5335 +ipset=/mastercard.co.za/gfwlist +server=/eakorea.co.kr/127.0.0.1#5335 +ipset=/eakorea.co.kr/gfwlist +server=/nikefreeshoes.com/127.0.0.1#5335 +ipset=/nikefreeshoes.com/gfwlist +server=/doom.com/127.0.0.1#5335 +ipset=/doom.com/gfwlist +server=/jodic-forum.org/127.0.0.1#5335 +ipset=/jodic-forum.org/gfwlist +server=/tyms2022.com/127.0.0.1#5335 +ipset=/tyms2022.com/gfwlist +server=/miniccrc.ca/127.0.0.1#5335 +ipset=/miniccrc.ca/gfwlist +server=/viet69.dev/127.0.0.1#5335 +ipset=/viet69.dev/gfwlist +server=/ap0le.com/127.0.0.1#5335 +ipset=/ap0le.com/gfwlist +server=/airtunes.net/127.0.0.1#5335 +ipset=/airtunes.net/gfwlist +server=/diabloimmortal.com/127.0.0.1#5335 +ipset=/diabloimmortal.com/gfwlist +server=/tnntoday.com/127.0.0.1#5335 +ipset=/tnntoday.com/gfwlist +server=/airtunes.info/127.0.0.1#5335 +ipset=/airtunes.info/gfwlist +server=/alt.com/127.0.0.1#5335 +ipset=/alt.com/gfwlist +server=/airport.brussels/127.0.0.1#5335 +ipset=/airport.brussels/gfwlist +server=/a0pple.net/127.0.0.1#5335 +ipset=/a0pple.net/gfwlist +server=/2022.dev/127.0.0.1#5335 +ipset=/2022.dev/gfwlist +server=/wixapps.net/127.0.0.1#5335 +ipset=/wixapps.net/gfwlist +server=/18avx.com/127.0.0.1#5335 +ipset=/18avx.com/gfwlist +server=/shazam.com/127.0.0.1#5335 +ipset=/shazam.com/gfwlist +server=/huobigroup.com/127.0.0.1#5335 +ipset=/huobigroup.com/gfwlist +server=/eroticbeauties.net/127.0.0.1#5335 +ipset=/eroticbeauties.net/gfwlist +server=/horsedicks.net/127.0.0.1#5335 +ipset=/horsedicks.net/gfwlist +server=/dnsvisa.com/127.0.0.1#5335 +ipset=/dnsvisa.com/gfwlist +server=/appleone.host/127.0.0.1#5335 +ipset=/appleone.host/gfwlist +server=/appleone.guide/127.0.0.1#5335 +ipset=/appleone.guide/gfwlist +server=/paypal-prepagata.com/127.0.0.1#5335 +ipset=/paypal-prepagata.com/gfwlist +server=/terapeack.com/127.0.0.1#5335 +ipset=/terapeack.com/gfwlist +server=/cheapbagshoes.com/127.0.0.1#5335 +ipset=/cheapbagshoes.com/gfwlist +server=/123hplaserjet.com/127.0.0.1#5335 +ipset=/123hplaserjet.com/gfwlist +server=/cdn.jsdelivr.net/127.0.0.1#5335 +ipset=/cdn.jsdelivr.net/gfwlist +server=/appleone.blog/127.0.0.1#5335 +ipset=/appleone.blog/gfwlist +server=/appleone.audio/127.0.0.1#5335 +ipset=/appleone.audio/gfwlist +server=/appletv.wang/127.0.0.1#5335 +ipset=/appletv.wang/gfwlist +server=/shopcustomizedbeats.com/127.0.0.1#5335 +ipset=/shopcustomizedbeats.com/gfwlist +server=/vkmessenger.app/127.0.0.1#5335 +ipset=/vkmessenger.app/gfwlist +server=/appletv.com/127.0.0.1#5335 +ipset=/appletv.com/gfwlist +server=/sevgikurtulmaz.com/127.0.0.1#5335 +ipset=/sevgikurtulmaz.com/gfwlist +server=/kenxxx.com/127.0.0.1#5335 +ipset=/kenxxx.com/gfwlist +server=/redsexhub.com/127.0.0.1#5335 +ipset=/redsexhub.com/gfwlist +server=/paypal-donations.com/127.0.0.1#5335 +ipset=/paypal-donations.com/gfwlist +server=/appleid.berlin/127.0.0.1#5335 +ipset=/appleid.berlin/gfwlist +server=/deeper.com/127.0.0.1#5335 +ipset=/deeper.com/gfwlist +server=/colorfulstage.com/127.0.0.1#5335 +ipset=/colorfulstage.com/gfwlist +server=/microsoft.cz/127.0.0.1#5335 +ipset=/microsoft.cz/gfwlist +server=/lesbianpics.org/127.0.0.1#5335 +ipset=/lesbianpics.org/gfwlist +server=/appleid-iclou.com/127.0.0.1#5335 +ipset=/appleid-iclou.com/gfwlist +server=/appleid-applemx.us/127.0.0.1#5335 +ipset=/appleid-applemx.us/gfwlist +server=/ertk.net/127.0.0.1#5335 +ipset=/ertk.net/gfwlist +server=/the-monster-beats.com/127.0.0.1#5335 +ipset=/the-monster-beats.com/gfwlist +server=/mypornhere.com/127.0.0.1#5335 +ipset=/mypornhere.com/gfwlist +server=/beatswirelesscuffie.com/127.0.0.1#5335 +ipset=/beatswirelesscuffie.com/gfwlist +server=/binance.org/127.0.0.1#5335 +ipset=/binance.org/gfwlist +server=/betternike.com/127.0.0.1#5335 +ipset=/betternike.com/gfwlist +server=/technologyandsociety.org/127.0.0.1#5335 +ipset=/technologyandsociety.org/gfwlist +server=/foxnewsb2b.com/127.0.0.1#5335 +ipset=/foxnewsb2b.com/gfwlist +server=/benaughty.fun/127.0.0.1#5335 +ipset=/benaughty.fun/gfwlist +server=/vfsco.ca/127.0.0.1#5335 +ipset=/vfsco.ca/gfwlist +server=/sexy-babe-pics.com/127.0.0.1#5335 +ipset=/sexy-babe-pics.com/gfwlist +server=/duga.jp/127.0.0.1#5335 +ipset=/duga.jp/gfwlist +server=/facebcook.com/127.0.0.1#5335 +ipset=/facebcook.com/gfwlist +server=/canonproprinters.com/127.0.0.1#5335 +ipset=/canonproprinters.com/gfwlist +server=/beatsbydreonlines-ireland.com/127.0.0.1#5335 +ipset=/beatsbydreonlines-ireland.com/gfwlist +server=/npmjs.com/127.0.0.1#5335 +ipset=/npmjs.com/gfwlist +server=/affect3dstore.com/127.0.0.1#5335 +ipset=/affect3dstore.com/gfwlist +server=/largeporntube.com/127.0.0.1#5335 +ipset=/largeporntube.com/gfwlist +server=/ebay-authenticate.net/127.0.0.1#5335 +ipset=/ebay-authenticate.net/gfwlist +server=/google.co.uk/127.0.0.1#5335 +ipset=/google.co.uk/gfwlist +server=/cuntwars.com/127.0.0.1#5335 +ipset=/cuntwars.com/gfwlist +server=/nationalgeographic.com/127.0.0.1#5335 +ipset=/nationalgeographic.com/gfwlist +server=/amazon.fr/127.0.0.1#5335 +ipset=/amazon.fr/gfwlist +server=/botstop.com/127.0.0.1#5335 +ipset=/botstop.com/gfwlist +server=/arphic.com/127.0.0.1#5335 +ipset=/arphic.com/gfwlist +server=/ibooksauthor.com/127.0.0.1#5335 +ipset=/ibooksauthor.com/gfwlist +server=/wiremoneytoirelandwithxoomeasierandcheaper.com/127.0.0.1#5335 +ipset=/wiremoneytoirelandwithxoomeasierandcheaper.com/gfwlist +server=/wionews.com/127.0.0.1#5335 +ipset=/wionews.com/gfwlist +server=/kindle.com/127.0.0.1#5335 +ipset=/kindle.com/gfwlist +server=/alphabet.no/127.0.0.1#5335 +ipset=/alphabet.no/gfwlist +server=/anon-v.com/127.0.0.1#5335 +ipset=/anon-v.com/gfwlist +server=/bmw.dk/127.0.0.1#5335 +ipset=/bmw.dk/gfwlist +server=/ibook.com/127.0.0.1#5335 +ipset=/ibook.com/gfwlist +server=/ithaisex.com/127.0.0.1#5335 +ipset=/ithaisex.com/gfwlist +server=/magentoliveconference.com/127.0.0.1#5335 +ipset=/magentoliveconference.com/gfwlist +server=/applewallet.com/127.0.0.1#5335 +ipset=/applewallet.com/gfwlist +server=/torrentleen.com/127.0.0.1#5335 +ipset=/torrentleen.com/gfwlist +server=/mywaytopay.info/127.0.0.1#5335 +ipset=/mywaytopay.info/gfwlist +server=/firestonecomercial.com.mx/127.0.0.1#5335 +ipset=/firestonecomercial.com.mx/gfwlist +server=/bondagecomixxx.net/127.0.0.1#5335 +ipset=/bondagecomixxx.net/gfwlist +server=/kmff17.com/127.0.0.1#5335 +ipset=/kmff17.com/gfwlist +server=/applepay.info/127.0.0.1#5335 +ipset=/applepay.info/gfwlist +server=/hentai-books.com/127.0.0.1#5335 +ipset=/hentai-books.com/gfwlist +server=/youtube.co.zw/127.0.0.1#5335 +ipset=/youtube.co.zw/gfwlist +server=/shemaleporntube.tv/127.0.0.1#5335 +ipset=/shemaleporntube.tv/gfwlist +server=/beatsbeatsmonster.com/127.0.0.1#5335 +ipset=/beatsbeatsmonster.com/gfwlist +server=/zind.cloud/127.0.0.1#5335 +ipset=/zind.cloud/gfwlist +server=/easysexporn.com/127.0.0.1#5335 +ipset=/easysexporn.com/gfwlist +server=/apple-pay.com/127.0.0.1#5335 +ipset=/apple-pay.com/gfwlist +server=/needforspeedboost.com/127.0.0.1#5335 +ipset=/needforspeedboost.com/gfwlist +server=/gayboystube.com/127.0.0.1#5335 +ipset=/gayboystube.com/gfwlist +server=/applenews.berlin/127.0.0.1#5335 +ipset=/applenews.berlin/gfwlist +server=/cex.io/127.0.0.1#5335 +ipset=/cex.io/gfwlist +server=/download.visualstudio.microsoft.com/127.0.0.1#5335 +ipset=/download.visualstudio.microsoft.com/gfwlist +server=/pornokrol.com/127.0.0.1#5335 +ipset=/pornokrol.com/gfwlist +server=/nsfwmemes.com/127.0.0.1#5335 +ipset=/nsfwmemes.com/gfwlist +server=/biorxiv.org/127.0.0.1#5335 +ipset=/biorxiv.org/gfwlist +server=/hkopentv.com/127.0.0.1#5335 +ipset=/hkopentv.com/gfwlist +server=/applemusic.wang/127.0.0.1#5335 +ipset=/applemusic.wang/gfwlist +server=/sextreffensite.com/127.0.0.1#5335 +ipset=/sextreffensite.com/gfwlist +server=/espnqa.com/127.0.0.1#5335 +ipset=/espnqa.com/gfwlist +server=/myrewardzone.com/127.0.0.1#5335 +ipset=/myrewardzone.com/gfwlist +server=/beautyandthebeastmusical.co.uk/127.0.0.1#5335 +ipset=/beautyandthebeastmusical.co.uk/gfwlist +server=/applemusic.com/127.0.0.1#5335 +ipset=/applemusic.com/gfwlist +server=/bmw.com.co/127.0.0.1#5335 +ipset=/bmw.com.co/gfwlist +server=/xxxpornzeed.com/127.0.0.1#5335 +ipset=/xxxpornzeed.com/gfwlist +server=/javbangers.com/127.0.0.1#5335 +ipset=/javbangers.com/gfwlist +server=/stackoverflowbusiness.com/127.0.0.1#5335 +ipset=/stackoverflowbusiness.com/gfwlist +server=/applemusic.berlin/127.0.0.1#5335 +ipset=/applemusic.berlin/gfwlist +server=/cheapbeatssale4u.com/127.0.0.1#5335 +ipset=/cheapbeatssale4u.com/gfwlist +server=/rakuten.tw/127.0.0.1#5335 +ipset=/rakuten.tw/gfwlist +server=/verisign.info/127.0.0.1#5335 +ipset=/verisign.info/gfwlist +server=/typekit.net/127.0.0.1#5335 +ipset=/typekit.net/gfwlist +server=/home-made-videos.com/127.0.0.1#5335 +ipset=/home-made-videos.com/gfwlist +server=/fujossy.jp/127.0.0.1#5335 +ipset=/fujossy.jp/gfwlist +server=/blizzcon-a.akamaihd.net/127.0.0.1#5335 +ipset=/blizzcon-a.akamaihd.net/gfwlist +server=/nsimg.net/127.0.0.1#5335 +ipset=/nsimg.net/gfwlist +server=/starwarskids.com/127.0.0.1#5335 +ipset=/starwarskids.com/gfwlist +server=/francecasquebeatssolde.com/127.0.0.1#5335 +ipset=/francecasquebeatssolde.com/gfwlist +server=/ehv.cc/127.0.0.1#5335 +ipset=/ehv.cc/gfwlist +server=/wwwpaypass.com/127.0.0.1#5335 +ipset=/wwwpaypass.com/gfwlist +server=/trycloudflare.com/127.0.0.1#5335 +ipset=/trycloudflare.com/gfwlist +server=/wwwmacbookair.com/127.0.0.1#5335 +ipset=/wwwmacbookair.com/gfwlist +server=/macbooksale.com/127.0.0.1#5335 +ipset=/macbooksale.com/gfwlist +server=/facebook-pmdcenter.org/127.0.0.1#5335 +ipset=/facebook-pmdcenter.org/gfwlist +server=/clipsaoyai.com/127.0.0.1#5335 +ipset=/clipsaoyai.com/gfwlist +server=/gvt3.com/127.0.0.1#5335 +ipset=/gvt3.com/gfwlist +server=/macbookpro.us/127.0.0.1#5335 +ipset=/macbookpro.us/gfwlist +server=/macbookpro.net/127.0.0.1#5335 +ipset=/macbookpro.net/gfwlist +server=/macbookpro.com.au/127.0.0.1#5335 +ipset=/macbookpro.com.au/gfwlist +server=/epochtimes.pl/127.0.0.1#5335 +ipset=/epochtimes.pl/gfwlist +server=/macbookpro.co/127.0.0.1#5335 +ipset=/macbookpro.co/gfwlist +server=/wonporn.net/127.0.0.1#5335 +ipset=/wonporn.net/gfwlist +server=/facebhook.com/127.0.0.1#5335 +ipset=/facebhook.com/gfwlist +server=/macbookair.net/127.0.0.1#5335 +ipset=/macbookair.net/gfwlist +server=/apple.es/127.0.0.1#5335 +ipset=/apple.es/gfwlist +server=/macbookair.es/127.0.0.1#5335 +ipset=/macbookair.es/gfwlist +server=/macbookair.com.au/127.0.0.1#5335 +ipset=/macbookair.com.au/gfwlist +server=/bmwm.com/127.0.0.1#5335 +ipset=/bmwm.com/gfwlist +server=/macbookair.co.kr/127.0.0.1#5335 +ipset=/macbookair.co.kr/gfwlist +server=/redwap-xxx.com/127.0.0.1#5335 +ipset=/redwap-xxx.com/gfwlist +server=/iana.org/127.0.0.1#5335 +ipset=/iana.org/gfwlist +server=/redamateurtube.com/127.0.0.1#5335 +ipset=/redamateurtube.com/gfwlist +server=/blzmedia-a.akamaihd.net/127.0.0.1#5335 +ipset=/blzmedia-a.akamaihd.net/gfwlist +server=/dragonage.com/127.0.0.1#5335 +ipset=/dragonage.com/gfwlist +server=/braintreepayments.org/127.0.0.1#5335 +ipset=/braintreepayments.org/gfwlist +server=/hammerandchisel.ssl.zendesk.com/127.0.0.1#5335 +ipset=/hammerandchisel.ssl.zendesk.com/gfwlist +server=/gfpornbox.com/127.0.0.1#5335 +ipset=/gfpornbox.com/gfwlist +server=/21centuryaccess.com/127.0.0.1#5335 +ipset=/21centuryaccess.com/gfwlist +server=/wwwipodlounge.com/127.0.0.1#5335 +ipset=/wwwipodlounge.com/gfwlist +server=/bmw.be/127.0.0.1#5335 +ipset=/bmw.be/gfwlist +server=/cwcams.com/127.0.0.1#5335 +ipset=/cwcams.com/gfwlist +server=/starfieldtech.com/127.0.0.1#5335 +ipset=/starfieldtech.com/gfwlist +server=/myipod.net/127.0.0.1#5335 +ipset=/myipod.net/gfwlist +server=/bestbuy24x7solutions.com/127.0.0.1#5335 +ipset=/bestbuy24x7solutions.com/gfwlist +server=/zzycdz.com/127.0.0.1#5335 +ipset=/zzycdz.com/gfwlist +server=/thomsonreuters.com.br/127.0.0.1#5335 +ipset=/thomsonreuters.com.br/gfwlist +server=/audiobeatsau.com/127.0.0.1#5335 +ipset=/audiobeatsau.com/gfwlist +server=/ipods.com/127.0.0.1#5335 +ipset=/ipods.com/gfwlist +server=/ipodrocks.com.au/127.0.0.1#5335 +ipset=/ipodrocks.com.au/gfwlist +server=/hplatexknowledgecenter.com/127.0.0.1#5335 +ipset=/hplatexknowledgecenter.com/gfwlist +server=/ipodrip.ca/127.0.0.1#5335 +ipset=/ipodrip.ca/gfwlist +server=/ipodprices.com/127.0.0.1#5335 +ipset=/ipodprices.com/gfwlist +server=/modrinth.com/127.0.0.1#5335 +ipset=/modrinth.com/gfwlist +server=/sourcingforebay.net/127.0.0.1#5335 +ipset=/sourcingforebay.net/gfwlist +server=/allpornsites.net/127.0.0.1#5335 +ipset=/allpornsites.net/gfwlist +server=/ipod.rs/127.0.0.1#5335 +ipset=/ipod.rs/gfwlist +server=/ipod.pk/127.0.0.1#5335 +ipset=/ipod.pk/gfwlist +server=/justporn.com/127.0.0.1#5335 +ipset=/justporn.com/gfwlist +server=/ipod.hk/127.0.0.1#5335 +ipset=/ipod.hk/gfwlist +server=/ipod.gr/127.0.0.1#5335 +ipset=/ipod.gr/gfwlist +server=/ipod.fr/127.0.0.1#5335 +ipset=/ipod.fr/gfwlist +server=/gostosanovinha.com/127.0.0.1#5335 +ipset=/gostosanovinha.com/gfwlist +server=/thinkdifferent.us/127.0.0.1#5335 +ipset=/thinkdifferent.us/gfwlist +server=/coliriodemacho.com.br/127.0.0.1#5335 +ipset=/coliriodemacho.com.br/gfwlist +server=/ipod.de/127.0.0.1#5335 +ipset=/ipod.de/gfwlist +server=/pixiv.net/127.0.0.1#5335 +ipset=/pixiv.net/gfwlist +server=/fastly.net/127.0.0.1#5335 +ipset=/fastly.net/gfwlist +server=/iphone-cd.com/127.0.0.1#5335 +ipset=/iphone-cd.com/gfwlist +server=/canon.com.cy/127.0.0.1#5335 +ipset=/canon.com.cy/gfwlist +server=/vanish.ch/127.0.0.1#5335 +ipset=/vanish.ch/gfwlist +server=/yourmonsterbeats.com/127.0.0.1#5335 +ipset=/yourmonsterbeats.com/gfwlist +server=/sci.hubg.org/127.0.0.1#5335 +ipset=/sci.hubg.org/gfwlist +server=/workers.dev/127.0.0.1#5335 +ipset=/workers.dev/gfwlist +server=/bmw.no/127.0.0.1#5335 +ipset=/bmw.no/gfwlist +server=/cocksuckersguide.com/127.0.0.1#5335 +ipset=/cocksuckersguide.com/gfwlist +server=/foxsportsneworleans.com/127.0.0.1#5335 +ipset=/foxsportsneworleans.com/gfwlist +server=/camdolls.com/127.0.0.1#5335 +ipset=/camdolls.com/gfwlist +server=/steemit.com/127.0.0.1#5335 +ipset=/steemit.com/gfwlist +server=/ipod.com.au/127.0.0.1#5335 +ipset=/ipod.com.au/gfwlist +server=/eamirrorsedge.com/127.0.0.1#5335 +ipset=/eamirrorsedge.com/gfwlist +server=/ipod.co.uk/127.0.0.1#5335 +ipset=/ipod.co.uk/gfwlist +server=/ipod.co/127.0.0.1#5335 +ipset=/ipod.co/gfwlist +server=/igtv.com/127.0.0.1#5335 +ipset=/igtv.com/gfwlist +server=/91rb.net/127.0.0.1#5335 +ipset=/91rb.net/gfwlist +server=/fb.careers/127.0.0.1#5335 +ipset=/fb.careers/gfwlist +server=/sexfilm4free.com/127.0.0.1#5335 +ipset=/sexfilm4free.com/gfwlist +server=/volvobuses.se/127.0.0.1#5335 +ipset=/volvobuses.se/gfwlist +server=/volvopenta.de/127.0.0.1#5335 +ipset=/volvopenta.de/gfwlist +server=/ebuyheadphones.com/127.0.0.1#5335 +ipset=/ebuyheadphones.com/gfwlist +server=/mastercard.com.sg/127.0.0.1#5335 +ipset=/mastercard.com.sg/gfwlist +server=/ipod.ca/127.0.0.1#5335 +ipset=/ipod.ca/gfwlist +server=/palestineremix.com/127.0.0.1#5335 +ipset=/palestineremix.com/gfwlist +server=/mycams.com/127.0.0.1#5335 +ipset=/mycams.com/gfwlist +server=/etvonline.hk/127.0.0.1#5335 +ipset=/etvonline.hk/gfwlist +server=/swingexpert.nl/127.0.0.1#5335 +ipset=/swingexpert.nl/gfwlist +server=/battlefront2.com/127.0.0.1#5335 +ipset=/battlefront2.com/gfwlist +server=/appleclassicipod.com/127.0.0.1#5335 +ipset=/appleclassicipod.com/gfwlist +server=/gannettdigital.com/127.0.0.1#5335 +ipset=/gannettdigital.com/gfwlist +server=/thomsonreuters.com.ar/127.0.0.1#5335 +ipset=/thomsonreuters.com.ar/gfwlist +server=/aplleipods.com/127.0.0.1#5335 +ipset=/aplleipods.com/gfwlist +server=/s2stagehance.com/127.0.0.1#5335 +ipset=/s2stagehance.com/gfwlist +server=/comicscartoonporn.com/127.0.0.1#5335 +ipset=/comicscartoonporn.com/gfwlist +server=/gitlab-static.net/127.0.0.1#5335 +ipset=/gitlab-static.net/gfwlist +server=/bmw-connecteddrive.it/127.0.0.1#5335 +ipset=/bmw-connecteddrive.it/gfwlist +server=/iphonerip.net/127.0.0.1#5335 +ipset=/iphonerip.net/gfwlist +server=/1lib.limited/127.0.0.1#5335 +ipset=/1lib.limited/gfwlist +server=/miniofmonrovia.com/127.0.0.1#5335 +ipset=/miniofmonrovia.com/gfwlist +server=/wireguard.com/127.0.0.1#5335 +ipset=/wireguard.com/gfwlist +server=/newscdn.com.au/127.0.0.1#5335 +ipset=/newscdn.com.au/gfwlist +server=/linetv.tw/127.0.0.1#5335 +ipset=/linetv.tw/gfwlist +server=/hpcustomersupport.net/127.0.0.1#5335 +ipset=/hpcustomersupport.net/gfwlist +server=/iphonegermany.com/127.0.0.1#5335 +ipset=/iphonegermany.com/gfwlist +server=/adobecce.com/127.0.0.1#5335 +ipset=/adobecce.com/gfwlist +server=/durex.cl/127.0.0.1#5335 +ipset=/durex.cl/gfwlist +server=/iphonecases5.com/127.0.0.1#5335 +ipset=/iphonecases5.com/gfwlist +server=/intagrm.com/127.0.0.1#5335 +ipset=/intagrm.com/gfwlist +server=/iphonecase2013.com/127.0.0.1#5335 +ipset=/iphonecase2013.com/gfwlist +server=/iphone5s5case.com/127.0.0.1#5335 +ipset=/iphone5s5case.com/gfwlist +server=/mini.cl/127.0.0.1#5335 +ipset=/mini.cl/gfwlist +server=/xoom.us/127.0.0.1#5335 +ipset=/xoom.us/gfwlist +server=/bronto.com/127.0.0.1#5335 +ipset=/bronto.com/gfwlist +server=/discordstatus.com/127.0.0.1#5335 +ipset=/discordstatus.com/gfwlist +server=/sway-cdn.com/127.0.0.1#5335 +ipset=/sway-cdn.com/gfwlist +server=/bridgestone.co.id/127.0.0.1#5335 +ipset=/bridgestone.co.id/gfwlist +server=/cyber-bay.org/127.0.0.1#5335 +ipset=/cyber-bay.org/gfwlist +server=/megafilmporno.com/127.0.0.1#5335 +ipset=/megafilmporno.com/gfwlist +server=/forzaracingchampionship.com/127.0.0.1#5335 +ipset=/forzaracingchampionship.com/gfwlist +server=/wwwebay.net/127.0.0.1#5335 +ipset=/wwwebay.net/gfwlist +server=/arabysexy.com/127.0.0.1#5335 +ipset=/arabysexy.com/gfwlist +server=/vs-hls-pushb-uk-live.akamaized.net/127.0.0.1#5335 +ipset=/vs-hls-pushb-uk-live.akamaized.net/gfwlist +server=/viu.com/127.0.0.1#5335 +ipset=/viu.com/gfwlist +server=/karupspc.com/127.0.0.1#5335 +ipset=/karupspc.com/gfwlist +server=/iphone.rs/127.0.0.1#5335 +ipset=/iphone.rs/gfwlist +server=/hitomi.la/127.0.0.1#5335 +ipset=/hitomi.la/gfwlist +server=/iphone.pt/127.0.0.1#5335 +ipset=/iphone.pt/gfwlist +server=/opensea.io/127.0.0.1#5335 +ipset=/opensea.io/gfwlist +server=/vipissy.com/127.0.0.1#5335 +ipset=/vipissy.com/gfwlist +server=/awsautoscaling.com/127.0.0.1#5335 +ipset=/awsautoscaling.com/gfwlist +server=/warroom.org/127.0.0.1#5335 +ipset=/warroom.org/gfwlist +server=/ikea.com.au/127.0.0.1#5335 +ipset=/ikea.com.au/gfwlist +server=/uchicago.edu/127.0.0.1#5335 +ipset=/uchicago.edu/gfwlist +server=/iphone.com.gr/127.0.0.1#5335 +ipset=/iphone.com.gr/gfwlist +server=/myminisexdoll.com/127.0.0.1#5335 +ipset=/myminisexdoll.com/gfwlist +server=/scholar.google.co.nz/127.0.0.1#5335 +ipset=/scholar.google.co.nz/gfwlist +server=/realitykings.com/127.0.0.1#5335 +ipset=/realitykings.com/gfwlist +server=/hulupurchase.com/127.0.0.1#5335 +ipset=/hulupurchase.com/gfwlist +server=/drebeatsbydreoutlet.com/127.0.0.1#5335 +ipset=/drebeatsbydreoutlet.com/gfwlist +server=/iphone.com.au/127.0.0.1#5335 +ipset=/iphone.com.au/gfwlist +server=/jpboy1069.net/127.0.0.1#5335 +ipset=/jpboy1069.net/gfwlist +server=/alphassl.com/127.0.0.1#5335 +ipset=/alphassl.com/gfwlist +server=/e-hentai.org/127.0.0.1#5335 +ipset=/e-hentai.org/gfwlist +server=/cdn77.com/127.0.0.1#5335 +ipset=/cdn77.com/gfwlist +server=/sonypicturesstudios.com/127.0.0.1#5335 +ipset=/sonypicturesstudios.com/gfwlist +server=/feacebook.com/127.0.0.1#5335 +ipset=/feacebook.com/gfwlist +server=/ampproject.org/127.0.0.1#5335 +ipset=/ampproject.org/gfwlist +server=/iphone-yh.com/127.0.0.1#5335 +ipset=/iphone-yh.com/gfwlist +server=/iphone-vip3.com/127.0.0.1#5335 +ipset=/iphone-vip3.com/gfwlist +server=/rabbitscams.sex/127.0.0.1#5335 +ipset=/rabbitscams.sex/gfwlist +server=/iphone-vip2.com/127.0.0.1#5335 +ipset=/iphone-vip2.com/gfwlist +server=/nentindo.net/127.0.0.1#5335 +ipset=/nentindo.net/gfwlist +server=/tubxporn.com/127.0.0.1#5335 +ipset=/tubxporn.com/gfwlist +server=/grooby.com/127.0.0.1#5335 +ipset=/grooby.com/gfwlist +server=/iphone-cn.com/127.0.0.1#5335 +ipset=/iphone-cn.com/gfwlist +server=/facfacebook.com/127.0.0.1#5335 +ipset=/facfacebook.com/gfwlist +server=/hf-iphone.com/127.0.0.1#5335 +ipset=/hf-iphone.com/gfwlist +server=/npr.org/127.0.0.1#5335 +ipset=/npr.org/gfwlist +server=/hebiphone.com/127.0.0.1#5335 +ipset=/hebiphone.com/gfwlist +server=/pornvibe.org/127.0.0.1#5335 +ipset=/pornvibe.org/gfwlist +server=/dgaqp.com/127.0.0.1#5335 +ipset=/dgaqp.com/gfwlist +server=/udtrucksmeena.com/127.0.0.1#5335 +ipset=/udtrucksmeena.com/gfwlist +server=/fundaiphone5s.com/127.0.0.1#5335 +ipset=/fundaiphone5s.com/gfwlist +server=/bestjapanesepornsites.com/127.0.0.1#5335 +ipset=/bestjapanesepornsites.com/gfwlist +server=/cloudflarepreview.com/127.0.0.1#5335 +ipset=/cloudflarepreview.com/gfwlist +server=/91porny.com/127.0.0.1#5335 +ipset=/91porny.com/gfwlist +server=/starbucks.de/127.0.0.1#5335 +ipset=/starbucks.de/gfwlist +server=/bowlroll.net/127.0.0.1#5335 +ipset=/bowlroll.net/gfwlist +server=/symcd.com/127.0.0.1#5335 +ipset=/symcd.com/gfwlist +server=/sneakerpage.net/127.0.0.1#5335 +ipset=/sneakerpage.net/gfwlist +server=/perfectgonzo.com/127.0.0.1#5335 +ipset=/perfectgonzo.com/gfwlist +server=/9anime.id/127.0.0.1#5335 +ipset=/9anime.id/gfwlist +server=/ntdtv.co.kr/127.0.0.1#5335 +ipset=/ntdtv.co.kr/gfwlist +server=/bloggrowup.com/127.0.0.1#5335 +ipset=/bloggrowup.com/gfwlist +server=/fbacebook.com/127.0.0.1#5335 +ipset=/fbacebook.com/gfwlist +server=/geek-squad-support.com/127.0.0.1#5335 +ipset=/geek-squad-support.com/gfwlist +server=/businessinsider.sg/127.0.0.1#5335 +ipset=/businessinsider.sg/gfwlist +server=/itunesstore.co/127.0.0.1#5335 +ipset=/itunesstore.co/gfwlist +server=/ipadmini.com.lk/127.0.0.1#5335 +ipset=/ipadmini.com.lk/gfwlist +server=/bbcverticals.com/127.0.0.1#5335 +ipset=/bbcverticals.com/gfwlist +server=/barefootnetworks.com/127.0.0.1#5335 +ipset=/barefootnetworks.com/gfwlist +server=/ipadair.fr/127.0.0.1#5335 +ipset=/ipadair.fr/gfwlist +server=/gettyimages.com.br/127.0.0.1#5335 +ipset=/gettyimages.com.br/gfwlist +server=/minimotoringrewards.com/127.0.0.1#5335 +ipset=/minimotoringrewards.com/gfwlist +server=/howtogetmo.co.uk/127.0.0.1#5335 +ipset=/howtogetmo.co.uk/gfwlist +server=/yandex.lv/127.0.0.1#5335 +ipset=/yandex.lv/gfwlist +server=/analsaga.com/127.0.0.1#5335 +ipset=/analsaga.com/gfwlist +server=/adultgeek.net/127.0.0.1#5335 +ipset=/adultgeek.net/gfwlist +server=/ipadair.com.br/127.0.0.1#5335 +ipset=/ipadair.com.br/gfwlist +server=/scholar.google.com.co/127.0.0.1#5335 +ipset=/scholar.google.com.co/gfwlist +server=/cloudflareresolve.com/127.0.0.1#5335 +ipset=/cloudflareresolve.com/gfwlist +server=/4tube.com/127.0.0.1#5335 +ipset=/4tube.com/gfwlist +server=/mini.co.za/127.0.0.1#5335 +ipset=/mini.co.za/gfwlist +server=/oxfordlawtrove.com/127.0.0.1#5335 +ipset=/oxfordlawtrove.com/gfwlist +server=/xacmbq.xyz/127.0.0.1#5335 +ipset=/xacmbq.xyz/gfwlist +server=/svpply.com/127.0.0.1#5335 +ipset=/svpply.com/gfwlist +server=/ipadair.cm/127.0.0.1#5335 +ipset=/ipadair.cm/gfwlist +server=/electronicarts.fr/127.0.0.1#5335 +ipset=/electronicarts.fr/gfwlist +server=/dukgo.com/127.0.0.1#5335 +ipset=/dukgo.com/gfwlist +server=/zlibcdn.com/127.0.0.1#5335 +ipset=/zlibcdn.com/gfwlist +server=/ipad.host/127.0.0.1#5335 +ipset=/ipad.host/gfwlist +server=/camvideoshub.com/127.0.0.1#5335 +ipset=/camvideoshub.com/gfwlist +server=/pornky.com/127.0.0.1#5335 +ipset=/pornky.com/gfwlist +server=/fbthirdpartypixel.org/127.0.0.1#5335 +ipset=/fbthirdpartypixel.org/gfwlist +server=/steamcdn-a.akamaihd.net/127.0.0.1#5335 +ipset=/steamcdn-a.akamaihd.net/gfwlist +server=/tiresplus.com/127.0.0.1#5335 +ipset=/tiresplus.com/gfwlist +server=/ebaynow.com/127.0.0.1#5335 +ipset=/ebaynow.com/gfwlist +server=/fcacebook.com/127.0.0.1#5335 +ipset=/fcacebook.com/gfwlist +server=/quovadisglobal.com/127.0.0.1#5335 +ipset=/quovadisglobal.com/gfwlist +server=/ebookforipad.com/127.0.0.1#5335 +ipset=/ebookforipad.com/gfwlist +server=/imac.rs/127.0.0.1#5335 +ipset=/imac.rs/gfwlist +server=/kindleproject.com/127.0.0.1#5335 +ipset=/kindleproject.com/gfwlist +server=/futureofbusinesssurvey.org/127.0.0.1#5335 +ipset=/futureofbusinesssurvey.org/gfwlist +server=/itunes.hk/127.0.0.1#5335 +ipset=/itunes.hk/gfwlist +server=/hpofficejetprinter.com/127.0.0.1#5335 +ipset=/hpofficejetprinter.com/gfwlist +server=/bbyurl.us/127.0.0.1#5335 +ipset=/bbyurl.us/gfwlist +server=/monsterbeatsbydre2015.com/127.0.0.1#5335 +ipset=/monsterbeatsbydre2015.com/gfwlist +server=/imac.gr/127.0.0.1#5335 +ipset=/imac.gr/gfwlist +server=/julesjordan.com/127.0.0.1#5335 +ipset=/julesjordan.com/gfwlist +server=/imac.co.nz/127.0.0.1#5335 +ipset=/imac.co.nz/gfwlist +server=/bgr.in/127.0.0.1#5335 +ipset=/bgr.in/gfwlist +server=/ma1lib.org/127.0.0.1#5335 +ipset=/ma1lib.org/gfwlist +server=/hentai-fun.com/127.0.0.1#5335 +ipset=/hentai-fun.com/gfwlist +server=/xxxvideoszoo.com/127.0.0.1#5335 +ipset=/xxxvideoszoo.com/gfwlist +server=/adobeplatinumclub.com/127.0.0.1#5335 +ipset=/adobeplatinumclub.com/gfwlist +server=/apple-imac.com/127.0.0.1#5335 +ipset=/apple-imac.com/gfwlist +server=/osapublishing.org/127.0.0.1#5335 +ipset=/osapublishing.org/gfwlist +server=/appstore.hk/127.0.0.1#5335 +ipset=/appstore.hk/gfwlist +server=/bmwgroupfs.com/127.0.0.1#5335 +ipset=/bmwgroupfs.com/gfwlist +server=/e122475.dscg.akamaiedge.net/127.0.0.1#5335 +ipset=/e122475.dscg.akamaiedge.net/gfwlist +server=/sex-young.com/127.0.0.1#5335 +ipset=/sex-young.com/gfwlist +server=/jmcomic1.mobi/127.0.0.1#5335 +ipset=/jmcomic1.mobi/gfwlist +server=/pvzheroes.com/127.0.0.1#5335 +ipset=/pvzheroes.com/gfwlist +server=/persagg.com/127.0.0.1#5335 +ipset=/persagg.com/gfwlist +server=/appsto.re/127.0.0.1#5335 +ipset=/appsto.re/gfwlist +server=/dungeonkeeper.cn/127.0.0.1#5335 +ipset=/dungeonkeeper.cn/gfwlist +server=/jafgrown.com/127.0.0.1#5335 +ipset=/jafgrown.com/gfwlist +server=/foxporns.com/127.0.0.1#5335 +ipset=/foxporns.com/gfwlist +server=/erotichdworld.com/127.0.0.1#5335 +ipset=/erotichdworld.com/gfwlist +server=/applestorepro.eu/127.0.0.1#5335 +ipset=/applestorepro.eu/gfwlist +server=/handjobhub.com/127.0.0.1#5335 +ipset=/handjobhub.com/gfwlist +server=/applestore.net/127.0.0.1#5335 +ipset=/applestore.net/gfwlist +server=/imtagram.com/127.0.0.1#5335 +ipset=/imtagram.com/gfwlist +server=/applestore.kr/127.0.0.1#5335 +ipset=/applestore.kr/gfwlist +server=/applestore.hk/127.0.0.1#5335 +ipset=/applestore.hk/gfwlist +server=/applestore.com.sn/127.0.0.1#5335 +ipset=/applestore.com.sn/gfwlist +server=/bmw-motorrad.co.kr/127.0.0.1#5335 +ipset=/bmw-motorrad.co.kr/gfwlist +server=/microsoftsilverlight.net/127.0.0.1#5335 +ipset=/microsoftsilverlight.net/gfwlist +server=/tiny4k.com/127.0.0.1#5335 +ipset=/tiny4k.com/gfwlist +server=/i-mobile.co.jp/127.0.0.1#5335 +ipset=/i-mobile.co.jp/gfwlist +server=/applestore.com.ph/127.0.0.1#5335 +ipset=/applestore.com.ph/gfwlist +server=/applestore.com.jo/127.0.0.1#5335 +ipset=/applestore.com.jo/gfwlist +server=/applestore.com.hr/127.0.0.1#5335 +ipset=/applestore.com.hr/gfwlist +server=/applestore.com.gr/127.0.0.1#5335 +ipset=/applestore.com.gr/gfwlist +server=/kkbox.com.tw/127.0.0.1#5335 +ipset=/kkbox.com.tw/gfwlist +server=/mtao.fun/127.0.0.1#5335 +ipset=/mtao.fun/gfwlist +server=/severeporn.com/127.0.0.1#5335 +ipset=/severeporn.com/gfwlist +server=/applestore.com/127.0.0.1#5335 +ipset=/applestore.com/gfwlist +server=/matrix.org/127.0.0.1#5335 +ipset=/matrix.org/gfwlist +server=/froogle.com/127.0.0.1#5335 +ipset=/froogle.com/gfwlist +server=/apisof.net/127.0.0.1#5335 +ipset=/apisof.net/gfwlist +server=/pornbrb.com/127.0.0.1#5335 +ipset=/pornbrb.com/gfwlist +server=/nikehightops.com/127.0.0.1#5335 +ipset=/nikehightops.com/gfwlist +server=/volvogroup.be/127.0.0.1#5335 +ipset=/volvogroup.be/gfwlist +server=/icloudmail.net/127.0.0.1#5335 +ipset=/icloudmail.net/gfwlist +server=/whatsapp.net/127.0.0.1#5335 +ipset=/whatsapp.net/gfwlist +server=/paypal.jp/127.0.0.1#5335 +ipset=/paypal.jp/gfwlist +server=/apple-store.net/127.0.0.1#5335 +ipset=/apple-store.net/gfwlist +server=/mypearsonenglish.ch/127.0.0.1#5335 +ipset=/mypearsonenglish.ch/gfwlist +server=/msocsp.com/127.0.0.1#5335 +ipset=/msocsp.com/gfwlist +server=/uusexdoll.com/127.0.0.1#5335 +ipset=/uusexdoll.com/gfwlist +server=/apple.xn--fiqs8s/127.0.0.1#5335 +ipset=/apple.xn--fiqs8s/gfwlist +server=/apple.xn--czr694b/127.0.0.1#5335 +ipset=/apple.xn--czr694b/gfwlist +server=/youtube.cat/127.0.0.1#5335 +ipset=/youtube.cat/gfwlist +server=/finish.ro/127.0.0.1#5335 +ipset=/finish.ro/gfwlist +server=/apple.tw/127.0.0.1#5335 +ipset=/apple.tw/gfwlist +server=/ikea.do/127.0.0.1#5335 +ipset=/ikea.do/gfwlist +server=/bayareabmw.com/127.0.0.1#5335 +ipset=/bayareabmw.com/gfwlist +server=/youtube.lk/127.0.0.1#5335 +ipset=/youtube.lk/gfwlist +server=/porn62.com/127.0.0.1#5335 +ipset=/porn62.com/gfwlist +server=/longtailvideo.com/127.0.0.1#5335 +ipset=/longtailvideo.com/gfwlist +server=/minibrossard.ca/127.0.0.1#5335 +ipset=/minibrossard.ca/gfwlist +server=/apple.tt/127.0.0.1#5335 +ipset=/apple.tt/gfwlist +server=/apple.so/127.0.0.1#5335 +ipset=/apple.so/gfwlist +server=/facebdok.com/127.0.0.1#5335 +ipset=/facebdok.com/gfwlist +server=/apple.sk/127.0.0.1#5335 +ipset=/apple.sk/gfwlist +server=/instagy.com/127.0.0.1#5335 +ipset=/instagy.com/gfwlist +server=/appledaily.hk/127.0.0.1#5335 +ipset=/appledaily.hk/gfwlist +server=/charlotte-anime.jp/127.0.0.1#5335 +ipset=/charlotte-anime.jp/gfwlist +server=/bmw-motorcycle.com/127.0.0.1#5335 +ipset=/bmw-motorcycle.com/gfwlist +server=/verpeliculasporno.gratis/127.0.0.1#5335 +ipset=/verpeliculasporno.gratis/gfwlist +server=/apple.rs/127.0.0.1#5335 +ipset=/apple.rs/gfwlist +server=/xxxvideo.vip/127.0.0.1#5335 +ipset=/xxxvideo.vip/gfwlist +server=/apple.pl/127.0.0.1#5335 +ipset=/apple.pl/gfwlist +server=/beatsforcheap-usa.com/127.0.0.1#5335 +ipset=/beatsforcheap-usa.com/gfwlist +server=/disney.co.il/127.0.0.1#5335 +ipset=/disney.co.il/gfwlist +server=/apple.net.gr/127.0.0.1#5335 +ipset=/apple.net.gr/gfwlist +server=/fanaken.com/127.0.0.1#5335 +ipset=/fanaken.com/gfwlist +server=/petitehdporn.com/127.0.0.1#5335 +ipset=/petitehdporn.com/gfwlist +server=/tg.dev/127.0.0.1#5335 +ipset=/tg.dev/gfwlist +server=/volvotrucks.co.na/127.0.0.1#5335 +ipset=/volvotrucks.co.na/gfwlist +server=/dynacw.co.jp/127.0.0.1#5335 +ipset=/dynacw.co.jp/gfwlist +server=/geeksquadforums.com/127.0.0.1#5335 +ipset=/geeksquadforums.com/gfwlist +server=/apple.lv/127.0.0.1#5335 +ipset=/apple.lv/gfwlist +server=/d100.net/127.0.0.1#5335 +ipset=/d100.net/gfwlist +server=/apple.lt/127.0.0.1#5335 +ipset=/apple.lt/gfwlist +server=/apple.jp/127.0.0.1#5335 +ipset=/apple.jp/gfwlist +server=/beatsbydresdanmark.net/127.0.0.1#5335 +ipset=/beatsbydresdanmark.net/gfwlist +server=/login-paypal.com/127.0.0.1#5335 +ipset=/login-paypal.com/gfwlist +server=/ultimaforever.com/127.0.0.1#5335 +ipset=/ultimaforever.com/gfwlist +server=/bigboobsonline.org/127.0.0.1#5335 +ipset=/bigboobsonline.org/gfwlist +server=/mediasama.com/127.0.0.1#5335 +ipset=/mediasama.com/gfwlist +server=/minitroisrivieres.ca/127.0.0.1#5335 +ipset=/minitroisrivieres.ca/gfwlist +server=/pearsoncred.com/127.0.0.1#5335 +ipset=/pearsoncred.com/gfwlist +server=/mypornvid.fun/127.0.0.1#5335 +ipset=/mypornvid.fun/gfwlist +server=/opengw.net/127.0.0.1#5335 +ipset=/opengw.net/gfwlist +server=/makeeu.com/127.0.0.1#5335 +ipset=/makeeu.com/gfwlist +server=/mybeatscheapbydre.com/127.0.0.1#5335 +ipset=/mybeatscheapbydre.com/gfwlist +server=/macbookair.kr/127.0.0.1#5335 +ipset=/macbookair.kr/gfwlist +server=/lp99.pw/127.0.0.1#5335 +ipset=/lp99.pw/gfwlist +server=/ieeeaps.org/127.0.0.1#5335 +ipset=/ieeeaps.org/gfwlist +server=/faptitans.com/127.0.0.1#5335 +ipset=/faptitans.com/gfwlist +server=/fecebook.net/127.0.0.1#5335 +ipset=/fecebook.net/gfwlist +server=/apple.co.mz/127.0.0.1#5335 +ipset=/apple.co.mz/gfwlist +server=/dotfacebook.net/127.0.0.1#5335 +ipset=/dotfacebook.net/gfwlist +server=/yinac.xyz/127.0.0.1#5335 +ipset=/yinac.xyz/gfwlist +server=/digitaloceanspaces.com/127.0.0.1#5335 +ipset=/digitaloceanspaces.com/gfwlist +server=/rewrite-anime.tv/127.0.0.1#5335 +ipset=/rewrite-anime.tv/gfwlist +server=/epochtimes.co.il/127.0.0.1#5335 +ipset=/epochtimes.co.il/gfwlist +server=/boyvid.com/127.0.0.1#5335 +ipset=/boyvid.com/gfwlist +server=/apple.co.cr/127.0.0.1#5335 +ipset=/apple.co.cr/gfwlist +server=/pornfinder.biz/127.0.0.1#5335 +ipset=/pornfinder.biz/gfwlist +server=/bridgestoneamericas.com/127.0.0.1#5335 +ipset=/bridgestoneamericas.com/gfwlist +server=/assetsadobe.com/127.0.0.1#5335 +ipset=/assetsadobe.com/gfwlist +server=/momami18.livedoor.blog/127.0.0.1#5335 +ipset=/momami18.livedoor.blog/gfwlist +server=/avxlive.icu/127.0.0.1#5335 +ipset=/avxlive.icu/gfwlist +server=/aboutfacebook.com/127.0.0.1#5335 +ipset=/aboutfacebook.com/gfwlist +server=/air-nike-shoes.com/127.0.0.1#5335 +ipset=/air-nike-shoes.com/gfwlist +server=/etviet.com/127.0.0.1#5335 +ipset=/etviet.com/gfwlist +server=/verisign.tw/127.0.0.1#5335 +ipset=/verisign.tw/gfwlist +server=/oxfordmedicine.com/127.0.0.1#5335 +ipset=/oxfordmedicine.com/gfwlist +server=/ruleporn.com/127.0.0.1#5335 +ipset=/ruleporn.com/gfwlist +server=/ebay.ca/127.0.0.1#5335 +ipset=/ebay.ca/gfwlist +server=/the-tls.co.uk/127.0.0.1#5335 +ipset=/the-tls.co.uk/gfwlist +server=/logitech.io/127.0.0.1#5335 +ipset=/logitech.io/gfwlist +server=/pornhoho.com/127.0.0.1#5335 +ipset=/pornhoho.com/gfwlist +server=/itunesu.com/127.0.0.1#5335 +ipset=/itunesu.com/gfwlist +server=/humblebundle.com/127.0.0.1#5335 +ipset=/humblebundle.com/gfwlist +server=/punishworld.com/127.0.0.1#5335 +ipset=/punishworld.com/gfwlist +server=/itunesradio.tv/127.0.0.1#5335 +ipset=/itunesradio.tv/gfwlist +server=/verisign.us/127.0.0.1#5335 +ipset=/verisign.us/gfwlist +server=/rumble.com/127.0.0.1#5335 +ipset=/rumble.com/gfwlist +server=/itunesradio.rio/127.0.0.1#5335 +ipset=/itunesradio.rio/gfwlist +server=/itunesradio.com/127.0.0.1#5335 +ipset=/itunesradio.com/gfwlist +server=/ituneslatino.com/127.0.0.1#5335 +ipset=/ituneslatino.com/gfwlist +server=/yahoo.com.gi/127.0.0.1#5335 +ipset=/yahoo.com.gi/gfwlist +server=/itunesiradio.com/127.0.0.1#5335 +ipset=/itunesiradio.com/gfwlist +server=/bmw-connecteddrive.si/127.0.0.1#5335 +ipset=/bmw-connecteddrive.si/gfwlist +server=/itunes.rio/127.0.0.1#5335 +ipset=/itunes.rio/gfwlist +server=/imgurinc.com/127.0.0.1#5335 +ipset=/imgurinc.com/gfwlist +server=/alphera.de/127.0.0.1#5335 +ipset=/alphera.de/gfwlist +server=/tubsexer.com/127.0.0.1#5335 +ipset=/tubsexer.com/gfwlist +server=/mini.pt/127.0.0.1#5335 +ipset=/mini.pt/gfwlist +server=/myfoxsanfran.com/127.0.0.1#5335 +ipset=/myfoxsanfran.com/gfwlist +server=/baraero.com/127.0.0.1#5335 +ipset=/baraero.com/gfwlist +server=/vklive.app/127.0.0.1#5335 +ipset=/vklive.app/gfwlist +server=/hpeprintcenter.com/127.0.0.1#5335 +ipset=/hpeprintcenter.com/gfwlist +server=/myfoxdfw.com/127.0.0.1#5335 +ipset=/myfoxdfw.com/gfwlist +server=/quantil.com/127.0.0.1#5335 +ipset=/quantil.com/gfwlist +server=/itunes.co.th/127.0.0.1#5335 +ipset=/itunes.co.th/gfwlist +server=/javporn.ws/127.0.0.1#5335 +ipset=/javporn.ws/gfwlist +server=/mmdnn.com/127.0.0.1#5335 +ipset=/mmdnn.com/gfwlist +server=/google.com.sb/127.0.0.1#5335 +ipset=/google.com.sb/gfwlist +server=/fi11av1.com/127.0.0.1#5335 +ipset=/fi11av1.com/gfwlist +server=/realtype.jp/127.0.0.1#5335 +ipset=/realtype.jp/gfwlist +server=/mini.com.mx/127.0.0.1#5335 +ipset=/mini.com.mx/gfwlist +server=/livesex.com/127.0.0.1#5335 +ipset=/livesex.com/gfwlist +server=/itun.es/127.0.0.1#5335 +ipset=/itun.es/gfwlist +server=/pixfs.net/127.0.0.1#5335 +ipset=/pixfs.net/gfwlist +server=/12joursdecadeauxdeitunes.com/127.0.0.1#5335 +ipset=/12joursdecadeauxdeitunes.com/gfwlist +server=/hk1lib.org/127.0.0.1#5335 +ipset=/hk1lib.org/gfwlist +server=/12diasderegalosdeitunes.hn/127.0.0.1#5335 +ipset=/12diasderegalosdeitunes.hn/gfwlist +server=/disneyredirects.com/127.0.0.1#5335 +ipset=/disneyredirects.com/gfwlist +server=/hairynature.com/127.0.0.1#5335 +ipset=/hairynature.com/gfwlist +server=/pornovideoshub.com/127.0.0.1#5335 +ipset=/pornovideoshub.com/gfwlist +server=/cheapbeatsbydr.com/127.0.0.1#5335 +ipset=/cheapbeatsbydr.com/gfwlist +server=/fecbooc.com/127.0.0.1#5335 +ipset=/fecbooc.com/gfwlist +server=/wsjshop.com/127.0.0.1#5335 +ipset=/wsjshop.com/gfwlist +server=/12diasderegalosdeitunes.cr/127.0.0.1#5335 +ipset=/12diasderegalosdeitunes.cr/gfwlist +server=/originalindianporn.com/127.0.0.1#5335 +ipset=/originalindianporn.com/gfwlist +server=/beatsbydrefrcasquepascher.com/127.0.0.1#5335 +ipset=/beatsbydrefrcasquepascher.com/gfwlist +server=/xxbrits.com/127.0.0.1#5335 +ipset=/xxbrits.com/gfwlist +server=/fetishshrine.com/127.0.0.1#5335 +ipset=/fetishshrine.com/gfwlist +server=/sinoinsider.com/127.0.0.1#5335 +ipset=/sinoinsider.com/gfwlist +server=/12diasderegalosdeitunes.cl/127.0.0.1#5335 +ipset=/12diasderegalosdeitunes.cl/gfwlist +server=/foxnews.com/127.0.0.1#5335 +ipset=/foxnews.com/gfwlist +server=/iloveprettylolimm.com/127.0.0.1#5335 +ipset=/iloveprettylolimm.com/gfwlist +server=/mylcloud.net/127.0.0.1#5335 +ipset=/mylcloud.net/gfwlist +server=/ingkacentres.com/127.0.0.1#5335 +ipset=/ingkacentres.com/gfwlist +server=/easportsfootballclub.com/127.0.0.1#5335 +ipset=/easportsfootballclub.com/gfwlist +server=/prepsure.com/127.0.0.1#5335 +ipset=/prepsure.com/gfwlist +server=/myicloud.net/127.0.0.1#5335 +ipset=/myicloud.net/gfwlist +server=/myferrariheadphones.com/127.0.0.1#5335 +ipset=/myferrariheadphones.com/gfwlist +server=/disneyplus.com.ssl.sc.omtrdc.net/127.0.0.1#5335 +ipset=/disneyplus.com.ssl.sc.omtrdc.net/gfwlist +server=/de1lib.org/127.0.0.1#5335 +ipset=/de1lib.org/gfwlist +server=/icloudsecure.net/127.0.0.1#5335 +ipset=/icloudsecure.net/gfwlist +server=/multporn.net/127.0.0.1#5335 +ipset=/multporn.net/gfwlist +server=/globalsign.be/127.0.0.1#5335 +ipset=/globalsign.be/gfwlist +server=/storesense.com/127.0.0.1#5335 +ipset=/storesense.com/gfwlist +server=/youtubego.com/127.0.0.1#5335 +ipset=/youtubego.com/gfwlist +server=/foxnews.org/127.0.0.1#5335 +ipset=/foxnews.org/gfwlist +server=/directv.com/127.0.0.1#5335 +ipset=/directv.com/gfwlist +server=/macbookpros.com/127.0.0.1#5335 +ipset=/macbookpros.com/gfwlist +server=/freebdsmxxx.org/127.0.0.1#5335 +ipset=/freebdsmxxx.org/gfwlist +server=/arzon.jp/127.0.0.1#5335 +ipset=/arzon.jp/gfwlist +server=/youtube.com.ee/127.0.0.1#5335 +ipset=/youtube.com.ee/gfwlist +server=/yahoo.com.fj/127.0.0.1#5335 +ipset=/yahoo.com.fj/gfwlist +server=/microad.jp/127.0.0.1#5335 +ipset=/microad.jp/gfwlist +server=/foxdigitalmovies.com/127.0.0.1#5335 +ipset=/foxdigitalmovies.com/gfwlist +server=/veet.at/127.0.0.1#5335 +ipset=/veet.at/gfwlist +server=/icloudnet.net/127.0.0.1#5335 +ipset=/icloudnet.net/gfwlist +server=/icloudbrowser.net/127.0.0.1#5335 +ipset=/icloudbrowser.net/gfwlist +server=/facebook.hu/127.0.0.1#5335 +ipset=/facebook.hu/gfwlist +server=/icloud.vn/127.0.0.1#5335 +ipset=/icloud.vn/gfwlist +server=/sexsex1.com/127.0.0.1#5335 +ipset=/sexsex1.com/gfwlist +server=/disneymagicmoments.co.il/127.0.0.1#5335 +ipset=/disneymagicmoments.co.il/gfwlist +server=/hotamateurblowjobs.com/127.0.0.1#5335 +ipset=/hotamateurblowjobs.com/gfwlist +server=/girlspoopingtube.com/127.0.0.1#5335 +ipset=/girlspoopingtube.com/gfwlist +server=/icloud.pt/127.0.0.1#5335 +ipset=/icloud.pt/gfwlist +server=/avstar03.me/127.0.0.1#5335 +ipset=/avstar03.me/gfwlist +server=/icloud.om/127.0.0.1#5335 +ipset=/icloud.om/gfwlist +server=/vrcams.io/127.0.0.1#5335 +ipset=/vrcams.io/gfwlist +server=/icloud.ie/127.0.0.1#5335 +ipset=/icloud.ie/gfwlist +server=/canon.dk/127.0.0.1#5335 +ipset=/canon.dk/gfwlist +server=/henti-night.com/127.0.0.1#5335 +ipset=/henti-night.com/gfwlist +server=/mastercard.co.jp/127.0.0.1#5335 +ipset=/mastercard.co.jp/gfwlist +server=/older-women-movies.com/127.0.0.1#5335 +ipset=/older-women-movies.com/gfwlist +server=/instawank.com/127.0.0.1#5335 +ipset=/instawank.com/gfwlist +server=/mi9.com.au/127.0.0.1#5335 +ipset=/mi9.com.au/gfwlist +server=/supportfacebook.com/127.0.0.1#5335 +ipset=/supportfacebook.com/gfwlist +server=/bmw-connecteddrive.de/127.0.0.1#5335 +ipset=/bmw-connecteddrive.de/gfwlist +server=/vrsmash.com/127.0.0.1#5335 +ipset=/vrsmash.com/gfwlist +server=/alljapanesepass.com/127.0.0.1#5335 +ipset=/alljapanesepass.com/gfwlist +server=/mask-h2.icloud.com/127.0.0.1#5335 +ipset=/mask-h2.icloud.com/gfwlist +server=/facecook.com/127.0.0.1#5335 +ipset=/facecook.com/gfwlist +server=/scp-wiki.net/127.0.0.1#5335 +ipset=/scp-wiki.net/gfwlist +server=/wholesalefine.com/127.0.0.1#5335 +ipset=/wholesalefine.com/gfwlist +server=/bmwi.ca/127.0.0.1#5335 +ipset=/bmwi.ca/gfwlist +server=/wholesale-exporter1.com/127.0.0.1#5335 +ipset=/wholesale-exporter1.com/gfwlist +server=/digicert-validation.com/127.0.0.1#5335 +ipset=/digicert-validation.com/gfwlist +server=/kyurem.com/127.0.0.1#5335 +ipset=/kyurem.com/gfwlist +server=/foxsports-chicago.com/127.0.0.1#5335 +ipset=/foxsports-chicago.com/gfwlist +server=/canon.com.hk/127.0.0.1#5335 +ipset=/canon.com.hk/gfwlist +server=/hellosmartbook.com/127.0.0.1#5335 +ipset=/hellosmartbook.com/gfwlist +server=/online-instagram.com/127.0.0.1#5335 +ipset=/online-instagram.com/gfwlist +server=/alphera.my/127.0.0.1#5335 +ipset=/alphera.my/gfwlist +server=/nervanasys.com/127.0.0.1#5335 +ipset=/nervanasys.com/gfwlist +server=/advancediddetection.com/127.0.0.1#5335 +ipset=/advancediddetection.com/gfwlist +server=/xboxplayanywhere.com/127.0.0.1#5335 +ipset=/xboxplayanywhere.com/gfwlist +server=/vimeo-staging2.com/127.0.0.1#5335 +ipset=/vimeo-staging2.com/gfwlist +server=/18comic.org/127.0.0.1#5335 +ipset=/18comic.org/gfwlist +server=/pornburger.com/127.0.0.1#5335 +ipset=/pornburger.com/gfwlist +server=/gofuckmenow.com/127.0.0.1#5335 +ipset=/gofuckmenow.com/gfwlist +server=/adidas.ie/127.0.0.1#5335 +ipset=/adidas.ie/gfwlist +server=/bmw.gr/127.0.0.1#5335 +ipset=/bmw.gr/gfwlist +server=/voashona.com/127.0.0.1#5335 +ipset=/voashona.com/gfwlist +server=/fcebookk.com/127.0.0.1#5335 +ipset=/fcebookk.com/gfwlist +server=/google.gy/127.0.0.1#5335 +ipset=/google.gy/gfwlist +server=/volvogroup.com/127.0.0.1#5335 +ipset=/volvogroup.com/gfwlist +server=/bloombergbreakaway.com/127.0.0.1#5335 +ipset=/bloombergbreakaway.com/gfwlist +server=/volvotrucks.ae/127.0.0.1#5335 +ipset=/volvotrucks.ae/gfwlist +server=/adultsextoys.com/127.0.0.1#5335 +ipset=/adultsextoys.com/gfwlist +server=/akiba-online.com/127.0.0.1#5335 +ipset=/akiba-online.com/gfwlist +server=/beibao.com/127.0.0.1#5335 +ipset=/beibao.com/gfwlist +server=/faccebookk.com/127.0.0.1#5335 +ipset=/faccebookk.com/gfwlist +server=/www-facebook.com/127.0.0.1#5335 +ipset=/www-facebook.com/gfwlist +server=/pearsonclinical.dk/127.0.0.1#5335 +ipset=/pearsonclinical.dk/gfwlist +server=/eanordic.com/127.0.0.1#5335 +ipset=/eanordic.com/gfwlist +server=/dynamics.com/127.0.0.1#5335 +ipset=/dynamics.com/gfwlist +server=/bmwshop.ca/127.0.0.1#5335 +ipset=/bmwshop.ca/gfwlist +server=/sulwerphoto.com/127.0.0.1#5335 +ipset=/sulwerphoto.com/gfwlist +server=/couriermail.com.au/127.0.0.1#5335 +ipset=/couriermail.com.au/gfwlist +server=/freebigmovies.com/127.0.0.1#5335 +ipset=/freebigmovies.com/gfwlist +server=/specialtyheadphones.com/127.0.0.1#5335 +ipset=/specialtyheadphones.com/gfwlist +server=/mastercard.ke/127.0.0.1#5335 +ipset=/mastercard.ke/gfwlist +server=/xbeegtube.com/127.0.0.1#5335 +ipset=/xbeegtube.com/gfwlist +server=/solostudioksale.com/127.0.0.1#5335 +ipset=/solostudioksale.com/gfwlist +server=/gotgayporn.com/127.0.0.1#5335 +ipset=/gotgayporn.com/gfwlist +server=/mini.es/127.0.0.1#5335 +ipset=/mini.es/gfwlist +server=/mini-egypt.com/127.0.0.1#5335 +ipset=/mini-egypt.com/gfwlist +server=/sneaker666.com/127.0.0.1#5335 +ipset=/sneaker666.com/gfwlist +server=/shoppinguheadphones.com/127.0.0.1#5335 +ipset=/shoppinguheadphones.com/gfwlist +server=/webtype.com/127.0.0.1#5335 +ipset=/webtype.com/gfwlist +server=/pinterest.com.mx/127.0.0.1#5335 +ipset=/pinterest.com.mx/gfwlist +server=/bmw-motorrad.sv/127.0.0.1#5335 +ipset=/bmw-motorrad.sv/gfwlist +server=/gallery-dump.club/127.0.0.1#5335 +ipset=/gallery-dump.club/gfwlist +server=/shop-headphones.net/127.0.0.1#5335 +ipset=/shop-headphones.net/gfwlist +server=/myrz.com/127.0.0.1#5335 +ipset=/myrz.com/gfwlist +server=/femscat.com/127.0.0.1#5335 +ipset=/femscat.com/gfwlist +server=/volvobuses.es/127.0.0.1#5335 +ipset=/volvobuses.es/gfwlist +server=/shoestop2.com/127.0.0.1#5335 +ipset=/shoestop2.com/gfwlist +server=/sanvaras.com/127.0.0.1#5335 +ipset=/sanvaras.com/gfwlist +server=/spoti.fi/127.0.0.1#5335 +ipset=/spoti.fi/gfwlist +server=/mini.com.mo/127.0.0.1#5335 +ipset=/mini.com.mo/gfwlist +server=/como-hackearfacebook.com/127.0.0.1#5335 +ipset=/como-hackearfacebook.com/gfwlist +server=/chloesworld.com/127.0.0.1#5335 +ipset=/chloesworld.com/gfwlist +server=/repsneakermall.com/127.0.0.1#5335 +ipset=/repsneakermall.com/gfwlist +server=/prostudiobeatscybersale.com/127.0.0.1#5335 +ipset=/prostudiobeatscybersale.com/gfwlist +server=/haori888.com/127.0.0.1#5335 +ipset=/haori888.com/gfwlist +server=/mini-bosnia.com/127.0.0.1#5335 +ipset=/mini-bosnia.com/gfwlist +server=/flatmates.com.au/127.0.0.1#5335 +ipset=/flatmates.com.au/gfwlist +server=/powerbeatsbydre.com/127.0.0.1#5335 +ipset=/powerbeatsbydre.com/gfwlist +server=/powerbeatsbydrdre.com/127.0.0.1#5335 +ipset=/powerbeatsbydrdre.com/gfwlist +server=/bamgrid.com/127.0.0.1#5335 +ipset=/bamgrid.com/gfwlist +server=/pocketbiketrader.com/127.0.0.1#5335 +ipset=/pocketbiketrader.com/gfwlist +server=/iporntv.net/127.0.0.1#5335 +ipset=/iporntv.net/gfwlist +server=/pillbeatsblackfridaysale.com/127.0.0.1#5335 +ipset=/pillbeatsblackfridaysale.com/gfwlist +server=/pickshoesclothes.com/127.0.0.1#5335 +ipset=/pickshoesclothes.com/gfwlist +server=/picknicekicks.net/127.0.0.1#5335 +ipset=/picknicekicks.net/gfwlist +server=/personeelsland.com/127.0.0.1#5335 +ipset=/personeelsland.com/gfwlist +server=/monsterbeatssalg.com/127.0.0.1#5335 +ipset=/monsterbeatssalg.com/gfwlist +server=/breitbart.com/127.0.0.1#5335 +ipset=/breitbart.com/gfwlist +server=/pugetsoundbmw.com/127.0.0.1#5335 +ipset=/pugetsoundbmw.com/gfwlist +server=/cmu.edu/127.0.0.1#5335 +ipset=/cmu.edu/gfwlist +server=/edx.org/127.0.0.1#5335 +ipset=/edx.org/gfwlist +server=/javprice.com/127.0.0.1#5335 +ipset=/javprice.com/gfwlist +server=/mastercard-email.com/127.0.0.1#5335 +ipset=/mastercard-email.com/gfwlist +server=/zee5.tv/127.0.0.1#5335 +ipset=/zee5.tv/gfwlist +server=/officialbeatsbydrestore.com/127.0.0.1#5335 +ipset=/officialbeatsbydrestore.com/gfwlist +server=/mega.nz/127.0.0.1#5335 +ipset=/mega.nz/gfwlist +server=/disquscdn.com/127.0.0.1#5335 +ipset=/disquscdn.com/gfwlist +server=/theclasshroom.com/127.0.0.1#5335 +ipset=/theclasshroom.com/gfwlist +server=/bmw.fi/127.0.0.1#5335 +ipset=/bmw.fi/gfwlist +server=/newlysprung.net/127.0.0.1#5335 +ipset=/newlysprung.net/gfwlist +server=/ficeboock.com/127.0.0.1#5335 +ipset=/ficeboock.com/gfwlist +server=/xdsummit.com/127.0.0.1#5335 +ipset=/xdsummit.com/gfwlist +server=/thetvdb.com/127.0.0.1#5335 +ipset=/thetvdb.com/gfwlist +server=/1lib.domains/127.0.0.1#5335 +ipset=/1lib.domains/gfwlist +server=/acgnmanhua.com/127.0.0.1#5335 +ipset=/acgnmanhua.com/gfwlist +server=/newbemany.com/127.0.0.1#5335 +ipset=/newbemany.com/gfwlist +server=/bmwmotorrad.com.ph/127.0.0.1#5335 +ipset=/bmwmotorrad.com.ph/gfwlist +server=/atkgallery.com/127.0.0.1#5335 +ipset=/atkgallery.com/gfwlist +server=/cheapbeatsbydre99.com/127.0.0.1#5335 +ipset=/cheapbeatsbydre99.com/gfwlist +server=/negozimonsterbeats.com/127.0.0.1#5335 +ipset=/negozimonsterbeats.com/gfwlist +server=/zohostatic.com/127.0.0.1#5335 +ipset=/zohostatic.com/gfwlist +server=/paypalnet.org/127.0.0.1#5335 +ipset=/paypalnet.org/gfwlist +server=/skyassets.com/127.0.0.1#5335 +ipset=/skyassets.com/gfwlist +server=/bmwmuseum.net/127.0.0.1#5335 +ipset=/bmwmuseum.net/gfwlist +server=/bmw-arts-design.com/127.0.0.1#5335 +ipset=/bmw-arts-design.com/gfwlist +server=/neborder.com/127.0.0.1#5335 +ipset=/neborder.com/gfwlist +server=/cool18.com/127.0.0.1#5335 +ipset=/cool18.com/gfwlist +server=/apple.eu/127.0.0.1#5335 +ipset=/apple.eu/gfwlist +server=/disney.co.th/127.0.0.1#5335 +ipset=/disney.co.th/gfwlist +server=/facecook.org/127.0.0.1#5335 +ipset=/facecook.org/gfwlist +server=/bioporno.com/127.0.0.1#5335 +ipset=/bioporno.com/gfwlist +server=/mini.rs/127.0.0.1#5335 +ipset=/mini.rs/gfwlist +server=/starbucks.es/127.0.0.1#5335 +ipset=/starbucks.es/gfwlist +server=/ms4dre.com/127.0.0.1#5335 +ipset=/ms4dre.com/gfwlist +server=/google.ae/127.0.0.1#5335 +ipset=/google.ae/gfwlist +server=/ccav69.me/127.0.0.1#5335 +ipset=/ccav69.me/gfwlist +server=/goldcoastbulletin.com.au/127.0.0.1#5335 +ipset=/goldcoastbulletin.com.au/gfwlist +server=/minidurham.com/127.0.0.1#5335 +ipset=/minidurham.com/gfwlist +server=/aishegw.com/127.0.0.1#5335 +ipset=/aishegw.com/gfwlist +server=/socdm.com/127.0.0.1#5335 +ipset=/socdm.com/gfwlist +server=/xxxymovies.com/127.0.0.1#5335 +ipset=/xxxymovies.com/gfwlist +server=/nikepromax.com/127.0.0.1#5335 +ipset=/nikepromax.com/gfwlist +server=/facebooksupplier.com/127.0.0.1#5335 +ipset=/facebooksupplier.com/gfwlist +server=/monstersdebea.com/127.0.0.1#5335 +ipset=/monstersdebea.com/gfwlist +server=/10xfotolia.com/127.0.0.1#5335 +ipset=/10xfotolia.com/gfwlist +server=/scatfinder.com/127.0.0.1#5335 +ipset=/scatfinder.com/gfwlist +server=/flbjc.net/127.0.0.1#5335 +ipset=/flbjc.net/gfwlist +server=/ebayeletro.com/127.0.0.1#5335 +ipset=/ebayeletro.com/gfwlist +server=/icsd.fiz-karlsruhe.de/127.0.0.1#5335 +ipset=/icsd.fiz-karlsruhe.de/gfwlist +server=/xbox360.com/127.0.0.1#5335 +ipset=/xbox360.com/gfwlist +server=/gayfuckporn.com/127.0.0.1#5335 +ipset=/gayfuckporn.com/gfwlist +server=/waa.tw/127.0.0.1#5335 +ipset=/waa.tw/gfwlist +server=/cloudflareaccess.com/127.0.0.1#5335 +ipset=/cloudflareaccess.com/gfwlist +server=/beatsbydremonsteraustralia.com/127.0.0.1#5335 +ipset=/beatsbydremonsteraustralia.com/gfwlist +server=/s-nbcnews.com/127.0.0.1#5335 +ipset=/s-nbcnews.com/gfwlist +server=/visasignature.co.kr/127.0.0.1#5335 +ipset=/visasignature.co.kr/gfwlist +server=/monsterbeatsru.com/127.0.0.1#5335 +ipset=/monsterbeatsru.com/gfwlist +server=/monsterbeatsonlinestoreuk.com/127.0.0.1#5335 +ipset=/monsterbeatsonlinestoreuk.com/gfwlist +server=/vfsco.dk/127.0.0.1#5335 +ipset=/vfsco.dk/gfwlist +server=/monsterbeatsok.com/127.0.0.1#5335 +ipset=/monsterbeatsok.com/gfwlist +server=/monsterbeatsnegozi.net/127.0.0.1#5335 +ipset=/monsterbeatsnegozi.net/gfwlist +server=/porngames.com/127.0.0.1#5335 +ipset=/porngames.com/gfwlist +server=/monsterbeatsitaly.com/127.0.0.1#5335 +ipset=/monsterbeatsitaly.com/gfwlist +server=/stunnel.org/127.0.0.1#5335 +ipset=/stunnel.org/gfwlist +server=/monsterbeatsfinland.com/127.0.0.1#5335 +ipset=/monsterbeatsfinland.com/gfwlist +server=/mastercard.kz/127.0.0.1#5335 +ipset=/mastercard.kz/gfwlist +server=/bmw-motorrad.bg/127.0.0.1#5335 +ipset=/bmw-motorrad.bg/gfwlist +server=/siam.org/127.0.0.1#5335 +ipset=/siam.org/gfwlist +server=/kicksnike1.com/127.0.0.1#5335 +ipset=/kicksnike1.com/gfwlist +server=/squarecloudservices.com/127.0.0.1#5335 +ipset=/squarecloudservices.com/gfwlist +server=/bmw-connecteddrive.ae/127.0.0.1#5335 +ipset=/bmw-connecteddrive.ae/gfwlist +server=/youyu.services/127.0.0.1#5335 +ipset=/youyu.services/gfwlist +server=/phimsexhentai.me/127.0.0.1#5335 +ipset=/phimsexhentai.me/gfwlist +server=/nginx.com/127.0.0.1#5335 +ipset=/nginx.com/gfwlist +server=/binancezh.sh/127.0.0.1#5335 +ipset=/binancezh.sh/gfwlist +server=/gonzo-movies.com/127.0.0.1#5335 +ipset=/gonzo-movies.com/gfwlist +server=/monsterbeatsbydrebilligde.com/127.0.0.1#5335 +ipset=/monsterbeatsbydrebilligde.com/gfwlist +server=/starwarsgalacticstarcruiser.com/127.0.0.1#5335 +ipset=/starwarsgalacticstarcruiser.com/gfwlist +server=/gaycock4u.com/127.0.0.1#5335 +ipset=/gaycock4u.com/gfwlist +server=/nikesbdunks.net/127.0.0.1#5335 +ipset=/nikesbdunks.net/gfwlist +server=/bandag.cc/127.0.0.1#5335 +ipset=/bandag.cc/gfwlist +server=/manhuagui.com/127.0.0.1#5335 +ipset=/manhuagui.com/gfwlist +server=/artoferotica.info/127.0.0.1#5335 +ipset=/artoferotica.info/gfwlist +server=/gaypornforyou.com/127.0.0.1#5335 +ipset=/gaypornforyou.com/gfwlist +server=/hentaigamesplanet.com/127.0.0.1#5335 +ipset=/hentaigamesplanet.com/gfwlist +server=/youtube.com.qa/127.0.0.1#5335 +ipset=/youtube.com.qa/gfwlist +server=/mzed.com/127.0.0.1#5335 +ipset=/mzed.com/gfwlist +server=/heavenlyhentai.com/127.0.0.1#5335 +ipset=/heavenlyhentai.com/gfwlist +server=/youtube.la/127.0.0.1#5335 +ipset=/youtube.la/gfwlist +server=/bmwworld.com/127.0.0.1#5335 +ipset=/bmwworld.com/gfwlist +server=/micstl.com/127.0.0.1#5335 +ipset=/micstl.com/gfwlist +server=/8muses.io/127.0.0.1#5335 +ipset=/8muses.io/gfwlist +server=/visapcsdirect.com/127.0.0.1#5335 +ipset=/visapcsdirect.com/gfwlist +server=/gettyimages.at/127.0.0.1#5335 +ipset=/gettyimages.at/gfwlist +server=/media-amazon.com/127.0.0.1#5335 +ipset=/media-amazon.com/gfwlist +server=/instagrm.com/127.0.0.1#5335 +ipset=/instagrm.com/gfwlist +server=/mairbeats.com/127.0.0.1#5335 +ipset=/mairbeats.com/gfwlist +server=/dtci.technology/127.0.0.1#5335 +ipset=/dtci.technology/gfwlist +server=/airwick.hu/127.0.0.1#5335 +ipset=/airwick.hu/gfwlist +server=/kickshatchannel.com/127.0.0.1#5335 +ipset=/kickshatchannel.com/gfwlist +server=/sacredhentai.com/127.0.0.1#5335 +ipset=/sacredhentai.com/gfwlist +server=/lifeselector.com/127.0.0.1#5335 +ipset=/lifeselector.com/gfwlist +server=/italiabeatsbydrdre.com/127.0.0.1#5335 +ipset=/italiabeatsbydrdre.com/gfwlist +server=/chinapower.csis.org/127.0.0.1#5335 +ipset=/chinapower.csis.org/gfwlist +server=/kijijiauto.ca/127.0.0.1#5335 +ipset=/kijijiauto.ca/gfwlist +server=/bmw-motorrad.si/127.0.0.1#5335 +ipset=/bmw-motorrad.si/gfwlist +server=/topcelebnudes.com/127.0.0.1#5335 +ipset=/topcelebnudes.com/gfwlist +server=/marketo.tv/127.0.0.1#5335 +ipset=/marketo.tv/gfwlist +server=/billmelater.info/127.0.0.1#5335 +ipset=/billmelater.info/gfwlist +server=/canon.net/127.0.0.1#5335 +ipset=/canon.net/gfwlist +server=/geforce.com.tw/127.0.0.1#5335 +ipset=/geforce.com.tw/gfwlist +server=/yomikyo.or.jp/127.0.0.1#5335 +ipset=/yomikyo.or.jp/gfwlist +server=/omghk.com/127.0.0.1#5335 +ipset=/omghk.com/gfwlist +server=/bridgestonenationalfleet.com/127.0.0.1#5335 +ipset=/bridgestonenationalfleet.com/gfwlist +server=/anb.org/127.0.0.1#5335 +ipset=/anb.org/gfwlist +server=/milftube.pro/127.0.0.1#5335 +ipset=/milftube.pro/gfwlist +server=/csis.org/127.0.0.1#5335 +ipset=/csis.org/gfwlist +server=/librarylovefest.com/127.0.0.1#5335 +ipset=/librarylovefest.com/gfwlist +server=/dlgarenanow-a.akamaihd.net/127.0.0.1#5335 +ipset=/dlgarenanow-a.akamaihd.net/gfwlist +server=/milfprime.com/127.0.0.1#5335 +ipset=/milfprime.com/gfwlist +server=/facebook-support.org/127.0.0.1#5335 +ipset=/facebook-support.org/gfwlist +server=/fifastreet3.com/127.0.0.1#5335 +ipset=/fifastreet3.com/gfwlist +server=/lexuemei.com/127.0.0.1#5335 +ipset=/lexuemei.com/gfwlist +server=/appbridge.ca/127.0.0.1#5335 +ipset=/appbridge.ca/gfwlist +server=/slobodnaevropa.mk/127.0.0.1#5335 +ipset=/slobodnaevropa.mk/gfwlist +server=/3dfuckhouse.com/127.0.0.1#5335 +ipset=/3dfuckhouse.com/gfwlist +server=/japaneselovelygirl.com/127.0.0.1#5335 +ipset=/japaneselovelygirl.com/gfwlist +server=/faronics.com.au/127.0.0.1#5335 +ipset=/faronics.com.au/gfwlist +server=/intelplay.com/127.0.0.1#5335 +ipset=/intelplay.com/gfwlist +server=/fuhouse.club/127.0.0.1#5335 +ipset=/fuhouse.club/gfwlist +server=/headphonezip.com/127.0.0.1#5335 +ipset=/headphonezip.com/gfwlist +server=/bexjt5wz.xyz/127.0.0.1#5335 +ipset=/bexjt5wz.xyz/gfwlist +server=/travelex.co.uk/127.0.0.1#5335 +ipset=/travelex.co.uk/gfwlist +server=/headphonesretailer.com/127.0.0.1#5335 +ipset=/headphonesretailer.com/gfwlist +server=/sysinternals.com/127.0.0.1#5335 +ipset=/sysinternals.com/gfwlist +server=/nike.us/127.0.0.1#5335 +ipset=/nike.us/gfwlist +server=/jquery.com/127.0.0.1#5335 +ipset=/jquery.com/gfwlist +server=/volvotrucks.sk/127.0.0.1#5335 +ipset=/volvotrucks.sk/gfwlist +server=/ebayde.com/127.0.0.1#5335 +ipset=/ebayde.com/gfwlist +server=/lesbianpornvideos.com/127.0.0.1#5335 +ipset=/lesbianpornvideos.com/gfwlist +server=/cloudinary.net/127.0.0.1#5335 +ipset=/cloudinary.net/gfwlist +server=/volvobuses.at/127.0.0.1#5335 +ipset=/volvobuses.at/gfwlist +server=/mythicgames.com/127.0.0.1#5335 +ipset=/mythicgames.com/gfwlist +server=/atlasdmt.com/127.0.0.1#5335 +ipset=/atlasdmt.com/gfwlist +server=/verisign.com.es/127.0.0.1#5335 +ipset=/verisign.com.es/gfwlist +server=/jdbstatic.com/127.0.0.1#5335 +ipset=/jdbstatic.com/gfwlist +server=/minid.no/127.0.0.1#5335 +ipset=/minid.no/gfwlist +server=/pornlegendsclub.com/127.0.0.1#5335 +ipset=/pornlegendsclub.com/gfwlist +server=/amatura.com/127.0.0.1#5335 +ipset=/amatura.com/gfwlist +server=/ballbustingtube.com/127.0.0.1#5335 +ipset=/ballbustingtube.com/gfwlist +server=/jav101.com/127.0.0.1#5335 +ipset=/jav101.com/gfwlist +server=/nationalaustraliaban.tt.omtrdc.net/127.0.0.1#5335 +ipset=/nationalaustraliaban.tt.omtrdc.net/gfwlist +server=/gmnetworks.net/127.0.0.1#5335 +ipset=/gmnetworks.net/gfwlist +server=/frishoes.com/127.0.0.1#5335 +ipset=/frishoes.com/gfwlist +server=/frcasquesbeats.com/127.0.0.1#5335 +ipset=/frcasquesbeats.com/gfwlist +server=/fr-beatsbydrestore.com/127.0.0.1#5335 +ipset=/fr-beatsbydrestore.com/gfwlist +server=/fox26.com/127.0.0.1#5335 +ipset=/fox26.com/gfwlist +server=/foxsports.com.ar/127.0.0.1#5335 +ipset=/foxsports.com.ar/gfwlist +server=/mastercardcenter.com/127.0.0.1#5335 +ipset=/mastercardcenter.com/gfwlist +server=/vimeo.com/127.0.0.1#5335 +ipset=/vimeo.com/gfwlist +server=/naver.net/127.0.0.1#5335 +ipset=/naver.net/gfwlist +server=/ebaka.ru/127.0.0.1#5335 +ipset=/ebaka.ru/gfwlist +server=/awsloft-stockholm.com/127.0.0.1#5335 +ipset=/awsloft-stockholm.com/gfwlist +server=/attinnovationspace.com/127.0.0.1#5335 +ipset=/attinnovationspace.com/gfwlist +server=/ts.la/127.0.0.1#5335 +ipset=/ts.la/gfwlist +server=/pinduck.com/127.0.0.1#5335 +ipset=/pinduck.com/gfwlist +server=/dreprobeats.com/127.0.0.1#5335 +ipset=/dreprobeats.com/gfwlist +server=/kicu.tv/127.0.0.1#5335 +ipset=/kicu.tv/gfwlist +server=/frescolib.org/127.0.0.1#5335 +ipset=/frescolib.org/gfwlist +server=/drebeatsaustralia-cheap.com/127.0.0.1#5335 +ipset=/drebeatsaustralia-cheap.com/gfwlist +server=/limer.tw/127.0.0.1#5335 +ipset=/limer.tw/gfwlist +server=/newscorpaustralia.com/127.0.0.1#5335 +ipset=/newscorpaustralia.com/gfwlist +server=/ak1.net/127.0.0.1#5335 +ipset=/ak1.net/gfwlist +server=/google.com.my/127.0.0.1#5335 +ipset=/google.com.my/gfwlist +server=/tryquinn.com/127.0.0.1#5335 +ipset=/tryquinn.com/gfwlist +server=/yandex.kz/127.0.0.1#5335 +ipset=/yandex.kz/gfwlist +server=/microsoftaffiliates.com/127.0.0.1#5335 +ipset=/microsoftaffiliates.com/gfwlist +server=/twgreatnews.com/127.0.0.1#5335 +ipset=/twgreatnews.com/gfwlist +server=/albagals.com/127.0.0.1#5335 +ipset=/albagals.com/gfwlist +server=/hentaiyes.com/127.0.0.1#5335 +ipset=/hentaiyes.com/gfwlist +server=/drebeatsaustralia-cheap.net/127.0.0.1#5335 +ipset=/drebeatsaustralia-cheap.net/gfwlist +server=/naughtyamerica.com/127.0.0.1#5335 +ipset=/naughtyamerica.com/gfwlist +server=/mini.com.gt/127.0.0.1#5335 +ipset=/mini.com.gt/gfwlist +server=/drebeats-monsteraustralia.com/127.0.0.1#5335 +ipset=/drebeats-monsteraustralia.com/gfwlist +server=/akami.net/127.0.0.1#5335 +ipset=/akami.net/gfwlist +server=/erogames.com/127.0.0.1#5335 +ipset=/erogames.com/gfwlist +server=/sectigo.com/127.0.0.1#5335 +ipset=/sectigo.com/gfwlist +server=/mengnan.shop/127.0.0.1#5335 +ipset=/mengnan.shop/gfwlist +server=/tx5254.com/127.0.0.1#5335 +ipset=/tx5254.com/gfwlist +server=/xbox.com/127.0.0.1#5335 +ipset=/xbox.com/gfwlist +server=/nintendodsi.com/127.0.0.1#5335 +ipset=/nintendodsi.com/gfwlist +server=/my20houston.com/127.0.0.1#5335 +ipset=/my20houston.com/gfwlist +server=/bmw-fleet.net/127.0.0.1#5335 +ipset=/bmw-fleet.net/gfwlist +server=/mortein.co.za/127.0.0.1#5335 +ipset=/mortein.co.za/gfwlist +server=/visa.ky/127.0.0.1#5335 +ipset=/visa.ky/gfwlist +server=/bmw-yemen.com/127.0.0.1#5335 +ipset=/bmw-yemen.com/gfwlist +server=/enanyang.my/127.0.0.1#5335 +ipset=/enanyang.my/gfwlist +server=/drdremonster-beats.com/127.0.0.1#5335 +ipset=/drdremonster-beats.com/gfwlist +server=/attdns.net/127.0.0.1#5335 +ipset=/attdns.net/gfwlist +server=/signal.art/127.0.0.1#5335 +ipset=/signal.art/gfwlist +server=/cuckoldplacetube.com/127.0.0.1#5335 +ipset=/cuckoldplacetube.com/gfwlist +server=/drdrebeatsretail2013.com/127.0.0.1#5335 +ipset=/drdrebeatsretail2013.com/gfwlist +server=/xindelu.com/127.0.0.1#5335 +ipset=/xindelu.com/gfwlist +server=/nhentai.com/127.0.0.1#5335 +ipset=/nhentai.com/gfwlist +server=/doodhwali.com/127.0.0.1#5335 +ipset=/doodhwali.com/gfwlist +server=/wankzvr.com/127.0.0.1#5335 +ipset=/wankzvr.com/gfwlist +server=/slutload.com/127.0.0.1#5335 +ipset=/slutload.com/gfwlist +server=/radian6.com/127.0.0.1#5335 +ipset=/radian6.com/gfwlist +server=/audible.com/127.0.0.1#5335 +ipset=/audible.com/gfwlist +server=/disneyworld-go.com/127.0.0.1#5335 +ipset=/disneyworld-go.com/gfwlist +server=/npm.community/127.0.0.1#5335 +ipset=/npm.community/gfwlist +server=/mini-connected.es/127.0.0.1#5335 +ipset=/mini-connected.es/gfwlist +server=/gyutto.com/127.0.0.1#5335 +ipset=/gyutto.com/gfwlist +server=/computer.org/127.0.0.1#5335 +ipset=/computer.org/gfwlist +server=/1010.com.hk/127.0.0.1#5335 +ipset=/1010.com.hk/gfwlist +server=/yourspeculumexam.com/127.0.0.1#5335 +ipset=/yourspeculumexam.com/gfwlist +server=/59mvmv.com/127.0.0.1#5335 +ipset=/59mvmv.com/gfwlist +server=/codei.sh/127.0.0.1#5335 +ipset=/codei.sh/gfwlist +server=/tferwq.com/127.0.0.1#5335 +ipset=/tferwq.com/gfwlist +server=/discountbeatsstore.com/127.0.0.1#5335 +ipset=/discountbeatsstore.com/gfwlist +server=/taylorfrancis.com/127.0.0.1#5335 +ipset=/taylorfrancis.com/gfwlist +server=/yoshisnewisland.com/127.0.0.1#5335 +ipset=/yoshisnewisland.com/gfwlist +server=/wikileaks.org/127.0.0.1#5335 +ipset=/wikileaks.org/gfwlist +server=/adidas.de/127.0.0.1#5335 +ipset=/adidas.de/gfwlist +server=/custombeatssbydreus.com/127.0.0.1#5335 +ipset=/custombeatssbydreus.com/gfwlist +server=/custombeatsdeals.com/127.0.0.1#5335 +ipset=/custombeatsdeals.com/gfwlist +server=/beatsbydreus.com/127.0.0.1#5335 +ipset=/beatsbydreus.com/gfwlist +server=/nintendo.fi/127.0.0.1#5335 +ipset=/nintendo.fi/gfwlist +server=/cuffiesaldi.com/127.0.0.1#5335 +ipset=/cuffiesaldi.com/gfwlist +server=/eamobile.com/127.0.0.1#5335 +ipset=/eamobile.com/gfwlist +server=/acgww.cyou/127.0.0.1#5335 +ipset=/acgww.cyou/gfwlist +server=/coolmonster.net/127.0.0.1#5335 +ipset=/coolmonster.net/gfwlist +server=/miniwindsor.com/127.0.0.1#5335 +ipset=/miniwindsor.com/gfwlist +server=/chihair-straightener.com/127.0.0.1#5335 +ipset=/chihair-straightener.com/gfwlist +server=/pearsonlongman.ch/127.0.0.1#5335 +ipset=/pearsonlongman.ch/gfwlist +server=/cheapsalemonster.com/127.0.0.1#5335 +ipset=/cheapsalemonster.com/gfwlist +server=/cheapnewbeatsbydre.com/127.0.0.1#5335 +ipset=/cheapnewbeatsbydre.com/gfwlist +server=/xbox360.co/127.0.0.1#5335 +ipset=/xbox360.co/gfwlist +server=/bobs-tube.com/127.0.0.1#5335 +ipset=/bobs-tube.com/gfwlist +server=/cheapmonsterbeatsheadsets.com/127.0.0.1#5335 +ipset=/cheapmonsterbeatsheadsets.com/gfwlist +server=/ea.tt.omtrdc.net/127.0.0.1#5335 +ipset=/ea.tt.omtrdc.net/gfwlist +server=/cheapheadphonessale.com/127.0.0.1#5335 +ipset=/cheapheadphonessale.com/gfwlist +server=/xxx4hindi.com/127.0.0.1#5335 +ipset=/xxx4hindi.com/gfwlist +server=/cheapdrdrebeatsca.com/127.0.0.1#5335 +ipset=/cheapdrdrebeatsca.com/gfwlist +server=/chuokoron.jp/127.0.0.1#5335 +ipset=/chuokoron.jp/gfwlist +server=/cheapdrdrebeats8.com/127.0.0.1#5335 +ipset=/cheapdrdrebeats8.com/gfwlist +server=/infocert.it/127.0.0.1#5335 +ipset=/infocert.it/gfwlist +server=/fox13news.com/127.0.0.1#5335 +ipset=/fox13news.com/gfwlist +server=/mini-vietnam.com/127.0.0.1#5335 +ipset=/mini-vietnam.com/gfwlist +server=/freexvideos.org/127.0.0.1#5335 +ipset=/freexvideos.org/gfwlist +server=/bridgestoneperformance.com/127.0.0.1#5335 +ipset=/bridgestoneperformance.com/gfwlist +server=/myfoxaustin.com/127.0.0.1#5335 +ipset=/myfoxaustin.com/gfwlist +server=/cheapbeatsheadphones.us/127.0.0.1#5335 +ipset=/cheapbeatsheadphones.us/gfwlist +server=/cheapbeatsheadphone2014.com/127.0.0.1#5335 +ipset=/cheapbeatsheadphone2014.com/gfwlist +server=/ilovexs.com/127.0.0.1#5335 +ipset=/ilovexs.com/gfwlist +server=/99thz.com/127.0.0.1#5335 +ipset=/99thz.com/gfwlist +server=/fteproxy.org/127.0.0.1#5335 +ipset=/fteproxy.org/gfwlist +server=/xxxbunker.com/127.0.0.1#5335 +ipset=/xxxbunker.com/gfwlist +server=/xnxxhd.biz/127.0.0.1#5335 +ipset=/xnxxhd.biz/gfwlist +server=/cheapbeatsbydreoutlets2013.com/127.0.0.1#5335 +ipset=/cheapbeatsbydreoutlets2013.com/gfwlist +server=/beatsheadphonesdealer.com/127.0.0.1#5335 +ipset=/beatsheadphonesdealer.com/gfwlist +server=/18tube.xxx/127.0.0.1#5335 +ipset=/18tube.xxx/gfwlist +server=/czechvideo.org/127.0.0.1#5335 +ipset=/czechvideo.org/gfwlist +server=/gfacecbook.com/127.0.0.1#5335 +ipset=/gfacecbook.com/gfwlist +server=/xhamster.com/127.0.0.1#5335 +ipset=/xhamster.com/gfwlist +server=/ipod.net/127.0.0.1#5335 +ipset=/ipod.net/gfwlist +server=/verizonmedia.com/127.0.0.1#5335 +ipset=/verizonmedia.com/gfwlist +server=/apple.jo/127.0.0.1#5335 +ipset=/apple.jo/gfwlist +server=/casquebeatspascher2013.com/127.0.0.1#5335 +ipset=/casquebeatspascher2013.com/gfwlist +server=/yourphysicalexam.com/127.0.0.1#5335 +ipset=/yourphysicalexam.com/gfwlist +server=/casquebeatsmer.net/127.0.0.1#5335 +ipset=/casquebeatsmer.net/gfwlist +server=/blpevents.com/127.0.0.1#5335 +ipset=/blpevents.com/gfwlist +server=/xbox.co/127.0.0.1#5335 +ipset=/xbox.co/gfwlist +server=/gentoo.org/127.0.0.1#5335 +ipset=/gentoo.org/gfwlist +server=/camonster.com/127.0.0.1#5335 +ipset=/camonster.com/gfwlist +server=/namethatpornad.com/127.0.0.1#5335 +ipset=/namethatpornad.com/gfwlist +server=/stxmosquitoproject.net/127.0.0.1#5335 +ipset=/stxmosquitoproject.net/gfwlist +server=/easylist.to/127.0.0.1#5335 +ipset=/easylist.to/gfwlist +server=/buyshoponly.com/127.0.0.1#5335 +ipset=/buyshoponly.com/gfwlist +server=/hentaiheadlines.com/127.0.0.1#5335 +ipset=/hentaiheadlines.com/gfwlist +server=/justfamilyporn.com/127.0.0.1#5335 +ipset=/justfamilyporn.com/gfwlist +server=/dailym.ai/127.0.0.1#5335 +ipset=/dailym.ai/gfwlist +server=/vodafone.it/127.0.0.1#5335 +ipset=/vodafone.it/gfwlist +server=/buybeatsheadphonesbydre.com/127.0.0.1#5335 +ipset=/buybeatsheadphonesbydre.com/gfwlist +server=/bmwusa.com/127.0.0.1#5335 +ipset=/bmwusa.com/gfwlist +server=/buybeatsbydre-uk.com/127.0.0.1#5335 +ipset=/buybeatsbydre-uk.com/gfwlist +server=/nintendo.co.jp/127.0.0.1#5335 +ipset=/nintendo.co.jp/gfwlist +server=/firestone.com.ar/127.0.0.1#5335 +ipset=/firestone.com.ar/gfwlist +server=/buy-from-shanghai.com/127.0.0.1#5335 +ipset=/buy-from-shanghai.com/gfwlist +server=/brands098.com/127.0.0.1#5335 +ipset=/brands098.com/gfwlist +server=/steam.cdn.on.net/127.0.0.1#5335 +ipset=/steam.cdn.on.net/gfwlist +server=/thegooglestore.com/127.0.0.1#5335 +ipset=/thegooglestore.com/gfwlist +server=/nokiantyres.com/127.0.0.1#5335 +ipset=/nokiantyres.com/gfwlist +server=/isfocus.net/127.0.0.1#5335 +ipset=/isfocus.net/gfwlist +server=/badgen.net/127.0.0.1#5335 +ipset=/badgen.net/gfwlist +server=/maturewomenanal.com/127.0.0.1#5335 +ipset=/maturewomenanal.com/gfwlist +server=/scatshop.com/127.0.0.1#5335 +ipset=/scatshop.com/gfwlist +server=/youtube.com.kw/127.0.0.1#5335 +ipset=/youtube.com.kw/gfwlist +server=/bookonsky.net/127.0.0.1#5335 +ipset=/bookonsky.net/gfwlist +server=/bloommicroventures.com/127.0.0.1#5335 +ipset=/bloommicroventures.com/gfwlist +server=/biitii.com/127.0.0.1#5335 +ipset=/biitii.com/gfwlist +server=/azatutyun.am/127.0.0.1#5335 +ipset=/azatutyun.am/gfwlist +server=/thecandidforum-voyeur.ru/127.0.0.1#5335 +ipset=/thecandidforum-voyeur.ru/gfwlist +server=/facebooks.com/127.0.0.1#5335 +ipset=/facebooks.com/gfwlist +server=/54647.io/127.0.0.1#5335 +ipset=/54647.io/gfwlist +server=/playparagon.com/127.0.0.1#5335 +ipset=/playparagon.com/gfwlist +server=/eebay.com/127.0.0.1#5335 +ipset=/eebay.com/gfwlist +server=/xn--ubt498knmf.com/127.0.0.1#5335 +ipset=/xn--ubt498knmf.com/gfwlist +server=/javfree.me/127.0.0.1#5335 +ipset=/javfree.me/gfwlist +server=/beatssingapores.com/127.0.0.1#5335 +ipset=/beatssingapores.com/gfwlist +server=/pythonhosted.org/127.0.0.1#5335 +ipset=/pythonhosted.org/gfwlist +server=/eurekaselect.com/127.0.0.1#5335 +ipset=/eurekaselect.com/gfwlist +server=/ocsp-certum.com/127.0.0.1#5335 +ipset=/ocsp-certum.com/gfwlist +server=/porncoil.com/127.0.0.1#5335 +ipset=/porncoil.com/gfwlist +server=/xbox360.org/127.0.0.1#5335 +ipset=/xbox360.org/gfwlist +server=/advertiserscommunity.com/127.0.0.1#5335 +ipset=/advertiserscommunity.com/gfwlist +server=/beatspromonsterjp.com/127.0.0.1#5335 +ipset=/beatspromonsterjp.com/gfwlist +server=/bmwfilms.com/127.0.0.1#5335 +ipset=/bmwfilms.com/gfwlist +server=/xero.porn/127.0.0.1#5335 +ipset=/xero.porn/gfwlist +server=/appledaily.com/127.0.0.1#5335 +ipset=/appledaily.com/gfwlist +server=/uselessjunk.com/127.0.0.1#5335 +ipset=/uselessjunk.com/gfwlist +server=/bcsecure01-a.akamaihd.net/127.0.0.1#5335 +ipset=/bcsecure01-a.akamaihd.net/gfwlist +server=/soasta-dswb.com/127.0.0.1#5335 +ipset=/soasta-dswb.com/gfwlist +server=/jav9999.com/127.0.0.1#5335 +ipset=/jav9999.com/gfwlist +server=/beatsofdre-usa.com/127.0.0.1#5335 +ipset=/beatsofdre-usa.com/gfwlist +server=/adulto.vip/127.0.0.1#5335 +ipset=/adulto.vip/gfwlist +server=/aznude.com/127.0.0.1#5335 +ipset=/aznude.com/gfwlist +server=/my3dhentai.com/127.0.0.1#5335 +ipset=/my3dhentai.com/gfwlist +server=/volvotrucks.ps/127.0.0.1#5335 +ipset=/volvotrucks.ps/gfwlist +server=/miiverse.com/127.0.0.1#5335 +ipset=/miiverse.com/gfwlist +server=/huobi.sc/127.0.0.1#5335 +ipset=/huobi.sc/gfwlist +server=/dokusho-ojikan.jp/127.0.0.1#5335 +ipset=/dokusho-ojikan.jp/gfwlist +server=/pinkteentube.net/127.0.0.1#5335 +ipset=/pinkteentube.net/gfwlist +server=/airgonetworks.com/127.0.0.1#5335 +ipset=/airgonetworks.com/gfwlist +server=/bestshoesale2014.net/127.0.0.1#5335 +ipset=/bestshoesale2014.net/gfwlist +server=/beatsheadphonestudio.com/127.0.0.1#5335 +ipset=/beatsheadphonestudio.com/gfwlist +server=/bmw-motorrad.in/127.0.0.1#5335 +ipset=/bmw-motorrad.in/gfwlist +server=/bestfreesexgames.com/127.0.0.1#5335 +ipset=/bestfreesexgames.com/gfwlist +server=/freesexyindians.com/127.0.0.1#5335 +ipset=/freesexyindians.com/gfwlist +server=/yahoo.so/127.0.0.1#5335 +ipset=/yahoo.so/gfwlist +server=/oninstagram.com/127.0.0.1#5335 +ipset=/oninstagram.com/gfwlist +server=/cambb.xxx/127.0.0.1#5335 +ipset=/cambb.xxx/gfwlist +server=/bmw-motorrad.es/127.0.0.1#5335 +ipset=/bmw-motorrad.es/gfwlist +server=/beatsheadphones2u.com/127.0.0.1#5335 +ipset=/beatsheadphones2u.com/gfwlist +server=/beatsheadphones1.com/127.0.0.1#5335 +ipset=/beatsheadphones1.com/gfwlist +server=/jupyter.org/127.0.0.1#5335 +ipset=/jupyter.org/gfwlist +server=/yahoo.fi/127.0.0.1#5335 +ipset=/yahoo.fi/gfwlist +server=/joox.com/127.0.0.1#5335 +ipset=/joox.com/gfwlist +server=/test-ipv6.com/127.0.0.1#5335 +ipset=/test-ipv6.com/gfwlist +server=/dajiyuan.com/127.0.0.1#5335 +ipset=/dajiyuan.com/gfwlist +server=/cygwin.com/127.0.0.1#5335 +ipset=/cygwin.com/gfwlist +server=/whynotbi.com/127.0.0.1#5335 +ipset=/whynotbi.com/gfwlist +server=/hulu.jp/127.0.0.1#5335 +ipset=/hulu.jp/gfwlist +server=/vrv.co/127.0.0.1#5335 +ipset=/vrv.co/gfwlist +server=/girlscv.com/127.0.0.1#5335 +ipset=/girlscv.com/gfwlist +server=/beatsfacstore.com/127.0.0.1#5335 +ipset=/beatsfacstore.com/gfwlist +server=/beatsearbudsheadphoness.com/127.0.0.1#5335 +ipset=/beatsearbudsheadphoness.com/gfwlist +server=/nyt.com/127.0.0.1#5335 +ipset=/nyt.com/gfwlist +server=/doujincg.blog.jp/127.0.0.1#5335 +ipset=/doujincg.blog.jp/gfwlist +server=/fontsinuse.com/127.0.0.1#5335 +ipset=/fontsinuse.com/gfwlist +server=/pplah.com/127.0.0.1#5335 +ipset=/pplah.com/gfwlist +server=/googleusercontent.com/127.0.0.1#5335 +ipset=/googleusercontent.com/gfwlist +server=/cepacol.ca/127.0.0.1#5335 +ipset=/cepacol.ca/gfwlist +server=/beatsdresalestore.com/127.0.0.1#5335 +ipset=/beatsdresalestore.com/gfwlist +server=/beatsdremonster-uk.com/127.0.0.1#5335 +ipset=/beatsdremonster-uk.com/gfwlist +server=/beatsdredreheadphones.com/127.0.0.1#5335 +ipset=/beatsdredreheadphones.com/gfwlist +server=/cnpmjs.org/127.0.0.1#5335 +ipset=/cnpmjs.org/gfwlist +server=/ipfs.runfission.com/127.0.0.1#5335 +ipset=/ipfs.runfission.com/gfwlist +server=/visa.co.th/127.0.0.1#5335 +ipset=/visa.co.th/gfwlist +server=/beatsdrecheap.com/127.0.0.1#5335 +ipset=/beatsdrecheap.com/gfwlist +server=/82mvmv.com/127.0.0.1#5335 +ipset=/82mvmv.com/gfwlist +server=/wwwhuluplus.com/127.0.0.1#5335 +ipset=/wwwhuluplus.com/gfwlist +server=/beatsdrdreneon.com/127.0.0.1#5335 +ipset=/beatsdrdreneon.com/gfwlist +server=/18yiren.tv/127.0.0.1#5335 +ipset=/18yiren.tv/gfwlist +server=/amazonfctours.com/127.0.0.1#5335 +ipset=/amazonfctours.com/gfwlist +server=/ss2.us/127.0.0.1#5335 +ipset=/ss2.us/gfwlist +server=/hentairead.vip/127.0.0.1#5335 +ipset=/hentairead.vip/gfwlist +server=/eater.com/127.0.0.1#5335 +ipset=/eater.com/gfwlist +server=/bmw.com.bo/127.0.0.1#5335 +ipset=/bmw.com.bo/gfwlist +server=/bridgestonecntc.com/127.0.0.1#5335 +ipset=/bridgestonecntc.com/gfwlist +server=/beatsdrdre-it.com/127.0.0.1#5335 +ipset=/beatsdrdre-it.com/gfwlist +server=/freehqtube.com/127.0.0.1#5335 +ipset=/freehqtube.com/gfwlist +server=/microsoftedge.com/127.0.0.1#5335 +ipset=/microsoftedge.com/gfwlist +server=/mini-kuwait.com/127.0.0.1#5335 +ipset=/mini-kuwait.com/gfwlist +server=/epochtimes.cz/127.0.0.1#5335 +ipset=/epochtimes.cz/gfwlist +server=/calvappd.me/127.0.0.1#5335 +ipset=/calvappd.me/gfwlist +server=/fundpaypal.com/127.0.0.1#5335 +ipset=/fundpaypal.com/gfwlist +server=/openstreetmap.org/127.0.0.1#5335 +ipset=/openstreetmap.org/gfwlist +server=/smokinmovies.com/127.0.0.1#5335 +ipset=/smokinmovies.com/gfwlist +server=/feceboock.com/127.0.0.1#5335 +ipset=/feceboock.com/gfwlist +server=/futhead.com/127.0.0.1#5335 +ipset=/futhead.com/gfwlist +server=/pornwatchers.com/127.0.0.1#5335 +ipset=/pornwatchers.com/gfwlist +server=/jav168.cc/127.0.0.1#5335 +ipset=/jav168.cc/gfwlist +server=/scholar.google.be/127.0.0.1#5335 +ipset=/scholar.google.be/gfwlist +server=/directvlebanontn.com/127.0.0.1#5335 +ipset=/directvlebanontn.com/gfwlist +server=/battlefield3.com/127.0.0.1#5335 +ipset=/battlefield3.com/gfwlist +server=/beatsbydrew.com/127.0.0.1#5335 +ipset=/beatsbydrew.com/gfwlist +server=/earlyob.com/127.0.0.1#5335 +ipset=/earlyob.com/gfwlist +server=/beatsbydrevipde.com/127.0.0.1#5335 +ipset=/beatsbydrevipde.com/gfwlist +server=/69xporn.com/127.0.0.1#5335 +ipset=/69xporn.com/gfwlist +server=/bstatic.com/127.0.0.1#5335 +ipset=/bstatic.com/gfwlist +server=/taboola.com/127.0.0.1#5335 +ipset=/taboola.com/gfwlist +server=/google.lk/127.0.0.1#5335 +ipset=/google.lk/gfwlist +server=/beatsbydresingaporesale.com/127.0.0.1#5335 +ipset=/beatsbydresingaporesale.com/gfwlist +server=/littlesexdolls.com/127.0.0.1#5335 +ipset=/littlesexdolls.com/gfwlist +server=/hponlineprinting.com/127.0.0.1#5335 +ipset=/hponlineprinting.com/gfwlist +server=/pokemonplatinum.com/127.0.0.1#5335 +ipset=/pokemonplatinum.com/gfwlist +server=/steamuserimages-a.akamaihd.net/127.0.0.1#5335 +ipset=/steamuserimages-a.akamaihd.net/gfwlist +server=/bmw-bahrain.com/127.0.0.1#5335 +ipset=/bmw-bahrain.com/gfwlist +server=/beatsbydreshop-uk.com/127.0.0.1#5335 +ipset=/beatsbydreshop-uk.com/gfwlist +server=/nikeby.com/127.0.0.1#5335 +ipset=/nikeby.com/gfwlist +server=/linkedin.sc.omtrdc.net/127.0.0.1#5335 +ipset=/linkedin.sc.omtrdc.net/gfwlist +server=/myfoxhurricane.com/127.0.0.1#5335 +ipset=/myfoxhurricane.com/gfwlist +server=/facebooklivestaging.net/127.0.0.1#5335 +ipset=/facebooklivestaging.net/gfwlist +server=/beatsbydrerealstore.com/127.0.0.1#5335 +ipset=/beatsbydrerealstore.com/gfwlist +server=/xxxbit.com/127.0.0.1#5335 +ipset=/xxxbit.com/gfwlist +server=/privilege.hk/127.0.0.1#5335 +ipset=/privilege.hk/gfwlist +server=/mastercard.it/127.0.0.1#5335 +ipset=/mastercard.it/gfwlist +server=/beatsbydreonlinesale-nz.com/127.0.0.1#5335 +ipset=/beatsbydreonlinesale-nz.com/gfwlist +server=/mozilla.community/127.0.0.1#5335 +ipset=/mozilla.community/gfwlist +server=/kismia.com/127.0.0.1#5335 +ipset=/kismia.com/gfwlist +server=/pxt.io/127.0.0.1#5335 +ipset=/pxt.io/gfwlist +server=/testonfox.com/127.0.0.1#5335 +ipset=/testonfox.com/gfwlist +server=/pussyboy.net/127.0.0.1#5335 +ipset=/pussyboy.net/gfwlist +server=/enfasmart.com/127.0.0.1#5335 +ipset=/enfasmart.com/gfwlist +server=/taste.com.au/127.0.0.1#5335 +ipset=/taste.com.au/gfwlist +server=/porndiscounts.com/127.0.0.1#5335 +ipset=/porndiscounts.com/gfwlist +server=/beatsbydrenorge1.net/127.0.0.1#5335 +ipset=/beatsbydrenorge1.net/gfwlist +server=/beatsbydrenls.com/127.0.0.1#5335 +ipset=/beatsbydrenls.com/gfwlist +server=/nikezoom.com/127.0.0.1#5335 +ipset=/nikezoom.com/gfwlist +server=/lilhumpers.com/127.0.0.1#5335 +ipset=/lilhumpers.com/gfwlist +server=/crypton.co.jp/127.0.0.1#5335 +ipset=/crypton.co.jp/gfwlist +server=/blzddistkr1-a.akamaihd.net/127.0.0.1#5335 +ipset=/blzddistkr1-a.akamaihd.net/gfwlist +server=/beatsbydreirelandsonline.com/127.0.0.1#5335 +ipset=/beatsbydreirelandsonline.com/gfwlist +server=/ign.jp/127.0.0.1#5335 +ipset=/ign.jp/gfwlist +server=/beatsbydreirelandsale.com/127.0.0.1#5335 +ipset=/beatsbydreirelandsale.com/gfwlist +server=/emcs.org/127.0.0.1#5335 +ipset=/emcs.org/gfwlist +server=/paypal-learning.com/127.0.0.1#5335 +ipset=/paypal-learning.com/gfwlist +server=/beatsbydrehut.com/127.0.0.1#5335 +ipset=/beatsbydrehut.com/gfwlist +server=/daylenerio.com/127.0.0.1#5335 +ipset=/daylenerio.com/gfwlist +server=/stackmod.blog/127.0.0.1#5335 +ipset=/stackmod.blog/gfwlist +server=/sextime.tv/127.0.0.1#5335 +ipset=/sextime.tv/gfwlist +server=/yeyuehuachao12.com/127.0.0.1#5335 +ipset=/yeyuehuachao12.com/gfwlist +server=/libsolutions.app/127.0.0.1#5335 +ipset=/libsolutions.app/gfwlist +server=/beatsbydredr.com/127.0.0.1#5335 +ipset=/beatsbydredr.com/gfwlist +server=/f95zone.to/127.0.0.1#5335 +ipset=/f95zone.to/gfwlist +server=/imagetwist.com/127.0.0.1#5335 +ipset=/imagetwist.com/gfwlist +server=/youtube.com.mt/127.0.0.1#5335 +ipset=/youtube.com.mt/gfwlist +server=/beatsjoy.com/127.0.0.1#5335 +ipset=/beatsjoy.com/gfwlist +server=/dropboxapi.com/127.0.0.1#5335 +ipset=/dropboxapi.com/gfwlist +server=/blogspot.ba/127.0.0.1#5335 +ipset=/blogspot.ba/gfwlist +server=/beatsbydredealsblackfriday.com/127.0.0.1#5335 +ipset=/beatsbydredealsblackfriday.com/gfwlist +server=/playporngame.com/127.0.0.1#5335 +ipset=/playporngame.com/gfwlist +server=/oxfordbibliographies.com/127.0.0.1#5335 +ipset=/oxfordbibliographies.com/gfwlist +server=/akamak.com/127.0.0.1#5335 +ipset=/akamak.com/gfwlist +server=/buhidoh.net/127.0.0.1#5335 +ipset=/buhidoh.net/gfwlist +server=/spotify.map.fastly.net/127.0.0.1#5335 +ipset=/spotify.map.fastly.net/gfwlist +server=/braintreegateway.tv/127.0.0.1#5335 +ipset=/braintreegateway.tv/gfwlist +server=/fadebook.com/127.0.0.1#5335 +ipset=/fadebook.com/gfwlist +server=/bmw-routes.com/127.0.0.1#5335 +ipset=/bmw-routes.com/gfwlist +server=/beatsbydreblackfriday2013.com/127.0.0.1#5335 +ipset=/beatsbydreblackfriday2013.com/gfwlist +server=/hnntube.com/127.0.0.1#5335 +ipset=/hnntube.com/gfwlist +server=/boypost.com/127.0.0.1#5335 +ipset=/boypost.com/gfwlist +server=/beatsbydre4usales.com/127.0.0.1#5335 +ipset=/beatsbydre4usales.com/gfwlist +server=/beatsbydre411.com/127.0.0.1#5335 +ipset=/beatsbydre411.com/gfwlist +server=/rsc.org/127.0.0.1#5335 +ipset=/rsc.org/gfwlist +server=/mrchewsasianbeaver.com/127.0.0.1#5335 +ipset=/mrchewsasianbeaver.com/gfwlist +server=/verisign.org/127.0.0.1#5335 +ipset=/verisign.org/gfwlist +server=/huluplus.com/127.0.0.1#5335 +ipset=/huluplus.com/gfwlist +server=/beatsbydre-mall.com/127.0.0.1#5335 +ipset=/beatsbydre-mall.com/gfwlist +server=/nextplus.com.hk/127.0.0.1#5335 +ipset=/nextplus.com.hk/gfwlist +server=/joinclubhouse.com/127.0.0.1#5335 +ipset=/joinclubhouse.com/gfwlist +server=/88square.com/127.0.0.1#5335 +ipset=/88square.com/gfwlist +server=/69gayporno.com/127.0.0.1#5335 +ipset=/69gayporno.com/gfwlist +server=/beatsbydre-beatsheadphone.com/127.0.0.1#5335 +ipset=/beatsbydre-beatsheadphone.com/gfwlist +server=/avh.world/127.0.0.1#5335 +ipset=/avh.world/gfwlist +server=/bdn.dev/127.0.0.1#5335 +ipset=/bdn.dev/gfwlist +server=/alphaporno.com/127.0.0.1#5335 +ipset=/alphaporno.com/gfwlist +server=/mastercard.nl/127.0.0.1#5335 +ipset=/mastercard.nl/gfwlist +server=/miniitalianjob.com/127.0.0.1#5335 +ipset=/miniitalianjob.com/gfwlist +server=/cuckoldfuck.com/127.0.0.1#5335 +ipset=/cuckoldfuck.com/gfwlist +server=/volvobuses.com.kw/127.0.0.1#5335 +ipset=/volvobuses.com.kw/gfwlist +server=/favjapaneseporn.com/127.0.0.1#5335 +ipset=/favjapaneseporn.com/gfwlist +server=/cbsivideo.com/127.0.0.1#5335 +ipset=/cbsivideo.com/gfwlist +server=/businessweek.com/127.0.0.1#5335 +ipset=/businessweek.com/gfwlist +server=/beatsbydrdre-store.com/127.0.0.1#5335 +ipset=/beatsbydrdre-store.com/gfwlist +server=/forgecdn.net/127.0.0.1#5335 +ipset=/forgecdn.net/gfwlist +server=/beatsbydrdre-online.com/127.0.0.1#5335 +ipset=/beatsbydrdre-online.com/gfwlist +server=/graph.org/127.0.0.1#5335 +ipset=/graph.org/gfwlist +server=/ikea.ua/127.0.0.1#5335 +ipset=/ikea.ua/gfwlist +server=/pokemonmysterydungeon.com/127.0.0.1#5335 +ipset=/pokemonmysterydungeon.com/gfwlist +server=/volvobuses.co.uk/127.0.0.1#5335 +ipset=/volvobuses.co.uk/gfwlist +server=/aga-expo.com/127.0.0.1#5335 +ipset=/aga-expo.com/gfwlist +server=/beatsaudiobydre.com/127.0.0.1#5335 +ipset=/beatsaudiobydre.com/gfwlist +server=/jfrog.org/127.0.0.1#5335 +ipset=/jfrog.org/gfwlist +server=/beatsaudifonos.com/127.0.0.1#5335 +ipset=/beatsaudifonos.com/gfwlist +server=/sexysexdoll.com/127.0.0.1#5335 +ipset=/sexysexdoll.com/gfwlist +server=/fetishfishcams.com/127.0.0.1#5335 +ipset=/fetishfishcams.com/gfwlist +server=/marioandluigidreamteam.com/127.0.0.1#5335 +ipset=/marioandluigidreamteam.com/gfwlist +server=/xn--hxtr4rozx.xn--czr694b/127.0.0.1#5335 +ipset=/xn--hxtr4rozx.xn--czr694b/gfwlist +server=/beats4.net/127.0.0.1#5335 +ipset=/beats4.net/gfwlist +server=/igsonar.com/127.0.0.1#5335 +ipset=/igsonar.com/gfwlist +server=/beats123.com/127.0.0.1#5335 +ipset=/beats123.com/gfwlist +server=/javfilms.com/127.0.0.1#5335 +ipset=/javfilms.com/gfwlist +server=/beats1.cc/127.0.0.1#5335 +ipset=/beats1.cc/gfwlist +server=/nineentertainmentco.com.au/127.0.0.1#5335 +ipset=/nineentertainmentco.com.au/gfwlist +server=/visa.mq/127.0.0.1#5335 +ipset=/visa.mq/gfwlist +server=/bmwmperformance.com/127.0.0.1#5335 +ipset=/bmwmperformance.com/gfwlist +server=/lordofultima.com/127.0.0.1#5335 +ipset=/lordofultima.com/gfwlist +server=/cloudflare.tv/127.0.0.1#5335 +ipset=/cloudflare.tv/gfwlist +server=/mini.bg/127.0.0.1#5335 +ipset=/mini.bg/gfwlist +server=/hugedildo.com/127.0.0.1#5335 +ipset=/hugedildo.com/gfwlist +server=/connectionsacademy.com/127.0.0.1#5335 +ipset=/connectionsacademy.com/gfwlist +server=/citasecuador.com/127.0.0.1#5335 +ipset=/citasecuador.com/gfwlist +server=/cartoonpornvideos.com/127.0.0.1#5335 +ipset=/cartoonpornvideos.com/gfwlist +server=/mini-abudhabi.com/127.0.0.1#5335 +ipset=/mini-abudhabi.com/gfwlist +server=/beats-bydreoutletssale.net/127.0.0.1#5335 +ipset=/beats-bydreoutletssale.net/gfwlist +server=/hibdontire.com/127.0.0.1#5335 +ipset=/hibdontire.com/gfwlist +server=/beats-bydreoutletsale.com/127.0.0.1#5335 +ipset=/beats-bydreoutletsale.com/gfwlist +server=/minimontroyal.com/127.0.0.1#5335 +ipset=/minimontroyal.com/gfwlist +server=/8111y.top/127.0.0.1#5335 +ipset=/8111y.top/gfwlist +server=/nikeshoxsale.com/127.0.0.1#5335 +ipset=/nikeshoxsale.com/gfwlist +server=/beats-bydrdre.net/127.0.0.1#5335 +ipset=/beats-bydrdre.net/gfwlist +server=/beats-by-dre-australia.com/127.0.0.1#5335 +ipset=/beats-by-dre-australia.com/gfwlist +server=/volvotrucks.dk/127.0.0.1#5335 +ipset=/volvotrucks.dk/gfwlist +server=/9zipai.net/127.0.0.1#5335 +ipset=/9zipai.net/gfwlist +server=/volvotrucks.fi/127.0.0.1#5335 +ipset=/volvotrucks.fi/gfwlist +server=/mini.ro/127.0.0.1#5335 +ipset=/mini.ro/gfwlist +server=/porn7.xxx/127.0.0.1#5335 +ipset=/porn7.xxx/gfwlist +server=/beatmonstersaustralia.net/127.0.0.1#5335 +ipset=/beatmonstersaustralia.net/gfwlist +server=/lxxlxx.com/127.0.0.1#5335 +ipset=/lxxlxx.com/gfwlist +server=/beatbydremonster.com/127.0.0.1#5335 +ipset=/beatbydremonster.com/gfwlist +server=/beatbydre2013.com/127.0.0.1#5335 +ipset=/beatbydre2013.com/gfwlist +server=/getws1.com/127.0.0.1#5335 +ipset=/getws1.com/gfwlist +server=/baxsound.com/127.0.0.1#5335 +ipset=/baxsound.com/gfwlist +server=/auricularesbeatsmarkt.com/127.0.0.1#5335 +ipset=/auricularesbeatsmarkt.com/gfwlist +server=/nudegfporn.com/127.0.0.1#5335 +ipset=/nudegfporn.com/gfwlist +server=/epochbuy.com/127.0.0.1#5335 +ipset=/epochbuy.com/gfwlist +server=/faceboock.com/127.0.0.1#5335 +ipset=/faceboock.com/gfwlist +server=/anandtech.com/127.0.0.1#5335 +ipset=/anandtech.com/gfwlist +server=/audiobeatsbydre.com/127.0.0.1#5335 +ipset=/audiobeatsbydre.com/gfwlist +server=/app-store.wang/127.0.0.1#5335 +ipset=/app-store.wang/gfwlist +server=/historyofdota.net/127.0.0.1#5335 +ipset=/historyofdota.net/gfwlist +server=/foxrelease.com/127.0.0.1#5335 +ipset=/foxrelease.com/gfwlist +server=/stepdaughter.love/127.0.0.1#5335 +ipset=/stepdaughter.love/gfwlist +server=/alphera-finance.co.in/127.0.0.1#5335 +ipset=/alphera-finance.co.in/gfwlist +server=/farfetch-contents.com/127.0.0.1#5335 +ipset=/farfetch-contents.com/gfwlist +server=/gay1069sex.com/127.0.0.1#5335 +ipset=/gay1069sex.com/gfwlist +server=/aws-iot-hackathon.com/127.0.0.1#5335 +ipset=/aws-iot-hackathon.com/gfwlist +server=/volvo-truck.nl/127.0.0.1#5335 +ipset=/volvo-truck.nl/gfwlist +server=/aanaan.com/127.0.0.1#5335 +ipset=/aanaan.com/gfwlist +server=/pearsonassessment.no/127.0.0.1#5335 +ipset=/pearsonassessment.no/gfwlist +server=/adobelogin.com/127.0.0.1#5335 +ipset=/adobelogin.com/gfwlist +server=/bridgestone-brand.com/127.0.0.1#5335 +ipset=/bridgestone-brand.com/gfwlist +server=/bmw-motorrad.com.do/127.0.0.1#5335 +ipset=/bmw-motorrad.com.do/gfwlist +server=/2drdrebeats.com/127.0.0.1#5335 +ipset=/2drdrebeats.com/gfwlist +server=/ultrayoungsex.com/127.0.0.1#5335 +ipset=/ultrayoungsex.com/gfwlist +server=/allpasswords.com/127.0.0.1#5335 +ipset=/allpasswords.com/gfwlist +server=/xn--4vq477m.com/127.0.0.1#5335 +ipset=/xn--4vq477m.com/gfwlist +server=/metcams.com/127.0.0.1#5335 +ipset=/metcams.com/gfwlist +server=/caribbeancom.com/127.0.0.1#5335 +ipset=/caribbeancom.com/gfwlist +server=/voaswahili.com/127.0.0.1#5335 +ipset=/voaswahili.com/gfwlist +server=/fanqianglu.com/127.0.0.1#5335 +ipset=/fanqianglu.com/gfwlist +server=/pearsonplaces.com.au/127.0.0.1#5335 +ipset=/pearsonplaces.com.au/gfwlist +server=/starwarsfallenorder.com/127.0.0.1#5335 +ipset=/starwarsfallenorder.com/gfwlist +server=/womenwill.mx/127.0.0.1#5335 +ipset=/womenwill.mx/gfwlist +server=/bizographics.com/127.0.0.1#5335 +ipset=/bizographics.com/gfwlist +server=/certum.pl/127.0.0.1#5335 +ipset=/certum.pl/gfwlist +server=/disneyplus.com/127.0.0.1#5335 +ipset=/disneyplus.com/gfwlist +server=/bluffyporn.com/127.0.0.1#5335 +ipset=/bluffyporn.com/gfwlist +server=/terrlficdates.com/127.0.0.1#5335 +ipset=/terrlficdates.com/gfwlist +server=/gameon-masters.com/127.0.0.1#5335 +ipset=/gameon-masters.com/gfwlist +server=/associates-amazon.com/127.0.0.1#5335 +ipset=/associates-amazon.com/gfwlist +server=/3xplanet.com/127.0.0.1#5335 +ipset=/3xplanet.com/gfwlist +server=/amzn.com/127.0.0.1#5335 +ipset=/amzn.com/gfwlist +server=/sex021.net/127.0.0.1#5335 +ipset=/sex021.net/gfwlist +server=/ulrichsweb.serialssolutions.com/127.0.0.1#5335 +ipset=/ulrichsweb.serialssolutions.com/gfwlist +server=/espn.api.edge.bamgrid.com/127.0.0.1#5335 +ipset=/espn.api.edge.bamgrid.com/gfwlist +server=/halfcanada.com/127.0.0.1#5335 +ipset=/halfcanada.com/gfwlist +server=/ebayboutique.com/127.0.0.1#5335 +ipset=/ebayboutique.com/gfwlist +server=/amazonpay.com/127.0.0.1#5335 +ipset=/amazonpay.com/gfwlist +server=/battlefield4.com/127.0.0.1#5335 +ipset=/battlefield4.com/gfwlist +server=/opencreate.org/127.0.0.1#5335 +ipset=/opencreate.org/gfwlist +server=/hentaivvz.com/127.0.0.1#5335 +ipset=/hentaivvz.com/gfwlist +server=/paypal-community.net/127.0.0.1#5335 +ipset=/paypal-community.net/gfwlist +server=/gvt5.com/127.0.0.1#5335 +ipset=/gvt5.com/gfwlist +server=/amazonimages.com/127.0.0.1#5335 +ipset=/amazonimages.com/gfwlist +server=/ipfs-gateway.cloud/127.0.0.1#5335 +ipset=/ipfs-gateway.cloud/gfwlist +server=/iwork.com/127.0.0.1#5335 +ipset=/iwork.com/gfwlist +server=/amazonbusiness.org/127.0.0.1#5335 +ipset=/amazonbusiness.org/gfwlist +server=/hentai-img.com/127.0.0.1#5335 +ipset=/hentai-img.com/gfwlist +server=/gendai.net/127.0.0.1#5335 +ipset=/gendai.net/gfwlist +server=/eubluecardvisa.com/127.0.0.1#5335 +ipset=/eubluecardvisa.com/gfwlist +server=/pornproxy.app/127.0.0.1#5335 +ipset=/pornproxy.app/gfwlist +server=/researchgate.net/127.0.0.1#5335 +ipset=/researchgate.net/gfwlist +server=/bestbuyethics.com/127.0.0.1#5335 +ipset=/bestbuyethics.com/gfwlist +server=/amazon.com.au/127.0.0.1#5335 +ipset=/amazon.com.au/gfwlist +server=/imageworks.com/127.0.0.1#5335 +ipset=/imageworks.com/gfwlist +server=/youtube.co.il/127.0.0.1#5335 +ipset=/youtube.co.il/gfwlist +server=/sony.sk/127.0.0.1#5335 +ipset=/sony.sk/gfwlist +server=/aboutamazon.in/127.0.0.1#5335 +ipset=/aboutamazon.in/gfwlist +server=/aboutamazon.de/127.0.0.1#5335 +ipset=/aboutamazon.de/gfwlist +server=/rthk.hk/127.0.0.1#5335 +ipset=/rthk.hk/gfwlist +server=/aboutamazon.com.au/127.0.0.1#5335 +ipset=/aboutamazon.com.au/gfwlist +server=/bloombergenvironment.com/127.0.0.1#5335 +ipset=/bloombergenvironment.com/gfwlist +server=/wfm.com/127.0.0.1#5335 +ipset=/wfm.com/gfwlist +server=/heydoga.com/127.0.0.1#5335 +ipset=/heydoga.com/gfwlist +server=/pearson.com.uy/127.0.0.1#5335 +ipset=/pearson.com.uy/gfwlist +server=/demfhz.xyz/127.0.0.1#5335 +ipset=/demfhz.xyz/gfwlist +server=/bridgestonecomercial.cl/127.0.0.1#5335 +ipset=/bridgestonecomercial.cl/gfwlist +server=/libsolutions.domains/127.0.0.1#5335 +ipset=/libsolutions.domains/gfwlist +server=/zohomeetups.com/127.0.0.1#5335 +ipset=/zohomeetups.com/gfwlist +server=/mastercard.com.vn/127.0.0.1#5335 +ipset=/mastercard.com.vn/gfwlist +server=/kindle.co.uk/127.0.0.1#5335 +ipset=/kindle.co.uk/gfwlist +server=/containersonaws.com/127.0.0.1#5335 +ipset=/containersonaws.com/gfwlist +server=/cloudfront.net/127.0.0.1#5335 +ipset=/cloudfront.net/gfwlist +server=/gaypornlinks.com/127.0.0.1#5335 +ipset=/gaypornlinks.com/gfwlist +server=/monsterbeatspascher.net/127.0.0.1#5335 +ipset=/monsterbeatspascher.net/gfwlist +server=/hulu.playback.edge.bamgrid.com/127.0.0.1#5335 +ipset=/hulu.playback.edge.bamgrid.com/gfwlist +server=/bcbits.com/127.0.0.1#5335 +ipset=/bcbits.com/gfwlist +server=/appl.com/127.0.0.1#5335 +ipset=/appl.com/gfwlist +server=/awseducate.com/127.0.0.1#5335 +ipset=/awseducate.com/gfwlist +server=/durex.jp/127.0.0.1#5335 +ipset=/durex.jp/gfwlist +server=/kinkbook.com/127.0.0.1#5335 +ipset=/kinkbook.com/gfwlist +server=/origin-a.akamaihd.net/127.0.0.1#5335 +ipset=/origin-a.akamaihd.net/gfwlist +server=/alfera.in/127.0.0.1#5335 +ipset=/alfera.in/gfwlist +server=/mhradio.org/127.0.0.1#5335 +ipset=/mhradio.org/gfwlist +server=/gmail.com/127.0.0.1#5335 +ipset=/gmail.com/gfwlist +server=/minidowntown.ca/127.0.0.1#5335 +ipset=/minidowntown.ca/gfwlist +server=/ikea.de/127.0.0.1#5335 +ipset=/ikea.de/gfwlist +server=/uun92.com/127.0.0.1#5335 +ipset=/uun92.com/gfwlist +server=/visa.com.ua/127.0.0.1#5335 +ipset=/visa.com.ua/gfwlist +server=/ebayclassifieds.org/127.0.0.1#5335 +ipset=/ebayclassifieds.org/gfwlist +server=/product.co.jp/127.0.0.1#5335 +ipset=/product.co.jp/gfwlist +server=/amazonses.com/127.0.0.1#5335 +ipset=/amazonses.com/gfwlist +server=/cheapbeatsdrestudios.com/127.0.0.1#5335 +ipset=/cheapbeatsdrestudios.com/gfwlist +server=/amazonaws.tv/127.0.0.1#5335 +ipset=/amazonaws.tv/gfwlist +server=/6japaneseporn.com/127.0.0.1#5335 +ipset=/6japaneseporn.com/gfwlist +server=/amazonaws-china.com/127.0.0.1#5335 +ipset=/amazonaws-china.com/gfwlist +server=/digital-rb.com/127.0.0.1#5335 +ipset=/digital-rb.com/gfwlist +server=/hopstop.tv/127.0.0.1#5335 +ipset=/hopstop.tv/gfwlist +server=/ymail.com/127.0.0.1#5335 +ipset=/ymail.com/gfwlist +server=/69flv.com/127.0.0.1#5335 +ipset=/69flv.com/gfwlist +server=/bootstrapcdn.com/127.0.0.1#5335 +ipset=/bootstrapcdn.com/gfwlist +server=/mastercard.ro/127.0.0.1#5335 +ipset=/mastercard.ro/gfwlist +server=/alibabacloud.com.sg/127.0.0.1#5335 +ipset=/alibabacloud.com.sg/gfwlist +server=/nintendoswitch.com/127.0.0.1#5335 +ipset=/nintendoswitch.com/gfwlist +server=/b-ok.asia/127.0.0.1#5335 +ipset=/b-ok.asia/gfwlist +server=/medrxiv.org/127.0.0.1#5335 +ipset=/medrxiv.org/gfwlist +server=/fetlife.com/127.0.0.1#5335 +ipset=/fetlife.com/gfwlist +server=/fzdshare.net/127.0.0.1#5335 +ipset=/fzdshare.net/gfwlist +server=/omscr.com/127.0.0.1#5335 +ipset=/omscr.com/gfwlist +server=/pearsonclinical.com.au/127.0.0.1#5335 +ipset=/pearsonclinical.com.au/gfwlist +server=/alibabacloud.co.in/127.0.0.1#5335 +ipset=/alibabacloud.co.in/gfwlist +server=/hptechventures.com/127.0.0.1#5335 +ipset=/hptechventures.com/gfwlist +server=/sonyclassics.com/127.0.0.1#5335 +ipset=/sonyclassics.com/gfwlist +server=/rexcha.com/127.0.0.1#5335 +ipset=/rexcha.com/gfwlist +server=/redditstatic.com/127.0.0.1#5335 +ipset=/redditstatic.com/gfwlist +server=/amateurwifevideos.com/127.0.0.1#5335 +ipset=/amateurwifevideos.com/gfwlist +server=/nikefootballgloves.com/127.0.0.1#5335 +ipset=/nikefootballgloves.com/gfwlist +server=/rimg.com.tw/127.0.0.1#5335 +ipset=/rimg.com.tw/gfwlist +server=/orbitera.com/127.0.0.1#5335 +ipset=/orbitera.com/gfwlist +server=/sex-ly.com/127.0.0.1#5335 +ipset=/sex-ly.com/gfwlist +server=/youtube.com.ar/127.0.0.1#5335 +ipset=/youtube.com.ar/gfwlist +server=/juggsjoy.com/127.0.0.1#5335 +ipset=/juggsjoy.com/gfwlist +server=/ntd.tv/127.0.0.1#5335 +ipset=/ntd.tv/gfwlist +server=/motolia.com/127.0.0.1#5335 +ipset=/motolia.com/gfwlist +server=/wife-home-videos.com/127.0.0.1#5335 +ipset=/wife-home-videos.com/gfwlist +server=/netname.com.br/127.0.0.1#5335 +ipset=/netname.com.br/gfwlist +server=/fptolia.com/127.0.0.1#5335 +ipset=/fptolia.com/gfwlist +server=/deviantclip.com/127.0.0.1#5335 +ipset=/deviantclip.com/gfwlist +server=/fotolia-noticias.com/127.0.0.1#5335 +ipset=/fotolia-noticias.com/gfwlist +server=/worldflipper.akamaized.net/127.0.0.1#5335 +ipset=/worldflipper.akamaized.net/gfwlist +server=/fonolia.com/127.0.0.1#5335 +ipset=/fonolia.com/gfwlist +server=/disneymeetingsandevents.com/127.0.0.1#5335 +ipset=/disneymeetingsandevents.com/gfwlist +server=/bridgestone-business-service.jp/127.0.0.1#5335 +ipset=/bridgestone-business-service.jp/gfwlist +server=/huffingtonpost.co.za/127.0.0.1#5335 +ipset=/huffingtonpost.co.za/gfwlist +server=/foftolia.com/127.0.0.1#5335 +ipset=/foftolia.com/gfwlist +server=/fiotolia.com/127.0.0.1#5335 +ipset=/fiotolia.com/gfwlist +server=/visa.com.bz/127.0.0.1#5335 +ipset=/visa.com.bz/gfwlist +server=/webex.co.nz/127.0.0.1#5335 +ipset=/webex.co.nz/gfwlist +server=/nexttv.com.tw/127.0.0.1#5335 +ipset=/nexttv.com.tw/gfwlist +server=/adobeccstatic.com/127.0.0.1#5335 +ipset=/adobeccstatic.com/gfwlist +server=/worldsecureemail.com/127.0.0.1#5335 +ipset=/worldsecureemail.com/gfwlist +server=/ettoday.net/127.0.0.1#5335 +ipset=/ettoday.net/gfwlist +server=/dirtyhomefuck.com/127.0.0.1#5335 +ipset=/dirtyhomefuck.com/gfwlist +server=/battlefrontii.com/127.0.0.1#5335 +ipset=/battlefrontii.com/gfwlist +server=/imagineecommerce.com/127.0.0.1#5335 +ipset=/imagineecommerce.com/gfwlist +server=/wiz-s.jp/127.0.0.1#5335 +ipset=/wiz-s.jp/gfwlist +server=/zee.com/127.0.0.1#5335 +ipset=/zee.com/gfwlist +server=/fuckingthreesome.com/127.0.0.1#5335 +ipset=/fuckingthreesome.com/gfwlist +server=/tx.me/127.0.0.1#5335 +ipset=/tx.me/gfwlist +server=/kidgrid.tv/127.0.0.1#5335 +ipset=/kidgrid.tv/gfwlist +server=/porno-erotica.com/127.0.0.1#5335 +ipset=/porno-erotica.com/gfwlist +server=/flyingjizz.com/127.0.0.1#5335 +ipset=/flyingjizz.com/gfwlist +server=/pornobrasileiro.xyz/127.0.0.1#5335 +ipset=/pornobrasileiro.xyz/gfwlist +server=/microsoft.md/127.0.0.1#5335 +ipset=/microsoft.md/gfwlist +server=/bestfreecams.club/127.0.0.1#5335 +ipset=/bestfreecams.club/gfwlist +server=/9nation.com.au/127.0.0.1#5335 +ipset=/9nation.com.au/gfwlist +server=/watersex.com/127.0.0.1#5335 +ipset=/watersex.com/gfwlist +server=/mailonline.co.uk/127.0.0.1#5335 +ipset=/mailonline.co.uk/gfwlist +server=/adobetechcomm.com/127.0.0.1#5335 +ipset=/adobetechcomm.com/gfwlist +server=/adobestock.com/127.0.0.1#5335 +ipset=/adobestock.com/gfwlist +server=/jinnaju.com/127.0.0.1#5335 +ipset=/jinnaju.com/gfwlist +server=/sci-hub.it.nf/127.0.0.1#5335 +ipset=/sci-hub.it.nf/gfwlist +server=/bmw-motorrad.tw/127.0.0.1#5335 +ipset=/bmw-motorrad.tw/gfwlist +server=/albeats.com/127.0.0.1#5335 +ipset=/albeats.com/gfwlist +server=/gaypornonly.com/127.0.0.1#5335 +ipset=/gaypornonly.com/gfwlist +server=/adobelanding.com/127.0.0.1#5335 +ipset=/adobelanding.com/gfwlist +server=/adobejanus.com/127.0.0.1#5335 +ipset=/adobejanus.com/gfwlist +server=/adultvideodump.com/127.0.0.1#5335 +ipset=/adultvideodump.com/gfwlist +server=/google.co.zm/127.0.0.1#5335 +ipset=/google.co.zm/gfwlist +server=/visa.com.ai/127.0.0.1#5335 +ipset=/visa.com.ai/gfwlist +server=/nytimes.com/127.0.0.1#5335 +ipset=/nytimes.com/gfwlist +server=/mastercard.com.bz/127.0.0.1#5335 +ipset=/mastercard.com.bz/gfwlist +server=/adobedemo.com/127.0.0.1#5335 +ipset=/adobedemo.com/gfwlist +server=/facebopk.com/127.0.0.1#5335 +ipset=/facebopk.com/gfwlist +server=/imacapplecomputer.com/127.0.0.1#5335 +ipset=/imacapplecomputer.com/gfwlist +server=/youtube.com/127.0.0.1#5335 +ipset=/youtube.com/gfwlist +server=/vhxqa4.com/127.0.0.1#5335 +ipset=/vhxqa4.com/gfwlist +server=/indianpornvideo.org/127.0.0.1#5335 +ipset=/indianpornvideo.org/gfwlist +server=/voachinese.com/127.0.0.1#5335 +ipset=/voachinese.com/gfwlist +server=/indianfuck2.com/127.0.0.1#5335 +ipset=/indianfuck2.com/gfwlist +server=/manoramayearbook.in/127.0.0.1#5335 +ipset=/manoramayearbook.in/gfwlist +server=/airtunes.com/127.0.0.1#5335 +ipset=/airtunes.com/gfwlist +server=/adobe.ly/127.0.0.1#5335 +ipset=/adobe.ly/gfwlist +server=/mymusclevideo.com/127.0.0.1#5335 +ipset=/mymusclevideo.com/gfwlist +server=/targetimg1.com/127.0.0.1#5335 +ipset=/targetimg1.com/gfwlist +server=/visa.com.pr/127.0.0.1#5335 +ipset=/visa.com.pr/gfwlist +server=/elderscrolls.com/127.0.0.1#5335 +ipset=/elderscrolls.com/gfwlist +server=/scholar.google.com.tr/127.0.0.1#5335 +ipset=/scholar.google.com.tr/gfwlist +server=/uun96.com/127.0.0.1#5335 +ipset=/uun96.com/gfwlist +server=/hbabit.com/127.0.0.1#5335 +ipset=/hbabit.com/gfwlist +server=/adobe-audience-finder.com/127.0.0.1#5335 +ipset=/adobe-audience-finder.com/gfwlist +server=/allpornsitespass.com/127.0.0.1#5335 +ipset=/allpornsitespass.com/gfwlist +server=/beatsoutletonlines.com/127.0.0.1#5335 +ipset=/beatsoutletonlines.com/gfwlist +server=/bybeatsdre.com/127.0.0.1#5335 +ipset=/bybeatsdre.com/gfwlist +server=/qualcomm-email.com/127.0.0.1#5335 +ipset=/qualcomm-email.com/gfwlist +server=/vod-dash-ww-live.akamaized.net/127.0.0.1#5335 +ipset=/vod-dash-ww-live.akamaized.net/gfwlist +server=/onxxxtube.com/127.0.0.1#5335 +ipset=/onxxxtube.com/gfwlist +server=/goldjizz.com/127.0.0.1#5335 +ipset=/goldjizz.com/gfwlist +server=/electronicarts.com/127.0.0.1#5335 +ipset=/electronicarts.com/gfwlist +server=/advertising.adobe.com/127.0.0.1#5335 +ipset=/advertising.adobe.com/gfwlist +server=/acer.com/127.0.0.1#5335 +ipset=/acer.com/gfwlist +server=/ikea.co.th/127.0.0.1#5335 +ipset=/ikea.co.th/gfwlist +server=/zsh.org/127.0.0.1#5335 +ipset=/zsh.org/gfwlist +server=/readmoo.com/127.0.0.1#5335 +ipset=/readmoo.com/gfwlist +server=/unpkg.com/127.0.0.1#5335 +ipset=/unpkg.com/gfwlist +server=/sqlite.org/127.0.0.1#5335 +ipset=/sqlite.org/gfwlist +server=/maddenseason.org/127.0.0.1#5335 +ipset=/maddenseason.org/gfwlist +server=/r-project.org/127.0.0.1#5335 +ipset=/r-project.org/gfwlist +server=/betterhdporn.com/127.0.0.1#5335 +ipset=/betterhdporn.com/gfwlist +server=/macappsto.re/127.0.0.1#5335 +ipset=/macappsto.re/gfwlist +server=/phantomjs.org/127.0.0.1#5335 +ipset=/phantomjs.org/gfwlist +server=/im-apps.net/127.0.0.1#5335 +ipset=/im-apps.net/gfwlist +server=/gayfuror.com/127.0.0.1#5335 +ipset=/gayfuror.com/gfwlist +server=/pornmonde.com/127.0.0.1#5335 +ipset=/pornmonde.com/gfwlist +server=/openai.com/127.0.0.1#5335 +ipset=/openai.com/gfwlist +server=/porncomixonline.net/127.0.0.1#5335 +ipset=/porncomixonline.net/gfwlist +server=/apple.bg/127.0.0.1#5335 +ipset=/apple.bg/gfwlist +server=/sunglassessale2014.com/127.0.0.1#5335 +ipset=/sunglassessale2014.com/gfwlist +server=/exploitedcollegegirls.com/127.0.0.1#5335 +ipset=/exploitedcollegegirls.com/gfwlist +server=/lua.org/127.0.0.1#5335 +ipset=/lua.org/gfwlist +server=/visasignaturehotels.com/127.0.0.1#5335 +ipset=/visasignaturehotels.com/gfwlist +server=/js.org/127.0.0.1#5335 +ipset=/js.org/gfwlist +server=/mastercard.co.ve/127.0.0.1#5335 +ipset=/mastercard.co.ve/gfwlist +server=/ebaysohos.com/127.0.0.1#5335 +ipset=/ebaysohos.com/gfwlist +server=/nuespournous.com/127.0.0.1#5335 +ipset=/nuespournous.com/gfwlist +server=/deepfreeze.com.br/127.0.0.1#5335 +ipset=/deepfreeze.com.br/gfwlist +server=/pypi.io/127.0.0.1#5335 +ipset=/pypi.io/gfwlist +server=/gnu.org/127.0.0.1#5335 +ipset=/gnu.org/gfwlist +server=/icloudmusic.net/127.0.0.1#5335 +ipset=/icloudmusic.net/gfwlist +server=/juicytwink.com/127.0.0.1#5335 +ipset=/juicytwink.com/gfwlist +server=/drdremonsterdre.com/127.0.0.1#5335 +ipset=/drdremonsterdre.com/gfwlist +server=/dditsadn.com/127.0.0.1#5335 +ipset=/dditsadn.com/gfwlist +server=/meetandfuck.games/127.0.0.1#5335 +ipset=/meetandfuck.games/gfwlist +server=/steamygamer.com/127.0.0.1#5335 +ipset=/steamygamer.com/gfwlist +server=/bdsmlr.com/127.0.0.1#5335 +ipset=/bdsmlr.com/gfwlist +server=/apache.org/127.0.0.1#5335 +ipset=/apache.org/gfwlist +server=/mini.com.mt/127.0.0.1#5335 +ipset=/mini.com.mt/gfwlist +server=/fox-corporation.com/127.0.0.1#5335 +ipset=/fox-corporation.com/gfwlist +server=/webex.com.au/127.0.0.1#5335 +ipset=/webex.com.au/gfwlist +server=/swoosh.tv/127.0.0.1#5335 +ipset=/swoosh.tv/gfwlist +server=/bmw-motorrad.ma/127.0.0.1#5335 +ipset=/bmw-motorrad.ma/gfwlist +server=/xda-cdn.com/127.0.0.1#5335 +ipset=/xda-cdn.com/gfwlist +server=/intelnet.component/127.0.0.1#5335 +ipset=/intelnet.component/gfwlist +server=/bukkake-jav.com/127.0.0.1#5335 +ipset=/bukkake-jav.com/gfwlist +server=/adult.toonsearch.net/127.0.0.1#5335 +ipset=/adult.toonsearch.net/gfwlist +server=/kav.tw/127.0.0.1#5335 +ipset=/kav.tw/gfwlist +server=/dealtime.com/127.0.0.1#5335 +ipset=/dealtime.com/gfwlist +server=/girlfriendvideos.com/127.0.0.1#5335 +ipset=/girlfriendvideos.com/gfwlist +server=/unity3d.com/127.0.0.1#5335 +ipset=/unity3d.com/gfwlist +server=/disp.cc/127.0.0.1#5335 +ipset=/disp.cc/gfwlist +server=/xn--yf1at58a.com/127.0.0.1#5335 +ipset=/xn--yf1at58a.com/gfwlist +server=/dlsitenews.com/127.0.0.1#5335 +ipset=/dlsitenews.com/gfwlist +server=/booksc.xyz/127.0.0.1#5335 +ipset=/booksc.xyz/gfwlist +server=/ampproject.com/127.0.0.1#5335 +ipset=/ampproject.com/gfwlist +server=/applecare.cc/127.0.0.1#5335 +ipset=/applecare.cc/gfwlist +server=/fstopimages.com/127.0.0.1#5335 +ipset=/fstopimages.com/gfwlist +server=/camelotherald.net/127.0.0.1#5335 +ipset=/camelotherald.net/gfwlist +server=/kernel.org/127.0.0.1#5335 +ipset=/kernel.org/gfwlist +server=/dropboxstatic.com/127.0.0.1#5335 +ipset=/dropboxstatic.com/gfwlist +server=/privilege.tw/127.0.0.1#5335 +ipset=/privilege.tw/gfwlist +server=/android.com/127.0.0.1#5335 +ipset=/android.com/gfwlist +server=/batsa.me/127.0.0.1#5335 +ipset=/batsa.me/gfwlist +server=/vanish.fr/127.0.0.1#5335 +ipset=/vanish.fr/gfwlist +server=/alphera.net/127.0.0.1#5335 +ipset=/alphera.net/gfwlist +server=/wifevideos.net/127.0.0.1#5335 +ipset=/wifevideos.net/gfwlist +server=/dremonsterbeatsoutlets.com/127.0.0.1#5335 +ipset=/dremonsterbeatsoutlets.com/gfwlist +server=/fox2news.com/127.0.0.1#5335 +ipset=/fox2news.com/gfwlist +server=/beatsnzsale.com/127.0.0.1#5335 +ipset=/beatsnzsale.com/gfwlist +server=/intel.sc/127.0.0.1#5335 +ipset=/intel.sc/gfwlist +server=/stackoverflowcareers.com/127.0.0.1#5335 +ipset=/stackoverflowcareers.com/gfwlist +server=/uun79.com/127.0.0.1#5335 +ipset=/uun79.com/gfwlist +server=/volvobuses.jo/127.0.0.1#5335 +ipset=/volvobuses.jo/gfwlist +server=/ecuatorianas.best/127.0.0.1#5335 +ipset=/ecuatorianas.best/gfwlist +server=/stackoverflow.co/127.0.0.1#5335 +ipset=/stackoverflow.co/gfwlist +server=/stackoverflow.blog/127.0.0.1#5335 +ipset=/stackoverflow.blog/gfwlist +server=/connectedcommerce.com/127.0.0.1#5335 +ipset=/connectedcommerce.com/gfwlist +server=/orsm.net/127.0.0.1#5335 +ipset=/orsm.net/gfwlist +server=/paypal-business.com/127.0.0.1#5335 +ipset=/paypal-business.com/gfwlist +server=/momoniji.com/127.0.0.1#5335 +ipset=/momoniji.com/gfwlist +server=/homegrownfreaks.net/127.0.0.1#5335 +ipset=/homegrownfreaks.net/gfwlist +server=/youtube.co.ke/127.0.0.1#5335 +ipset=/youtube.co.ke/gfwlist +server=/goodporn.to/127.0.0.1#5335 +ipset=/goodporn.to/gfwlist +server=/kindle.fr/127.0.0.1#5335 +ipset=/kindle.fr/gfwlist +server=/javher.com/127.0.0.1#5335 +ipset=/javher.com/gfwlist +server=/pypi.org/127.0.0.1#5335 +ipset=/pypi.org/gfwlist +server=/lustery.com/127.0.0.1#5335 +ipset=/lustery.com/gfwlist +server=/polymerproject.org/127.0.0.1#5335 +ipset=/polymerproject.org/gfwlist +server=/facebook-covid-19.com/127.0.0.1#5335 +ipset=/facebook-covid-19.com/gfwlist +server=/hairy-amateurs.com/127.0.0.1#5335 +ipset=/hairy-amateurs.com/gfwlist +server=/jetbrains.space/127.0.0.1#5335 +ipset=/jetbrains.space/gfwlist +server=/hinet.net/127.0.0.1#5335 +ipset=/hinet.net/gfwlist +server=/perl.org/127.0.0.1#5335 +ipset=/perl.org/gfwlist +server=/maya5.net/127.0.0.1#5335 +ipset=/maya5.net/gfwlist +server=/disney.nl/127.0.0.1#5335 +ipset=/disney.nl/gfwlist +server=/garena.tv/127.0.0.1#5335 +ipset=/garena.tv/gfwlist +server=/hentaizz.net/127.0.0.1#5335 +ipset=/hentaizz.net/gfwlist +server=/mongodb.com/127.0.0.1#5335 +ipset=/mongodb.com/gfwlist +server=/eroan.xyz/127.0.0.1#5335 +ipset=/eroan.xyz/gfwlist +server=/ikea.si/127.0.0.1#5335 +ipset=/ikea.si/gfwlist +server=/visa.co.ke/127.0.0.1#5335 +ipset=/visa.co.ke/gfwlist +server=/volvotrucks.by/127.0.0.1#5335 +ipset=/volvotrucks.by/gfwlist +server=/babylongirls.co.uk/127.0.0.1#5335 +ipset=/babylongirls.co.uk/gfwlist +server=/cairn.info/127.0.0.1#5335 +ipset=/cairn.info/gfwlist +server=/alphera.in/127.0.0.1#5335 +ipset=/alphera.in/gfwlist +server=/alpherafs.com.hk/127.0.0.1#5335 +ipset=/alpherafs.com.hk/gfwlist +server=/volvotrucks.fr/127.0.0.1#5335 +ipset=/volvotrucks.fr/gfwlist +server=/vscode-unpkg.net/127.0.0.1#5335 +ipset=/vscode-unpkg.net/gfwlist +server=/vfsforgit.org/127.0.0.1#5335 +ipset=/vfsforgit.org/gfwlist +server=/nexpart.tv/127.0.0.1#5335 +ipset=/nexpart.tv/gfwlist +server=/visualstudio.co.uk/127.0.0.1#5335 +ipset=/visualstudio.co.uk/gfwlist +server=/volvogroup.se/127.0.0.1#5335 +ipset=/volvogroup.se/gfwlist +server=/visualstudio.co/127.0.0.1#5335 +ipset=/visualstudio.co/gfwlist +server=/bmw-motorrad.cr/127.0.0.1#5335 +ipset=/bmw-motorrad.cr/gfwlist +server=/blacked.com/127.0.0.1#5335 +ipset=/blacked.com/gfwlist +server=/escape.com.au/127.0.0.1#5335 +ipset=/escape.com.au/gfwlist +server=/bag-glasses1.com/127.0.0.1#5335 +ipset=/bag-glasses1.com/gfwlist +server=/cloudflaretest.com/127.0.0.1#5335 +ipset=/cloudflaretest.com/gfwlist +server=/microsoftsilverlight.org/127.0.0.1#5335 +ipset=/microsoftsilverlight.org/gfwlist +server=/bill-safe.com/127.0.0.1#5335 +ipset=/bill-safe.com/gfwlist +server=/priceless.com/127.0.0.1#5335 +ipset=/priceless.com/gfwlist +server=/bmw.re/127.0.0.1#5335 +ipset=/bmw.re/gfwlist +server=/analtime.org/127.0.0.1#5335 +ipset=/analtime.org/gfwlist +server=/nikelives.com/127.0.0.1#5335 +ipset=/nikelives.com/gfwlist +server=/google.com.sa/127.0.0.1#5335 +ipset=/google.com.sa/gfwlist +server=/camelotherald.com/127.0.0.1#5335 +ipset=/camelotherald.com/gfwlist +server=/gay4tube.com/127.0.0.1#5335 +ipset=/gay4tube.com/gfwlist +server=/d29vzk4ow07wi7.cloudfront.net/127.0.0.1#5335 +ipset=/d29vzk4ow07wi7.cloudfront.net/gfwlist +server=/av-th.net/127.0.0.1#5335 +ipset=/av-th.net/gfwlist +server=/adobespark.com/127.0.0.1#5335 +ipset=/adobespark.com/gfwlist +server=/jfrog.com/127.0.0.1#5335 +ipset=/jfrog.com/gfwlist +server=/kijiji.ca/127.0.0.1#5335 +ipset=/kijiji.ca/gfwlist +server=/oxfordre.com/127.0.0.1#5335 +ipset=/oxfordre.com/gfwlist +server=/i69.com.tw/127.0.0.1#5335 +ipset=/i69.com.tw/gfwlist +server=/upornia.com/127.0.0.1#5335 +ipset=/upornia.com/gfwlist +server=/jjaaxyz.com/127.0.0.1#5335 +ipset=/jjaaxyz.com/gfwlist +server=/mcpeaceofmind.com/127.0.0.1#5335 +ipset=/mcpeaceofmind.com/gfwlist +server=/18novel.xyz/127.0.0.1#5335 +ipset=/18novel.xyz/gfwlist +server=/bridgestone.com.vn/127.0.0.1#5335 +ipset=/bridgestone.com.vn/gfwlist +server=/cbart.net/127.0.0.1#5335 +ipset=/cbart.net/gfwlist +server=/piapro.net/127.0.0.1#5335 +ipset=/piapro.net/gfwlist +server=/facebokc.com/127.0.0.1#5335 +ipset=/facebokc.com/gfwlist +server=/mastercad.com/127.0.0.1#5335 +ipset=/mastercad.com/gfwlist +server=/girl7942.com/127.0.0.1#5335 +ipset=/girl7942.com/gfwlist +server=/snap-telemetry.io/127.0.0.1#5335 +ipset=/snap-telemetry.io/gfwlist +server=/bidi.net.uk/127.0.0.1#5335 +ipset=/bidi.net.uk/gfwlist +server=/soundcloud.com/127.0.0.1#5335 +ipset=/soundcloud.com/gfwlist +server=/canon.rs/127.0.0.1#5335 +ipset=/canon.rs/gfwlist +server=/ebaycdn.net/127.0.0.1#5335 +ipset=/ebaycdn.net/gfwlist +server=/instagram.com/127.0.0.1#5335 +ipset=/instagram.com/gfwlist +server=/mastercard.ca/127.0.0.1#5335 +ipset=/mastercard.ca/gfwlist +server=/foxnewslatino.com/127.0.0.1#5335 +ipset=/foxnewslatino.com/gfwlist +server=/google.md/127.0.0.1#5335 +ipset=/google.md/gfwlist +server=/simcity.com/127.0.0.1#5335 +ipset=/simcity.com/gfwlist +server=/newslicensing.co.uk/127.0.0.1#5335 +ipset=/newslicensing.co.uk/gfwlist +server=/niketrainers.com/127.0.0.1#5335 +ipset=/niketrainers.com/gfwlist +server=/marvelspotlightplays.com/127.0.0.1#5335 +ipset=/marvelspotlightplays.com/gfwlist +server=/beatssaustraliabuy.com/127.0.0.1#5335 +ipset=/beatssaustraliabuy.com/gfwlist +server=/stackage.org/127.0.0.1#5335 +ipset=/stackage.org/gfwlist +server=/ebay.fr/127.0.0.1#5335 +ipset=/ebay.fr/gfwlist +server=/theleakbay.com/127.0.0.1#5335 +ipset=/theleakbay.com/gfwlist +server=/youtube.fr/127.0.0.1#5335 +ipset=/youtube.fr/gfwlist +server=/dogcumshot.net/127.0.0.1#5335 +ipset=/dogcumshot.net/gfwlist +server=/slidesharecdn.com/127.0.0.1#5335 +ipset=/slidesharecdn.com/gfwlist +server=/vagrantcloud.com/127.0.0.1#5335 +ipset=/vagrantcloud.com/gfwlist +server=/mcdelivery.com.tw/127.0.0.1#5335 +ipset=/mcdelivery.com.tw/gfwlist +server=/netflix.ca/127.0.0.1#5335 +ipset=/netflix.ca/gfwlist +server=/nijigen-daiaru.com/127.0.0.1#5335 +ipset=/nijigen-daiaru.com/gfwlist +server=/99re.com/127.0.0.1#5335 +ipset=/99re.com/gfwlist +server=/ebaystore.com/127.0.0.1#5335 +ipset=/ebaystore.com/gfwlist +server=/go-lang.com/127.0.0.1#5335 +ipset=/go-lang.com/gfwlist +server=/rajwaphq.com/127.0.0.1#5335 +ipset=/rajwaphq.com/gfwlist +server=/ieeer5.org/127.0.0.1#5335 +ipset=/ieeer5.org/gfwlist +server=/gettyimages.com/127.0.0.1#5335 +ipset=/gettyimages.com/gfwlist +server=/filipino-music.net/127.0.0.1#5335 +ipset=/filipino-music.net/gfwlist +server=/costcobusinessdelivery.com/127.0.0.1#5335 +ipset=/costcobusinessdelivery.com/gfwlist +server=/mini-connected.it/127.0.0.1#5335 +ipset=/mini-connected.it/gfwlist +server=/jwkcgd.xyz/127.0.0.1#5335 +ipset=/jwkcgd.xyz/gfwlist +server=/blzddist1-a.akamaihd.net/127.0.0.1#5335 +ipset=/blzddist1-a.akamaihd.net/gfwlist +server=/fasebokk.com/127.0.0.1#5335 +ipset=/fasebokk.com/gfwlist +server=/industrialtoys.com/127.0.0.1#5335 +ipset=/industrialtoys.com/gfwlist +server=/bloombergbna.com/127.0.0.1#5335 +ipset=/bloombergbna.com/gfwlist +server=/gitlab.io/127.0.0.1#5335 +ipset=/gitlab.io/gfwlist +server=/gitlab.com/127.0.0.1#5335 +ipset=/gitlab.com/gfwlist +server=/disney.com/127.0.0.1#5335 +ipset=/disney.com/gfwlist +server=/github-cloud.s3.amazonaws.com/127.0.0.1#5335 +ipset=/github-cloud.s3.amazonaws.com/gfwlist +server=/apexlegends.com/127.0.0.1#5335 +ipset=/apexlegends.com/gfwlist +server=/githubuniverse.com/127.0.0.1#5335 +ipset=/githubuniverse.com/gfwlist +server=/instantfapgay.com/127.0.0.1#5335 +ipset=/instantfapgay.com/gfwlist +server=/sankei.com/127.0.0.1#5335 +ipset=/sankei.com/gfwlist +server=/googlesource.com/127.0.0.1#5335 +ipset=/googlesource.com/gfwlist +server=/freecamstars.com/127.0.0.1#5335 +ipset=/freecamstars.com/gfwlist +server=/xnxxfap.info/127.0.0.1#5335 +ipset=/xnxxfap.info/gfwlist +server=/marvel10thanniversary.com/127.0.0.1#5335 +ipset=/marvel10thanniversary.com/gfwlist +server=/pypl.com/127.0.0.1#5335 +ipset=/pypl.com/gfwlist +server=/dnai.in/127.0.0.1#5335 +ipset=/dnai.in/gfwlist +server=/shoppercentre.com/127.0.0.1#5335 +ipset=/shoppercentre.com/gfwlist +server=/mini-connected.lt/127.0.0.1#5335 +ipset=/mini-connected.lt/gfwlist +server=/pki.google.com/127.0.0.1#5335 +ipset=/pki.google.com/gfwlist +server=/besttitstube.com/127.0.0.1#5335 +ipset=/besttitstube.com/gfwlist +server=/vfsco.ro/127.0.0.1#5335 +ipset=/vfsco.ro/gfwlist +server=/hsfacebook.com/127.0.0.1#5335 +ipset=/hsfacebook.com/gfwlist +server=/virtualrealporn.com/127.0.0.1#5335 +ipset=/virtualrealporn.com/gfwlist +server=/riot.net/127.0.0.1#5335 +ipset=/riot.net/gfwlist +server=/bmw-motorrad.com.br/127.0.0.1#5335 +ipset=/bmw-motorrad.com.br/gfwlist +server=/nude.hu/127.0.0.1#5335 +ipset=/nude.hu/gfwlist +server=/foxnewsmagazine.com/127.0.0.1#5335 +ipset=/foxnewsmagazine.com/gfwlist +server=/flutter.dev/127.0.0.1#5335 +ipset=/flutter.dev/gfwlist +server=/pearsonclinical.nl/127.0.0.1#5335 +ipset=/pearsonclinical.nl/gfwlist +server=/facebboook.com/127.0.0.1#5335 +ipset=/facebboook.com/gfwlist +server=/fedoraproject.org/127.0.0.1#5335 +ipset=/fedoraproject.org/gfwlist +server=/baltimorebmw.com/127.0.0.1#5335 +ipset=/baltimorebmw.com/gfwlist +server=/ieee-ies.org/127.0.0.1#5335 +ipset=/ieee-ies.org/gfwlist +server=/symantec.com/127.0.0.1#5335 +ipset=/symantec.com/gfwlist +server=/taipeitimes.com/127.0.0.1#5335 +ipset=/taipeitimes.com/gfwlist +server=/payserve.com/127.0.0.1#5335 +ipset=/payserve.com/gfwlist +server=/pornotube.blog.br/127.0.0.1#5335 +ipset=/pornotube.blog.br/gfwlist +server=/yahoo.it/127.0.0.1#5335 +ipset=/yahoo.it/gfwlist +server=/reactjs.org/127.0.0.1#5335 +ipset=/reactjs.org/gfwlist +server=/garotoesperto.com/127.0.0.1#5335 +ipset=/garotoesperto.com/gfwlist +server=/7mmtv.tv/127.0.0.1#5335 +ipset=/7mmtv.tv/gfwlist +server=/minispygear.com/127.0.0.1#5335 +ipset=/minispygear.com/gfwlist +server=/keezmovies.com/127.0.0.1#5335 +ipset=/keezmovies.com/gfwlist +server=/minidrivingexperienceusa.com/127.0.0.1#5335 +ipset=/minidrivingexperienceusa.com/gfwlist +server=/react.com/127.0.0.1#5335 +ipset=/react.com/gfwlist +server=/rockstargames.com/127.0.0.1#5335 +ipset=/rockstargames.com/gfwlist +server=/messengerdevelopers.com/127.0.0.1#5335 +ipset=/messengerdevelopers.com/gfwlist +server=/dollarfotoclub.com/127.0.0.1#5335 +ipset=/dollarfotoclub.com/gfwlist +server=/globalvoices.org/127.0.0.1#5335 +ipset=/globalvoices.org/gfwlist +server=/projecteuclid.org/127.0.0.1#5335 +ipset=/projecteuclid.org/gfwlist +server=/foxsports.com.bo/127.0.0.1#5335 +ipset=/foxsports.com.bo/gfwlist +server=/hbomaxcdn.com/127.0.0.1#5335 +ipset=/hbomaxcdn.com/gfwlist +server=/fasttext.cc/127.0.0.1#5335 +ipset=/fasttext.cc/gfwlist +server=/faciometrics.com/127.0.0.1#5335 +ipset=/faciometrics.com/gfwlist +server=/hentaispark.com/127.0.0.1#5335 +ipset=/hentaispark.com/gfwlist +server=/google.ro/127.0.0.1#5335 +ipset=/google.ro/gfwlist +server=/porn.com/127.0.0.1#5335 +ipset=/porn.com/gfwlist +server=/hlbelygl.com/127.0.0.1#5335 +ipset=/hlbelygl.com/gfwlist +server=/paydiant.com/127.0.0.1#5335 +ipset=/paydiant.com/gfwlist +server=/f8.com/127.0.0.1#5335 +ipset=/f8.com/gfwlist +server=/buck.build/127.0.0.1#5335 +ipset=/buck.build/gfwlist +server=/embedly.com/127.0.0.1#5335 +ipset=/embedly.com/gfwlist +server=/star-brasil.com/127.0.0.1#5335 +ipset=/star-brasil.com/gfwlist +server=/nikeoutletstore.com/127.0.0.1#5335 +ipset=/nikeoutletstore.com/gfwlist +server=/imstagram.com/127.0.0.1#5335 +ipset=/imstagram.com/gfwlist +server=/twitter.com/127.0.0.1#5335 +ipset=/twitter.com/gfwlist +server=/stackapps.com/127.0.0.1#5335 +ipset=/stackapps.com/gfwlist +server=/cispaletter.org/127.0.0.1#5335 +ipset=/cispaletter.org/gfwlist +server=/dotdeb.org/127.0.0.1#5335 +ipset=/dotdeb.org/gfwlist +server=/ubuntuforums.org/127.0.0.1#5335 +ipset=/ubuntuforums.org/gfwlist +server=/ubuntu.com/127.0.0.1#5335 +ipset=/ubuntu.com/gfwlist +server=/xn--yt8h.la/127.0.0.1#5335 +ipset=/xn--yt8h.la/gfwlist +server=/nintendoeurope.com/127.0.0.1#5335 +ipset=/nintendoeurope.com/gfwlist +server=/launchpadlibrarian.net/127.0.0.1#5335 +ipset=/launchpadlibrarian.net/gfwlist +server=/getbootstrap.com/127.0.0.1#5335 +ipset=/getbootstrap.com/gfwlist +server=/applecensorship.com/127.0.0.1#5335 +ipset=/applecensorship.com/gfwlist +server=/cloudflareapps.com/127.0.0.1#5335 +ipset=/cloudflareapps.com/gfwlist +server=/muji.us/127.0.0.1#5335 +ipset=/muji.us/gfwlist +server=/lanik.us/127.0.0.1#5335 +ipset=/lanik.us/gfwlist +server=/star-latam.com/127.0.0.1#5335 +ipset=/star-latam.com/gfwlist +server=/videosdemadurasx.com/127.0.0.1#5335 +ipset=/videosdemadurasx.com/gfwlist +server=/netflixdnstest6.com/127.0.0.1#5335 +ipset=/netflixdnstest6.com/gfwlist +server=/as-hp.ca/127.0.0.1#5335 +ipset=/as-hp.ca/gfwlist +server=/volvotrucks.com.ar/127.0.0.1#5335 +ipset=/volvotrucks.com.ar/gfwlist +server=/visual-arts.jp/127.0.0.1#5335 +ipset=/visual-arts.jp/gfwlist +server=/18exgfs.com/127.0.0.1#5335 +ipset=/18exgfs.com/gfwlist +server=/argotunnel.com/127.0.0.1#5335 +ipset=/argotunnel.com/gfwlist +server=/audiencenetwork.com/127.0.0.1#5335 +ipset=/audiencenetwork.com/gfwlist +server=/swift.org/127.0.0.1#5335 +ipset=/swift.org/gfwlist +server=/parkinfo.com/127.0.0.1#5335 +ipset=/parkinfo.com/gfwlist +server=/appleswift.com/127.0.0.1#5335 +ipset=/appleswift.com/gfwlist +server=/acebook.com/127.0.0.1#5335 +ipset=/acebook.com/gfwlist +server=/upmedia.mg/127.0.0.1#5335 +ipset=/upmedia.mg/gfwlist +server=/auroraoss.com/127.0.0.1#5335 +ipset=/auroraoss.com/gfwlist +server=/harpercollinsadvantage.com/127.0.0.1#5335 +ipset=/harpercollinsadvantage.com/gfwlist +server=/zohostatic.in/127.0.0.1#5335 +ipset=/zohostatic.in/gfwlist +server=/zeplin.dev/127.0.0.1#5335 +ipset=/zeplin.dev/gfwlist +server=/bsersd.xyz/127.0.0.1#5335 +ipset=/bsersd.xyz/gfwlist +server=/facebooknfl.com/127.0.0.1#5335 +ipset=/facebooknfl.com/gfwlist +server=/zendesk.com/127.0.0.1#5335 +ipset=/zendesk.com/gfwlist +server=/wpvip.com/127.0.0.1#5335 +ipset=/wpvip.com/gfwlist +server=/wordpress.tv/127.0.0.1#5335 +ipset=/wordpress.tv/gfwlist +server=/uun89.com/127.0.0.1#5335 +ipset=/uun89.com/gfwlist +server=/scholar.google.com.ph/127.0.0.1#5335 +ipset=/scholar.google.com.ph/gfwlist +server=/reutersagency.cn/127.0.0.1#5335 +ipset=/reutersagency.cn/gfwlist +server=/dailymail.co.uk/127.0.0.1#5335 +ipset=/dailymail.co.uk/gfwlist +server=/projectbaseline.com/127.0.0.1#5335 +ipset=/projectbaseline.com/gfwlist +server=/dditscdn.com/127.0.0.1#5335 +ipset=/dditscdn.com/gfwlist +server=/mastercard.com.au/127.0.0.1#5335 +ipset=/mastercard.com.au/gfwlist +server=/geeksquadservices.org/127.0.0.1#5335 +ipset=/geeksquadservices.org/gfwlist +server=/webflow.com/127.0.0.1#5335 +ipset=/webflow.com/gfwlist +server=/1xbet.cm/127.0.0.1#5335 +ipset=/1xbet.cm/gfwlist +server=/vercel.sh/127.0.0.1#5335 +ipset=/vercel.sh/gfwlist +server=/nijidoujin.com/127.0.0.1#5335 +ipset=/nijidoujin.com/gfwlist +server=/instagramhilecim.com/127.0.0.1#5335 +ipset=/instagramhilecim.com/gfwlist +server=/imgix.net/127.0.0.1#5335 +ipset=/imgix.net/gfwlist +server=/streamingporn.xyz/127.0.0.1#5335 +ipset=/streamingporn.xyz/gfwlist +server=/visa.cl/127.0.0.1#5335 +ipset=/visa.cl/gfwlist +server=/scholar.google.co.uk/127.0.0.1#5335 +ipset=/scholar.google.co.uk/gfwlist +server=/i-cable.com/127.0.0.1#5335 +ipset=/i-cable.com/gfwlist +server=/err.sh/127.0.0.1#5335 +ipset=/err.sh/gfwlist +server=/ctan.org/127.0.0.1#5335 +ipset=/ctan.org/gfwlist +server=/svp-team.com/127.0.0.1#5335 +ipset=/svp-team.com/gfwlist +server=/bingsettingssearch.trafficmanager.net/127.0.0.1#5335 +ipset=/bingsettingssearch.trafficmanager.net/gfwlist +server=/facebookmarketingpartner.com/127.0.0.1#5335 +ipset=/facebookmarketingpartner.com/gfwlist +server=/creditcardsbay.com/127.0.0.1#5335 +ipset=/creditcardsbay.com/gfwlist +server=/biguz.net/127.0.0.1#5335 +ipset=/biguz.net/gfwlist +server=/scholar.l.google.com/127.0.0.1#5335 +ipset=/scholar.l.google.com/gfwlist +server=/steam.naeu.qtlglb.com/127.0.0.1#5335 +ipset=/steam.naeu.qtlglb.com/gfwlist +server=/thescottishsun.co.uk/127.0.0.1#5335 +ipset=/thescottishsun.co.uk/gfwlist +server=/bmw.com/127.0.0.1#5335 +ipset=/bmw.com/gfwlist +server=/analamateursex.com/127.0.0.1#5335 +ipset=/analamateursex.com/gfwlist +server=/startpage.com/127.0.0.1#5335 +ipset=/startpage.com/gfwlist +server=/squarecapital.com/127.0.0.1#5335 +ipset=/squarecapital.com/gfwlist +server=/git.io/127.0.0.1#5335 +ipset=/git.io/gfwlist +server=/exporntoons.net/127.0.0.1#5335 +ipset=/exporntoons.net/gfwlist +server=/itripto.com/127.0.0.1#5335 +ipset=/itripto.com/gfwlist +server=/91porn.best/127.0.0.1#5335 +ipset=/91porn.best/gfwlist +server=/rplay.live/127.0.0.1#5335 +ipset=/rplay.live/gfwlist +server=/slideshare.com/127.0.0.1#5335 +ipset=/slideshare.com/gfwlist +server=/shorturl.at/127.0.0.1#5335 +ipset=/shorturl.at/gfwlist +server=/visa.co.in/127.0.0.1#5335 +ipset=/visa.co.in/gfwlist +server=/dl.begellhouse.com/127.0.0.1#5335 +ipset=/dl.begellhouse.com/gfwlist +server=/nyansa.com/127.0.0.1#5335 +ipset=/nyansa.com/gfwlist +server=/spaindisney.com/127.0.0.1#5335 +ipset=/spaindisney.com/gfwlist +server=/shop.app/127.0.0.1#5335 +ipset=/shop.app/gfwlist +server=/myshopify.com/127.0.0.1#5335 +ipset=/myshopify.com/gfwlist +server=/setapp.com/127.0.0.1#5335 +ipset=/setapp.com/gfwlist +server=/bellebound.com/127.0.0.1#5335 +ipset=/bellebound.com/gfwlist +server=/loli.net/127.0.0.1#5335 +ipset=/loli.net/gfwlist +server=/rb.gy/127.0.0.1#5335 +ipset=/rb.gy/gfwlist +server=/6neek.com/127.0.0.1#5335 +ipset=/6neek.com/gfwlist +server=/thebeatsheadphonesale.com/127.0.0.1#5335 +ipset=/thebeatsheadphonesale.com/gfwlist +server=/lqh0bon3.xyz/127.0.0.1#5335 +ipset=/lqh0bon3.xyz/gfwlist +server=/stackauth.com/127.0.0.1#5335 +ipset=/stackauth.com/gfwlist +server=/pacloudflare.com/127.0.0.1#5335 +ipset=/pacloudflare.com/gfwlist +server=/foxsmallbusinesscenter.org/127.0.0.1#5335 +ipset=/foxsmallbusinesscenter.org/gfwlist +server=/tnatryouts.com/127.0.0.1#5335 +ipset=/tnatryouts.com/gfwlist +server=/teenqueens.net/127.0.0.1#5335 +ipset=/teenqueens.net/gfwlist +server=/cdn-terapeak.com/127.0.0.1#5335 +ipset=/cdn-terapeak.com/gfwlist +server=/rolfoundation.org/127.0.0.1#5335 +ipset=/rolfoundation.org/gfwlist +server=/patreonusercontent.com/127.0.0.1#5335 +ipset=/patreonusercontent.com/gfwlist +server=/miniusa.com/127.0.0.1#5335 +ipset=/miniusa.com/gfwlist +server=/omaps.app/127.0.0.1#5335 +ipset=/omaps.app/gfwlist +server=/cloudimg.io/127.0.0.1#5335 +ipset=/cloudimg.io/gfwlist +server=/notion.so/127.0.0.1#5335 +ipset=/notion.so/gfwlist +server=/notion.com/127.0.0.1#5335 +ipset=/notion.com/gfwlist +server=/nintendo.com/127.0.0.1#5335 +ipset=/nintendo.com/gfwlist +server=/newsextv.com/127.0.0.1#5335 +ipset=/newsextv.com/gfwlist +server=/d33wubrfki0l68.cloudfront.net/127.0.0.1#5335 +ipset=/d33wubrfki0l68.cloudfront.net/gfwlist +server=/mpv.io/127.0.0.1#5335 +ipset=/mpv.io/gfwlist +server=/huffingtonpost.kr/127.0.0.1#5335 +ipset=/huffingtonpost.kr/gfwlist +server=/madvrlabs.llc/127.0.0.1#5335 +ipset=/madvrlabs.llc/gfwlist +server=/crl.microsoft.com/127.0.0.1#5335 +ipset=/crl.microsoft.com/gfwlist +server=/madvr.net/127.0.0.1#5335 +ipset=/madvr.net/gfwlist +server=/awayoutgame.com/127.0.0.1#5335 +ipset=/awayoutgame.com/gfwlist +server=/amazonbusinessblog.com/127.0.0.1#5335 +ipset=/amazonbusinessblog.com/gfwlist +server=/madvr.com/127.0.0.1#5335 +ipset=/madvr.com/gfwlist +server=/ebay-confirm.com/127.0.0.1#5335 +ipset=/ebay-confirm.com/gfwlist +server=/chunja19.net/127.0.0.1#5335 +ipset=/chunja19.net/gfwlist +server=/swiftcapital.com/127.0.0.1#5335 +ipset=/swiftcapital.com/gfwlist +server=/liberapay.com/127.0.0.1#5335 +ipset=/liberapay.com/gfwlist +server=/venezporn.com/127.0.0.1#5335 +ipset=/venezporn.com/gfwlist +server=/bustyangelique.com/127.0.0.1#5335 +ipset=/bustyangelique.com/gfwlist +server=/jwpltx.com/127.0.0.1#5335 +ipset=/jwpltx.com/gfwlist +server=/xxx-com.cfd/127.0.0.1#5335 +ipset=/xxx-com.cfd/gfwlist +server=/xxxner.com/127.0.0.1#5335 +ipset=/xxxner.com/gfwlist +server=/visa.co.uk/127.0.0.1#5335 +ipset=/visa.co.uk/gfwlist +server=/disney.pt/127.0.0.1#5335 +ipset=/disney.pt/gfwlist +server=/teslamotors.com/127.0.0.1#5335 +ipset=/teslamotors.com/gfwlist +server=/bowenpress.com/127.0.0.1#5335 +ipset=/bowenpress.com/gfwlist +server=/3dhentai.tv/127.0.0.1#5335 +ipset=/3dhentai.tv/gfwlist +server=/dlfacebook.com/127.0.0.1#5335 +ipset=/dlfacebook.com/gfwlist +server=/heroku-app.com/127.0.0.1#5335 +ipset=/heroku-app.com/gfwlist +server=/secomtrust.net/127.0.0.1#5335 +ipset=/secomtrust.net/gfwlist +server=/predictivetechnologies.com/127.0.0.1#5335 +ipset=/predictivetechnologies.com/gfwlist +server=/fabuye.top/127.0.0.1#5335 +ipset=/fabuye.top/gfwlist +server=/appleexpo.info/127.0.0.1#5335 +ipset=/appleexpo.info/gfwlist +server=/xxxland.net/127.0.0.1#5335 +ipset=/xxxland.net/gfwlist +server=/translatewiki.org/127.0.0.1#5335 +ipset=/translatewiki.org/gfwlist +server=/sexcelebrity.net/127.0.0.1#5335 +ipset=/sexcelebrity.net/gfwlist +server=/arcgis.com/127.0.0.1#5335 +ipset=/arcgis.com/gfwlist +server=/duckside.com/127.0.0.1#5335 +ipset=/duckside.com/gfwlist +server=/intel.eu/127.0.0.1#5335 +ipset=/intel.eu/gfwlist +server=/chatterbate.io/127.0.0.1#5335 +ipset=/chatterbate.io/gfwlist +server=/streetmeatasia.com/127.0.0.1#5335 +ipset=/streetmeatasia.com/gfwlist +server=/xxxhomefuck.com/127.0.0.1#5335 +ipset=/xxxhomefuck.com/gfwlist +server=/hotscope.tv/127.0.0.1#5335 +ipset=/hotscope.tv/gfwlist +server=/pornomasse.com/127.0.0.1#5335 +ipset=/pornomasse.com/gfwlist +server=/xvideosnovinha.com/127.0.0.1#5335 +ipset=/xvideosnovinha.com/gfwlist +server=/byjav.me/127.0.0.1#5335 +ipset=/byjav.me/gfwlist +server=/duckduckgo.com.tw/127.0.0.1#5335 +ipset=/duckduckgo.com.tw/gfwlist +server=/nike.com.br/127.0.0.1#5335 +ipset=/nike.com.br/gfwlist +server=/asiancamly.com/127.0.0.1#5335 +ipset=/asiancamly.com/gfwlist +server=/zlibcdn2.com/127.0.0.1#5335 +ipset=/zlibcdn2.com/gfwlist +server=/ahswingerporno.com/127.0.0.1#5335 +ipset=/ahswingerporno.com/gfwlist +server=/pornenix.com/127.0.0.1#5335 +ipset=/pornenix.com/gfwlist +server=/ddg.co/127.0.0.1#5335 +ipset=/ddg.co/gfwlist +server=/bondagesex-xxx.com/127.0.0.1#5335 +ipset=/bondagesex-xxx.com/gfwlist +server=/erodou.tousatu.fun/127.0.0.1#5335 +ipset=/erodou.tousatu.fun/gfwlist +server=/disqus.com/127.0.0.1#5335 +ipset=/disqus.com/gfwlist +server=/pornxxxweb.com/127.0.0.1#5335 +ipset=/pornxxxweb.com/gfwlist +server=/digitalocean.com/127.0.0.1#5335 +ipset=/digitalocean.com/gfwlist +server=/cloudconvert.com/127.0.0.1#5335 +ipset=/cloudconvert.com/gfwlist +server=/steam-chat.com/127.0.0.1#5335 +ipset=/steam-chat.com/gfwlist +server=/buymeacoff.ee/127.0.0.1#5335 +ipset=/buymeacoff.ee/gfwlist +server=/myfoxorlando.com/127.0.0.1#5335 +ipset=/myfoxorlando.com/gfwlist +server=/anyxxx.me/127.0.0.1#5335 +ipset=/anyxxx.me/gfwlist +server=/sexyfeet.tv/127.0.0.1#5335 +ipset=/sexyfeet.tv/gfwlist +server=/volvotrucks.ph/127.0.0.1#5335 +ipset=/volvotrucks.ph/gfwlist +server=/youtube.com.lv/127.0.0.1#5335 +ipset=/youtube.com.lv/gfwlist +server=/fonts.net/127.0.0.1#5335 +ipset=/fonts.net/gfwlist +server=/horsemecum.com/127.0.0.1#5335 +ipset=/horsemecum.com/gfwlist +server=/brightcove.services/127.0.0.1#5335 +ipset=/brightcove.services/gfwlist +server=/thri.xxx/127.0.0.1#5335 +ipset=/thri.xxx/gfwlist +server=/hrecords.jp/127.0.0.1#5335 +ipset=/hrecords.jp/gfwlist +server=/isiknowledge.com/127.0.0.1#5335 +ipset=/isiknowledge.com/gfwlist +server=/doom9.org/127.0.0.1#5335 +ipset=/doom9.org/gfwlist +server=/bahamut.akamaized.net/127.0.0.1#5335 +ipset=/bahamut.akamaized.net/gfwlist +server=/arphic.com.tw/127.0.0.1#5335 +ipset=/arphic.com.tw/gfwlist +server=/literotica.com/127.0.0.1#5335 +ipset=/literotica.com/gfwlist +server=/fabhairypussy.com/127.0.0.1#5335 +ipset=/fabhairypussy.com/gfwlist +server=/fbsbx.com/127.0.0.1#5335 +ipset=/fbsbx.com/gfwlist +server=/kaggle.io/127.0.0.1#5335 +ipset=/kaggle.io/gfwlist +server=/abcheadphones.com/127.0.0.1#5335 +ipset=/abcheadphones.com/gfwlist +server=/gamer-cds.cdn.hinet.net/127.0.0.1#5335 +ipset=/gamer-cds.cdn.hinet.net/gfwlist +server=/ikea.com.eg/127.0.0.1#5335 +ipset=/ikea.com.eg/gfwlist +server=/msads.net/127.0.0.1#5335 +ipset=/msads.net/gfwlist +server=/addtoany.com/127.0.0.1#5335 +ipset=/addtoany.com/gfwlist +server=/konachan.net/127.0.0.1#5335 +ipset=/konachan.net/gfwlist +server=/gscanada.info/127.0.0.1#5335 +ipset=/gscanada.info/gfwlist +server=/globalspec.com/127.0.0.1#5335 +ipset=/globalspec.com/gfwlist +server=/avstar3.com/127.0.0.1#5335 +ipset=/avstar3.com/gfwlist +server=/zoo-xnxx.com/127.0.0.1#5335 +ipset=/zoo-xnxx.com/gfwlist +server=/zh99.net/127.0.0.1#5335 +ipset=/zh99.net/gfwlist +server=/firefoxusercontent.com/127.0.0.1#5335 +ipset=/firefoxusercontent.com/gfwlist +server=/yepporn.com/127.0.0.1#5335 +ipset=/yepporn.com/gfwlist +server=/binance.us/127.0.0.1#5335 +ipset=/binance.us/gfwlist +server=/a-hentai.tv/127.0.0.1#5335 +ipset=/a-hentai.tv/gfwlist +server=/thomsonreuters.es/127.0.0.1#5335 +ipset=/thomsonreuters.es/gfwlist +server=/easportsactive.com/127.0.0.1#5335 +ipset=/easportsactive.com/gfwlist +server=/shenyun.com/127.0.0.1#5335 +ipset=/shenyun.com/gfwlist +server=/foxcanvasroom.com/127.0.0.1#5335 +ipset=/foxcanvasroom.com/gfwlist +server=/devsitetest.how/127.0.0.1#5335 +ipset=/devsitetest.how/gfwlist +server=/rule34video.com/127.0.0.1#5335 +ipset=/rule34video.com/gfwlist +server=/hkedcity.net/127.0.0.1#5335 +ipset=/hkedcity.net/gfwlist +server=/zohoschools.com/127.0.0.1#5335 +ipset=/zohoschools.com/gfwlist +server=/yavtube.com/127.0.0.1#5335 +ipset=/yavtube.com/gfwlist +server=/volvodefense.com/127.0.0.1#5335 +ipset=/volvodefense.com/gfwlist +server=/zzitube.com/127.0.0.1#5335 +ipset=/zzitube.com/gfwlist +server=/realdoll.com/127.0.0.1#5335 +ipset=/realdoll.com/gfwlist +server=/zqqpwz.com/127.0.0.1#5335 +ipset=/zqqpwz.com/gfwlist +server=/xboxgamepass.com/127.0.0.1#5335 +ipset=/xboxgamepass.com/gfwlist +server=/xemales.com/127.0.0.1#5335 +ipset=/xemales.com/gfwlist +server=/web-instagram.net/127.0.0.1#5335 +ipset=/web-instagram.net/gfwlist +server=/bridgestonela.com/127.0.0.1#5335 +ipset=/bridgestonela.com/gfwlist +server=/faebook.com/127.0.0.1#5335 +ipset=/faebook.com/gfwlist +server=/adult.contents.fc2.com/127.0.0.1#5335 +ipset=/adult.contents.fc2.com/gfwlist +server=/gayporn.pro/127.0.0.1#5335 +ipset=/gayporn.pro/gfwlist +server=/drdrefnac.com/127.0.0.1#5335 +ipset=/drdrefnac.com/gfwlist +server=/javtube.com/127.0.0.1#5335 +ipset=/javtube.com/gfwlist +server=/swag.live/127.0.0.1#5335 +ipset=/swag.live/gfwlist +server=/visiontimes.de/127.0.0.1#5335 +ipset=/visiontimes.de/gfwlist +server=/nikkeibp.co.jp/127.0.0.1#5335 +ipset=/nikkeibp.co.jp/gfwlist +server=/zhainanjidi.xyz/127.0.0.1#5335 +ipset=/zhainanjidi.xyz/gfwlist +server=/pearsonclinical.in/127.0.0.1#5335 +ipset=/pearsonclinical.in/gfwlist +server=/daddyslilangel.com/127.0.0.1#5335 +ipset=/daddyslilangel.com/gfwlist +server=/nikesoccercleats.com/127.0.0.1#5335 +ipset=/nikesoccercleats.com/gfwlist +server=/naughtyfootjobs.com/127.0.0.1#5335 +ipset=/naughtyfootjobs.com/gfwlist +server=/pornobengala.com/127.0.0.1#5335 +ipset=/pornobengala.com/gfwlist +server=/diamondgirlstudio.com/127.0.0.1#5335 +ipset=/diamondgirlstudio.com/gfwlist +server=/spyjinx.com/127.0.0.1#5335 +ipset=/spyjinx.com/gfwlist +server=/geek-squads.net/127.0.0.1#5335 +ipset=/geek-squads.net/gfwlist +server=/zerochan.net/127.0.0.1#5335 +ipset=/zerochan.net/gfwlist +server=/zen8ok.xyz/127.0.0.1#5335 +ipset=/zen8ok.xyz/gfwlist +server=/zazzybabes.com/127.0.0.1#5335 +ipset=/zazzybabes.com/gfwlist +server=/z00.world/127.0.0.1#5335 +ipset=/z00.world/gfwlist +server=/leagueoflegends.com/127.0.0.1#5335 +ipset=/leagueoflegends.com/gfwlist +server=/cashpassport.co.za/127.0.0.1#5335 +ipset=/cashpassport.co.za/gfwlist +server=/adulttime.com/127.0.0.1#5335 +ipset=/adulttime.com/gfwlist +server=/ospray.net/127.0.0.1#5335 +ipset=/ospray.net/gfwlist +server=/bigtitvenera.com/127.0.0.1#5335 +ipset=/bigtitvenera.com/gfwlist +server=/facebbook.com/127.0.0.1#5335 +ipset=/facebbook.com/gfwlist +server=/721av.com/127.0.0.1#5335 +ipset=/721av.com/gfwlist +server=/verisign.mobi/127.0.0.1#5335 +ipset=/verisign.mobi/gfwlist +server=/unravel2.com/127.0.0.1#5335 +ipset=/unravel2.com/gfwlist +server=/cf-ipfs.com/127.0.0.1#5335 +ipset=/cf-ipfs.com/gfwlist +server=/bmw-nigeria.com/127.0.0.1#5335 +ipset=/bmw-nigeria.com/gfwlist +server=/easportsactiveonline.com/127.0.0.1#5335 +ipset=/easportsactiveonline.com/gfwlist +server=/bmw.mu/127.0.0.1#5335 +ipset=/bmw.mu/gfwlist +server=/youramateurporn.com/127.0.0.1#5335 +ipset=/youramateurporn.com/gfwlist +server=/youporn.com/127.0.0.1#5335 +ipset=/youporn.com/gfwlist +server=/pornve.com/127.0.0.1#5335 +ipset=/pornve.com/gfwlist +server=/telesell.com/127.0.0.1#5335 +ipset=/telesell.com/gfwlist +server=/screw-my-wife.com/127.0.0.1#5335 +ipset=/screw-my-wife.com/gfwlist +server=/youngsex.video/127.0.0.1#5335 +ipset=/youngsex.video/gfwlist +server=/youngsex.sexy/127.0.0.1#5335 +ipset=/youngsex.sexy/gfwlist +server=/facebookhome.com/127.0.0.1#5335 +ipset=/facebookhome.com/gfwlist +server=/howfuck.me/127.0.0.1#5335 +ipset=/howfuck.me/gfwlist +server=/youngerbabes.com/127.0.0.1#5335 +ipset=/youngerbabes.com/gfwlist +server=/airhornbot.com/127.0.0.1#5335 +ipset=/airhornbot.com/gfwlist +server=/youjism.com/127.0.0.1#5335 +ipset=/youjism.com/gfwlist +server=/troisrivieresmini.com/127.0.0.1#5335 +ipset=/troisrivieresmini.com/gfwlist +server=/pornaffected.com/127.0.0.1#5335 +ipset=/pornaffected.com/gfwlist +server=/hardx.com/127.0.0.1#5335 +ipset=/hardx.com/gfwlist +server=/gbnews.uk/127.0.0.1#5335 +ipset=/gbnews.uk/gfwlist +server=/cup.com.hk/127.0.0.1#5335 +ipset=/cup.com.hk/gfwlist +server=/goshemalecams.com/127.0.0.1#5335 +ipset=/goshemalecams.com/gfwlist +server=/aod-pod-uk-live.akamaized.net/127.0.0.1#5335 +ipset=/aod-pod-uk-live.akamaized.net/gfwlist +server=/yinac5.top/127.0.0.1#5335 +ipset=/yinac5.top/gfwlist +server=/yieamnd.com/127.0.0.1#5335 +ipset=/yieamnd.com/gfwlist +server=/adobedtm.com/127.0.0.1#5335 +ipset=/adobedtm.com/gfwlist +server=/yhy.cool/127.0.0.1#5335 +ipset=/yhy.cool/gfwlist +server=/vfsco.cz/127.0.0.1#5335 +ipset=/vfsco.cz/gfwlist +server=/yespornpleasexxx.com/127.0.0.1#5335 +ipset=/yespornpleasexxx.com/gfwlist +server=/mastercard.com.cy/127.0.0.1#5335 +ipset=/mastercard.com.cy/gfwlist +server=/disney-portal.my.onetrust.com/127.0.0.1#5335 +ipset=/disney-portal.my.onetrust.com/gfwlist +server=/yespornfree.com/127.0.0.1#5335 +ipset=/yespornfree.com/gfwlist +server=/yes.xxx/127.0.0.1#5335 +ipset=/yes.xxx/gfwlist +server=/hentaiworld.eu/127.0.0.1#5335 +ipset=/hentaiworld.eu/gfwlist +server=/volvobuses.dk/127.0.0.1#5335 +ipset=/volvobuses.dk/gfwlist +server=/buyitnowshop.net/127.0.0.1#5335 +ipset=/buyitnowshop.net/gfwlist +server=/galegroup.com/127.0.0.1#5335 +ipset=/galegroup.com/gfwlist +server=/yazhouse8.com/127.0.0.1#5335 +ipset=/yazhouse8.com/gfwlist +server=/jessicaturner.com/127.0.0.1#5335 +ipset=/jessicaturner.com/gfwlist +server=/foxsports.gt/127.0.0.1#5335 +ipset=/foxsports.gt/gfwlist +server=/bmw-motorrad.ec/127.0.0.1#5335 +ipset=/bmw-motorrad.ec/gfwlist +server=/yatong.info/127.0.0.1#5335 +ipset=/yatong.info/gfwlist +server=/theteenhome.com/127.0.0.1#5335 +ipset=/theteenhome.com/gfwlist +server=/visa.gd/127.0.0.1#5335 +ipset=/visa.gd/gfwlist +server=/yadori.club/127.0.0.1#5335 +ipset=/yadori.club/gfwlist +server=/jasmin.com/127.0.0.1#5335 +ipset=/jasmin.com/gfwlist +server=/sumomo-ch.com/127.0.0.1#5335 +ipset=/sumomo-ch.com/gfwlist +server=/avwong.com/127.0.0.1#5335 +ipset=/avwong.com/gfwlist +server=/132288.cc/127.0.0.1#5335 +ipset=/132288.cc/gfwlist +server=/supremacy.net/127.0.0.1#5335 +ipset=/supremacy.net/gfwlist +server=/facebyook.com/127.0.0.1#5335 +ipset=/facebyook.com/gfwlist +server=/gaytopcams.com/127.0.0.1#5335 +ipset=/gaytopcams.com/gfwlist +server=/veet.co.uk/127.0.0.1#5335 +ipset=/veet.co.uk/gfwlist +server=/xxxvogue.net/127.0.0.1#5335 +ipset=/xxxvogue.net/gfwlist +server=/paypal-cardcash.com/127.0.0.1#5335 +ipset=/paypal-cardcash.com/gfwlist +server=/xxxvideo.blog.br/127.0.0.1#5335 +ipset=/xxxvideo.blog.br/gfwlist +server=/bigtitterrynova.com/127.0.0.1#5335 +ipset=/bigtitterrynova.com/gfwlist +server=/epochweekly.com/127.0.0.1#5335 +ipset=/epochweekly.com/gfwlist +server=/aimei133.com/127.0.0.1#5335 +ipset=/aimei133.com/gfwlist +server=/xx159.com.cn/127.0.0.1#5335 +ipset=/xx159.com.cn/gfwlist +server=/xxxsexocasero.com/127.0.0.1#5335 +ipset=/xxxsexocasero.com/gfwlist +server=/xxxsexcinema.com/127.0.0.1#5335 +ipset=/xxxsexcinema.com/gfwlist +server=/browserleaks.com/127.0.0.1#5335 +ipset=/browserleaks.com/gfwlist +server=/xxxpornhd.pro/127.0.0.1#5335 +ipset=/xxxpornhd.pro/gfwlist +server=/disneychannelroadtrip.com/127.0.0.1#5335 +ipset=/disneychannelroadtrip.com/gfwlist +server=/bethesda.net/127.0.0.1#5335 +ipset=/bethesda.net/gfwlist +server=/ausbeatsbydrdre.com/127.0.0.1#5335 +ipset=/ausbeatsbydrdre.com/gfwlist +server=/citizenlab.org/127.0.0.1#5335 +ipset=/citizenlab.org/gfwlist +server=/xxxmovies.fun/127.0.0.1#5335 +ipset=/xxxmovies.fun/gfwlist +server=/alphabet.fr/127.0.0.1#5335 +ipset=/alphabet.fr/gfwlist +server=/xxxmomporn.tube/127.0.0.1#5335 +ipset=/xxxmomporn.tube/gfwlist +server=/facebooksuppliers.com/127.0.0.1#5335 +ipset=/facebooksuppliers.com/gfwlist +server=/paypal-pages.com/127.0.0.1#5335 +ipset=/paypal-pages.com/gfwlist +server=/chickstagram.com/127.0.0.1#5335 +ipset=/chickstagram.com/gfwlist +server=/thepornlist.net/127.0.0.1#5335 +ipset=/thepornlist.net/gfwlist +server=/bloombergvault.com/127.0.0.1#5335 +ipset=/bloombergvault.com/gfwlist +server=/xfantazy.com/127.0.0.1#5335 +ipset=/xfantazy.com/gfwlist +server=/bonyu.cyou/127.0.0.1#5335 +ipset=/bonyu.cyou/gfwlist +server=/8muses.com/127.0.0.1#5335 +ipset=/8muses.com/gfwlist +server=/xxxfuckmom.com/127.0.0.1#5335 +ipset=/xxxfuckmom.com/gfwlist +server=/xxxforte.com/127.0.0.1#5335 +ipset=/xxxforte.com/gfwlist +server=/xxxflare.com/127.0.0.1#5335 +ipset=/xxxflare.com/gfwlist +server=/mastercard.ba/127.0.0.1#5335 +ipset=/mastercard.ba/gfwlist +server=/hitbdsm.com/127.0.0.1#5335 +ipset=/hitbdsm.com/gfwlist +server=/hardanalfucking.com/127.0.0.1#5335 +ipset=/hardanalfucking.com/gfwlist +server=/mistresskym.com/127.0.0.1#5335 +ipset=/mistresskym.com/gfwlist +server=/xxxbolivianas.com/127.0.0.1#5335 +ipset=/xxxbolivianas.com/gfwlist +server=/paypal.ca/127.0.0.1#5335 +ipset=/paypal.ca/gfwlist +server=/disney-discount.com/127.0.0.1#5335 +ipset=/disney-discount.com/gfwlist +server=/bijukujo.club/127.0.0.1#5335 +ipset=/bijukujo.club/gfwlist +server=/fb.me/127.0.0.1#5335 +ipset=/fb.me/gfwlist +server=/xxx-video.cfd/127.0.0.1#5335 +ipset=/xxx-video.cfd/gfwlist +server=/xxu.mobi/127.0.0.1#5335 +ipset=/xxu.mobi/gfwlist +server=/needforspeedstreetkings.com/127.0.0.1#5335 +ipset=/needforspeedstreetkings.com/gfwlist +server=/facebook123.org/127.0.0.1#5335 +ipset=/facebook123.org/gfwlist +server=/clips4sale.com/127.0.0.1#5335 +ipset=/clips4sale.com/gfwlist +server=/volvotrucks.co.zw/127.0.0.1#5335 +ipset=/volvotrucks.co.zw/gfwlist +server=/xxindianporn.com/127.0.0.1#5335 +ipset=/xxindianporn.com/gfwlist +server=/calgoncarbon.com/127.0.0.1#5335 +ipset=/calgoncarbon.com/gfwlist +server=/pjgirls.com/127.0.0.1#5335 +ipset=/pjgirls.com/gfwlist +server=/bahamut.com.tw/127.0.0.1#5335 +ipset=/bahamut.com.tw/gfwlist +server=/minivancouver.ca/127.0.0.1#5335 +ipset=/minivancouver.ca/gfwlist +server=/ngeo.com/127.0.0.1#5335 +ipset=/ngeo.com/gfwlist +server=/minigrandriver.com/127.0.0.1#5335 +ipset=/minigrandriver.com/gfwlist +server=/biologists.com/127.0.0.1#5335 +ipset=/biologists.com/gfwlist +server=/ikea.ie/127.0.0.1#5335 +ipset=/ikea.ie/gfwlist +server=/foxsports.net.br/127.0.0.1#5335 +ipset=/foxsports.net.br/gfwlist +server=/durex.us/127.0.0.1#5335 +ipset=/durex.us/gfwlist +server=/thechronicle.com.au/127.0.0.1#5335 +ipset=/thechronicle.com.au/gfwlist +server=/watchespn.com/127.0.0.1#5335 +ipset=/watchespn.com/gfwlist +server=/mirrormedia.com.tw/127.0.0.1#5335 +ipset=/mirrormedia.com.tw/gfwlist +server=/xvideos.la/127.0.0.1#5335 +ipset=/xvideos.la/gfwlist +server=/xvideo-jp.com/127.0.0.1#5335 +ipset=/xvideo-jp.com/gfwlist +server=/faesebook.com/127.0.0.1#5335 +ipset=/faesebook.com/gfwlist +server=/mini.fi/127.0.0.1#5335 +ipset=/mini.fi/gfwlist +server=/vine.co/127.0.0.1#5335 +ipset=/vine.co/gfwlist +server=/epinions.com/127.0.0.1#5335 +ipset=/epinions.com/gfwlist +server=/adultrental.com/127.0.0.1#5335 +ipset=/adultrental.com/gfwlist +server=/microsoftcloud.com/127.0.0.1#5335 +ipset=/microsoftcloud.com/gfwlist +server=/fanbox.cc/127.0.0.1#5335 +ipset=/fanbox.cc/gfwlist +server=/xpornblog.com/127.0.0.1#5335 +ipset=/xpornblog.com/gfwlist +server=/xpaja.net/127.0.0.1#5335 +ipset=/xpaja.net/gfwlist +server=/mr-tireman.jp/127.0.0.1#5335 +ipset=/mr-tireman.jp/gfwlist +server=/xnxxporn.fun/127.0.0.1#5335 +ipset=/xnxxporn.fun/gfwlist +server=/xnxxmovies.com/127.0.0.1#5335 +ipset=/xnxxmovies.com/gfwlist +server=/trithucvn.net/127.0.0.1#5335 +ipset=/trithucvn.net/gfwlist +server=/xnxxcomvideos.com/127.0.0.1#5335 +ipset=/xnxxcomvideos.com/gfwlist +server=/physicalexam.info/127.0.0.1#5335 +ipset=/physicalexam.info/gfwlist +server=/fank.ru/127.0.0.1#5335 +ipset=/fank.ru/gfwlist +server=/zert.ch/127.0.0.1#5335 +ipset=/zert.ch/gfwlist +server=/scholar.google.lv/127.0.0.1#5335 +ipset=/scholar.google.lv/gfwlist +server=/hentaitalk.com/127.0.0.1#5335 +ipset=/hentaitalk.com/gfwlist +server=/ebayads.com/127.0.0.1#5335 +ipset=/ebayads.com/gfwlist +server=/xmissy.nl/127.0.0.1#5335 +ipset=/xmissy.nl/gfwlist +server=/pokemonpicross.com/127.0.0.1#5335 +ipset=/pokemonpicross.com/gfwlist +server=/drdrebeatsdiscount.com/127.0.0.1#5335 +ipset=/drdrebeatsdiscount.com/gfwlist +server=/anudetube.com/127.0.0.1#5335 +ipset=/anudetube.com/gfwlist +server=/ibook.net/127.0.0.1#5335 +ipset=/ibook.net/gfwlist +server=/wholecitiesfoundation.org/127.0.0.1#5335 +ipset=/wholecitiesfoundation.org/gfwlist +server=/gvt0.com/127.0.0.1#5335 +ipset=/gvt0.com/gfwlist +server=/silversluts.com/127.0.0.1#5335 +ipset=/silversluts.com/gfwlist +server=/minghui.org/127.0.0.1#5335 +ipset=/minghui.org/gfwlist +server=/xdaddy.in/127.0.0.1#5335 +ipset=/xdaddy.in/gfwlist +server=/soccermatchpass.com/127.0.0.1#5335 +ipset=/soccermatchpass.com/gfwlist +server=/faceebook.com/127.0.0.1#5335 +ipset=/faceebook.com/gfwlist +server=/xchina.fun/127.0.0.1#5335 +ipset=/xchina.fun/gfwlist +server=/volvotrucks.ba/127.0.0.1#5335 +ipset=/volvotrucks.ba/gfwlist +server=/facrbook.com/127.0.0.1#5335 +ipset=/facrbook.com/gfwlist +server=/mastercard.sk/127.0.0.1#5335 +ipset=/mastercard.sk/gfwlist +server=/cheapnikeoutlet.com/127.0.0.1#5335 +ipset=/cheapnikeoutlet.com/gfwlist +server=/cbsimg.net/127.0.0.1#5335 +ipset=/cbsimg.net/gfwlist +server=/foxentertainment.com/127.0.0.1#5335 +ipset=/foxentertainment.com/gfwlist +server=/xbahis55.com/127.0.0.1#5335 +ipset=/xbahis55.com/gfwlist +server=/kissjav.com/127.0.0.1#5335 +ipset=/kissjav.com/gfwlist +server=/xanimeporn.tv/127.0.0.1#5335 +ipset=/xanimeporn.tv/gfwlist +server=/douyintt10.me/127.0.0.1#5335 +ipset=/douyintt10.me/gfwlist +server=/shemalepornonly.com/127.0.0.1#5335 +ipset=/shemalepornonly.com/gfwlist +server=/embl.org/127.0.0.1#5335 +ipset=/embl.org/gfwlist +server=/durex-slovenia.si/127.0.0.1#5335 +ipset=/durex-slovenia.si/gfwlist +server=/ntdtvla.com/127.0.0.1#5335 +ipset=/ntdtvla.com/gfwlist +server=/x3guide.com/127.0.0.1#5335 +ipset=/x3guide.com/gfwlist +server=/yjcontentdelivery.com/127.0.0.1#5335 +ipset=/yjcontentdelivery.com/gfwlist +server=/buypass.se/127.0.0.1#5335 +ipset=/buypass.se/gfwlist +server=/alpherafs.co.nz/127.0.0.1#5335 +ipset=/alpherafs.co.nz/gfwlist +server=/bestbuysgeeksquad.com/127.0.0.1#5335 +ipset=/bestbuysgeeksquad.com/gfwlist +server=/myteenwebcam.com/127.0.0.1#5335 +ipset=/myteenwebcam.com/gfwlist +server=/douya.org/127.0.0.1#5335 +ipset=/douya.org/gfwlist +server=/ginzasonypark.jp/127.0.0.1#5335 +ipset=/ginzasonypark.jp/gfwlist +server=/braintreepaymentsolutions.com/127.0.0.1#5335 +ipset=/braintreepaymentsolutions.com/gfwlist +server=/winning11.com/127.0.0.1#5335 +ipset=/winning11.com/gfwlist +server=/willyporn.com/127.0.0.1#5335 +ipset=/willyporn.com/gfwlist +server=/wifemovies.net/127.0.0.1#5335 +ipset=/wifemovies.net/gfwlist +server=/wifeloversporn.com/127.0.0.1#5335 +ipset=/wifeloversporn.com/gfwlist +server=/minimontrealcentre.ca/127.0.0.1#5335 +ipset=/minimontrealcentre.ca/gfwlist +server=/playmeow.com/127.0.0.1#5335 +ipset=/playmeow.com/gfwlist +server=/allmomsex.com/127.0.0.1#5335 +ipset=/allmomsex.com/gfwlist +server=/freegaypornfinder.com/127.0.0.1#5335 +ipset=/freegaypornfinder.com/gfwlist +server=/hpvirtualthin.com/127.0.0.1#5335 +ipset=/hpvirtualthin.com/gfwlist +server=/whitexxxtube.com/127.0.0.1#5335 +ipset=/whitexxxtube.com/gfwlist +server=/nike-dunksb.com/127.0.0.1#5335 +ipset=/nike-dunksb.com/gfwlist +server=/monstercheapbeatss.com/127.0.0.1#5335 +ipset=/monstercheapbeatss.com/gfwlist +server=/whentai.com/127.0.0.1#5335 +ipset=/whentai.com/gfwlist +server=/visa.com.pa/127.0.0.1#5335 +ipset=/visa.com.pa/gfwlist +server=/maskedsingerfox.com/127.0.0.1#5335 +ipset=/maskedsingerfox.com/gfwlist +server=/facebook-newsroom.com/127.0.0.1#5335 +ipset=/facebook-newsroom.com/gfwlist +server=/ebay-discoveries.com/127.0.0.1#5335 +ipset=/ebay-discoveries.com/gfwlist +server=/weknowporn.com/127.0.0.1#5335 +ipset=/weknowporn.com/gfwlist +server=/cfna.com/127.0.0.1#5335 +ipset=/cfna.com/gfwlist +server=/pornworld.to/127.0.0.1#5335 +ipset=/pornworld.to/gfwlist +server=/pinterest.nl/127.0.0.1#5335 +ipset=/pinterest.nl/gfwlist +server=/tospo-keiba.jp/127.0.0.1#5335 +ipset=/tospo-keiba.jp/gfwlist +server=/linkedin.com/127.0.0.1#5335 +ipset=/linkedin.com/gfwlist +server=/outletbeatsshop.com/127.0.0.1#5335 +ipset=/outletbeatsshop.com/gfwlist +server=/tvbs.com.tw/127.0.0.1#5335 +ipset=/tvbs.com.tw/gfwlist +server=/binancezh.co/127.0.0.1#5335 +ipset=/binancezh.co/gfwlist +server=/watchersweb.com/127.0.0.1#5335 +ipset=/watchersweb.com/gfwlist +server=/warddogs.com/127.0.0.1#5335 +ipset=/warddogs.com/gfwlist +server=/vrfdgswx.xyz/127.0.0.1#5335 +ipset=/vrfdgswx.xyz/gfwlist +server=/youtube.cr/127.0.0.1#5335 +ipset=/youtube.cr/gfwlist +server=/newsmaxtv.com/127.0.0.1#5335 +ipset=/newsmaxtv.com/gfwlist +server=/visa.com.kn/127.0.0.1#5335 +ipset=/visa.com.kn/gfwlist +server=/pornohutdeutsch.net/127.0.0.1#5335 +ipset=/pornohutdeutsch.net/gfwlist +server=/watchmygf.net/127.0.0.1#5335 +ipset=/watchmygf.net/gfwlist +server=/mini-connected.co.uk/127.0.0.1#5335 +ipset=/mini-connected.co.uk/gfwlist +server=/voyeurhouse.com/127.0.0.1#5335 +ipset=/voyeurhouse.com/gfwlist +server=/pornovenezolano.com.ve/127.0.0.1#5335 +ipset=/pornovenezolano.com.ve/gfwlist +server=/vomitkings.com/127.0.0.1#5335 +ipset=/vomitkings.com/gfwlist +server=/onesiterip.com/127.0.0.1#5335 +ipset=/onesiterip.com/gfwlist +server=/4kup.net/127.0.0.1#5335 +ipset=/4kup.net/gfwlist +server=/virtualpartyworld.com/127.0.0.1#5335 +ipset=/virtualpartyworld.com/gfwlist +server=/vintagexxxfilms.com/127.0.0.1#5335 +ipset=/vintagexxxfilms.com/gfwlist +server=/megatitsminka.com/127.0.0.1#5335 +ipset=/megatitsminka.com/gfwlist +server=/hycgm1324.shop/127.0.0.1#5335 +ipset=/hycgm1324.shop/gfwlist +server=/celebritynakeds.com/127.0.0.1#5335 +ipset=/celebritynakeds.com/gfwlist +server=/viet.sex/127.0.0.1#5335 +ipset=/viet.sex/gfwlist +server=/bmw-connecteddrive.com.mt/127.0.0.1#5335 +ipset=/bmw-connecteddrive.com.mt/gfwlist +server=/kenyasexparadise.com/127.0.0.1#5335 +ipset=/kenyasexparadise.com/gfwlist +server=/only-xxx.com/127.0.0.1#5335 +ipset=/only-xxx.com/gfwlist +server=/menhdv.com/127.0.0.1#5335 +ipset=/menhdv.com/gfwlist +server=/malayporn.site/127.0.0.1#5335 +ipset=/malayporn.site/gfwlist +server=/nike.shop/127.0.0.1#5335 +ipset=/nike.shop/gfwlist +server=/bookshome.net/127.0.0.1#5335 +ipset=/bookshome.net/gfwlist +server=/youtube.ca/127.0.0.1#5335 +ipset=/youtube.ca/gfwlist +server=/harpercollinschildrensbooks.co.uk/127.0.0.1#5335 +ipset=/harpercollinschildrensbooks.co.uk/gfwlist +server=/volvobuses.com.ar/127.0.0.1#5335 +ipset=/volvobuses.com.ar/gfwlist +server=/4ksex.me/127.0.0.1#5335 +ipset=/4ksex.me/gfwlist +server=/videosxxxnicaragua.top/127.0.0.1#5335 +ipset=/videosxxxnicaragua.top/gfwlist +server=/disney.co.za/127.0.0.1#5335 +ipset=/disney.co.za/gfwlist +server=/apress.com/127.0.0.1#5335 +ipset=/apress.com/gfwlist +server=/nikefactorystore.com/127.0.0.1#5335 +ipset=/nikefactorystore.com/gfwlist +server=/starwarsjedifallenorder.com/127.0.0.1#5335 +ipset=/starwarsjedifallenorder.com/gfwlist +server=/mcisco.com/127.0.0.1#5335 +ipset=/mcisco.com/gfwlist +server=/drebeatsoutletstore.com/127.0.0.1#5335 +ipset=/drebeatsoutletstore.com/gfwlist +server=/choicereviews.org/127.0.0.1#5335 +ipset=/choicereviews.org/gfwlist +server=/vanish.pt/127.0.0.1#5335 +ipset=/vanish.pt/gfwlist +server=/simg.jp/127.0.0.1#5335 +ipset=/simg.jp/gfwlist +server=/picsee.pro/127.0.0.1#5335 +ipset=/picsee.pro/gfwlist +server=/natgeomaps.com/127.0.0.1#5335 +ipset=/natgeomaps.com/gfwlist +server=/free18.net/127.0.0.1#5335 +ipset=/free18.net/gfwlist +server=/alphabet.com.pl/127.0.0.1#5335 +ipset=/alphabet.com.pl/gfwlist +server=/vercomicsporno.xxx/127.0.0.1#5335 +ipset=/vercomicsporno.xxx/gfwlist +server=/ftiecla.com/127.0.0.1#5335 +ipset=/ftiecla.com/gfwlist +server=/vaginalultrasound.info/127.0.0.1#5335 +ipset=/vaginalultrasound.info/gfwlist +server=/v7hds.com/127.0.0.1#5335 +ipset=/v7hds.com/gfwlist +server=/visaluxuryhotelcollection.com/127.0.0.1#5335 +ipset=/visaluxuryhotelcollection.com/gfwlist +server=/face-book.com/127.0.0.1#5335 +ipset=/face-book.com/gfwlist +server=/fnlondon.com/127.0.0.1#5335 +ipset=/fnlondon.com/gfwlist +server=/ikea.com.ru/127.0.0.1#5335 +ipset=/ikea.com.ru/gfwlist +server=/pearson.es/127.0.0.1#5335 +ipset=/pearson.es/gfwlist +server=/tgutube.com/127.0.0.1#5335 +ipset=/tgutube.com/gfwlist +server=/urasma.com/127.0.0.1#5335 +ipset=/urasma.com/gfwlist +server=/akaeai.com/127.0.0.1#5335 +ipset=/akaeai.com/gfwlist +server=/beautifulandbusty.com/127.0.0.1#5335 +ipset=/beautifulandbusty.com/gfwlist +server=/reutersmedia.net/127.0.0.1#5335 +ipset=/reutersmedia.net/gfwlist +server=/icloud.hu/127.0.0.1#5335 +ipset=/icloud.hu/gfwlist +server=/ibm.com/127.0.0.1#5335 +ipset=/ibm.com/gfwlist +server=/uncensoredsexparties.com/127.0.0.1#5335 +ipset=/uncensoredsexparties.com/gfwlist +server=/bridgestonetire.ca/127.0.0.1#5335 +ipset=/bridgestonetire.ca/gfwlist +server=/openssl.org/127.0.0.1#5335 +ipset=/openssl.org/gfwlist +server=/ujapanesesex.com/127.0.0.1#5335 +ipset=/ujapanesesex.com/gfwlist +server=/telegram.org/127.0.0.1#5335 +ipset=/telegram.org/gfwlist +server=/tytng189.com/127.0.0.1#5335 +ipset=/tytng189.com/gfwlist +server=/aple.com/127.0.0.1#5335 +ipset=/aple.com/gfwlist +server=/tomovie.net/127.0.0.1#5335 +ipset=/tomovie.net/gfwlist +server=/ius.io/127.0.0.1#5335 +ipset=/ius.io/gfwlist +server=/tushy.com/127.0.0.1#5335 +ipset=/tushy.com/gfwlist +server=/glyphsapp.com/127.0.0.1#5335 +ipset=/glyphsapp.com/gfwlist +server=/nikelunarglide.com/127.0.0.1#5335 +ipset=/nikelunarglide.com/gfwlist +server=/fxn.ws/127.0.0.1#5335 +ipset=/fxn.ws/gfwlist +server=/bmw.lt/127.0.0.1#5335 +ipset=/bmw.lt/gfwlist +server=/ebayforcharity.org/127.0.0.1#5335 +ipset=/ebayforcharity.org/gfwlist +server=/ebay-inc.net/127.0.0.1#5335 +ipset=/ebay-inc.net/gfwlist +server=/eracom.com.tw/127.0.0.1#5335 +ipset=/eracom.com.tw/gfwlist +server=/thesims3.com/127.0.0.1#5335 +ipset=/thesims3.com/gfwlist +server=/tubepornstars.com/127.0.0.1#5335 +ipset=/tubepornstars.com/gfwlist +server=/webkit.org/127.0.0.1#5335 +ipset=/webkit.org/gfwlist +server=/youtubegaming.com/127.0.0.1#5335 +ipset=/youtubegaming.com/gfwlist +server=/hcbdsm.com/127.0.0.1#5335 +ipset=/hcbdsm.com/gfwlist +server=/tubeorigin.com/127.0.0.1#5335 +ipset=/tubeorigin.com/gfwlist +server=/youtube.tv/127.0.0.1#5335 +ipset=/youtube.tv/gfwlist +server=/monsterbeatsbydreaustraliacheap.com/127.0.0.1#5335 +ipset=/monsterbeatsbydreaustraliacheap.com/gfwlist +server=/connaissancesfinancierespratiques.ca/127.0.0.1#5335 +ipset=/connaissancesfinancierespratiques.ca/gfwlist +server=/tiendabestbuy.com/127.0.0.1#5335 +ipset=/tiendabestbuy.com/gfwlist +server=/tubedupe.com/127.0.0.1#5335 +ipset=/tubedupe.com/gfwlist +server=/tubecaptain.com/127.0.0.1#5335 +ipset=/tubecaptain.com/gfwlist +server=/tube8zoo.com/127.0.0.1#5335 +ipset=/tube8zoo.com/gfwlist +server=/tube-pornomovs.com/127.0.0.1#5335 +ipset=/tube-pornomovs.com/gfwlist +server=/alphera.com.hk/127.0.0.1#5335 +ipset=/alphera.com.hk/gfwlist +server=/ftopx.com/127.0.0.1#5335 +ipset=/ftopx.com/gfwlist +server=/tiohentai.com/127.0.0.1#5335 +ipset=/tiohentai.com/gfwlist +server=/uug23.com/127.0.0.1#5335 +ipset=/uug23.com/gfwlist +server=/kbdxlesx.xyz/127.0.0.1#5335 +ipset=/kbdxlesx.xyz/gfwlist +server=/audiomonsterbeatsonline.com/127.0.0.1#5335 +ipset=/audiomonsterbeatsonline.com/gfwlist +server=/justhd.xyz/127.0.0.1#5335 +ipset=/justhd.xyz/gfwlist +server=/mastercard.dk/127.0.0.1#5335 +ipset=/mastercard.dk/gfwlist +server=/travelgirls.com/127.0.0.1#5335 +ipset=/travelgirls.com/gfwlist +server=/sexgame.com/127.0.0.1#5335 +ipset=/sexgame.com/gfwlist +server=/transangels.com/127.0.0.1#5335 +ipset=/transangels.com/gfwlist +server=/yahoo.be/127.0.0.1#5335 +ipset=/yahoo.be/gfwlist +server=/colegialasreales.com/127.0.0.1#5335 +ipset=/colegialasreales.com/gfwlist +server=/cbssvideo.com/127.0.0.1#5335 +ipset=/cbssvideo.com/gfwlist +server=/imac.eu/127.0.0.1#5335 +ipset=/imac.eu/gfwlist +server=/msftauth.net/127.0.0.1#5335 +ipset=/msftauth.net/gfwlist +server=/binancezh.top/127.0.0.1#5335 +ipset=/binancezh.top/gfwlist +server=/foxnewsrundown.com/127.0.0.1#5335 +ipset=/foxnewsrundown.com/gfwlist +server=/akamai-platform-staging.com/127.0.0.1#5335 +ipset=/akamai-platform-staging.com/gfwlist +server=/tophentaicomics.com/127.0.0.1#5335 +ipset=/tophentaicomics.com/gfwlist +server=/tophentai.biz/127.0.0.1#5335 +ipset=/tophentai.biz/gfwlist +server=/facebooktv.net/127.0.0.1#5335 +ipset=/facebooktv.net/gfwlist +server=/etherscan.io/127.0.0.1#5335 +ipset=/etherscan.io/gfwlist +server=/mingwatch.com/127.0.0.1#5335 +ipset=/mingwatch.com/gfwlist +server=/natgeokidsbooks.co.uk/127.0.0.1#5335 +ipset=/natgeokidsbooks.co.uk/gfwlist +server=/airwick.co.nz/127.0.0.1#5335 +ipset=/airwick.co.nz/gfwlist +server=/toperoticartsites.com/127.0.0.1#5335 +ipset=/toperoticartsites.com/gfwlist +server=/intel.uk/127.0.0.1#5335 +ipset=/intel.uk/gfwlist +server=/tokyomotion.net/127.0.0.1#5335 +ipset=/tokyomotion.net/gfwlist +server=/mariosupersluggers.com/127.0.0.1#5335 +ipset=/mariosupersluggers.com/gfwlist +server=/byspotify.com/127.0.0.1#5335 +ipset=/byspotify.com/gfwlist +server=/ebayon.net/127.0.0.1#5335 +ipset=/ebayon.net/gfwlist +server=/titsintops.com/127.0.0.1#5335 +ipset=/titsintops.com/gfwlist +server=/collabora.com/127.0.0.1#5335 +ipset=/collabora.com/gfwlist +server=/sonyentertainmentnetwork.com/127.0.0.1#5335 +ipset=/sonyentertainmentnetwork.com/gfwlist +server=/hentai24h.org/127.0.0.1#5335 +ipset=/hentai24h.org/gfwlist +server=/visa.com.au/127.0.0.1#5335 +ipset=/visa.com.au/gfwlist +server=/3dsexmovies.biz/127.0.0.1#5335 +ipset=/3dsexmovies.biz/gfwlist +server=/tinhduc.org/127.0.0.1#5335 +ipset=/tinhduc.org/gfwlist +server=/timo0.com/127.0.0.1#5335 +ipset=/timo0.com/gfwlist +server=/fbsbx.net/127.0.0.1#5335 +ipset=/fbsbx.net/gfwlist +server=/thumbnailseries.com/127.0.0.1#5335 +ipset=/thumbnailseries.com/gfwlist +server=/graneodin.com.mx/127.0.0.1#5335 +ipset=/graneodin.com.mx/gfwlist +server=/porndig.com/127.0.0.1#5335 +ipset=/porndig.com/gfwlist +server=/pornscum.com/127.0.0.1#5335 +ipset=/pornscum.com/gfwlist +server=/akamai-sucks.net/127.0.0.1#5335 +ipset=/akamai-sucks.net/gfwlist +server=/facebookporno.net/127.0.0.1#5335 +ipset=/facebookporno.net/gfwlist +server=/metartnetwork.com/127.0.0.1#5335 +ipset=/metartnetwork.com/gfwlist +server=/r34porn.net/127.0.0.1#5335 +ipset=/r34porn.net/gfwlist +server=/hairy-beauty.com/127.0.0.1#5335 +ipset=/hairy-beauty.com/gfwlist +server=/scoreclassics.com/127.0.0.1#5335 +ipset=/scoreclassics.com/gfwlist +server=/onionshare.org/127.0.0.1#5335 +ipset=/onionshare.org/gfwlist +server=/pscdn.co/127.0.0.1#5335 +ipset=/pscdn.co/gfwlist +server=/uncensoredhentai.xxx/127.0.0.1#5335 +ipset=/uncensoredhentai.xxx/gfwlist +server=/smyw.org/127.0.0.1#5335 +ipset=/smyw.org/gfwlist +server=/porn93.cc/127.0.0.1#5335 +ipset=/porn93.cc/gfwlist +server=/redino.tw/127.0.0.1#5335 +ipset=/redino.tw/gfwlist +server=/thehabibshow.com/127.0.0.1#5335 +ipset=/thehabibshow.com/gfwlist +server=/thefappening.wiki/127.0.0.1#5335 +ipset=/thefappening.wiki/gfwlist +server=/mini.de/127.0.0.1#5335 +ipset=/mini.de/gfwlist +server=/academic.eb.com/127.0.0.1#5335 +ipset=/academic.eb.com/gfwlist +server=/rsf.org/127.0.0.1#5335 +ipset=/rsf.org/gfwlist +server=/thebondagefiles.com/127.0.0.1#5335 +ipset=/thebondagefiles.com/gfwlist +server=/russianrape.org/127.0.0.1#5335 +ipset=/russianrape.org/gfwlist +server=/gaysonic.eu/127.0.0.1#5335 +ipset=/gaysonic.eu/gfwlist +server=/xxxpenguin.com/127.0.0.1#5335 +ipset=/xxxpenguin.com/gfwlist +server=/travelcontroller.com/127.0.0.1#5335 +ipset=/travelcontroller.com/gfwlist +server=/thaigirls100.net/127.0.0.1#5335 +ipset=/thaigirls100.net/gfwlist +server=/amsterdamhotescort.com/127.0.0.1#5335 +ipset=/amsterdamhotescort.com/gfwlist +server=/msnbc.com/127.0.0.1#5335 +ipset=/msnbc.com/gfwlist +server=/hpcpi.com/127.0.0.1#5335 +ipset=/hpcpi.com/gfwlist +server=/cartoonville.net/127.0.0.1#5335 +ipset=/cartoonville.net/gfwlist +server=/boyztube.com/127.0.0.1#5335 +ipset=/boyztube.com/gfwlist +server=/teenwebcamtube.com/127.0.0.1#5335 +ipset=/teenwebcamtube.com/gfwlist +server=/illusionchn.com/127.0.0.1#5335 +ipset=/illusionchn.com/gfwlist +server=/azatliq.org/127.0.0.1#5335 +ipset=/azatliq.org/gfwlist +server=/devilsfilm.com/127.0.0.1#5335 +ipset=/devilsfilm.com/gfwlist +server=/ic.ac.uk/127.0.0.1#5335 +ipset=/ic.ac.uk/gfwlist +server=/blowjobit.com/127.0.0.1#5335 +ipset=/blowjobit.com/gfwlist +server=/teen3x.mobi/127.0.0.1#5335 +ipset=/teen3x.mobi/gfwlist +server=/ciscofax.com/127.0.0.1#5335 +ipset=/ciscofax.com/gfwlist +server=/friendfeedmedia.com/127.0.0.1#5335 +ipset=/friendfeedmedia.com/gfwlist +server=/netflixdnstest7.com/127.0.0.1#5335 +ipset=/netflixdnstest7.com/gfwlist +server=/mirrorsedge2d.com/127.0.0.1#5335 +ipset=/mirrorsedge2d.com/gfwlist +server=/prastitutki.ru/127.0.0.1#5335 +ipset=/prastitutki.ru/gfwlist +server=/disneycruisebrasil.com/127.0.0.1#5335 +ipset=/disneycruisebrasil.com/gfwlist +server=/uk-exhibitionist.com/127.0.0.1#5335 +ipset=/uk-exhibitionist.com/gfwlist +server=/taxi69.com/127.0.0.1#5335 +ipset=/taxi69.com/gfwlist +server=/disney.id/127.0.0.1#5335 +ipset=/disney.id/gfwlist +server=/ovid.com/127.0.0.1#5335 +ipset=/ovid.com/gfwlist +server=/tabooporns.com/127.0.0.1#5335 +ipset=/tabooporns.com/gfwlist +server=/foxsports.sv/127.0.0.1#5335 +ipset=/foxsports.sv/gfwlist +server=/sxshentai.com/127.0.0.1#5335 +ipset=/sxshentai.com/gfwlist +server=/paysitesreviews.net/127.0.0.1#5335 +ipset=/paysitesreviews.net/gfwlist +server=/youtube.ie/127.0.0.1#5335 +ipset=/youtube.ie/gfwlist +server=/cloudimage.io/127.0.0.1#5335 +ipset=/cloudimage.io/gfwlist +server=/disneyaulani.com/127.0.0.1#5335 +ipset=/disneyaulani.com/gfwlist +server=/superhqporn.com/127.0.0.1#5335 +ipset=/superhqporn.com/gfwlist +server=/supergratisporno.com/127.0.0.1#5335 +ipset=/supergratisporno.com/gfwlist +server=/beatstoreusa.com/127.0.0.1#5335 +ipset=/beatstoreusa.com/gfwlist +server=/deviantart.com/127.0.0.1#5335 +ipset=/deviantart.com/gfwlist +server=/sunporno.com/127.0.0.1#5335 +ipset=/sunporno.com/gfwlist +server=/globalsign-media.com/127.0.0.1#5335 +ipset=/globalsign-media.com/gfwlist +server=/mediachinese.com/127.0.0.1#5335 +ipset=/mediachinese.com/gfwlist +server=/streamsex.com/127.0.0.1#5335 +ipset=/streamsex.com/gfwlist +server=/stileproject.com/127.0.0.1#5335 +ipset=/stileproject.com/gfwlist +server=/taiav.com/127.0.0.1#5335 +ipset=/taiav.com/gfwlist +server=/amateursvid.com/127.0.0.1#5335 +ipset=/amateursvid.com/gfwlist +server=/ikea.net/127.0.0.1#5335 +ipset=/ikea.net/gfwlist +server=/jennylist.xyz/127.0.0.1#5335 +ipset=/jennylist.xyz/gfwlist +server=/microsoft-ppe.com/127.0.0.1#5335 +ipset=/microsoft-ppe.com/gfwlist +server=/supplybestjerseys.com/127.0.0.1#5335 +ipset=/supplybestjerseys.com/gfwlist +server=/sshs.pw/127.0.0.1#5335 +ipset=/sshs.pw/gfwlist +server=/nexusmods.com/127.0.0.1#5335 +ipset=/nexusmods.com/gfwlist +server=/ebayclassifiedsgroup.org/127.0.0.1#5335 +ipset=/ebayclassifiedsgroup.org/gfwlist +server=/riot-games.com/127.0.0.1#5335 +ipset=/riot-games.com/gfwlist +server=/spectraltube.com/127.0.0.1#5335 +ipset=/spectraltube.com/gfwlist +server=/youtube.me/127.0.0.1#5335 +ipset=/youtube.me/gfwlist +server=/hbo.com.c.footprint.net/127.0.0.1#5335 +ipset=/hbo.com.c.footprint.net/gfwlist +server=/thehun.net/127.0.0.1#5335 +ipset=/thehun.net/gfwlist +server=/smutcam.com/127.0.0.1#5335 +ipset=/smutcam.com/gfwlist +server=/sksarab.top/127.0.0.1#5335 +ipset=/sksarab.top/gfwlist +server=/millymarks.com/127.0.0.1#5335 +ipset=/millymarks.com/gfwlist +server=/nike.hk/127.0.0.1#5335 +ipset=/nike.hk/gfwlist +server=/pki-poste.ch/127.0.0.1#5335 +ipset=/pki-poste.ch/gfwlist +server=/electrochem.org/127.0.0.1#5335 +ipset=/electrochem.org/gfwlist +server=/newsmax.com/127.0.0.1#5335 +ipset=/newsmax.com/gfwlist +server=/cashvideotube.com/127.0.0.1#5335 +ipset=/cashvideotube.com/gfwlist +server=/firestone.com.mx/127.0.0.1#5335 +ipset=/firestone.com.mx/gfwlist +server=/sisisl.com/127.0.0.1#5335 +ipset=/sisisl.com/gfwlist +server=/bloombergindices.com/127.0.0.1#5335 +ipset=/bloombergindices.com/gfwlist +server=/instagramq.com/127.0.0.1#5335 +ipset=/instagramq.com/gfwlist +server=/hpshooping.com/127.0.0.1#5335 +ipset=/hpshooping.com/gfwlist +server=/orl.ly/127.0.0.1#5335 +ipset=/orl.ly/gfwlist +server=/nikeshoemarket.com/127.0.0.1#5335 +ipset=/nikeshoemarket.com/gfwlist +server=/chromium.org/127.0.0.1#5335 +ipset=/chromium.org/gfwlist +server=/free-3d-porn.com/127.0.0.1#5335 +ipset=/free-3d-porn.com/gfwlist +server=/av1688.cc/127.0.0.1#5335 +ipset=/av1688.cc/gfwlist +server=/shittytube.com/127.0.0.1#5335 +ipset=/shittytube.com/gfwlist +server=/mini-bahrain.com/127.0.0.1#5335 +ipset=/mini-bahrain.com/gfwlist +server=/bloomberg.com.br/127.0.0.1#5335 +ipset=/bloomberg.com.br/gfwlist +server=/shithd.com/127.0.0.1#5335 +ipset=/shithd.com/gfwlist +server=/javmix.tv/127.0.0.1#5335 +ipset=/javmix.tv/gfwlist +server=/humoron.com/127.0.0.1#5335 +ipset=/humoron.com/gfwlist +server=/shemale-porn-galls.com/127.0.0.1#5335 +ipset=/shemale-porn-galls.com/gfwlist +server=/masterclass.com/127.0.0.1#5335 +ipset=/masterclass.com/gfwlist +server=/accuweather.com/127.0.0.1#5335 +ipset=/accuweather.com/gfwlist +server=/volvobuses.co.za/127.0.0.1#5335 +ipset=/volvobuses.co.za/gfwlist +server=/sexywetpussy.com/127.0.0.1#5335 +ipset=/sexywetpussy.com/gfwlist +server=/sexyteenssite.com/127.0.0.1#5335 +ipset=/sexyteenssite.com/gfwlist +server=/sexysites.com.ph/127.0.0.1#5335 +ipset=/sexysites.com.ph/gfwlist +server=/theepochtimes.com/127.0.0.1#5335 +ipset=/theepochtimes.com/gfwlist +server=/asredas.com/127.0.0.1#5335 +ipset=/asredas.com/gfwlist +server=/jav.land/127.0.0.1#5335 +ipset=/jav.land/gfwlist +server=/hot2048.com/127.0.0.1#5335 +ipset=/hot2048.com/gfwlist +server=/sexyfuckgames.com/127.0.0.1#5335 +ipset=/sexyfuckgames.com/gfwlist +server=/youtubeembeddedplayer.googleapis.com/127.0.0.1#5335 +ipset=/youtubeembeddedplayer.googleapis.com/gfwlist +server=/gladporn.com/127.0.0.1#5335 +ipset=/gladporn.com/gfwlist +server=/4ebaytraders.com/127.0.0.1#5335 +ipset=/4ebaytraders.com/gfwlist +server=/youtube.kz/127.0.0.1#5335 +ipset=/youtube.kz/gfwlist +server=/bmw-dubai.com/127.0.0.1#5335 +ipset=/bmw-dubai.com/gfwlist +server=/ac-pocketcamp.com/127.0.0.1#5335 +ipset=/ac-pocketcamp.com/gfwlist +server=/bmw.uz/127.0.0.1#5335 +ipset=/bmw.uz/gfwlist +server=/google.com.br/127.0.0.1#5335 +ipset=/google.com.br/gfwlist +server=/redtube.blog/127.0.0.1#5335 +ipset=/redtube.blog/gfwlist +server=/sexxxdoll.com/127.0.0.1#5335 +ipset=/sexxxdoll.com/gfwlist +server=/sexxhd.de/127.0.0.1#5335 +ipset=/sexxhd.de/gfwlist +server=/nike0594.com/127.0.0.1#5335 +ipset=/nike0594.com/gfwlist +server=/sexualhentai.net/127.0.0.1#5335 +ipset=/sexualhentai.net/gfwlist +server=/infowarsmedia.com/127.0.0.1#5335 +ipset=/infowarsmedia.com/gfwlist +server=/youwuss.com/127.0.0.1#5335 +ipset=/youwuss.com/gfwlist +server=/qr.ae/127.0.0.1#5335 +ipset=/qr.ae/gfwlist +server=/sapphicerotica.com/127.0.0.1#5335 +ipset=/sapphicerotica.com/gfwlist +server=/sexstoriespost.com/127.0.0.1#5335 +ipset=/sexstoriespost.com/gfwlist +server=/sexsimulator.com/127.0.0.1#5335 +ipset=/sexsimulator.com/gfwlist +server=/scholar.google.com.ar/127.0.0.1#5335 +ipset=/scholar.google.com.ar/gfwlist +server=/sexopornolive.com/127.0.0.1#5335 +ipset=/sexopornolive.com/gfwlist +server=/bmw-kuwait.com/127.0.0.1#5335 +ipset=/bmw-kuwait.com/gfwlist +server=/drbl.in/127.0.0.1#5335 +ipset=/drbl.in/gfwlist +server=/applecentre.com.au/127.0.0.1#5335 +ipset=/applecentre.com.au/gfwlist +server=/xhcdn.com/127.0.0.1#5335 +ipset=/xhcdn.com/gfwlist +server=/mearki.com/127.0.0.1#5335 +ipset=/mearki.com/gfwlist +server=/sexmix.net/127.0.0.1#5335 +ipset=/sexmix.net/gfwlist +server=/spiceworks.com/127.0.0.1#5335 +ipset=/spiceworks.com/gfwlist +server=/sexkorea.net/127.0.0.1#5335 +ipset=/sexkorea.net/gfwlist +server=/sexiranian.party/127.0.0.1#5335 +ipset=/sexiranian.party/gfwlist +server=/itunes12days.com/127.0.0.1#5335 +ipset=/itunes12days.com/gfwlist +server=/sexhotgames.com/127.0.0.1#5335 +ipset=/sexhotgames.com/gfwlist +server=/ebaystatic.com/127.0.0.1#5335 +ipset=/ebaystatic.com/gfwlist +server=/my45.com/127.0.0.1#5335 +ipset=/my45.com/gfwlist +server=/youtube-ui.l.google.com/127.0.0.1#5335 +ipset=/youtube-ui.l.google.com/gfwlist +server=/directvcinema.com/127.0.0.1#5335 +ipset=/directvcinema.com/gfwlist +server=/sexgames.cc/127.0.0.1#5335 +ipset=/sexgames.cc/gfwlist +server=/appledarwin.net/127.0.0.1#5335 +ipset=/appledarwin.net/gfwlist +server=/lolesports.com/127.0.0.1#5335 +ipset=/lolesports.com/gfwlist +server=/bioware.com/127.0.0.1#5335 +ipset=/bioware.com/gfwlist +server=/sexfilmeporno.com/127.0.0.1#5335 +ipset=/sexfilmeporno.com/gfwlist +server=/joanabliss.com/127.0.0.1#5335 +ipset=/joanabliss.com/gfwlist +server=/sexedanslepre.net/127.0.0.1#5335 +ipset=/sexedanslepre.net/gfwlist +server=/sexdug.com/127.0.0.1#5335 +ipset=/sexdug.com/gfwlist +server=/facebookappcenter.org/127.0.0.1#5335 +ipset=/facebookappcenter.org/gfwlist +server=/sexdolls.com/127.0.0.1#5335 +ipset=/sexdolls.com/gfwlist +server=/ieee-ims.org/127.0.0.1#5335 +ipset=/ieee-ims.org/gfwlist +server=/eromanga-ace.com/127.0.0.1#5335 +ipset=/eromanga-ace.com/gfwlist +server=/pinterest.th/127.0.0.1#5335 +ipset=/pinterest.th/gfwlist +server=/nikecompany.com/127.0.0.1#5335 +ipset=/nikecompany.com/gfwlist +server=/marvelpinball.com/127.0.0.1#5335 +ipset=/marvelpinball.com/gfwlist +server=/sexanimalvideos.com/127.0.0.1#5335 +ipset=/sexanimalvideos.com/gfwlist +server=/sexalarab.com/127.0.0.1#5335 +ipset=/sexalarab.com/gfwlist +server=/paily.org/127.0.0.1#5335 +ipset=/paily.org/gfwlist +server=/bmw.si/127.0.0.1#5335 +ipset=/bmw.si/gfwlist +server=/pinterest.tw/127.0.0.1#5335 +ipset=/pinterest.tw/gfwlist +server=/sex-hay.pro/127.0.0.1#5335 +ipset=/sex-hay.pro/gfwlist +server=/mpfinance.com/127.0.0.1#5335 +ipset=/mpfinance.com/gfwlist +server=/familypies.net/127.0.0.1#5335 +ipset=/familypies.net/gfwlist +server=/paypalx.com/127.0.0.1#5335 +ipset=/paypalx.com/gfwlist +server=/sex-gif.org/127.0.0.1#5335 +ipset=/sex-gif.org/gfwlist +server=/fortuneinsight.com/127.0.0.1#5335 +ipset=/fortuneinsight.com/gfwlist +server=/sessoamatorialeitaliano.com/127.0.0.1#5335 +ipset=/sessoamatorialeitaliano.com/gfwlist +server=/g-tvapp.com/127.0.0.1#5335 +ipset=/g-tvapp.com/gfwlist +server=/camcam.cc/127.0.0.1#5335 +ipset=/camcam.cc/gfwlist +server=/texttobuy.org/127.0.0.1#5335 +ipset=/texttobuy.org/gfwlist +server=/publicagentxxx.com/127.0.0.1#5335 +ipset=/publicagentxxx.com/gfwlist +server=/pokedex3d.com/127.0.0.1#5335 +ipset=/pokedex3d.com/gfwlist +server=/search.xxx/127.0.0.1#5335 +ipset=/search.xxx/gfwlist +server=/myfoxlosangeles.com/127.0.0.1#5335 +ipset=/myfoxlosangeles.com/gfwlist +server=/vanish.com.co/127.0.0.1#5335 +ipset=/vanish.com.co/gfwlist +server=/primevideo.com/127.0.0.1#5335 +ipset=/primevideo.com/gfwlist +server=/beatsstudiosite.com/127.0.0.1#5335 +ipset=/beatsstudiosite.com/gfwlist +server=/comodoca3.com/127.0.0.1#5335 +ipset=/comodoca3.com/gfwlist +server=/bextbuy.com/127.0.0.1#5335 +ipset=/bextbuy.com/gfwlist +server=/avhome.one/127.0.0.1#5335 +ipset=/avhome.one/gfwlist +server=/yingpianqu.com/127.0.0.1#5335 +ipset=/yingpianqu.com/gfwlist +server=/riotgames.co.kr/127.0.0.1#5335 +ipset=/riotgames.co.kr/gfwlist +server=/scorediscounts.club/127.0.0.1#5335 +ipset=/scorediscounts.club/gfwlist +server=/bigtithooker.com/127.0.0.1#5335 +ipset=/bigtithooker.com/gfwlist +server=/azattyk.org/127.0.0.1#5335 +ipset=/azattyk.org/gfwlist +server=/callhulu.com/127.0.0.1#5335 +ipset=/callhulu.com/gfwlist +server=/cartoon18.com/127.0.0.1#5335 +ipset=/cartoon18.com/gfwlist +server=/savitabhabhi.vip/127.0.0.1#5335 +ipset=/savitabhabhi.vip/gfwlist +server=/krakenjs.com/127.0.0.1#5335 +ipset=/krakenjs.com/gfwlist +server=/facegbok.com/127.0.0.1#5335 +ipset=/facegbok.com/gfwlist +server=/gaypornsky.com/127.0.0.1#5335 +ipset=/gaypornsky.com/gfwlist +server=/xoom.io/127.0.0.1#5335 +ipset=/xoom.io/gfwlist +server=/ebayshopping.org/127.0.0.1#5335 +ipset=/ebayshopping.org/gfwlist +server=/blogspot.com.eg/127.0.0.1#5335 +ipset=/blogspot.com.eg/gfwlist +server=/ruvideos.net/127.0.0.1#5335 +ipset=/ruvideos.net/gfwlist +server=/paypal-japan.com/127.0.0.1#5335 +ipset=/paypal-japan.com/gfwlist +server=/isexlove.tw/127.0.0.1#5335 +ipset=/isexlove.tw/gfwlist +server=/taylorandfrancis.com/127.0.0.1#5335 +ipset=/taylorandfrancis.com/gfwlist +server=/moreheadphones.com/127.0.0.1#5335 +ipset=/moreheadphones.com/gfwlist +server=/apple.ae/127.0.0.1#5335 +ipset=/apple.ae/gfwlist +server=/ebaymotors.com/127.0.0.1#5335 +ipset=/ebaymotors.com/gfwlist +server=/6e8xr2gk.me/127.0.0.1#5335 +ipset=/6e8xr2gk.me/gfwlist +server=/rule34pornvids.com/127.0.0.1#5335 +ipset=/rule34pornvids.com/gfwlist +server=/scholar.google.com.ua/127.0.0.1#5335 +ipset=/scholar.google.com.ua/gfwlist +server=/jdforum.net/127.0.0.1#5335 +ipset=/jdforum.net/gfwlist +server=/10bet.com/127.0.0.1#5335 +ipset=/10bet.com/gfwlist +server=/romantic-sex-video.com/127.0.0.1#5335 +ipset=/romantic-sex-video.com/gfwlist +server=/gimy.to/127.0.0.1#5335 +ipset=/gimy.to/gfwlist +server=/hentaicomic.ru/127.0.0.1#5335 +ipset=/hentaicomic.ru/gfwlist +server=/risextube.com/127.0.0.1#5335 +ipset=/risextube.com/gfwlist +server=/volvotrucks.si/127.0.0.1#5335 +ipset=/volvotrucks.si/gfwlist +server=/instagramium.com/127.0.0.1#5335 +ipset=/instagramium.com/gfwlist +server=/heroku.me/127.0.0.1#5335 +ipset=/heroku.me/gfwlist +server=/ikea.nl/127.0.0.1#5335 +ipset=/ikea.nl/gfwlist +server=/alphabet.be/127.0.0.1#5335 +ipset=/alphabet.be/gfwlist +server=/airwick.de/127.0.0.1#5335 +ipset=/airwick.de/gfwlist +server=/durex.cz/127.0.0.1#5335 +ipset=/durex.cz/gfwlist +server=/kirbysepicyarn.com/127.0.0.1#5335 +ipset=/kirbysepicyarn.com/gfwlist +server=/realsexdoll.com/127.0.0.1#5335 +ipset=/realsexdoll.com/gfwlist +server=/blizzard.nefficient.co.kr/127.0.0.1#5335 +ipset=/blizzard.nefficient.co.kr/gfwlist +server=/myfoxphoenix.com/127.0.0.1#5335 +ipset=/myfoxphoenix.com/gfwlist +server=/vzw.com/127.0.0.1#5335 +ipset=/vzw.com/gfwlist +server=/fetishdreamz.com/127.0.0.1#5335 +ipset=/fetishdreamz.com/gfwlist +server=/real-thaipussy.com/127.0.0.1#5335 +ipset=/real-thaipussy.com/gfwlist +server=/real-homemade-movies.com/127.0.0.1#5335 +ipset=/real-homemade-movies.com/gfwlist +server=/readerswivesonline.com/127.0.0.1#5335 +ipset=/readerswivesonline.com/gfwlist +server=/ebaycareers.com/127.0.0.1#5335 +ipset=/ebaycareers.com/gfwlist +server=/ogameblog.com/127.0.0.1#5335 +ipset=/ogameblog.com/gfwlist +server=/funimation.com/127.0.0.1#5335 +ipset=/funimation.com/gfwlist +server=/rbeopp.com/127.0.0.1#5335 +ipset=/rbeopp.com/gfwlist +server=/petiteamateurteen.com/127.0.0.1#5335 +ipset=/petiteamateurteen.com/gfwlist +server=/s.team/127.0.0.1#5335 +ipset=/s.team/gfwlist +server=/google.co.ck/127.0.0.1#5335 +ipset=/google.co.ck/gfwlist +server=/yourmomlovesanal.com/127.0.0.1#5335 +ipset=/yourmomlovesanal.com/gfwlist +server=/westerndigital.com/127.0.0.1#5335 +ipset=/westerndigital.com/gfwlist +server=/quipelements.com/127.0.0.1#5335 +ipset=/quipelements.com/gfwlist +server=/irribay.com/127.0.0.1#5335 +ipset=/irribay.com/gfwlist +server=/store-bridgestonesports.com/127.0.0.1#5335 +ipset=/store-bridgestonesports.com/gfwlist +server=/beijingnike.com/127.0.0.1#5335 +ipset=/beijingnike.com/gfwlist +server=/enjoyasianporn.com/127.0.0.1#5335 +ipset=/enjoyasianporn.com/gfwlist +server=/verisign.com.sg/127.0.0.1#5335 +ipset=/verisign.com.sg/gfwlist +server=/qombol.com/127.0.0.1#5335 +ipset=/qombol.com/gfwlist +server=/x.team/127.0.0.1#5335 +ipset=/x.team/gfwlist +server=/66wwmm.com/127.0.0.1#5335 +ipset=/66wwmm.com/gfwlist +server=/scatnetwork.com/127.0.0.1#5335 +ipset=/scatnetwork.com/gfwlist +server=/faceboks.com/127.0.0.1#5335 +ipset=/faceboks.com/gfwlist +server=/paypal.me/127.0.0.1#5335 +ipset=/paypal.me/gfwlist +server=/xanimeporn.com/127.0.0.1#5335 +ipset=/xanimeporn.com/gfwlist +server=/toutapp.com/127.0.0.1#5335 +ipset=/toutapp.com/gfwlist +server=/luxuretv.com/127.0.0.1#5335 +ipset=/luxuretv.com/gfwlist +server=/o365weve-dev.com/127.0.0.1#5335 +ipset=/o365weve-dev.com/gfwlist +server=/g1d1goob.xyz/127.0.0.1#5335 +ipset=/g1d1goob.xyz/gfwlist +server=/twitter.biz/127.0.0.1#5335 +ipset=/twitter.biz/gfwlist +server=/christymarks.com/127.0.0.1#5335 +ipset=/christymarks.com/gfwlist +server=/uproxy.org/127.0.0.1#5335 +ipset=/uproxy.org/gfwlist +server=/nikeplus.org/127.0.0.1#5335 +ipset=/nikeplus.org/gfwlist +server=/pheonix.money/127.0.0.1#5335 +ipset=/pheonix.money/gfwlist +server=/prostoporno.net/127.0.0.1#5335 +ipset=/prostoporno.net/gfwlist +server=/mastercard.no/127.0.0.1#5335 +ipset=/mastercard.no/gfwlist +server=/profreeporno.com/127.0.0.1#5335 +ipset=/profreeporno.com/gfwlist +server=/disneymagicmomentsme.com/127.0.0.1#5335 +ipset=/disneymagicmomentsme.com/gfwlist +server=/private.com/127.0.0.1#5335 +ipset=/private.com/gfwlist +server=/fbthirdpartypixel.com/127.0.0.1#5335 +ipset=/fbthirdpartypixel.com/gfwlist +server=/primematures.com/127.0.0.1#5335 +ipset=/primematures.com/gfwlist +server=/ciscopress.ch/127.0.0.1#5335 +ipset=/ciscopress.ch/gfwlist +server=/hentaiprn.com/127.0.0.1#5335 +ipset=/hentaiprn.com/gfwlist +server=/pricelesssydney.com/127.0.0.1#5335 +ipset=/pricelesssydney.com/gfwlist +server=/businessfocus.io/127.0.0.1#5335 +ipset=/businessfocus.io/gfwlist +server=/disneypeoplesurveys.com/127.0.0.1#5335 +ipset=/disneypeoplesurveys.com/gfwlist +server=/getscorecash.com/127.0.0.1#5335 +ipset=/getscorecash.com/gfwlist +server=/rakuten.com/127.0.0.1#5335 +ipset=/rakuten.com/gfwlist +server=/pornwhitelist.com/127.0.0.1#5335 +ipset=/pornwhitelist.com/gfwlist +server=/aucheapbeats.com/127.0.0.1#5335 +ipset=/aucheapbeats.com/gfwlist +server=/fox247.tv/127.0.0.1#5335 +ipset=/fox247.tv/gfwlist +server=/porntn.com/127.0.0.1#5335 +ipset=/porntn.com/gfwlist +server=/pornstarbyface.com/127.0.0.1#5335 +ipset=/pornstarbyface.com/gfwlist +server=/pornsocket.com/127.0.0.1#5335 +ipset=/pornsocket.com/gfwlist +server=/ebay.lt/127.0.0.1#5335 +ipset=/ebay.lt/gfwlist +server=/pornsitesnow.com/127.0.0.1#5335 +ipset=/pornsitesnow.com/gfwlist +server=/pornrips.cc/127.0.0.1#5335 +ipset=/pornrips.cc/gfwlist +server=/nineentertainment.com.au/127.0.0.1#5335 +ipset=/nineentertainment.com.au/gfwlist +server=/xn--ruq8a011kt6y.xn--hxt814e/127.0.0.1#5335 +ipset=/xn--ruq8a011kt6y.xn--hxt814e/gfwlist +server=/needforspeed.com/127.0.0.1#5335 +ipset=/needforspeed.com/gfwlist +server=/pornrabbit.com/127.0.0.1#5335 +ipset=/pornrabbit.com/gfwlist +server=/tellme.pw/127.0.0.1#5335 +ipset=/tellme.pw/gfwlist +server=/azure-dns.com/127.0.0.1#5335 +ipset=/azure-dns.com/gfwlist +server=/foxnewsopinion.com/127.0.0.1#5335 +ipset=/foxnewsopinion.com/gfwlist +server=/aspenpublishing.com/127.0.0.1#5335 +ipset=/aspenpublishing.com/gfwlist +server=/enemaporn.blogspot.com/127.0.0.1#5335 +ipset=/enemaporn.blogspot.com/gfwlist +server=/facedbook.com/127.0.0.1#5335 +ipset=/facedbook.com/gfwlist +server=/hiddenvoyeurspy.com/127.0.0.1#5335 +ipset=/hiddenvoyeurspy.com/gfwlist +server=/hkcitizenmedia.com/127.0.0.1#5335 +ipset=/hkcitizenmedia.com/gfwlist +server=/pornotron.net/127.0.0.1#5335 +ipset=/pornotron.net/gfwlist +server=/bridgestonesyb.com/127.0.0.1#5335 +ipset=/bridgestonesyb.com/gfwlist +server=/gayonthenet.net/127.0.0.1#5335 +ipset=/gayonthenet.net/gfwlist +server=/pornosfilmes.com/127.0.0.1#5335 +ipset=/pornosfilmes.com/gfwlist +server=/bmw.com.cy/127.0.0.1#5335 +ipset=/bmw.com.cy/gfwlist +server=/nvidia.nl/127.0.0.1#5335 +ipset=/nvidia.nl/gfwlist +server=/pornolandia.xxx/127.0.0.1#5335 +ipset=/pornolandia.xxx/gfwlist +server=/doi.org/127.0.0.1#5335 +ipset=/doi.org/gfwlist +server=/pornoirado.com/127.0.0.1#5335 +ipset=/pornoirado.com/gfwlist +server=/c0930.com/127.0.0.1#5335 +ipset=/c0930.com/gfwlist +server=/53worldsweeps.com/127.0.0.1#5335 +ipset=/53worldsweeps.com/gfwlist +server=/assoass.com/127.0.0.1#5335 +ipset=/assoass.com/gfwlist +server=/98916.tv/127.0.0.1#5335 +ipset=/98916.tv/gfwlist +server=/tpornstars.com/127.0.0.1#5335 +ipset=/tpornstars.com/gfwlist +server=/ikea.us/127.0.0.1#5335 +ipset=/ikea.us/gfwlist +server=/pornogids.net/127.0.0.1#5335 +ipset=/pornogids.net/gfwlist +server=/socalbmw.com/127.0.0.1#5335 +ipset=/socalbmw.com/gfwlist +server=/pornnut.com/127.0.0.1#5335 +ipset=/pornnut.com/gfwlist +server=/pornmaki.com/127.0.0.1#5335 +ipset=/pornmaki.com/gfwlist +server=/fuck-xxx-movies.com/127.0.0.1#5335 +ipset=/fuck-xxx-movies.com/gfwlist +server=/sourcingforebay.com.cn/127.0.0.1#5335 +ipset=/sourcingforebay.com.cn/gfwlist +server=/visa.co.jp/127.0.0.1#5335 +ipset=/visa.co.jp/gfwlist +server=/pornjizz.co/127.0.0.1#5335 +ipset=/pornjizz.co/gfwlist +server=/novojoy.com/127.0.0.1#5335 +ipset=/novojoy.com/gfwlist +server=/faceook.com/127.0.0.1#5335 +ipset=/faceook.com/gfwlist +server=/leagueoflegends.kr/127.0.0.1#5335 +ipset=/leagueoflegends.kr/gfwlist +server=/pornhd3x.tv/127.0.0.1#5335 +ipset=/pornhd3x.tv/gfwlist +server=/pornhd.com/127.0.0.1#5335 +ipset=/pornhd.com/gfwlist +server=/hkheadline.com/127.0.0.1#5335 +ipset=/hkheadline.com/gfwlist +server=/rushporn.xxx/127.0.0.1#5335 +ipset=/rushporn.xxx/gfwlist +server=/porngrabbz.com/127.0.0.1#5335 +ipset=/porngrabbz.com/gfwlist +server=/kum.com/127.0.0.1#5335 +ipset=/kum.com/gfwlist +server=/beatssales.com/127.0.0.1#5335 +ipset=/beatssales.com/gfwlist +server=/chinatimes.com/127.0.0.1#5335 +ipset=/chinatimes.com/gfwlist +server=/hackyourconsole.com/127.0.0.1#5335 +ipset=/hackyourconsole.com/gfwlist +server=/volvotrucks.pk/127.0.0.1#5335 +ipset=/volvotrucks.pk/gfwlist +server=/discord.gg/127.0.0.1#5335 +ipset=/discord.gg/gfwlist +server=/adobeprojectm.com/127.0.0.1#5335 +ipset=/adobeprojectm.com/gfwlist +server=/porngames.club/127.0.0.1#5335 +ipset=/porngames.club/gfwlist +server=/microsoft.lu/127.0.0.1#5335 +ipset=/microsoft.lu/gfwlist +server=/manorama.com/127.0.0.1#5335 +ipset=/manorama.com/gfwlist +server=/czechav.com/127.0.0.1#5335 +ipset=/czechav.com/gfwlist +server=/finenike.com/127.0.0.1#5335 +ipset=/finenike.com/gfwlist +server=/pornfactory.info/127.0.0.1#5335 +ipset=/pornfactory.info/gfwlist +server=/pinterest.in/127.0.0.1#5335 +ipset=/pinterest.in/gfwlist +server=/mini.ma/127.0.0.1#5335 +ipset=/mini.ma/gfwlist +server=/porndoe.com/127.0.0.1#5335 +ipset=/porndoe.com/gfwlist +server=/bmwsfl.com/127.0.0.1#5335 +ipset=/bmwsfl.com/gfwlist +server=/disney.ca/127.0.0.1#5335 +ipset=/disney.ca/gfwlist +server=/moapi.site/127.0.0.1#5335 +ipset=/moapi.site/gfwlist +server=/porndiamond.com/127.0.0.1#5335 +ipset=/porndiamond.com/gfwlist +server=/playapex.com/127.0.0.1#5335 +ipset=/playapex.com/gfwlist +server=/porndabster.com/127.0.0.1#5335 +ipset=/porndabster.com/gfwlist +server=/porncore.net/127.0.0.1#5335 +ipset=/porncore.net/gfwlist +server=/ulol.com/127.0.0.1#5335 +ipset=/ulol.com/gfwlist +server=/gcr.io/127.0.0.1#5335 +ipset=/gcr.io/gfwlist +server=/pornagent.xyz/127.0.0.1#5335 +ipset=/pornagent.xyz/gfwlist +server=/macossierra.com/127.0.0.1#5335 +ipset=/macossierra.com/gfwlist +server=/apple.ie/127.0.0.1#5335 +ipset=/apple.ie/gfwlist +server=/freeadultcomix.com/127.0.0.1#5335 +ipset=/freeadultcomix.com/gfwlist +server=/afewmomentswith.com/127.0.0.1#5335 +ipset=/afewmomentswith.com/gfwlist +server=/pearsonclinical.co.uk/127.0.0.1#5335 +ipset=/pearsonclinical.co.uk/gfwlist +server=/porn.xxx/127.0.0.1#5335 +ipset=/porn.xxx/gfwlist +server=/askfacebook.org/127.0.0.1#5335 +ipset=/askfacebook.org/gfwlist +server=/pussyspace.com/127.0.0.1#5335 +ipset=/pussyspace.com/gfwlist +server=/porn-gratis.info/127.0.0.1#5335 +ipset=/porn-gratis.info/gfwlist +server=/porn-comic.com/127.0.0.1#5335 +ipset=/porn-comic.com/gfwlist +server=/freeporno.asia/127.0.0.1#5335 +ipset=/freeporno.asia/gfwlist +server=/playyoungtube.com/127.0.0.1#5335 +ipset=/playyoungtube.com/gfwlist +server=/foxla.tv/127.0.0.1#5335 +ipset=/foxla.tv/gfwlist +server=/piratecams.com/127.0.0.1#5335 +ipset=/piratecams.com/gfwlist +server=/paradisehill.cc/127.0.0.1#5335 +ipset=/paradisehill.cc/gfwlist +server=/pinkdino.com/127.0.0.1#5335 +ipset=/pinkdino.com/gfwlist +server=/picacg2022.com/127.0.0.1#5335 +ipset=/picacg2022.com/gfwlist +server=/kindleoasis.org/127.0.0.1#5335 +ipset=/kindleoasis.org/gfwlist +server=/fuckmeplease.net/127.0.0.1#5335 +ipset=/fuckmeplease.net/gfwlist +server=/doujin-night.com/127.0.0.1#5335 +ipset=/doujin-night.com/gfwlist +server=/facebookmail.tv/127.0.0.1#5335 +ipset=/facebookmail.tv/gfwlist +server=/pervclips.com/127.0.0.1#5335 +ipset=/pervclips.com/gfwlist +server=/apple.co.nz/127.0.0.1#5335 +ipset=/apple.co.nz/gfwlist +server=/ikea.kr/127.0.0.1#5335 +ipset=/ikea.kr/gfwlist +server=/deutsche-pornos-kostenlos.xxx/127.0.0.1#5335 +ipset=/deutsche-pornos-kostenlos.xxx/gfwlist +server=/peopledreamfunding.com/127.0.0.1#5335 +ipset=/peopledreamfunding.com/gfwlist +server=/xtapes.to/127.0.0.1#5335 +ipset=/xtapes.to/gfwlist +server=/kijijiforbusiness.ca/127.0.0.1#5335 +ipset=/kijijiforbusiness.ca/gfwlist +server=/lifewire.com/127.0.0.1#5335 +ipset=/lifewire.com/gfwlist +server=/youtube.com.eg/127.0.0.1#5335 +ipset=/youtube.com.eg/gfwlist +server=/sweetadult-tube.com/127.0.0.1#5335 +ipset=/sweetadult-tube.com/gfwlist +server=/pasionmujeres.com/127.0.0.1#5335 +ipset=/pasionmujeres.com/gfwlist +server=/pancolle-movie.jp/127.0.0.1#5335 +ipset=/pancolle-movie.jp/gfwlist +server=/paidpornguide.com/127.0.0.1#5335 +ipset=/paidpornguide.com/gfwlist +server=/hhvm.com/127.0.0.1#5335 +ipset=/hhvm.com/gfwlist +server=/bitmex.com/127.0.0.1#5335 +ipset=/bitmex.com/gfwlist +server=/candypleasure.com/127.0.0.1#5335 +ipset=/candypleasure.com/gfwlist +server=/pelvicexam.info/127.0.0.1#5335 +ipset=/pelvicexam.info/gfwlist +server=/op7979.com/127.0.0.1#5335 +ipset=/op7979.com/gfwlist +server=/onlyfanspw.com/127.0.0.1#5335 +ipset=/onlyfanspw.com/gfwlist +server=/onlydudes.com/127.0.0.1#5335 +ipset=/onlydudes.com/gfwlist +server=/binance.vision/127.0.0.1#5335 +ipset=/binance.vision/gfwlist +server=/fscebook.com/127.0.0.1#5335 +ipset=/fscebook.com/gfwlist +server=/bmw-connecteddrive.kr/127.0.0.1#5335 +ipset=/bmw-connecteddrive.kr/gfwlist +server=/onejav.com/127.0.0.1#5335 +ipset=/onejav.com/gfwlist +server=/omorashi.org/127.0.0.1#5335 +ipset=/omorashi.org/gfwlist +server=/axbdoll.com.tw/127.0.0.1#5335 +ipset=/axbdoll.com.tw/gfwlist +server=/fandango.com/127.0.0.1#5335 +ipset=/fandango.com/gfwlist +server=/obutu.com/127.0.0.1#5335 +ipset=/obutu.com/gfwlist +server=/findyourlimits.com/127.0.0.1#5335 +ipset=/findyourlimits.com/gfwlist +server=/nintendostore.com/127.0.0.1#5335 +ipset=/nintendostore.com/gfwlist +server=/ebaycbt.co.kr/127.0.0.1#5335 +ipset=/ebaycbt.co.kr/gfwlist +server=/expertmaker.com/127.0.0.1#5335 +ipset=/expertmaker.com/gfwlist +server=/iyottube.com/127.0.0.1#5335 +ipset=/iyottube.com/gfwlist +server=/jiyu-kobo.co.jp/127.0.0.1#5335 +ipset=/jiyu-kobo.co.jp/gfwlist +server=/disney.ro/127.0.0.1#5335 +ipset=/disney.ro/gfwlist +server=/flickr.net/127.0.0.1#5335 +ipset=/flickr.net/gfwlist +server=/noveltrove.com/127.0.0.1#5335 +ipset=/noveltrove.com/gfwlist +server=/theopportunityproject.org/127.0.0.1#5335 +ipset=/theopportunityproject.org/gfwlist +server=/rarbgway.org/127.0.0.1#5335 +ipset=/rarbgway.org/gfwlist +server=/youtube.pk/127.0.0.1#5335 +ipset=/youtube.pk/gfwlist +server=/embl.it/127.0.0.1#5335 +ipset=/embl.it/gfwlist +server=/terapeak.ca/127.0.0.1#5335 +ipset=/terapeak.ca/gfwlist +server=/livejasminbabes.net/127.0.0.1#5335 +ipset=/livejasminbabes.net/gfwlist +server=/nichepornsites.com/127.0.0.1#5335 +ipset=/nichepornsites.com/gfwlist +server=/dragonagekeep.com/127.0.0.1#5335 +ipset=/dragonagekeep.com/gfwlist +server=/new-redtube.com/127.0.0.1#5335 +ipset=/new-redtube.com/gfwlist +server=/neswangy.net/127.0.0.1#5335 +ipset=/neswangy.net/gfwlist +server=/simplify.com/127.0.0.1#5335 +ipset=/simplify.com/gfwlist +server=/hdpornfree.xxx/127.0.0.1#5335 +ipset=/hdpornfree.xxx/gfwlist +server=/identrust.com/127.0.0.1#5335 +ipset=/identrust.com/gfwlist +server=/mini-connected.fi/127.0.0.1#5335 +ipset=/mini-connected.fi/gfwlist +server=/nakednews.com/127.0.0.1#5335 +ipset=/nakednews.com/gfwlist +server=/airiti.com/127.0.0.1#5335 +ipset=/airiti.com/gfwlist +server=/naijauncut.com/127.0.0.1#5335 +ipset=/naijauncut.com/gfwlist +server=/blogspot.bg/127.0.0.1#5335 +ipset=/blogspot.bg/gfwlist +server=/nomadproject.io/127.0.0.1#5335 +ipset=/nomadproject.io/gfwlist +server=/myyoungwifeisnude.com/127.0.0.1#5335 +ipset=/myyoungwifeisnude.com/gfwlist +server=/partylikeits1986.org/127.0.0.1#5335 +ipset=/partylikeits1986.org/gfwlist +server=/globalsign.eu/127.0.0.1#5335 +ipset=/globalsign.eu/gfwlist +server=/gaycamvideos.net/127.0.0.1#5335 +ipset=/gaycamvideos.net/gfwlist +server=/mysexygfs.com/127.0.0.1#5335 +ipset=/mysexygfs.com/gfwlist +server=/mysexgames.com/127.0.0.1#5335 +ipset=/mysexgames.com/gfwlist +server=/bmw-powertrain.com/127.0.0.1#5335 +ipset=/bmw-powertrain.com/gfwlist +server=/fox11.com/127.0.0.1#5335 +ipset=/fox11.com/gfwlist +server=/yahoo.com.sa/127.0.0.1#5335 +ipset=/yahoo.com.sa/gfwlist +server=/nurofen.co.nz/127.0.0.1#5335 +ipset=/nurofen.co.nz/gfwlist +server=/javporn.tech/127.0.0.1#5335 +ipset=/javporn.tech/gfwlist +server=/gannett.com/127.0.0.1#5335 +ipset=/gannett.com/gfwlist +server=/wimpmusic.com/127.0.0.1#5335 +ipset=/wimpmusic.com/gfwlist +server=/xn--q41am8x.com/127.0.0.1#5335 +ipset=/xn--q41am8x.com/gfwlist +server=/donpornogratis.com/127.0.0.1#5335 +ipset=/donpornogratis.com/gfwlist +server=/hentaimangaporn.com/127.0.0.1#5335 +ipset=/hentaimangaporn.com/gfwlist +server=/slack-imgs.com/127.0.0.1#5335 +ipset=/slack-imgs.com/gfwlist +server=/bestkinky.com/127.0.0.1#5335 +ipset=/bestkinky.com/gfwlist +server=/ero-labs.online/127.0.0.1#5335 +ipset=/ero-labs.online/gfwlist +server=/officialbeatsbydreshop.com/127.0.0.1#5335 +ipset=/officialbeatsbydreshop.com/gfwlist +server=/dyttapis.com/127.0.0.1#5335 +ipset=/dyttapis.com/gfwlist +server=/xboxgamestudios.com/127.0.0.1#5335 +ipset=/xboxgamestudios.com/gfwlist +server=/mrdeepfakes.com/127.0.0.1#5335 +ipset=/mrdeepfakes.com/gfwlist +server=/menatplay.com/127.0.0.1#5335 +ipset=/menatplay.com/gfwlist +server=/bizarresexuality.com/127.0.0.1#5335 +ipset=/bizarresexuality.com/gfwlist +server=/bloomberg.co.jp/127.0.0.1#5335 +ipset=/bloomberg.co.jp/gfwlist +server=/lethalhardcore.com/127.0.0.1#5335 +ipset=/lethalhardcore.com/gfwlist +server=/morazzia.com/127.0.0.1#5335 +ipset=/morazzia.com/gfwlist +server=/appleiphone.hu/127.0.0.1#5335 +ipset=/appleiphone.hu/gfwlist +server=/hotntubes.com/127.0.0.1#5335 +ipset=/hotntubes.com/gfwlist +server=/hentaisea.com/127.0.0.1#5335 +ipset=/hentaisea.com/gfwlist +server=/momshardcoreporn.com/127.0.0.1#5335 +ipset=/momshardcoreporn.com/gfwlist +server=/fantv.hk/127.0.0.1#5335 +ipset=/fantv.hk/gfwlist +server=/singtaousa.com/127.0.0.1#5335 +ipset=/singtaousa.com/gfwlist +server=/foxsports.com.uy/127.0.0.1#5335 +ipset=/foxsports.com.uy/gfwlist +server=/snowmiku.com/127.0.0.1#5335 +ipset=/snowmiku.com/gfwlist +server=/momsfuckingboys.net/127.0.0.1#5335 +ipset=/momsfuckingboys.net/gfwlist +server=/foxcareers.com/127.0.0.1#5335 +ipset=/foxcareers.com/gfwlist +server=/serverfault.com/127.0.0.1#5335 +ipset=/serverfault.com/gfwlist +server=/dentalhypotheses.com/127.0.0.1#5335 +ipset=/dentalhypotheses.com/gfwlist +server=/tasteofpremium.jp/127.0.0.1#5335 +ipset=/tasteofpremium.jp/gfwlist +server=/exotic-ghana.com/127.0.0.1#5335 +ipset=/exotic-ghana.com/gfwlist +server=/ebay25.com/127.0.0.1#5335 +ipset=/ebay25.com/gfwlist +server=/nna.jp/127.0.0.1#5335 +ipset=/nna.jp/gfwlist +server=/mixmaturesex.com/127.0.0.1#5335 +ipset=/mixmaturesex.com/gfwlist +server=/gtv1.org/127.0.0.1#5335 +ipset=/gtv1.org/gfwlist +server=/mitnaka.com/127.0.0.1#5335 +ipset=/mitnaka.com/gfwlist +server=/blogspot.no/127.0.0.1#5335 +ipset=/blogspot.no/gfwlist +server=/pin.it/127.0.0.1#5335 +ipset=/pin.it/gfwlist +server=/milfsover30.com/127.0.0.1#5335 +ipset=/milfsover30.com/gfwlist +server=/imperialbusiness.school/127.0.0.1#5335 +ipset=/imperialbusiness.school/gfwlist +server=/ftv.com.tw/127.0.0.1#5335 +ipset=/ftv.com.tw/gfwlist +server=/akamai-access.com/127.0.0.1#5335 +ipset=/akamai-access.com/gfwlist +server=/18comic.company/127.0.0.1#5335 +ipset=/18comic.company/gfwlist +server=/huobi.com/127.0.0.1#5335 +ipset=/huobi.com/gfwlist +server=/milfed.com/127.0.0.1#5335 +ipset=/milfed.com/gfwlist +server=/deepfreeze.com/127.0.0.1#5335 +ipset=/deepfreeze.com/gfwlist +server=/paypal-login.info/127.0.0.1#5335 +ipset=/paypal-login.info/gfwlist +server=/bestmallawards.com/127.0.0.1#5335 +ipset=/bestmallawards.com/gfwlist +server=/mantochichi.com/127.0.0.1#5335 +ipset=/mantochichi.com/gfwlist +server=/kfs.io/127.0.0.1#5335 +ipset=/kfs.io/gfwlist +server=/manga18.art/127.0.0.1#5335 +ipset=/manga18.art/gfwlist +server=/realclearlife.com/127.0.0.1#5335 +ipset=/realclearlife.com/gfwlist +server=/diao.asia/127.0.0.1#5335 +ipset=/diao.asia/gfwlist +server=/fatstube.com/127.0.0.1#5335 +ipset=/fatstube.com/gfwlist +server=/singtaonewscorp.com/127.0.0.1#5335 +ipset=/singtaonewscorp.com/gfwlist +server=/intel.cu/127.0.0.1#5335 +ipset=/intel.cu/gfwlist +server=/asminternational.org/127.0.0.1#5335 +ipset=/asminternational.org/gfwlist +server=/ikea.com.sa/127.0.0.1#5335 +ipset=/ikea.com.sa/gfwlist +server=/madchensex.com/127.0.0.1#5335 +ipset=/madchensex.com/gfwlist +server=/getprintersupports.com/127.0.0.1#5335 +ipset=/getprintersupports.com/gfwlist +server=/businessinsider.my/127.0.0.1#5335 +ipset=/businessinsider.my/gfwlist +server=/gettyimages.ca/127.0.0.1#5335 +ipset=/gettyimages.ca/gfwlist +server=/pugpig-dev.com/127.0.0.1#5335 +ipset=/pugpig-dev.com/gfwlist +server=/singtao.com/127.0.0.1#5335 +ipset=/singtao.com/gfwlist +server=/lovepartners.life/127.0.0.1#5335 +ipset=/lovepartners.life/gfwlist +server=/lovehomeporn.com/127.0.0.1#5335 +ipset=/lovehomeporn.com/gfwlist +server=/vk-cdn.net/127.0.0.1#5335 +ipset=/vk-cdn.net/gfwlist +server=/ltsports.com.tw/127.0.0.1#5335 +ipset=/ltsports.com.tw/gfwlist +server=/lolhentai.net/127.0.0.1#5335 +ipset=/lolhentai.net/gfwlist +server=/loholidayhk.com/127.0.0.1#5335 +ipset=/loholidayhk.com/gfwlist +server=/localxlist.org/127.0.0.1#5335 +ipset=/localxlist.org/gfwlist +server=/liveprivates.com/127.0.0.1#5335 +ipset=/liveprivates.com/gfwlist +server=/diamantewebcam.com/127.0.0.1#5335 +ipset=/diamantewebcam.com/gfwlist +server=/ikea.ru/127.0.0.1#5335 +ipset=/ikea.ru/gfwlist +server=/nintendo.es/127.0.0.1#5335 +ipset=/nintendo.es/gfwlist +server=/letsfuckme.net/127.0.0.1#5335 +ipset=/letsfuckme.net/gfwlist +server=/letsdoeit.com/127.0.0.1#5335 +ipset=/letsdoeit.com/gfwlist +server=/lemoncams.com/127.0.0.1#5335 +ipset=/lemoncams.com/gfwlist +server=/kindle.es/127.0.0.1#5335 +ipset=/kindle.es/gfwlist +server=/egmontbooks.co.uk/127.0.0.1#5335 +ipset=/egmontbooks.co.uk/gfwlist +server=/lazymike.com/127.0.0.1#5335 +ipset=/lazymike.com/gfwlist +server=/101boyvideos.com/127.0.0.1#5335 +ipset=/101boyvideos.com/gfwlist +server=/voyeurmonkey.com/127.0.0.1#5335 +ipset=/voyeurmonkey.com/gfwlist +server=/javprime.net/127.0.0.1#5335 +ipset=/javprime.net/gfwlist +server=/avstar01.me/127.0.0.1#5335 +ipset=/avstar01.me/gfwlist +server=/igi-global.com/127.0.0.1#5335 +ipset=/igi-global.com/gfwlist +server=/nyaa.si/127.0.0.1#5335 +ipset=/nyaa.si/gfwlist +server=/api-priconne-redive.cygames.jp/127.0.0.1#5335 +ipset=/api-priconne-redive.cygames.jp/gfwlist +server=/jetbrains.team/127.0.0.1#5335 +ipset=/jetbrains.team/gfwlist +server=/freefacebook.com/127.0.0.1#5335 +ipset=/freefacebook.com/gfwlist +server=/kostenlosepornoclips.com/127.0.0.1#5335 +ipset=/kostenlosepornoclips.com/gfwlist +server=/visa-news.jp/127.0.0.1#5335 +ipset=/visa-news.jp/gfwlist +server=/marveldimensionofheroes.com/127.0.0.1#5335 +ipset=/marveldimensionofheroes.com/gfwlist +server=/kir2kos.net/127.0.0.1#5335 +ipset=/kir2kos.net/gfwlist +server=/swjfo.com/127.0.0.1#5335 +ipset=/swjfo.com/gfwlist +server=/iaablog.com/127.0.0.1#5335 +ipset=/iaablog.com/gfwlist +server=/mastercard.co.nz/127.0.0.1#5335 +ipset=/mastercard.co.nz/gfwlist +server=/xdty.org/127.0.0.1#5335 +ipset=/xdty.org/gfwlist +server=/nakedgirls.biz/127.0.0.1#5335 +ipset=/nakedgirls.biz/gfwlist +server=/card.io/127.0.0.1#5335 +ipset=/card.io/gfwlist +server=/disney.fr/127.0.0.1#5335 +ipset=/disney.fr/gfwlist +server=/karupsha.com/127.0.0.1#5335 +ipset=/karupsha.com/gfwlist +server=/faronicswise.co.uk/127.0.0.1#5335 +ipset=/faronicswise.co.uk/gfwlist +server=/guim.co.uk/127.0.0.1#5335 +ipset=/guim.co.uk/gfwlist +server=/kairakudoujin.net/127.0.0.1#5335 +ipset=/kairakudoujin.net/gfwlist +server=/bmw.com.do/127.0.0.1#5335 +ipset=/bmw.com.do/gfwlist +server=/peerj.com/127.0.0.1#5335 +ipset=/peerj.com/gfwlist +server=/universitypressscholarship.com/127.0.0.1#5335 +ipset=/universitypressscholarship.com/gfwlist +server=/alphabet.co.hu/127.0.0.1#5335 +ipset=/alphabet.co.hu/gfwlist +server=/vrsumo.com/127.0.0.1#5335 +ipset=/vrsumo.com/gfwlist +server=/justfullporn.org/127.0.0.1#5335 +ipset=/justfullporn.org/gfwlist +server=/appsonebay.net/127.0.0.1#5335 +ipset=/appsonebay.net/gfwlist +server=/sankei-books.co.jp/127.0.0.1#5335 +ipset=/sankei-books.co.jp/gfwlist +server=/tenbyfotolia.com/127.0.0.1#5335 +ipset=/tenbyfotolia.com/gfwlist +server=/joinmaidez.com/127.0.0.1#5335 +ipset=/joinmaidez.com/gfwlist +server=/jpg4.biz/127.0.0.1#5335 +ipset=/jpg4.biz/gfwlist +server=/degruyter.com/127.0.0.1#5335 +ipset=/degruyter.com/gfwlist +server=/vuvuzela.io/127.0.0.1#5335 +ipset=/vuvuzela.io/gfwlist +server=/erolabs.cloud/127.0.0.1#5335 +ipset=/erolabs.cloud/gfwlist +server=/softbank.tv/127.0.0.1#5335 +ipset=/softbank.tv/gfwlist +server=/pixnet.pro/127.0.0.1#5335 +ipset=/pixnet.pro/gfwlist +server=/akadns6.net/127.0.0.1#5335 +ipset=/akadns6.net/gfwlist +server=/hentaihaven.com/127.0.0.1#5335 +ipset=/hentaihaven.com/gfwlist +server=/penthouse.com/127.0.0.1#5335 +ipset=/penthouse.com/gfwlist +server=/vanish.ro/127.0.0.1#5335 +ipset=/vanish.ro/gfwlist +server=/zwtvusa.com/127.0.0.1#5335 +ipset=/zwtvusa.com/gfwlist +server=/facebookconsultant.org/127.0.0.1#5335 +ipset=/facebookconsultant.org/gfwlist +server=/javhdfree.net/127.0.0.1#5335 +ipset=/javhdfree.net/gfwlist +server=/javhaven.com/127.0.0.1#5335 +ipset=/javhaven.com/gfwlist +server=/harperapps.com/127.0.0.1#5335 +ipset=/harperapps.com/gfwlist +server=/pussysexgames.com/127.0.0.1#5335 +ipset=/pussysexgames.com/gfwlist +server=/newbeatsblackfriday.com/127.0.0.1#5335 +ipset=/newbeatsblackfriday.com/gfwlist +server=/ggsrv.com/127.0.0.1#5335 +ipset=/ggsrv.com/gfwlist +server=/tube4world.com/127.0.0.1#5335 +ipset=/tube4world.com/gfwlist +server=/jav.place/127.0.0.1#5335 +ipset=/jav.place/gfwlist +server=/japon-girls.com/127.0.0.1#5335 +ipset=/japon-girls.com/gfwlist +server=/youtubego.in/127.0.0.1#5335 +ipset=/youtubego.in/gfwlist +server=/ita-do.com/127.0.0.1#5335 +ipset=/ita-do.com/gfwlist +server=/iranx.net/127.0.0.1#5335 +ipset=/iranx.net/gfwlist +server=/umagazine.com.hk/127.0.0.1#5335 +ipset=/umagazine.com.hk/gfwlist +server=/intescort.com/127.0.0.1#5335 +ipset=/intescort.com/gfwlist +server=/instabang.com/127.0.0.1#5335 +ipset=/instabang.com/gfwlist +server=/ipodtouch.com/127.0.0.1#5335 +ipset=/ipodtouch.com/gfwlist +server=/visa.lv/127.0.0.1#5335 +ipset=/visa.lv/gfwlist +server=/verisign.name/127.0.0.1#5335 +ipset=/verisign.name/gfwlist +server=/akamai.net/127.0.0.1#5335 +ipset=/akamai.net/gfwlist +server=/indianhiddencams.com/127.0.0.1#5335 +ipset=/indianhiddencams.com/gfwlist +server=/foxsports-world.com/127.0.0.1#5335 +ipset=/foxsports-world.com/gfwlist +server=/oculuscasino.net/127.0.0.1#5335 +ipset=/oculuscasino.net/gfwlist +server=/adobeawards.com/127.0.0.1#5335 +ipset=/adobeawards.com/gfwlist +server=/independentdubaiescorts.com/127.0.0.1#5335 +ipset=/independentdubaiescorts.com/gfwlist +server=/incestporn.xxx/127.0.0.1#5335 +ipset=/incestporn.xxx/gfwlist +server=/visaluxuryhotels.com.ar/127.0.0.1#5335 +ipset=/visaluxuryhotels.com.ar/gfwlist +server=/sciencedirect.com/127.0.0.1#5335 +ipset=/sciencedirect.com/gfwlist +server=/readthedocs.org/127.0.0.1#5335 +ipset=/readthedocs.org/gfwlist +server=/duckgo.com/127.0.0.1#5335 +ipset=/duckgo.com/gfwlist +server=/igotpornpics.com/127.0.0.1#5335 +ipset=/igotpornpics.com/gfwlist +server=/pcstore.com.tw/127.0.0.1#5335 +ipset=/pcstore.com.tw/gfwlist +server=/hypnotube.com/127.0.0.1#5335 +ipset=/hypnotube.com/gfwlist +server=/premiumfs.de/127.0.0.1#5335 +ipset=/premiumfs.de/gfwlist +server=/mastercardservices.com/127.0.0.1#5335 +ipset=/mastercardservices.com/gfwlist +server=/dmm.com/127.0.0.1#5335 +ipset=/dmm.com/gfwlist +server=/hussiepass.com/127.0.0.1#5335 +ipset=/hussiepass.com/gfwlist +server=/jinsilubanzhao.com/127.0.0.1#5335 +ipset=/jinsilubanzhao.com/gfwlist +server=/huangse.love/127.0.0.1#5335 +ipset=/huangse.love/gfwlist +server=/nextmedia.com.tw/127.0.0.1#5335 +ipset=/nextmedia.com.tw/gfwlist +server=/zoho.com/127.0.0.1#5335 +ipset=/zoho.com/gfwlist +server=/hottystop.com/127.0.0.1#5335 +ipset=/hottystop.com/gfwlist +server=/av4.us/127.0.0.1#5335 +ipset=/av4.us/gfwlist +server=/hotsexvideo.mobi/127.0.0.1#5335 +ipset=/hotsexvideo.mobi/gfwlist +server=/ebay-sales.com/127.0.0.1#5335 +ipset=/ebay-sales.com/gfwlist +server=/javrave.club/127.0.0.1#5335 +ipset=/javrave.club/gfwlist +server=/steam-api.com/127.0.0.1#5335 +ipset=/steam-api.com/gfwlist +server=/airwick.nl/127.0.0.1#5335 +ipset=/airwick.nl/gfwlist +server=/historyofdota.org/127.0.0.1#5335 +ipset=/historyofdota.org/gfwlist +server=/nikefoampositeshoes.com/127.0.0.1#5335 +ipset=/nikefoampositeshoes.com/gfwlist +server=/illusionfb.cn/127.0.0.1#5335 +ipset=/illusionfb.cn/gfwlist +server=/paypal-here.com/127.0.0.1#5335 +ipset=/paypal-here.com/gfwlist +server=/akamqi.com/127.0.0.1#5335 +ipset=/akamqi.com/gfwlist +server=/newsapi.com.au/127.0.0.1#5335 +ipset=/newsapi.com.au/gfwlist +server=/sexygirlspics.com/127.0.0.1#5335 +ipset=/sexygirlspics.com/gfwlist +server=/mcdonaldsparties.co.nz/127.0.0.1#5335 +ipset=/mcdonaldsparties.co.nz/gfwlist +server=/horsecumshot.net/127.0.0.1#5335 +ipset=/horsecumshot.net/gfwlist +server=/kuke.com/127.0.0.1#5335 +ipset=/kuke.com/gfwlist +server=/press.vin/127.0.0.1#5335 +ipset=/press.vin/gfwlist +server=/stepsiblingscaught.com/127.0.0.1#5335 +ipset=/stepsiblingscaught.com/gfwlist +server=/hidefporn.ws/127.0.0.1#5335 +ipset=/hidefporn.ws/gfwlist +server=/hernudepics.com/127.0.0.1#5335 +ipset=/hernudepics.com/gfwlist +server=/nypost.com/127.0.0.1#5335 +ipset=/nypost.com/gfwlist +server=/hentaiworldporn.com/127.0.0.1#5335 +ipset=/hentaiworldporn.com/gfwlist +server=/pureapk.com/127.0.0.1#5335 +ipset=/pureapk.com/gfwlist +server=/ucla.edu/127.0.0.1#5335 +ipset=/ucla.edu/gfwlist +server=/hgamer.pro/127.0.0.1#5335 +ipset=/hgamer.pro/gfwlist +server=/verisign.com.au/127.0.0.1#5335 +ipset=/verisign.com.au/gfwlist +server=/tube2017.com/127.0.0.1#5335 +ipset=/tube2017.com/gfwlist +server=/cock4stepmom.com/127.0.0.1#5335 +ipset=/cock4stepmom.com/gfwlist +server=/indazn.com/127.0.0.1#5335 +ipset=/indazn.com/gfwlist +server=/chatwhores.sex/127.0.0.1#5335 +ipset=/chatwhores.sex/gfwlist +server=/facebook-pmdcenter.com/127.0.0.1#5335 +ipset=/facebook-pmdcenter.com/gfwlist +server=/hulupremium.com/127.0.0.1#5335 +ipset=/hulupremium.com/gfwlist +server=/yahoo.com.sb/127.0.0.1#5335 +ipset=/yahoo.com.sb/gfwlist +server=/foxsports.com.mx/127.0.0.1#5335 +ipset=/foxsports.com.mx/gfwlist +server=/leagueoflegends.info/127.0.0.1#5335 +ipset=/leagueoflegends.info/gfwlist +server=/vkcache.com/127.0.0.1#5335 +ipset=/vkcache.com/gfwlist +server=/hentaihaven.io/127.0.0.1#5335 +ipset=/hentaihaven.io/gfwlist +server=/postini.com/127.0.0.1#5335 +ipset=/postini.com/gfwlist +server=/hentai-space.supertop-100.com/127.0.0.1#5335 +ipset=/hentai-space.supertop-100.com/gfwlist +server=/visa.com.ec/127.0.0.1#5335 +ipset=/visa.com.ec/gfwlist +server=/hentai-cosplays.com/127.0.0.1#5335 +ipset=/hentai-cosplays.com/gfwlist +server=/bmw-motorrad.ru/127.0.0.1#5335 +ipset=/bmw-motorrad.ru/gfwlist +server=/identrust.co.uk/127.0.0.1#5335 +ipset=/identrust.co.uk/gfwlist +server=/hdsex.pro/127.0.0.1#5335 +ipset=/hdsex.pro/gfwlist +server=/hotindianbabe.com/127.0.0.1#5335 +ipset=/hotindianbabe.com/gfwlist +server=/9anime.ws/127.0.0.1#5335 +ipset=/9anime.ws/gfwlist +server=/youtube.com.mx/127.0.0.1#5335 +ipset=/youtube.com.mx/gfwlist +server=/familyswap.xxx/127.0.0.1#5335 +ipset=/familyswap.xxx/gfwlist +server=/china-facebook.com/127.0.0.1#5335 +ipset=/china-facebook.com/gfwlist +server=/bikaa.xyz/127.0.0.1#5335 +ipset=/bikaa.xyz/gfwlist +server=/scholar.google.lu/127.0.0.1#5335 +ipset=/scholar.google.lu/gfwlist +server=/hentaivn.net/127.0.0.1#5335 +ipset=/hentaivn.net/gfwlist +server=/thepornguy.org/127.0.0.1#5335 +ipset=/thepornguy.org/gfwlist +server=/supermario.com/127.0.0.1#5335 +ipset=/supermario.com/gfwlist +server=/thetread.com/127.0.0.1#5335 +ipset=/thetread.com/gfwlist +server=/guysnightlife.com/127.0.0.1#5335 +ipset=/guysnightlife.com/gfwlist +server=/youtube.com.au/127.0.0.1#5335 +ipset=/youtube.com.au/gfwlist +server=/guaranitermal.com/127.0.0.1#5335 +ipset=/guaranitermal.com/gfwlist +server=/cheapheadsetmall.com/127.0.0.1#5335 +ipset=/cheapheadsetmall.com/gfwlist +server=/grabhentai.com/127.0.0.1#5335 +ipset=/grabhentai.com/gfwlist +server=/chrome.com/127.0.0.1#5335 +ipset=/chrome.com/gfwlist +server=/mastercard.co.kr/127.0.0.1#5335 +ipset=/mastercard.co.kr/gfwlist +server=/beeg.rest/127.0.0.1#5335 +ipset=/beeg.rest/gfwlist +server=/iphoneunlockimei.com/127.0.0.1#5335 +ipset=/iphoneunlockimei.com/gfwlist +server=/yourtv.com.au/127.0.0.1#5335 +ipset=/yourtv.com.au/gfwlist +server=/proquest.com/127.0.0.1#5335 +ipset=/proquest.com/gfwlist +server=/binance.charity/127.0.0.1#5335 +ipset=/binance.charity/gfwlist +server=/udfs.com/127.0.0.1#5335 +ipset=/udfs.com/gfwlist +server=/cambiaip.org/127.0.0.1#5335 +ipset=/cambiaip.org/gfwlist +server=/fflnk.net/127.0.0.1#5335 +ipset=/fflnk.net/gfwlist +server=/gaystarnews.com/127.0.0.1#5335 +ipset=/gaystarnews.com/gfwlist +server=/mastercard.rs/127.0.0.1#5335 +ipset=/mastercard.rs/gfwlist +server=/roloxxx.com/127.0.0.1#5335 +ipset=/roloxxx.com/gfwlist +server=/swtor.com/127.0.0.1#5335 +ipset=/swtor.com/gfwlist +server=/mariokart7.com/127.0.0.1#5335 +ipset=/mariokart7.com/gfwlist +server=/pornaf.com/127.0.0.1#5335 +ipset=/pornaf.com/gfwlist +server=/flatandfuckedmilfs.com/127.0.0.1#5335 +ipset=/flatandfuckedmilfs.com/gfwlist +server=/gaybeeg.info/127.0.0.1#5335 +ipset=/gaybeeg.info/gfwlist +server=/gamerotic.com/127.0.0.1#5335 +ipset=/gamerotic.com/gfwlist +server=/escandinavia-arg.com/127.0.0.1#5335 +ipset=/escandinavia-arg.com/gfwlist +server=/ox.ac.uk/127.0.0.1#5335 +ipset=/ox.ac.uk/gfwlist +server=/bdsmpornonly.com/127.0.0.1#5335 +ipset=/bdsmpornonly.com/gfwlist +server=/fuq.com/127.0.0.1#5335 +ipset=/fuq.com/gfwlist +server=/gameroom.com/127.0.0.1#5335 +ipset=/gameroom.com/gfwlist +server=/bloomsburycollections.com/127.0.0.1#5335 +ipset=/bloomsburycollections.com/gfwlist +server=/nonstopfap.com/127.0.0.1#5335 +ipset=/nonstopfap.com/gfwlist +server=/fuckingmatures.com/127.0.0.1#5335 +ipset=/fuckingmatures.com/gfwlist +server=/mini-windsor.ca/127.0.0.1#5335 +ipset=/mini-windsor.ca/gfwlist +server=/uplynk.com/127.0.0.1#5335 +ipset=/uplynk.com/gfwlist +server=/xn--hb4aw0g.com/127.0.0.1#5335 +ipset=/xn--hb4aw0g.com/gfwlist +server=/freelifetimefuckbook.com/127.0.0.1#5335 +ipset=/freelifetimefuckbook.com/gfwlist +server=/vfsco.co.uk/127.0.0.1#5335 +ipset=/vfsco.co.uk/gfwlist +server=/paypalprepagata.com/127.0.0.1#5335 +ipset=/paypalprepagata.com/gfwlist +server=/0plkijj.vip/127.0.0.1#5335 +ipset=/0plkijj.vip/gfwlist +server=/shopspeedtv.com/127.0.0.1#5335 +ipset=/shopspeedtv.com/gfwlist +server=/mastercard.jo/127.0.0.1#5335 +ipset=/mastercard.jo/gfwlist +server=/sipriyearbook.org/127.0.0.1#5335 +ipset=/sipriyearbook.org/gfwlist +server=/freejavbt.com/127.0.0.1#5335 +ipset=/freejavbt.com/gfwlist +server=/naver.com/127.0.0.1#5335 +ipset=/naver.com/gfwlist +server=/pinterest.ec/127.0.0.1#5335 +ipset=/pinterest.ec/gfwlist +server=/fitnakedgirls.com/127.0.0.1#5335 +ipset=/fitnakedgirls.com/gfwlist +server=/minicooper.ca/127.0.0.1#5335 +ipset=/minicooper.ca/gfwlist +server=/hbox.jp/127.0.0.1#5335 +ipset=/hbox.jp/gfwlist +server=/bmw.com.mk/127.0.0.1#5335 +ipset=/bmw.com.mk/gfwlist +server=/kijijiautos.ca/127.0.0.1#5335 +ipset=/kijijiautos.ca/gfwlist +server=/mini.gp/127.0.0.1#5335 +ipset=/mini.gp/gfwlist +server=/av6k.com/127.0.0.1#5335 +ipset=/av6k.com/gfwlist +server=/amlg.io/127.0.0.1#5335 +ipset=/amlg.io/gfwlist +server=/fapality.com/127.0.0.1#5335 +ipset=/fapality.com/gfwlist +server=/fansteek.com/127.0.0.1#5335 +ipset=/fansteek.com/gfwlist +server=/fanleakstoday.com/127.0.0.1#5335 +ipset=/fanleakstoday.com/gfwlist +server=/trustcor.ca/127.0.0.1#5335 +ipset=/trustcor.ca/gfwlist +server=/facebooc.com/127.0.0.1#5335 +ipset=/facebooc.com/gfwlist +server=/ext-twitch.tv/127.0.0.1#5335 +ipset=/ext-twitch.tv/gfwlist +server=/facebolk.com/127.0.0.1#5335 +ipset=/facebolk.com/gfwlist +server=/amateur-exhibitionist.org/127.0.0.1#5335 +ipset=/amateur-exhibitionist.org/gfwlist +server=/amebaownd.com/127.0.0.1#5335 +ipset=/amebaownd.com/gfwlist +server=/evaelfie.com/127.0.0.1#5335 +ipset=/evaelfie.com/gfwlist +server=/escortamsterdam1.com/127.0.0.1#5335 +ipset=/escortamsterdam1.com/gfwlist +server=/airwick.jp/127.0.0.1#5335 +ipset=/airwick.jp/gfwlist +server=/vhxqa1.com/127.0.0.1#5335 +ipset=/vhxqa1.com/gfwlist +server=/nintendo.tw/127.0.0.1#5335 +ipset=/nintendo.tw/gfwlist +server=/canon-europe.com/127.0.0.1#5335 +ipset=/canon-europe.com/gfwlist +server=/volvopenta.it/127.0.0.1#5335 +ipset=/volvopenta.it/gfwlist +server=/volvogroup.nl/127.0.0.1#5335 +ipset=/volvogroup.nl/gfwlist +server=/entensity.net/127.0.0.1#5335 +ipset=/entensity.net/gfwlist +server=/instagramdi.com/127.0.0.1#5335 +ipset=/instagramdi.com/gfwlist +server=/harpercollins.com/127.0.0.1#5335 +ipset=/harpercollins.com/gfwlist +server=/nubiles-casting.com/127.0.0.1#5335 +ipset=/nubiles-casting.com/gfwlist +server=/twtrdns.net/127.0.0.1#5335 +ipset=/twtrdns.net/gfwlist +server=/enema-porn.com/127.0.0.1#5335 +ipset=/enema-porn.com/gfwlist +server=/adultlister.com/127.0.0.1#5335 +ipset=/adultlister.com/gfwlist +server=/mylogiclab.com/127.0.0.1#5335 +ipset=/mylogiclab.com/gfwlist +server=/microsoft.pl/127.0.0.1#5335 +ipset=/microsoft.pl/gfwlist +server=/youtube.co.in/127.0.0.1#5335 +ipset=/youtube.co.in/gfwlist +server=/adidas.nl/127.0.0.1#5335 +ipset=/adidas.nl/gfwlist +server=/extreme-board.com/127.0.0.1#5335 +ipset=/extreme-board.com/gfwlist +server=/thewonderful101.com/127.0.0.1#5335 +ipset=/thewonderful101.com/gfwlist +server=/dumps69.com/127.0.0.1#5335 +ipset=/dumps69.com/gfwlist +server=/dswz88.xyz/127.0.0.1#5335 +ipset=/dswz88.xyz/gfwlist +server=/drunkentop.com/127.0.0.1#5335 +ipset=/drunkentop.com/gfwlist +server=/drtuber.com/127.0.0.1#5335 +ipset=/drtuber.com/gfwlist +server=/beautyescortsamsterdam.com/127.0.0.1#5335 +ipset=/beautyescortsamsterdam.com/gfwlist +server=/lawdata.com.tw/127.0.0.1#5335 +ipset=/lawdata.com.tw/gfwlist +server=/tvb.com/127.0.0.1#5335 +ipset=/tvb.com/gfwlist +server=/bossae.com/127.0.0.1#5335 +ipset=/bossae.com/gfwlist +server=/bmwofcentralpa.com/127.0.0.1#5335 +ipset=/bmwofcentralpa.com/gfwlist +server=/dirtyonline.com/127.0.0.1#5335 +ipset=/dirtyonline.com/gfwlist +server=/illusionn2.com/127.0.0.1#5335 +ipset=/illusionn2.com/gfwlist +server=/yy55.tv/127.0.0.1#5335 +ipset=/yy55.tv/gfwlist +server=/dirtyfarmer.com/127.0.0.1#5335 +ipset=/dirtyfarmer.com/gfwlist +server=/rbdigitalab.com/127.0.0.1#5335 +ipset=/rbdigitalab.com/gfwlist +server=/bmw-yeg.ca/127.0.0.1#5335 +ipset=/bmw-yeg.ca/gfwlist +server=/dhlestudio.com.co/127.0.0.1#5335 +ipset=/dhlestudio.com.co/gfwlist +server=/deasians.com/127.0.0.1#5335 +ipset=/deasians.com/gfwlist +server=/bmw-motorrad.sk/127.0.0.1#5335 +ipset=/bmw-motorrad.sk/gfwlist +server=/rapetube.me/127.0.0.1#5335 +ipset=/rapetube.me/gfwlist +server=/czechcasting.com/127.0.0.1#5335 +ipset=/czechcasting.com/gfwlist +server=/paypal.hk/127.0.0.1#5335 +ipset=/paypal.hk/gfwlist +server=/hifacebook.info/127.0.0.1#5335 +ipset=/hifacebook.info/gfwlist +server=/adcommerce.tv/127.0.0.1#5335 +ipset=/adcommerce.tv/gfwlist +server=/czechbiporn.com/127.0.0.1#5335 +ipset=/czechbiporn.com/gfwlist +server=/mybridgestoneeducation.com/127.0.0.1#5335 +ipset=/mybridgestoneeducation.com/gfwlist +server=/developers.facebook.com/127.0.0.1#5335 +ipset=/developers.facebook.com/gfwlist +server=/ebaydts.com/127.0.0.1#5335 +ipset=/ebaydts.com/gfwlist +server=/yandex.ua/127.0.0.1#5335 +ipset=/yandex.ua/gfwlist +server=/starwarsbattlefront2.com/127.0.0.1#5335 +ipset=/starwarsbattlefront2.com/gfwlist +server=/wmcloud.org/127.0.0.1#5335 +ipset=/wmcloud.org/gfwlist +server=/tegrazone.co/127.0.0.1#5335 +ipset=/tegrazone.co/gfwlist +server=/gvt7.com/127.0.0.1#5335 +ipset=/gvt7.com/gfwlist +server=/crabporn.com/127.0.0.1#5335 +ipset=/crabporn.com/gfwlist +server=/okazudouga.blog.jp/127.0.0.1#5335 +ipset=/okazudouga.blog.jp/gfwlist +server=/scholar.google.sk/127.0.0.1#5335 +ipset=/scholar.google.sk/gfwlist +server=/indiaipad.com/127.0.0.1#5335 +ipset=/indiaipad.com/gfwlist +server=/sportsfacebook.com/127.0.0.1#5335 +ipset=/sportsfacebook.com/gfwlist +server=/discountbeatsbydre-us.com/127.0.0.1#5335 +ipset=/discountbeatsbydre-us.com/gfwlist +server=/hentairead.com/127.0.0.1#5335 +ipset=/hentairead.com/gfwlist +server=/lapriere.jp/127.0.0.1#5335 +ipset=/lapriere.jp/gfwlist +server=/netlock.hu/127.0.0.1#5335 +ipset=/netlock.hu/gfwlist +server=/mastercardbiz.com/127.0.0.1#5335 +ipset=/mastercardbiz.com/gfwlist +server=/webofscience.com/127.0.0.1#5335 +ipset=/webofscience.com/gfwlist +server=/ch9.ms/127.0.0.1#5335 +ipset=/ch9.ms/gfwlist +server=/miamifintechfestival.com/127.0.0.1#5335 +ipset=/miamifintechfestival.com/gfwlist +server=/cc18.biz/127.0.0.1#5335 +ipset=/cc18.biz/gfwlist +server=/gaypornmenu.com/127.0.0.1#5335 +ipset=/gaypornmenu.com/gfwlist +server=/vfsco.jp/127.0.0.1#5335 +ipset=/vfsco.jp/gfwlist +server=/ilongman.com/127.0.0.1#5335 +ipset=/ilongman.com/gfwlist +server=/ieeeoes.org/127.0.0.1#5335 +ipset=/ieeeoes.org/gfwlist +server=/ebaylocationsdevacances.com/127.0.0.1#5335 +ipset=/ebaylocationsdevacances.com/gfwlist +server=/iotinactionevents.com/127.0.0.1#5335 +ipset=/iotinactionevents.com/gfwlist +server=/sonypicturesmuseum.com/127.0.0.1#5335 +ipset=/sonypicturesmuseum.com/gfwlist +server=/scatfap.com/127.0.0.1#5335 +ipset=/scatfap.com/gfwlist +server=/ebay.com.sg/127.0.0.1#5335 +ipset=/ebay.com.sg/gfwlist +server=/yahoo.com/127.0.0.1#5335 +ipset=/yahoo.com/gfwlist +server=/scholar.google.ru/127.0.0.1#5335 +ipset=/scholar.google.ru/gfwlist +server=/nikebetterworld.org/127.0.0.1#5335 +ipset=/nikebetterworld.org/gfwlist +server=/learnwithleague.com/127.0.0.1#5335 +ipset=/learnwithleague.com/gfwlist +server=/zakzak.co.jp/127.0.0.1#5335 +ipset=/zakzak.co.jp/gfwlist +server=/drdrebeats-usa.com/127.0.0.1#5335 +ipset=/drdrebeats-usa.com/gfwlist +server=/camstreams.tv/127.0.0.1#5335 +ipset=/camstreams.tv/gfwlist +server=/privacysimplified.com/127.0.0.1#5335 +ipset=/privacysimplified.com/gfwlist +server=/softether-download.com/127.0.0.1#5335 +ipset=/softether-download.com/gfwlist +server=/bigboobsandhotsex.com/127.0.0.1#5335 +ipset=/bigboobsandhotsex.com/gfwlist +server=/xboxone.co/127.0.0.1#5335 +ipset=/xboxone.co/gfwlist +server=/headphonesbeatsaudio.com/127.0.0.1#5335 +ipset=/headphonesbeatsaudio.com/gfwlist +server=/newpppp.com/127.0.0.1#5335 +ipset=/newpppp.com/gfwlist +server=/paypal-business.net/127.0.0.1#5335 +ipset=/paypal-business.net/gfwlist +server=/bdsmboard.org/127.0.0.1#5335 +ipset=/bdsmboard.org/gfwlist +server=/sex-av.com/127.0.0.1#5335 +ipset=/sex-av.com/gfwlist +server=/r10s.jp/127.0.0.1#5335 +ipset=/r10s.jp/gfwlist +server=/bmw.cl/127.0.0.1#5335 +ipset=/bmw.cl/gfwlist +server=/youtube.ma/127.0.0.1#5335 +ipset=/youtube.ma/gfwlist +server=/kkff2484.live/127.0.0.1#5335 +ipset=/kkff2484.live/gfwlist +server=/youtube.jo/127.0.0.1#5335 +ipset=/youtube.jo/gfwlist +server=/byjhd.com/127.0.0.1#5335 +ipset=/byjhd.com/gfwlist +server=/ebaylocal.net/127.0.0.1#5335 +ipset=/ebaylocal.net/gfwlist +server=/visa.com.my/127.0.0.1#5335 +ipset=/visa.com.my/gfwlist +server=/playstation.net/127.0.0.1#5335 +ipset=/playstation.net/gfwlist +server=/tver.jp/127.0.0.1#5335 +ipset=/tver.jp/gfwlist +server=/vercel-dns.com/127.0.0.1#5335 +ipset=/vercel-dns.com/gfwlist +server=/brazzers-xxx.net/127.0.0.1#5335 +ipset=/brazzers-xxx.net/gfwlist +server=/gynoexam.info/127.0.0.1#5335 +ipset=/gynoexam.info/gfwlist +server=/yours-customised.mini.com/127.0.0.1#5335 +ipset=/yours-customised.mini.com/gfwlist +server=/dojinwatch.com/127.0.0.1#5335 +ipset=/dojinwatch.com/gfwlist +server=/acgcf.com/127.0.0.1#5335 +ipset=/acgcf.com/gfwlist +server=/miniso.pk/127.0.0.1#5335 +ipset=/miniso.pk/gfwlist +server=/dcard.link/127.0.0.1#5335 +ipset=/dcard.link/gfwlist +server=/volvotruckcenter.no/127.0.0.1#5335 +ipset=/volvotruckcenter.no/gfwlist +server=/visa.com.do/127.0.0.1#5335 +ipset=/visa.com.do/gfwlist +server=/blacksonblondes.com/127.0.0.1#5335 +ipset=/blacksonblondes.com/gfwlist +server=/sonypicturestelevision.com/127.0.0.1#5335 +ipset=/sonypicturestelevision.com/gfwlist +server=/sexflashgame.org/127.0.0.1#5335 +ipset=/sexflashgame.org/gfwlist +server=/toppornsites.com/127.0.0.1#5335 +ipset=/toppornsites.com/gfwlist +server=/amateurporn.photos/127.0.0.1#5335 +ipset=/amateurporn.photos/gfwlist +server=/texture.com/127.0.0.1#5335 +ipset=/texture.com/gfwlist +server=/elitvip.ru/127.0.0.1#5335 +ipset=/elitvip.ru/gfwlist +server=/ikea.qa/127.0.0.1#5335 +ipset=/ikea.qa/gfwlist +server=/sextop.net/127.0.0.1#5335 +ipset=/sextop.net/gfwlist +server=/vtsociety.org/127.0.0.1#5335 +ipset=/vtsociety.org/gfwlist +server=/scholar.google.pt/127.0.0.1#5335 +ipset=/scholar.google.pt/gfwlist +server=/visaeurope.lu/127.0.0.1#5335 +ipset=/visaeurope.lu/gfwlist +server=/swisssign.org/127.0.0.1#5335 +ipset=/swisssign.org/gfwlist +server=/ikea.cl/127.0.0.1#5335 +ipset=/ikea.cl/gfwlist +server=/teslaenergy.services/127.0.0.1#5335 +ipset=/teslaenergy.services/gfwlist +server=/ggpht.com/127.0.0.1#5335 +ipset=/ggpht.com/gfwlist +server=/mastercardezsavings.com/127.0.0.1#5335 +ipset=/mastercardezsavings.com/gfwlist +server=/pximg.net/127.0.0.1#5335 +ipset=/pximg.net/gfwlist +server=/gettyimages.dk/127.0.0.1#5335 +ipset=/gettyimages.dk/gfwlist +server=/mini.com.hr/127.0.0.1#5335 +ipset=/mini.com.hr/gfwlist +server=/customizedbeatbydre.com/127.0.0.1#5335 +ipset=/customizedbeatbydre.com/gfwlist +server=/tickdata.com/127.0.0.1#5335 +ipset=/tickdata.com/gfwlist +server=/animepornhd.com/127.0.0.1#5335 +ipset=/animepornhd.com/gfwlist +server=/ibook.eu/127.0.0.1#5335 +ipset=/ibook.eu/gfwlist +server=/handbags-nike.com/127.0.0.1#5335 +ipset=/handbags-nike.com/gfwlist +server=/oculuscdn.com/127.0.0.1#5335 +ipset=/oculuscdn.com/gfwlist +server=/realamericanstories.net/127.0.0.1#5335 +ipset=/realamericanstories.net/gfwlist +server=/citylab.com/127.0.0.1#5335 +ipset=/citylab.com/gfwlist +server=/aptoide.com/127.0.0.1#5335 +ipset=/aptoide.com/gfwlist +server=/scholar.google.ae/127.0.0.1#5335 +ipset=/scholar.google.ae/gfwlist +server=/pricelesstoronto.ca/127.0.0.1#5335 +ipset=/pricelesstoronto.ca/gfwlist +server=/amateurs-gone-wild.com/127.0.0.1#5335 +ipset=/amateurs-gone-wild.com/gfwlist +server=/instagrem.com/127.0.0.1#5335 +ipset=/instagrem.com/gfwlist +server=/bmw.ie/127.0.0.1#5335 +ipset=/bmw.ie/gfwlist +server=/paypalprepagata.net/127.0.0.1#5335 +ipset=/paypalprepagata.net/gfwlist +server=/nhentai.xxx/127.0.0.1#5335 +ipset=/nhentai.xxx/gfwlist +server=/my-formosa.com/127.0.0.1#5335 +ipset=/my-formosa.com/gfwlist +server=/scholar.google.com.mx/127.0.0.1#5335 +ipset=/scholar.google.com.mx/gfwlist +server=/allinternal.com/127.0.0.1#5335 +ipset=/allinternal.com/gfwlist +server=/bisq.io/127.0.0.1#5335 +ipset=/bisq.io/gfwlist +server=/opgg-static.akamaized.net/127.0.0.1#5335 +ipset=/opgg-static.akamaized.net/gfwlist +server=/9cao9.com/127.0.0.1#5335 +ipset=/9cao9.com/gfwlist +server=/bmw.ua/127.0.0.1#5335 +ipset=/bmw.ua/gfwlist +server=/ioffergift.com/127.0.0.1#5335 +ipset=/ioffergift.com/gfwlist +server=/adultvirtualworlds.net/127.0.0.1#5335 +ipset=/adultvirtualworlds.net/gfwlist +server=/sexsexe1.com/127.0.0.1#5335 +ipset=/sexsexe1.com/gfwlist +server=/adultinfojpn.com/127.0.0.1#5335 +ipset=/adultinfojpn.com/gfwlist +server=/twimg.com/127.0.0.1#5335 +ipset=/twimg.com/gfwlist +server=/adultblogtoplist.com/127.0.0.1#5335 +ipset=/adultblogtoplist.com/gfwlist +server=/intellearningseries.com/127.0.0.1#5335 +ipset=/intellearningseries.com/gfwlist +server=/alphabet.ch/127.0.0.1#5335 +ipset=/alphabet.ch/gfwlist +server=/adult3dporno.com/127.0.0.1#5335 +ipset=/adult3dporno.com/gfwlist +server=/9xlove.xyz/127.0.0.1#5335 +ipset=/9xlove.xyz/gfwlist +server=/cnn.it/127.0.0.1#5335 +ipset=/cnn.it/gfwlist +server=/91cy.app/127.0.0.1#5335 +ipset=/91cy.app/gfwlist +server=/61jxbs42.xyz/127.0.0.1#5335 +ipset=/61jxbs42.xyz/gfwlist +server=/rsg.sc/127.0.0.1#5335 +ipset=/rsg.sc/gfwlist +server=/vfsco.in/127.0.0.1#5335 +ipset=/vfsco.in/gfwlist +server=/sg120.me/127.0.0.1#5335 +ipset=/sg120.me/gfwlist +server=/intel.jo/127.0.0.1#5335 +ipset=/intel.jo/gfwlist +server=/18pornsex.com/127.0.0.1#5335 +ipset=/18pornsex.com/gfwlist +server=/akamaitech.net/127.0.0.1#5335 +ipset=/akamaitech.net/gfwlist +server=/gale.com/127.0.0.1#5335 +ipset=/gale.com/gfwlist +server=/fox10phoenix.com/127.0.0.1#5335 +ipset=/fox10phoenix.com/gfwlist +server=/avstar07.me/127.0.0.1#5335 +ipset=/avstar07.me/gfwlist +server=/youtubekids.com/127.0.0.1#5335 +ipset=/youtubekids.com/gfwlist +server=/bmwusatires.com/127.0.0.1#5335 +ipset=/bmwusatires.com/gfwlist +server=/bloomberg.com/127.0.0.1#5335 +ipset=/bloomberg.com/gfwlist +server=/nikeb.com/127.0.0.1#5335 +ipset=/nikeb.com/gfwlist +server=/minispecialoffers.ca/127.0.0.1#5335 +ipset=/minispecialoffers.ca/gfwlist +server=/cw.com.tw/127.0.0.1#5335 +ipset=/cw.com.tw/gfwlist +server=/appleantilles.com/127.0.0.1#5335 +ipset=/appleantilles.com/gfwlist +server=/bigboobspov.com/127.0.0.1#5335 +ipset=/bigboobspov.com/gfwlist +server=/pokemonletsgoeevee.com/127.0.0.1#5335 +ipset=/pokemonletsgoeevee.com/gfwlist +server=/bmw-welt.tv/127.0.0.1#5335 +ipset=/bmw-welt.tv/gfwlist +server=/ebayparts.com/127.0.0.1#5335 +ipset=/ebayparts.com/gfwlist +server=/visa.com.uy/127.0.0.1#5335 +ipset=/visa.com.uy/gfwlist +server=/ikea.rs/127.0.0.1#5335 +ipset=/ikea.rs/gfwlist +server=/kubakuba1996.com/127.0.0.1#5335 +ipset=/kubakuba1996.com/gfwlist +server=/nikesb.com/127.0.0.1#5335 +ipset=/nikesb.com/gfwlist +server=/vkuseraudio.com/127.0.0.1#5335 +ipset=/vkuseraudio.com/gfwlist +server=/paypalobjects.com/127.0.0.1#5335 +ipset=/paypalobjects.com/gfwlist +server=/alphabet.info/127.0.0.1#5335 +ipset=/alphabet.info/gfwlist +server=/pinterest.vn/127.0.0.1#5335 +ipset=/pinterest.vn/gfwlist +server=/sitepoint.com/127.0.0.1#5335 +ipset=/sitepoint.com/gfwlist +server=/sci-hub.st/127.0.0.1#5335 +ipset=/sci-hub.st/gfwlist +server=/amateur-threesomes.com/127.0.0.1#5335 +ipset=/amateur-threesomes.com/gfwlist +server=/aomedia.org/127.0.0.1#5335 +ipset=/aomedia.org/gfwlist +server=/ea-anz-press.com/127.0.0.1#5335 +ipset=/ea-anz-press.com/gfwlist +server=/delvenetworks.com/127.0.0.1#5335 +ipset=/delvenetworks.com/gfwlist +server=/vk.link/127.0.0.1#5335 +ipset=/vk.link/gfwlist +server=/squirrelvpn.com/127.0.0.1#5335 +ipset=/squirrelvpn.com/gfwlist +server=/ebayinternetsalestax.com/127.0.0.1#5335 +ipset=/ebayinternetsalestax.com/gfwlist +server=/stheadline.com/127.0.0.1#5335 +ipset=/stheadline.com/gfwlist +server=/tiburon.com/127.0.0.1#5335 +ipset=/tiburon.com/gfwlist +server=/boyspornpics.com/127.0.0.1#5335 +ipset=/boyspornpics.com/gfwlist +server=/oecd-ilibrary.org/127.0.0.1#5335 +ipset=/oecd-ilibrary.org/gfwlist +server=/bmw-connecteddrive.fi/127.0.0.1#5335 +ipset=/bmw-connecteddrive.fi/gfwlist +server=/anfutong.com/127.0.0.1#5335 +ipset=/anfutong.com/gfwlist +server=/libsolutions.net/127.0.0.1#5335 +ipset=/libsolutions.net/gfwlist +server=/travelexmoneycard.com/127.0.0.1#5335 +ipset=/travelexmoneycard.com/gfwlist +server=/paypal-dynamic.com/127.0.0.1#5335 +ipset=/paypal-dynamic.com/gfwlist +server=/easyanticheat.net/127.0.0.1#5335 +ipset=/easyanticheat.net/gfwlist +server=/thepaypalshop.com/127.0.0.1#5335 +ipset=/thepaypalshop.com/gfwlist +server=/eaassets-a.akamaihd.net/127.0.0.1#5335 +ipset=/eaassets-a.akamaihd.net/gfwlist +server=/swisssign.com/127.0.0.1#5335 +ipset=/swisssign.com/gfwlist +server=/softbankworld.com/127.0.0.1#5335 +ipset=/softbankworld.com/gfwlist +server=/huffingtonpost.fr/127.0.0.1#5335 +ipset=/huffingtonpost.fr/gfwlist +server=/volvoce.com/127.0.0.1#5335 +ipset=/volvoce.com/gfwlist +server=/ascelibrary.org/127.0.0.1#5335 +ipset=/ascelibrary.org/gfwlist +server=/disney.co.kr/127.0.0.1#5335 +ipset=/disney.co.kr/gfwlist +server=/mytvsuper.com/127.0.0.1#5335 +ipset=/mytvsuper.com/gfwlist +server=/bestsexcam.com/127.0.0.1#5335 +ipset=/bestsexcam.com/gfwlist +server=/bestbuycoffeemakers.com/127.0.0.1#5335 +ipset=/bestbuycoffeemakers.com/gfwlist +server=/bmw-m-safetycar.com/127.0.0.1#5335 +ipset=/bmw-m-safetycar.com/gfwlist +server=/foxbusinessgo.com/127.0.0.1#5335 +ipset=/foxbusinessgo.com/gfwlist +server=/static-verizon.com/127.0.0.1#5335 +ipset=/static-verizon.com/gfwlist +server=/decorativemodels.com/127.0.0.1#5335 +ipset=/decorativemodels.com/gfwlist +server=/surflite.co/127.0.0.1#5335 +ipset=/surflite.co/gfwlist +server=/babble.com/127.0.0.1#5335 +ipset=/babble.com/gfwlist +server=/achievementanalytics.com/127.0.0.1#5335 +ipset=/achievementanalytics.com/gfwlist +server=/javfun.me/127.0.0.1#5335 +ipset=/javfun.me/gfwlist +server=/ebayauthenticate.com.cn/127.0.0.1#5335 +ipset=/ebayauthenticate.com.cn/gfwlist +server=/mini-grouparchive.com/127.0.0.1#5335 +ipset=/mini-grouparchive.com/gfwlist +server=/bmw.gp/127.0.0.1#5335 +ipset=/bmw.gp/gfwlist diff --git a/luci-app-ssr-plus/root/etc/ssrplus/mosdns-config.yaml b/luci-app-ssr-plus/root/etc/ssrplus/mosdns-config.yaml new file mode 100644 index 00000000..a0b9f5c5 --- /dev/null +++ b/luci-app-ssr-plus/root/etc/ssrplus/mosdns-config.yaml @@ -0,0 +1,43 @@ +log: + level: info +plugins: + - tag: lazy_cache + type: cache + args: + size: 8000 + lazy_cache_ttl: 86400 + + - tag: forward_google + type: forward + args: + concurrent: 2 + upstreams: + + - tag: main_sequence_disable_IPv6 + type: sequence + args: + - exec: $lazy_cache + - exec: prefer_ipv4 + - exec: $forward_google + - matches: + - qtype 28 65 + exec: reject 0 + + - tag: main_sequence_with_IPv6 + type: sequence + args: + - exec: $lazy_cache + - exec: $forward_google + + - tag: udp_server + type: udp_server + args: + entry: DNS_MODE + listen: 0.0.0.0:DNS_PORT + + - tag: tcp_server + type: tcp_server + args: + entry: DNS_MODE + listen: 0.0.0.0:DNS_PORT + diff --git a/luci-app-ssr-plus/root/etc/ssrplus/netflix.list b/luci-app-ssr-plus/root/etc/ssrplus/netflix.list new file mode 100644 index 00000000..f98f711b --- /dev/null +++ b/luci-app-ssr-plus/root/etc/ssrplus/netflix.list @@ -0,0 +1,25 @@ +amazonaws.com +aws.amazon.com +awsstatic.com +fast.com +netflix.com +netflix.net +nflxext.com +nflximg.net +nflxso.net +nflxvideo.net +netflixdnstest0.com +netflixdnstest1.com +netflixdnstest2.com +netflixdnstest3.com +netflixdnstest4.com +netflixdnstest5.com +netflixdnstest6.com +netflixdnstest7.com +netflixdnstest8.com +netflixdnstest9.com +hulu.com +huluim.com +hbonow.com +hbogo.com +hbo.com diff --git a/luci-app-ssr-plus/root/etc/ssrplus/netflixip.list b/luci-app-ssr-plus/root/etc/ssrplus/netflixip.list new file mode 100644 index 00000000..445ff62f --- /dev/null +++ b/luci-app-ssr-plus/root/etc/ssrplus/netflixip.list @@ -0,0 +1,30 @@ +8.41.4.0/24 +23.23.189.144/28 +23.246.0.0/18 +34.195.253.0/25 +34.210.42.111/32 +37.77.184.0/21 +38.72.126.0/24 +45.57.0.0/17 +52.24.178.0/24 +52.35.140.0/24 +52.89.124.203/32 +54.148.37.5/32 +54.204.25.0/28 +54.213.167.0/24 +64.120.128.0/17 +66.197.128.0/17 +69.53.224.0/19 +103.87.204.0/22 +108.175.32.0/20 +185.2.220.0/22 +185.9.188.0/22 +192.173.64.0/18 +198.38.96.0/19 +198.45.48.0/20 +203.75.84.0/24 +203.198.13.0/24 +203.198.80.0/24 +207.45.72.0/22 +208.75.76.0/22 +210.0.153.0/24 diff --git a/luci-app-ssr-plus/root/etc/ssrplus/oversea_list.conf b/luci-app-ssr-plus/root/etc/ssrplus/oversea_list.conf new file mode 100644 index 00000000..ae50fb90 --- /dev/null +++ b/luci-app-ssr-plus/root/etc/ssrplus/oversea_list.conf @@ -0,0 +1,192 @@ +server=/v.youku.com/127.0.0.1#5335 +server=/api.youku.com/127.0.0.1#5335 +server=/v2.tudou.com/127.0.0.1#5335 +server=/www.tudou.com/127.0.0.1#5335 +server=/s.plcloud.music.qq.com/127.0.0.1#5335 +server=/i.y.qq.com/127.0.0.1#5335 +server=/hot.vrs.sohu.com/127.0.0.1#5335 +server=/live.tv.sohu.com/127.0.0.1#5335 +server=/pad.tv.sohu.com/127.0.0.1#5335 +server=/my.tv.sohu.com/127.0.0.1#5335 +server=/hot.vrs.letv.com/127.0.0.1#5335 +server=/data.video.qiyi.com/127.0.0.1#5335 +server=/cache.video.qiyi.com/127.0.0.1#5335 +server=/cache.vip.qiyi.com/127.0.0.1#5335 +server=/vv.video.qq.com/127.0.0.1#5335 +server=/tt.video.qq.com/127.0.0.1#5335 +server=/ice.video.qq.com/127.0.0.1#5335 +server=/tjsa.video.qq.com/127.0.0.1#5335 +server=/a10.video.qq.com/127.0.0.1#5335 +server=/xyy.video.qq.com/127.0.0.1#5335 +server=/vcq.video.qq.com/127.0.0.1#5335 +server=/vsh.video.qq.com/127.0.0.1#5335 +server=/vbj.video.qq.com/127.0.0.1#5335 +server=/bobo.video.qq.com/127.0.0.1#5335 +server=/flvs.video.qq.com/127.0.0.1#5335 +server=/bkvv.video.qq.com/127.0.0.1#5335 +server=/info.zb.qq.com/127.0.0.1#5335 +server=/geo.js.kankan.xunlei.com/127.0.0.1#5335 +server=/web-play.pptv.com/127.0.0.1#5335 +server=/web-play.pplive.cn/127.0.0.1#5335 +server=/dyn.ugc.pps.tv/127.0.0.1#5335 +server=/v.pps.tv/127.0.0.1#5335 +server=/inner.kandian.com/127.0.0.1#5335 +server=/ipservice.163.com/127.0.0.1#5335 +server=/so.open.163.com/127.0.0.1#5335 +server=/zb.s.qq.com/127.0.0.1#5335 +server=/ip.kankan.xunlei.com/127.0.0.1#5335 +server=/vxml.56.com/127.0.0.1#5335 +server=/music.sina.com.cn/127.0.0.1#5335 +server=/play.baidu.com/127.0.0.1#5335 +server=/v.iask.com/127.0.0.1#5335 +server=/tv.weibo.com/127.0.0.1#5335 +server=/wtv.v.iask.com/127.0.0.1#5335 +server=/video.sina.com.cn/127.0.0.1#5335 +server=/www.yinyuetai.com/127.0.0.1#5335 +server=/api.letv.com/127.0.0.1#5335 +server=/live.gslb.letv.com/127.0.0.1#5335 +server=/static.itv.letv.com/127.0.0.1#5335 +server=/ip.apps.cntv.cn/127.0.0.1#5335 +server=/vdn.apps.cntv.cn/127.0.0.1#5335 +server=/vdn.live.cntv.cn/127.0.0.1#5335 +server=/vip.sports.cntv.cn/127.0.0.1#5335 +server=/a.play.api.3g.youku.com/127.0.0.1#5335 +server=/i.play.api.3g.youku.com/127.0.0.1#5335 +server=/api.3g.youku.com/127.0.0.1#5335 +server=/tv.api.3g.youku.com/127.0.0.1#5335 +server=/play.api.3g.youku.com/127.0.0.1#5335 +server=/play.api.3g.tudou.com/127.0.0.1#5335 +server=/tv.api.3g.tudou.com/127.0.0.1#5335 +server=/api.3g.tudou.com/127.0.0.1#5335 +server=/api.tv.sohu.com/127.0.0.1#5335 +server=/access.tv.sohu.com/127.0.0.1#5335 +server=/iface.iqiyi.com/127.0.0.1#5335 +server=/iface2.iqiyi.com/127.0.0.1#5335 +server=/cache.m.iqiyi.com/127.0.0.1#5335 +server=/dynamic.app.m.letv.com/127.0.0.1#5335 +server=/dynamic.meizi.app.m.letv.com/127.0.0.1#5335 +server=/dynamic.search.app.m.letv.com/127.0.0.1#5335 +server=/dynamic.live.app.m.letv.com/127.0.0.1#5335 +server=/listso.m.areainfo.ppstream.com/127.0.0.1#5335 +server=/epg.api.pptv.com/127.0.0.1#5335 +server=/play.api.pptv.com/127.0.0.1#5335 +server=/m.letv.com/127.0.0.1#5335 +server=/interface.bilibili.com/127.0.0.1#5335 +server=/3g.music.qq.com/127.0.0.1#5335 +server=/mqqplayer.3g.qq.com/127.0.0.1#5335 +server=/proxy.music.qq.com/127.0.0.1#5335 +server=/proxymc.qq.com/127.0.0.1#5335 +server=/ip2.kugou.com/127.0.0.1#5335 +server=/ip.kugou.com/127.0.0.1#5335 +server=/client.api.ttpod.com/127.0.0.1#5335 +server=/mobi.kuwo.cn/127.0.0.1#5335 +server=/mobilefeedback.kugou.com/127.0.0.1#5335 +server=/tingapi.ting.baidu.com/127.0.0.1#5335 +server=/music.baidu.com/127.0.0.1#5335 +server=/serviceinfo.sdk.duomi.com/127.0.0.1#5335 +server=/music.163.com/127.0.0.1#5335 +server=/www.xiami.com/127.0.0.1#5335 +server=/spark.api.xiami.com/127.0.0.1#5335 +server=/iplocation.geo.qiyi.com/127.0.0.1#5335 +server=/sns.video.qq.com/127.0.0.1#5335 +server=/v5.pc.duomi.com/127.0.0.1#5335 +server=/tms.is.ysten.com/127.0.0.1#5335 +server=/internal.check.duokanbox.com/127.0.0.1#5335 +server=/openapi.youku.com/127.0.0.1#5335 +server=/y.qq.com/127.0.0.1#5335 +ipset=/v.youku.com/oversea +ipset=/api.youku.com/oversea +ipset=/v2.tudou.com/oversea +ipset=/www.tudou.com/oversea +ipset=/s.plcloud.music.qq.com/oversea +ipset=/i.y.qq.com/oversea +ipset=/hot.vrs.sohu.com/oversea +ipset=/live.tv.sohu.com/oversea +ipset=/pad.tv.sohu.com/oversea +ipset=/my.tv.sohu.com/oversea +ipset=/hot.vrs.letv.com/oversea +ipset=/data.video.qiyi.com/oversea +ipset=/cache.video.qiyi.com/oversea +ipset=/cache.vip.qiyi.com/oversea +ipset=/vv.video.qq.com/oversea +ipset=/tt.video.qq.com/oversea +ipset=/ice.video.qq.com/oversea +ipset=/tjsa.video.qq.com/oversea +ipset=/a10.video.qq.com/oversea +ipset=/xyy.video.qq.com/oversea +ipset=/vcq.video.qq.com/oversea +ipset=/vsh.video.qq.com/oversea +ipset=/vbj.video.qq.com/oversea +ipset=/bobo.video.qq.com/oversea +ipset=/flvs.video.qq.com/oversea +ipset=/bkvv.video.qq.com/oversea +ipset=/info.zb.qq.com/oversea +ipset=/geo.js.kankan.xunlei.com/oversea +ipset=/web-play.pptv.com/oversea +ipset=/web-play.pplive.cn/oversea +ipset=/dyn.ugc.pps.tv/oversea +ipset=/v.pps.tv/oversea +ipset=/inner.kandian.com/oversea +ipset=/ipservice.163.com/oversea +ipset=/so.open.163.com/oversea +ipset=/zb.s.qq.com/oversea +ipset=/ip.kankan.xunlei.com/oversea +ipset=/vxml.56.com/oversea +ipset=/music.sina.com.cn/oversea +ipset=/play.baidu.com/oversea +ipset=/v.iask.com/oversea +ipset=/tv.weibo.com/oversea +ipset=/wtv.v.iask.com/oversea +ipset=/video.sina.com.cn/oversea +ipset=/www.yinyuetai.com/oversea +ipset=/api.letv.com/oversea +ipset=/live.gslb.letv.com/oversea +ipset=/static.itv.letv.com/oversea +ipset=/ip.apps.cntv.cn/oversea +ipset=/vdn.apps.cntv.cn/oversea +ipset=/vdn.live.cntv.cn/oversea +ipset=/vip.sports.cntv.cn/oversea +ipset=/a.play.api.3g.youku.com/oversea +ipset=/i.play.api.3g.youku.com/oversea +ipset=/api.3g.youku.com/oversea +ipset=/tv.api.3g.youku.com/oversea +ipset=/play.api.3g.youku.com/oversea +ipset=/play.api.3g.tudou.com/oversea +ipset=/tv.api.3g.tudou.com/oversea +ipset=/api.3g.tudou.com/oversea +ipset=/api.tv.sohu.com/oversea +ipset=/access.tv.sohu.com/oversea +ipset=/iface.iqiyi.com/oversea +ipset=/iface2.iqiyi.com/oversea +ipset=/cache.m.iqiyi.com/oversea +ipset=/dynamic.app.m.letv.com/oversea +ipset=/dynamic.meizi.app.m.letv.com/oversea +ipset=/dynamic.search.app.m.letv.com/oversea +ipset=/dynamic.live.app.m.letv.com/oversea +ipset=/listso.m.areainfo.ppstream.com/oversea +ipset=/epg.api.pptv.com/oversea +ipset=/play.api.pptv.com/oversea +ipset=/m.letv.com/oversea +ipset=/interface.bilibili.com/oversea +ipset=/3g.music.qq.com/oversea +ipset=/mqqplayer.3g.qq.com/oversea +ipset=/proxy.music.qq.com/oversea +ipset=/proxymc.qq.com/oversea +ipset=/ip2.kugou.com/oversea +ipset=/ip.kugou.com/oversea +ipset=/client.api.ttpod.com/oversea +ipset=/mobi.kuwo.cn/oversea +ipset=/mobilefeedback.kugou.com/oversea +ipset=/tingapi.ting.baidu.com/oversea +ipset=/music.baidu.com/oversea +ipset=/serviceinfo.sdk.duomi.com/oversea +ipset=/music.163.com/oversea +ipset=/www.xiami.com/oversea +ipset=/spark.api.xiami.com/oversea +ipset=/iplocation.geo.qiyi.com/oversea +ipset=/sns.video.qq.com/oversea +ipset=/v5.pc.duomi.com/oversea +ipset=/tms.is.ysten.com/oversea +ipset=/internal.check.duokanbox.com/oversea +ipset=/openapi.youku.com/oversea +ipset=/y.qq.com/oversea diff --git a/luci-app-ssr-plus/root/etc/ssrplus/white.list b/luci-app-ssr-plus/root/etc/ssrplus/white.list new file mode 100644 index 00000000..9055fcb9 --- /dev/null +++ b/luci-app-ssr-plus/root/etc/ssrplus/white.list @@ -0,0 +1,7 @@ +bilibili.com +bilibili.cn +bilivideo.com +bilivideo.cn +biliapi.com +biliapi.net +apple.com \ No newline at end of file diff --git a/luci-app-ssr-plus/root/etc/uci-defaults/luci-ssr-plus b/luci-app-ssr-plus/root/etc/uci-defaults/luci-ssr-plus new file mode 100755 index 00000000..72b33818 --- /dev/null +++ b/luci-app-ssr-plus/root/etc/uci-defaults/luci-ssr-plus @@ -0,0 +1,45 @@ +#!/bin/sh + +uci -q batch <<-EOF >/dev/null + delete ucitrack.@shadowsocksr[-1] + add ucitrack shadowsocksr + set ucitrack.@shadowsocksr[-1].init=shadowsocksr + commit ucitrack + + delete firewall.shadowsocksr + set firewall.shadowsocksr=include + set firewall.shadowsocksr.type=script + set firewall.shadowsocksr.path=/var/etc/shadowsocksr.include + set firewall.shadowsocksr.reload=1 + commit firewall +EOF + +rm -rf /etc/config/shadowsocksr-opkg /etc/ssrplus/*opkg +touch /etc/ssrplus/china_ssr.txt +touch /etc/ssrplus/deny.list +touch /etc/ssrplus/white.list +touch /etc/ssrplus/black.list +touch /etc/ssrplus/netflix.list +touch /etc/ssrplus/netflixip.list +touch /etc/ssrplus/gfw_base.conf +touch /etc/ssrplus/gfw_list.conf +touch /etc/ssrplus/oversea_list.conf +touch /etc/ssrplus/ad.conf +touch /etc/config/shadowsocksr +[ -s "/etc/config/shadowsocksr" ] || /etc/init.d/shadowsocksr reset + +sed -i "s/option type 'vmess'/option type 'v2ray'\n\toption v2ray_protocol 'vmess'/g" /etc/config/shadowsocksr +sed -i "s/option type 'vless'/option type 'v2ray'\n\toption v2ray_protocol 'vless'/g" /etc/config/shadowsocksr +sed -i "s/option encrypt_method_v2ray_ss/option encrypt_method_ss/g" /etc/config/shadowsocksr +sed -i "s/option xtls/option tls/g" /etc/config/shadowsocksr +sed -i "/option vless_flow/d" /etc/config/shadowsocksr +sed -i "/option fingerprint 'disable'/d" /etc/config/shadowsocksr + +if [ -s "/etc/uwsgi/vassals/luci-webui.ini" ];then + limit=$(cat /etc/uwsgi/vassals/luci-webui.ini | grep -Eo "limit-as.*"|grep -Eo "[0-9]+") + [ $limit -lt 5000 ] && sed -i '/limit-as/c\limit-as = 5000' /etc/uwsgi/vassals/luci-webui.ini && \ + /etc/init.d/uwsgi restart +fi + +rm -rf /tmp/luci-modulecache /tmp/luci-indexcache +exit 0 diff --git a/luci-app-ssr-plus/root/usr/bin/ssr-monitor b/luci-app-ssr-plus/root/usr/bin/ssr-monitor new file mode 100755 index 00000000..f637d509 --- /dev/null +++ b/luci-app-ssr-plus/root/usr/bin/ssr-monitor @@ -0,0 +1,134 @@ +#!/bin/sh +# +# Copyright (C) 2017 openwrt-ssr +# Copyright (C) 2017 yushi studio +# +# This is free software, licensed under the GNU General Public License v3. +# See /LICENSE for more information. +# +. $IPKG_INSTROOT/etc/init.d/shadowsocksr +LOCK_FILE="/var/lock/ssr-monitor.lock" +[ -f "$LOCK_FILE" ] && exit 2 +touch "$LOCK_FILE" +server_process_count=$1 +redir_tcp_process=$2 +redir_udp_process=$3 +kcp_process=$4 +local_process=$5 +pdnsd_process=$6 +if [ -z "$pdnsd_process" ]; then + pdnsd_process=0 +fi +i=0 +GLOBAL_SERVER=$(uci_get_by_type global global_server) +server=$(uci_get_by_name $GLOBAL_SERVER server) +kcp_port=$(uci_get_by_name $GLOBAL_SERVER kcp_port) +server_port=$(uci_get_by_name $GLOBAL_SERVER server_port) +password=$(uci_get_by_name $GLOBAL_SERVER kcp_password) +kcp_param=$(uci_get_by_name $GLOBAL_SERVER kcp_param) +[ "$password" != "" ] && password="--key "${password} + +while [ "1" == "1" ]; do #死循环 + sleep 000030s + #redir tcp + if [ "$redir_tcp_process" -gt 0 ]; then + icount=$(busybox ps -w | grep ssr-retcp | grep -v grep | wc -l) + if [ "$icount" == 0 ]; then + logger -t "$NAME" "ssrplus redir tcp error.restart!" + echolog "ssrplus redir tcp error.restart!" + /etc/init.d/shadowsocksr restart + exit 0 + fi + fi + #redir udp + if [ "$redir_udp_process" -gt 0 ]; then + icount=$(busybox ps -w | grep ssr-reudp | grep -v grep | wc -l) + if [ "$icount" == 0 ]; then + logger -t "$NAME" "ssrplus redir udp error.restart!" + echolog "ssrplus redir udp error.restart!" + /etc/init.d/shadowsocksr restart + exit 0 + fi + fi + #server + if [ "$server_process_count" -gt 0 ]; then + icount=$(busybox ps -w | grep ssr-server | grep -v grep | wc -l) + if [ "$icount" -lt "$server_process_count" ]; then #如果进程挂掉就重启它 + logger -t "$NAME" "ssrplus server error.restart!" + echolog "ssrplus server error.restart!" + kill -9 $(busybox ps -w | grep ssr-server | grep -v grep | awk '{print $1}') >/dev/null 2>&1 + /etc/init.d/shadowsocksr restart + exit 0 + fi + fi + #kcptun + if [ "$kcp_process" -gt 0 ]; then + icount=$(busybox ps -w | grep kcptun-client | grep -v grep | wc -l) + if [ "$icount" -lt "$kcp_process" ]; then #如果进程挂掉就重启它 + logger -t "$NAME" "ssrplus kcptun error.restart!" + echolog "ssrplus kcptun error.restart!" + killall -q -9 kcptun-client + (/usr/bin/kcptun-client -r $server:$kcp_port -l :$server_port $password $kcp_param &) + fi + fi + #localsocks + if [ "$local_process" -gt 0 ]; then + icount=$(busybox ps -w | grep ssr-local | grep -v grep | wc -l) + if [ "$icount" -lt "$local_process" ]; then #如果进程挂掉就重启它 + logger -t "$NAME" "global socks server error.restart!" + echolog "global socks server error.restart!" + kill -9 $(busybox ps -w | grep ssr-local | grep -v grep | awk '{print $1}') >/dev/null 2>&1 + /etc/init.d/shadowsocksr restart + exit 0 + fi + fi + #dns2tcp + if [ "$pdnsd_process" -eq 1 ]; then + icount=$(busybox ps -w | grep $TMP_BIN_PATH/dns2tcp | grep -v grep | wc -l) + if [ "$icount" -lt 1 ]; then #如果进程挂掉就重启它 + logger -t "$NAME" "dns2tcp tunnel error.restart!" + echolog "dns2tcp tunnel error.restart!" + dnsserver=$(uci_get_by_type global tunnel_forward 8.8.4.4:53) + kill -9 $(busybox ps -w | grep $TMP_BIN_PATH/dns2tcp | grep -v grep | awk '{print $1}') >/dev/null 2>&1 + ln_start_bin $(first_type dns2tcp) dns2tcp -L "127.0.0.1#$dns_port" -R "${dnsserver/:/#}" + fi + #dns2socks + elif [ "$pdnsd_process" -eq 2 ]; then + icount=$(busybox ps -w | grep -e ssrplus-dns -e "dns2socks 127.0.0.1 $tmp_dns_port" | grep -v grep | wc -l) + if [ "$icount" -lt 2 ]; then #如果进程挂掉就重启它 + logger -t "$NAME" "dns2socks $dnsserver tunnel error.restart!" + echolog "dns2socks $dnsserver tunnel error.restart!" + dnsserver=$(uci_get_by_type global tunnel_forward 8.8.4.4:53) + kill -9 $(busybox ps -w | grep ssrplus-dns | grep -v grep | awk '{print $1}') >/dev/null 2>&1 + kill -9 $(busybox ps -w | grep "dns2socks 127.0.0.1 $tmp_dns_port" | grep -v grep | awk '{print $1}') >/dev/null 2>&1 + ln_start_bin $(first_type microsocks) microsocks -i 127.0.0.1 -p $tmp_dns_port ssrplus-dns + ln_start_bin $(first_type dns2socks) dns2socks 127.0.0.1:$tmp_dns_port $dnsserver 127.0.0.1:$dns_port -q + fi + #mosdns + elif [ "$pdnsd_process" -eq 3 ]; then + icount=$(busybox ps -w | grep $TMP_BIN_PATH/mosdns | grep -v grep | wc -l) + if [ "$icount" -lt 1 ]; then #如果进程挂掉就重启它 + logger -t "$NAME" "mosdns tunnel error.restart!" + echolog "mosdns tunnel error.restart!" + dnsserver=$(uci_get_by_type global tunnel_forward 8.8.4.4:53) + kill -9 $(busybox ps -w | grep $TMP_BIN_PATH/mosdns | grep -v grep | awk '{print $1}') >/dev/null 2>&1 + ln_start_bin $(first_type mosdns) mosdns start -c /etc/mosdns/config.yaml + fi + fi + #chinadns-ng + if [ "$(uci -q get "dhcp.@dnsmasq[0]._unused_ssrp_changed")" = "1" ]; then + icount=$(busybox ps -w | grep $TMP_BIN_PATH/chinadns-ng | grep -v grep | wc -l) + if [ "$icount" -lt 1 ]; then #如果进程挂掉就重启它 + logger -t "$NAME" "chinadns-ng tunnel error.restart!" + echolog "chinadns-ng tunnel error.restart!" + chinadns=$(uci_get_by_type global chinadns_forward) + wandns="$(ifstatus wan | jsonfilter -e '@["dns-server"][0]' || echo "119.29.29.29")" + case "$chinadns" in + "wan") chinadns="$wandns" ;; + ""|"wan_114") chinadns="$wandns,114.114.114.114" ;; + esac + kill -9 $(busybox ps -w | grep $TMP_BIN_PATH/chinadns-ng | grep -v grep | awk '{print $1}') >/dev/null 2>&1 + ln_start_bin $(first_type chinadns-ng) chinadns-ng -l $china_dns_port -4 china -p 3 -c ${chinadns/:/#} -t 127.0.0.1#$dns_port -N -f -r + fi + fi +done diff --git a/luci-app-ssr-plus/root/usr/bin/ssr-rules b/luci-app-ssr-plus/root/usr/bin/ssr-rules new file mode 100755 index 00000000..547d910a --- /dev/null +++ b/luci-app-ssr-plus/root/usr/bin/ssr-rules @@ -0,0 +1,424 @@ +#!/bin/sh +# +# Copyright (C) 2017 openwrt-ssr +# Copyright (C) 2017 yushi studio +# +# This is free software, licensed under the GNU General Public License v3. +# See /LICENSE for more information. +# +TAG="_SS_SPEC_RULE_" # comment tag +IPT="iptables -t nat" # alias of iptables +FWI=$(uci get firewall.shadowsocksr.path 2>/dev/null) # firewall include file +usage() { + cat <<-EOF + Usage: ssr-rules [options] + + Valid options are: + + -s ip address of shadowsocksr remote server + -l port number of shadowsocksr local server + -S ip address of shadowsocksr remote UDP server + -L port number of shadowsocksr local UDP server + -i a file content is bypassed ip list + -a lan ip of access control, need a prefix to + define access control mode + -b wan ip of will be bypassed + -w wan ip of will be forwarded + -B lan ip of will be bypassed proxy + -p lan ip of will be global proxy + -G lan ip of will be game mode proxy + -D proxy ports + -F shunt mode + -N shunt server IP + -M shunt proxy mode + -m Interface name + -I a file content is bypassed shunt ip list + -e extra options for iptables + -o apply the rules to the OUTPUT chain + -O apply the global rules to the OUTPUT chain + -u enable udprelay mode, TPROXY is required + -U enable udprelay mode, using different IP + and ports for TCP and UDP + -f flush the rules + -g gfwlist mode + -r router mode + -c oversea mode + -z all mode + -h show this help message and exit + EOF + exit $1 +} + +loger() { + # 1.alert 2.crit 3.err 4.warn 5.notice 6.info 7.debug + logger -st ssr-rules[$$] -p$1 $2 +} + +flush_r() { + flush_iptables() { + local ipt="iptables -t $1" + local DAT=$(iptables-save -t $1) + eval $(echo "$DAT" | grep "$TAG" | sed -e 's/^-A/$ipt -D/' -e 's/$/;/') + for chain in $(echo "$DAT" | awk '/^:SS_SPEC/{print $1}'); do + $ipt -F ${chain:1} 2>/dev/null && $ipt -X ${chain:1} + done + } + flush_iptables nat + flush_iptables mangle + ip rule del fwmark 0x01/0x01 table 100 2>/dev/null + ip route del local 0.0.0.0/0 dev lo table 100 2>/dev/null + ipset -X ss_spec_lan_ac 2>/dev/null + ipset -X ss_spec_wan_ac 2>/dev/null + ipset -X ssr_gen_router 2>/dev/null + ipset -X fplan 2>/dev/null + ipset -X bplan 2>/dev/null + ipset -X gmlan 2>/dev/null + ipset -X oversea 2>/dev/null + ipset -X whitelist 2>/dev/null + ipset -X blacklist 2>/dev/null + ipset -X netflix 2>/dev/null + [ -n "$FWI" ] && echo '#!/bin/sh' >$FWI + return 0 +} + +ipset_r() { + [ -f "$IGNORE_LIST" ] && /usr/share/shadowsocksr/chinaipset.sh $IGNORE_LIST + $IPT -N SS_SPEC_WAN_AC + $IPT -I SS_SPEC_WAN_AC -p tcp ! --dport 53 -d $server -j RETURN + ipset -N gmlan hash:net 2>/dev/null + for ip in $LAN_GM_IP; do ipset -! add gmlan $ip; done + case "$RUNMODE" in + router) + ipset -! -R <<-EOF || return 1 + create ss_spec_wan_ac hash:net + $(gen_spec_iplist | sed -e "s/^/add ss_spec_wan_ac /") + EOF + $IPT -A SS_SPEC_WAN_AC -m set --match-set ss_spec_wan_ac dst -j RETURN + $IPT -A SS_SPEC_WAN_AC -m set --match-set china dst -j RETURN + $IPT -A SS_SPEC_WAN_AC -m set --match-set gmlan src -m set ! --match-set china dst -j SS_SPEC_WAN_FW + $IPT -A SS_SPEC_WAN_AC -j SS_SPEC_WAN_FW + ;; + gfw) + ipset -N gfwlist hash:net 2>/dev/null + $IPT -A SS_SPEC_WAN_AC -m set --match-set china dst -j RETURN + $IPT -A SS_SPEC_WAN_AC -m set --match-set gfwlist dst -j SS_SPEC_WAN_FW + $IPT -A SS_SPEC_WAN_AC -m set --match-set gmlan src -m set ! --match-set china dst -j SS_SPEC_WAN_FW + ;; + oversea) + ipset -N oversea hash:net 2>/dev/null + $IPT -I SS_SPEC_WAN_AC -m set --match-set oversea dst -j SS_SPEC_WAN_FW + $IPT -A SS_SPEC_WAN_AC -m set --match-set gmlan src -j SS_SPEC_WAN_FW + $IPT -A SS_SPEC_WAN_AC -m set --match-set china dst -j SS_SPEC_WAN_FW + ;; + all) + $IPT -A SS_SPEC_WAN_AC -j SS_SPEC_WAN_FW + ;; + esac + ipset -N fplan hash:net 2>/dev/null + for ip in $LAN_FP_IP; do ipset -! add fplan $ip; done + $IPT -I SS_SPEC_WAN_AC -m set --match-set fplan src -j SS_SPEC_WAN_FW + ipset -N bplan hash:net 2>/dev/null + for ip in $LAN_BP_IP; do ipset -! add bplan $ip; done + $IPT -I SS_SPEC_WAN_AC -m set --match-set bplan src -j RETURN + ipset -N whitelist hash:net 2>/dev/null + ipset -N blacklist hash:net 2>/dev/null + $IPT -I SS_SPEC_WAN_AC -m set --match-set blacklist dst -j SS_SPEC_WAN_FW + $IPT -I SS_SPEC_WAN_AC -m set --match-set whitelist dst -j RETURN + if [ $(ipset list music -name -quiet | grep music) ]; then + $IPT -I SS_SPEC_WAN_AC -m set --match-set music dst -j RETURN 2>/dev/null + fi + for ip in $WAN_BP_IP; do ipset -! add whitelist $ip; done + for ip in $WAN_FW_IP; do ipset -! add blacklist $ip; done + if [ "$SHUNT_PORT" != "0" ]; then + ipset -N netflix hash:net 2>/dev/null + for ip in $(cat ${SHUNT_LIST:=/dev/null} 2>/dev/null); do ipset -! add netflix $ip; done + case "$SHUNT_PORT" in + 0) ;; + 1) + $IPT -I SS_SPEC_WAN_AC -p tcp -m set --match-set netflix dst -j REDIRECT --to-ports $local_port + ;; + *) + $IPT -I SS_SPEC_WAN_AC -p tcp -m set --match-set netflix dst -j REDIRECT --to-ports $SHUNT_PORT + if [ "$SHUNT_PROXY" == "1" ]; then + $IPT -I SS_SPEC_WAN_AC -p tcp -d $SHUNT_IP -j REDIRECT --to-ports $local_port + else + ipset -! add whitelist $SHUNT_IP + fi + ;; + esac + fi + return $? +} + +fw_rule() { + $IPT -N SS_SPEC_WAN_FW + $IPT -A SS_SPEC_WAN_FW -d 0.0.0.0/8 -j RETURN + $IPT -A SS_SPEC_WAN_FW -d 10.0.0.0/8 -j RETURN + $IPT -A SS_SPEC_WAN_FW -d 127.0.0.0/8 -j RETURN + $IPT -A SS_SPEC_WAN_FW -d 169.254.0.0/16 -j RETURN + $IPT -A SS_SPEC_WAN_FW -d 172.16.0.0/12 -j RETURN + $IPT -A SS_SPEC_WAN_FW -d 192.168.0.0/16 -j RETURN + $IPT -A SS_SPEC_WAN_FW -d 224.0.0.0/4 -j RETURN + $IPT -A SS_SPEC_WAN_FW -d 240.0.0.0/4 -j RETURN + $IPT -A SS_SPEC_WAN_FW -p tcp $PROXY_PORTS -j REDIRECT --to-ports $local_port 2>/dev/null || { + loger 3 "Can't redirect, please check the iptables." + exit 1 + } + return $? +} + +ac_rule() { + if [ -n "$LAN_AC_IP" ]; then + case "${LAN_AC_IP:0:1}" in + w | W) + MATCH_SET="-m set --match-set ss_spec_lan_ac src" + ;; + b | B) + MATCH_SET="-m set ! --match-set ss_spec_lan_ac src" + ;; + *) + loger 3 "Bad argument \`-a $LAN_AC_IP\`." + return 2 + ;; + esac + fi + ipset -! -R <<-EOF || return 1 + create ss_spec_lan_ac hash:net + $(for ip in ${LAN_AC_IP:1}; do echo "add ss_spec_lan_ac $ip"; done) + EOF + if [ -z "$Interface" ]; then + $IPT -I PREROUTING 1 -p tcp $EXT_ARGS $MATCH_SET -m comment --comment "$TAG" -j SS_SPEC_WAN_AC + else + for name in $Interface; do + local IFNAME=$(uci -P /var/state get network.$name.ifname 2>/dev/null) + [ -z "$IFNAME" ] && IFNAME=$(uci -P /var/state get network.$name.device 2>/dev/null) + [ -n "$IFNAME" ] && $IPT -I PREROUTING 1 ${IFNAME:+-i $IFNAME} -p tcp $EXT_ARGS $MATCH_SET -m comment --comment "$TAG" -j SS_SPEC_WAN_AC + done + fi + + case "$OUTPUT" in + 1) + $IPT -I OUTPUT 1 -p tcp $EXT_ARGS -m comment --comment "$TAG" -j SS_SPEC_WAN_AC + ;; + 2) + ipset -! -R <<-EOF || return 1 + create ssr_gen_router hash:net + $(gen_spec_iplist | sed -e "s/^/add ssr_gen_router /") + EOF + $IPT -N SS_SPEC_ROUTER && \ + $IPT -A SS_SPEC_ROUTER -m set --match-set ssr_gen_router dst -j RETURN && \ + $IPT -A SS_SPEC_ROUTER -j SS_SPEC_WAN_FW + $IPT -I OUTPUT 1 -p tcp -m comment --comment "$TAG" -j SS_SPEC_ROUTER + ;; + esac + return $? +} + +tp_rule() { + [ -n "$TPROXY" ] || return 0 + ip rule add fwmark 0x01/0x01 table 100 + ip route add local 0.0.0.0/0 dev lo table 100 + local ipt="iptables -t mangle" + $ipt -N SS_SPEC_TPROXY + $ipt -A SS_SPEC_TPROXY -p udp --dport 53 -j RETURN + $ipt -A SS_SPEC_TPROXY -p udp -d 0.0.0.0/8 -j RETURN + $ipt -A SS_SPEC_TPROXY -p udp -d 10.0.0.0/8 -j RETURN + $ipt -A SS_SPEC_TPROXY -p udp -d 127.0.0.0/8 -j RETURN + $ipt -A SS_SPEC_TPROXY -p udp -d 169.254.0.0/16 -j RETURN + $ipt -A SS_SPEC_TPROXY -p udp -d 172.16.0.0/12 -j RETURN + $ipt -A SS_SPEC_TPROXY -p udp -d 192.168.0.0/16 -j RETURN + $ipt -A SS_SPEC_TPROXY -p udp -d 224.0.0.0/4 -j RETURN + $ipt -A SS_SPEC_TPROXY -p udp -d 240.0.0.0/4 -j RETURN + $ipt -A SS_SPEC_TPROXY -p udp ! --dport 53 -d $SERVER -j RETURN + [ "$server" != "$SERVER" ] && ipset -! add whitelist $SERVER + $ipt -A SS_SPEC_TPROXY -p udp -m set --match-set bplan src -j RETURN + $ipt -A SS_SPEC_TPROXY -p udp $PROXY_PORTS -m set --match-set fplan src -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark 0x01/0x01 + case "$RUNMODE" in + router) + $ipt -A SS_SPEC_TPROXY -p udp -m set --match-set ss_spec_wan_ac dst -j RETURN + $ipt -A SS_SPEC_TPROXY -p udp -m set --match-set china dst -j RETURN + $ipt -A SS_SPEC_TPROXY -p udp --dport 80 -j DROP + $ipt -A SS_SPEC_TPROXY -p udp -m set --match-set gmlan src -m set ! --match-set china dst -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark 0x01/0x01 + $ipt -A SS_SPEC_TPROXY -p udp $PROXY_PORTS -m set ! --match-set ss_spec_wan_ac dst -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark 0x01/0x01 + ;; + gfw) + $ipt -A SS_SPEC_TPROXY -p udp -m set --match-set china dst -j RETURN + $ipt -A SS_SPEC_TPROXY -p udp --dport 80 -j DROP + $ipt -A SS_SPEC_TPROXY -p udp $PROXY_PORTS -m set --match-set gfwlist dst -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark 0x01/0x01 + $ipt -A SS_SPEC_TPROXY -p udp -m set --match-set gmlan src -m set ! --match-set china dst -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark 0x01/0x01 + ;; + oversea) + $ipt -A SS_SPEC_TPROXY -p udp $PROXY_PORTS -m set --match-set oversea src -m dst -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark 0x01/0x01 + $ipt -A SS_SPEC_TPROXY -p udp -m set --match-set gmlan src -m set -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark 0x01/0x01 + $ipt -A SS_SPEC_TPROXY -p udp $PROXY_PORTS -m set --match-set china dst -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark 0x01/0x01 + ;; + all) + $ipt -A SS_SPEC_TPROXY -p udp $PROXY_PORTS -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark 0x01/0x01 + ;; + esac + if [ -z "$Interface" ]; then + $ipt -I PREROUTING 1 -p udp $EXT_ARGS $MATCH_SET -m comment --comment "$TAG" -j SS_SPEC_TPROXY + else + for name in $Interface; do + local IFNAME=$(uci -P /var/state get network.$name.ifname 2>/dev/null) + [ -z "$IFNAME" ] && IFNAME=$(uci -P /var/state get network.$name.device 2>/dev/null) + [ -n "$IFNAME" ] && $ipt -I PREROUTING 1 ${IFNAME:+-i $IFNAME} -p udp $EXT_ARGS $MATCH_SET -m comment --comment "$TAG" -j SS_SPEC_TPROXY + done + fi + return $? +} + +get_wan_ip() { + cat <<-EOF | grep -E "^([0-9]{1,3}\.){3}[0-9]{1,3}" + $server + $SERVER + $WAN_BP_IP + EOF +} + +gen_spec_iplist() { + cat <<-EOF + 0.0.0.0/8 + 10.0.0.0/8 + 100.64.0.0/10 + 127.0.0.0/8 + 169.254.0.0/16 + 172.16.0.0/12 + 192.0.0.0/24 + 192.0.2.0/24 + 192.88.99.0/24 + 192.168.0.0/16 + 198.18.0.0/15 + 198.51.100.0/24 + 203.0.113.0/24 + 224.0.0.0/4 + 240.0.0.0/4 + 255.255.255.255 + $(get_wan_ip) + EOF +} + +gen_include() { + [ -n "$FWI" ] || return 0 + extract_rules() { + echo "*$1" + iptables-save -t $1 | grep SS_SPEC_ | sed -e "s/^-A \(OUTPUT\|PREROUTING\)/-I \1 1/" + echo 'COMMIT' + } + cat <<-EOF >>$FWI + iptables-save -c | grep -v "SS_SPEC" | iptables-restore -c + iptables-restore -n <<-EOT + $(extract_rules nat) + $(extract_rules mangle) + EOT + EOF + return 0 +} + +while getopts ":m:s:l:S:L:i:e:a:B:b:w:p:G:D:F:N:M:I:oOuUfgrczh" arg; do + case "$arg" in + m) + Interface=$OPTARG + ;; + s) + server=$OPTARG + ;; + l) + local_port=$OPTARG + ;; + S) + SERVER=$OPTARG + ;; + L) + LOCAL_PORT=$OPTARG + ;; + i) + IGNORE_LIST=$OPTARG + ;; + e) + EXT_ARGS=$OPTARG + ;; + a) + LAN_AC_IP=$OPTARG + ;; + B) + LAN_BP_IP=$OPTARG + ;; + b) + WAN_BP_IP=$(for ip in $OPTARG; do echo $ip; done) + ;; + w) + WAN_FW_IP=$OPTARG + ;; + p) + LAN_FP_IP=$OPTARG + ;; + G) + LAN_GM_IP=$OPTARG + ;; + D) + PROXY_PORTS=$OPTARG + ;; + F) + SHUNT_PORT=$OPTARG + ;; + N) + SHUNT_IP=$OPTARG + ;; + M) + SHUNT_PROXY=$OPTARG + ;; + I) + SHUNT_LIST=$OPTARG + ;; + o) + OUTPUT=1 + ;; + O) + OUTPUT=2 + ;; + u) + TPROXY=1 + ;; + U) + TPROXY=2 + ;; + g) + RUNMODE=gfw + ;; + r) + RUNMODE=router + ;; + c) + RUNMODE=oversea + ;; + z) + RUNMODE=all + ;; + f) + flush_r + exit 0 + ;; + h) usage 0 ;; + esac +done + +if [ -z "$server" -o -z "$local_port" ]; then + usage 2 +fi + +case "$TPROXY" in +1) + SERVER=$server + LOCAL_PORT=$local_port + ;; +2) + : ${SERVER:?"You must assign an ip for the udp relay server."} + : ${LOCAL_PORT:?"You must assign a port for the udp relay server."} + ;; +esac + +flush_r && fw_rule && ipset_r && ac_rule && tp_rule && gen_include +RET=$? +[ "$RET" = 0 ] || loger 3 "Start failed!" +exit $RET diff --git a/luci-app-ssr-plus/root/usr/bin/ssr-switch b/luci-app-ssr-plus/root/usr/bin/ssr-switch new file mode 100755 index 00000000..5a2a3709 --- /dev/null +++ b/luci-app-ssr-plus/root/usr/bin/ssr-switch @@ -0,0 +1,155 @@ +#!/bin/sh /etc/rc.common +# +# Copyright (C) 2017 openwrt-ssr +# Copyright (C) 2017 yushi studio +# +# This is free software, licensed under the GNU General Public License v3. +# See /LICENSE for more information. +# + +. $IPKG_INSTROOT/etc/init.d/shadowsocksr +LOCK_FILE="/var/lock/ssr-switch.lock" +[ -f "$LOCK_FILE" ] && exit 2 +touch "$LOCK_FILE" +LOG_FILE=/var/log/ssrplus.log + +cycle_time=60 +switch_time=3 +normal_flag=0 +server_locate=0 +server_count=0 +ENABLE_SERVER=nil +[ -n "$1" ] && cycle_time=$1 +[ -n "$2" ] && switch_time=$2 +DEFAULT_SERVER=$(uci_get_by_type global global_server) +CURRENT_SERVER=$DEFAULT_SERVER + +#判断代理是否正常 +check_proxy() { + local result=0 + local try_count=$(uci_get_by_type global switch_try_count 3) + for i in $(seq 1 $try_count); do + /usr/bin/ssr-check www.google.com 80 $switch_time 1 + if [ "$?" == "0" ]; then + # echolog "Check Google Proxy Success, count=$i" + result=0 + break + else + # echolog "Check Google Proxy Fail, count=$i" + /usr/bin/ssr-check www.baidu.com 80 $switch_time 1 + if [ "$?" == "0" ]; then + result=1 + else + result=2 + fi + fi + sleep 1 + done + return $result +} + +test_proxy() { + local servername=$(uci_get_by_name $1 server) + local serverport=$(uci_get_by_name $1 server_port) + ipset add whitelist $servername 2>/dev/null + tcping -q -c 3 -i 1 -t 2 -p $serverport $servername + if [ "$?" -gt "0" ]; then + ipset del whitelist $servername 2>/dev/null + return 1 + fi + /usr/bin/ssr-check $servername $serverport $switch_time + local ret=$? + ipset del whitelist $servername 2>/dev/null + if [ "$ret" == "0" ]; then + return 0 + else + return 1 + fi +} + +search_proxy() { + let server_count=server_count+1 + [ "$normal_flag" == "1" -a "$server_count" -le "$server_locate" ] && return 0 + [ "$(uci_get_by_name $1 switch_enable 0)" != "1" ] && return 1 + [ $ENABLE_SERVER != nil ] && return 0 + [ "$1" == "$CURRENT_SERVER" ] && return 0 + local servername=$(uci_get_by_name $1 server) + local serverport=$(uci_get_by_name $1 server_port) + ipset add whitelist $servername 2>/dev/null + /usr/bin/ssr-check $servername $serverport $switch_time + local ret=$? + ipset del whitelist $servername 2>/dev/null + if [ "$ret" == "0" ]; then + server_locate=$server_count + ENABLE_SERVER=$1 + return 0 + else + return 1 + fi +} + +#选择可用的代理 +select_proxy() { + config_load $NAME + ENABLE_SERVER=nil + mkdir -p /var/run /var/etc + server_count=0 + config_foreach search_proxy servers +} + +#切换代理 +switch_proxy() { + /etc/init.d/shadowsocksr restart $1 + return 0 +} + +start() { + #不支持kcptun启用时的切换 + [ $(uci_get_by_name $DEFAULT_SERVER kcp_enable) = "1" ] && return 1 + while [ "1" == "1" ]; do #死循环 + sleep 0000$cycle_time + LOGTIME=$(date "+%Y-%m-%d %H:%M:%S") + #判断当前代理是否为缺省服务器 + if [ "$CURRENT_SERVER" != "$DEFAULT_SERVER" ]; then + #echo "not default proxy" + echolog "Current server is not default Main server, try to switch back." + #检查缺省服务器是否正常 + if test_proxy $DEFAULT_SERVER; then + #echo "switch to default proxy" + echolog "Main server is avilable." + #缺省服务器正常,切换回来 + CURRENT_SERVER=$DEFAULT_SERVER + switch_proxy $CURRENT_SERVER + echolog "switch to default "$(uci_get_by_name $CURRENT_SERVER alias)" proxy!" + else + echolog "Main server is NOT avilable.Continue using current server." + fi + fi + #判断当前代理是否正常 + #echolog "Start checking if the current server is available." + check_proxy + current_ret=$? + if [ "$current_ret" == "1" ]; then + #当前代理错误,判断有无可用的服务器 + #echo "current error" + echolog "Current server error, try to switch another server." + select_proxy + if [ "$ENABLE_SERVER" != nil ]; then + #有其他服务器可用,进行切换 + #echo $(uci_get_by_name $new_proxy server) + echolog "Another server is avilable, now switching server." + CURRENT_SERVER=$ENABLE_SERVER + switch_proxy $CURRENT_SERVER + normal_flag=1 + echolog "Switch to "$(uci_get_by_name $CURRENT_SERVER alias)" proxy!" + else + switch_proxy $CURRENT_SERVER + normal_flag=1 + echolog "Try restart current server." + fi + else + normal_flag=0 + # echolog "ShadowsocksR No Problem." + fi + done +} diff --git a/luci-app-ssr-plus/root/usr/share/rpcd/acl.d/luci-app-ssr-plus.json b/luci-app-ssr-plus/root/usr/share/rpcd/acl.d/luci-app-ssr-plus.json new file mode 100644 index 00000000..2c381259 --- /dev/null +++ b/luci-app-ssr-plus/root/usr/share/rpcd/acl.d/luci-app-ssr-plus.json @@ -0,0 +1,11 @@ +{ + "luci-app-ssr-plus": { + "description": "Grant UCI access for luci-app-ssr-plus", + "read": { + "uci": ["shadowsocksr"] + }, + "write": { + "uci": ["shadowsocksr"] + } + } +} \ No newline at end of file diff --git a/luci-app-ssr-plus/root/usr/share/shadowsocksr/chinaipset.sh b/luci-app-ssr-plus/root/usr/share/shadowsocksr/chinaipset.sh new file mode 100755 index 00000000..4015644f --- /dev/null +++ b/luci-app-ssr-plus/root/usr/share/shadowsocksr/chinaipset.sh @@ -0,0 +1,7 @@ +#!/bin/sh +[ -f "$1" ] && china_ip=$1 +ipset -! flush china 2>/dev/null +ipset -! -R <<-EOF || exit 1 + create china hash:net + $(cat ${china_ip:=/etc/ssrplus/china_ssr.txt} | sed -e "s/^/add china /") +EOF diff --git a/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua b/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua new file mode 100755 index 00000000..332d51e5 --- /dev/null +++ b/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua @@ -0,0 +1,505 @@ +#!/usr/bin/lua + +local ucursor = require "luci.model.uci".cursor() +local json = require "luci.jsonc" + +local server_section = arg[1] +local proto = arg[2] +local local_port = arg[3] or "0" +local socks_port = arg[4] or "0" + +local chain = arg[5] or "0" +local chain_local_port = string.split(chain, "/")[2] or "0" + +local server = ucursor:get_all("shadowsocksr", server_section) +local outbound_settings = nil + +function vmess_vless() + outbound_settings = { + vnext = { + { + address = server.server, + port = tonumber(server.server_port), + users = { + { + id = server.vmess_id, + alterId = (server.v2ray_protocol == "vmess" or not server.v2ray_protocol) and tonumber(server.alter_id) or nil, + security = (server.v2ray_protocol == "vmess" or not server.v2ray_protocol) and server.security or nil, + encryption = (server.v2ray_protocol == "vless") and server.vless_encryption or nil, + flow = ((server.tls == '1') or (server.reality == '1')) and server.tls_flow or nil + } + } + } + } + } +end +function trojan_shadowsocks() + outbound_settings = { + servers = { + { + address = server.server, + port = tonumber(server.server_port), + password = server.password, + method = ((server.v2ray_protocol == "shadowsocks") and server.encrypt_method_ss) or nil, + uot = (server.v2ray_protocol == "shadowsocks") and (server.uot == '1') or nil, + ivCheck = (server.v2ray_protocol == "shadowsocks") and (server.ivCheck == '1') or nil, + } + } + } +end +function socks_http() + outbound_settings = { + version = server.socks_ver or nil, + servers = { + { + address = server.server, + port = tonumber(server.server_port), + users = (server.auth_enable == "1") and { + { + user = server.username, + pass = server.password + } + } or nil + } + } + } +end +function wireguard() + outbound_settings = { + secretKey = server.private_key, + address = server.local_addresses, + peers = { + { + publicKey = server.peer_pubkey, + preSharedKey = server.preshared_key, + endpoint = server.server .. ":" .. server.server_port + } + }, + mtu = tonumber(server.mtu) + } +end +local outbound = {} +function outbound:new(o) + o = o or {} + setmetatable(o, self) + self.__index = self + return o +end +function outbound:handleIndex(index) + local switch = { + vmess = function() + vmess_vless() + end, + vless = function() + vmess_vless() + end, + trojan = function() + trojan_shadowsocks() + end, + shadowsocks = function() + trojan_shadowsocks() + end, + socks = function() + socks_http() + end, + http = function() + socks_http() + end, + wireguard = function() + wireguard() + end + } + if switch[index] then + switch[index]() + end +end +local settings = outbound:new() +settings:handleIndex(server.v2ray_protocol) +local Xray = { + log = { + -- error = "/var/ssrplus.log", + loglevel = "warning" + }, + -- 传入连接 + inbound = (local_port ~= "0") and { + -- listening + port = tonumber(local_port), + protocol = "dokodemo-door", + settings = {network = proto, followRedirect = true}, + sniffing = {enabled = true, destOverride = {"http", "tls"}} + } or nil, + -- 开启 socks 代理 + inboundDetour = (proto:find("tcp") and socks_port ~= "0") and { + { + -- socks + protocol = "socks", + port = tonumber(socks_port), + settings = {auth = "noauth", udp = true} + } + } or nil, + -- 传出连接 + outbound = { + protocol = server.v2ray_protocol, + settings = outbound_settings, + -- 底层传输配置 + streamSettings = { + network = server.transport or "tcp", + security = (server.tls == '1') and "tls" or (server.reality == '1') and "reality" or nil, + tlsSettings = (server.tls == '1') and { + -- tls + alpn = server.tls_alpn, + fingerprint = server.fingerprint, + allowInsecure = (server.insecure == "1"), + serverName = server.tls_host, + certificates = server.certificate and { + usage = "verify", + certificateFile = server.certpath + } or nil + } or nil, + realitySettings = (server.reality == '1') and { + show = false, + publicKey = server.reality_publickey, + shortId = server.reality_shortid, + spiderX = server.reality_spiderx, + fingerprint = server.fingerprint, + serverName = server.tls_host + } or nil, + tcpSettings = (server.transport == "tcp" and server.tcp_guise == "http") and { + -- tcp + header = { + type = server.tcp_guise, + request = { + -- request + path = {server.http_path} or {"/"}, + headers = {Host = {server.http_host} or {}} + } + } + } or nil, + kcpSettings = (server.transport == "kcp") and { + mtu = tonumber(server.mtu), + tti = tonumber(server.tti), + uplinkCapacity = tonumber(server.uplink_capacity), + downlinkCapacity = tonumber(server.downlink_capacity), + congestion = (server.congestion == "1") and true or false, + readBufferSize = tonumber(server.read_buffer_size), + writeBufferSize = tonumber(server.write_buffer_size), + header = {type = server.kcp_guise}, + seed = server.seed or nil + } or nil, + wsSettings = (server.transport == "ws") and (server.ws_path or server.ws_host or server.tls_host) and { + -- ws + headers = (server.ws_host or server.tls_host) and { + -- headers + Host = server.ws_host or server.tls_host + } or nil, + path = server.ws_path, + maxEarlyData = tonumber(server.ws_ed) or nil, + earlyDataHeaderName = server.ws_ed_header or nil + } or nil, + httpSettings = (server.transport == "h2") and { + -- h2 + path = server.h2_path or "", + host = {server.h2_host} or nil, + read_idle_timeout = tonumber(server.read_idle_timeout) or nil, + health_check_timeout = tonumber(server.health_check_timeout) or nil + } or nil, + quicSettings = (server.transport == "quic") and { + -- quic + security = server.quic_security, + key = server.quic_key, + header = {type = server.quic_guise} + } or nil, + grpcSettings = (server.transport == "grpc") and { + -- grpc + serviceName = server.serviceName or "", + multiMode = (server.grpc_mode == "multi") and true or false, + idle_timeout = tonumber(server.idle_timeout) or nil, + health_check_timeout = tonumber(server.health_check_timeout) or nil, + permit_without_stream = (server.permit_without_stream == "1") and true or nil, + initial_windows_size = tonumber(server.initial_windows_size) or nil + } or nil + }, + mux = (server.mux == "1" and server.transport ~= "grpc") and { + -- mux + enabled = true, + concurrency = tonumber(server.concurrency) + } or nil + } or nil +} +local cipher = "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:AES128-SHA:AES256-SHA:DES-CBC3-SHA" +local cipher13 = "TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384" +local trojan = { + log_level = 3, + run_type = (proto == "nat" or proto == "tcp") and "nat" or "client", + local_addr = "0.0.0.0", + local_port = tonumber(local_port), + remote_addr = server.server, + remote_port = tonumber(server.server_port), + udp_timeout = 60, + -- 传入连接 + password = {server.password}, + -- 传出连接 + ssl = { + verify = (server.insecure == "0") and true or false, + verify_hostname = (server.tls == "1") and true or false, + cert = (server.certificate) and server.certpath or nil, + cipher = cipher, + cipher_tls13 = cipher13, + sni = server.tls_host, + alpn = server.tls_alpn or {"h2", "http/1.1"}, + curve = "", + reuse_session = true, + session_ticket = (server.tls_sessionTicket == "1") and true or false + }, + udp_timeout = 60, + tcp = { + -- tcp + no_delay = true, + keep_alive = true, + reuse_port = true, + fast_open = (server.fast_open == "1") and true or false, + fast_open_qlen = 20 + } +} +local naiveproxy = { + proxy = (server.username and server.password and server.server and server.server_port) and "https://" .. server.username .. ":" .. server.password .. "@" .. server.server .. ":" .. server.server_port, + listen = (proto == "redir") and "redir" .. "://0.0.0.0:" .. tonumber(local_port) or "socks" .. "://0.0.0.0:" .. tonumber(local_port), + ["insecure-concurrency"] = tonumber(server.concurrency) or 1 +} +local ss = { + server = (server.kcp_enable == "1") and "127.0.0.1" or server.server, + server_port = tonumber(server.server_port), + local_address = "0.0.0.0", + local_port = tonumber(local_port), + mode = (proto == "tcp,udp") and "tcp_and_udp" or proto .. "_only", + password = server.password, + method = server.encrypt_method_ss, + timeout = tonumber(server.timeout), + fast_open = (server.fast_open == "1") and true or false, + reuse_port = true +} +local hysteria = { + server = server.server_port and (server.server .. ":" .. server.server_port) or (server.server .. ":" .. server.port_range), + bandwidth = { + up = tonumber(server.uplink_capacity) and tonumber(server.uplink_capacity) .. " mbps" or nil, + down = tonumber(server.downlink_capacity) and tonumber(server.downlink_capacity) .. " mbps" or nil + }, + socks5 = (proto:find("tcp") and tonumber(socks_port) and tonumber(socks_port) ~= 0) and { + listen = "0.0.0.0:" .. tonumber(socks_port), + disable_udp = false + } or nil, + transport = { + type = server.transport_protocol, + udp = { + hopInterval = tonumber(server.hopinterval) and tonumber(server.hopinterval) .. "s" or nil + } + }, +--[[ + tcpTProxy = (proto:find("tcp") and local_port ~= "0") and { + listen = "0.0.0.0:" .. tonumber(local_port) +} or nil, +]] + tcpRedirect = (proto:find("tcp") and local_port ~= "0") and { + listen = "0.0.0.0:" .. tonumber(local_port) + } or nil, + udpTProxy = (proto:find("udp") and local_port ~= "0") and { + listen = "0.0.0.0:" .. tonumber(local_port) + } or nil, + obfs = (server.flag_obfs == "1") and { + type = server.obfs_type, + salamander = { password = server.salamander } + } or nil, + quic = (server.flag_quicparam == "1" ) and { + initStreamReceiveWindow = (server.initstreamreceivewindow and server.initstreamreceivewindow or nil), + maxStreamReceiveWindow = (server.maxstreamseceivewindow and server.maxstreamseceivewindow or nil), + initConnReceiveWindow = (server.initconnreceivewindow and server.initconnreceivewindow or nil), + maxConnReceiveWindow = (server.maxconnreceivewindow and server.maxconnreceivewindow or nil), + maxIdleTimeout = (tonumber(server.maxidletimeout) and tonumber(server.maxidletimeout) .. "s" or nil), + keepAlivePeriod = (tonumber(server.keepaliveperiod) and tonumber(server.keepaliveperiod) .. "s" or nil), + disable_mtu_discovery = (server.disablepathmtudiscovery == "1") and true or false + } or nil, + auth = server.hy2_auth, + tls = (server.tls_host) and { + sni = server.tls_host, + insecure = (server.insecure == "1") and true or false, + pinSHA256 = (server.insecure == "1") and server.pinsha256 or nil + } or { + sni = server.server, + insecure = (server.insecure == "1") and true or false + }, + fast_open = (server.fast_open == "1") and true or false, + lazy = (server.lazy_mode == "1") and true or false +} +local shadowtls = { + client = { + server_addr = server.server_port and server.server .. ":" .. server.server_port or nil, + listen = "127.0.0.1:" .. tonumber(local_port), + tls_names = server.shadowtls_sni, + password = server.password + }, + v3 = (server.shadowtls_protocol == "v3") and true or false, + disable_nodelay = (server.disable_nodelay == "1") and true or false, + fastopen = (server.fastopen == "1") and true or false, + strict = (server.strict == "1") and true or false +} +local chain_sslocal = { + locals = local_port ~= "0" and { + { + local_address = "0.0.0.0", + local_port = (chain_local_port == "0" and tonumber(server.local_port) or tonumber(chain_local_port)), + mode = (proto:find("tcp,udp") and "tcp_and_udp") or proto .. "_only", + protocol = "redir", + tcp_redir = "redirect", + --tcp_redir = "tproxy", + udp_redir = "tproxy" + }, + socks_port ~= "0" and { + protocol = "socks", + local_address = "0.0.0.0", + local_port = tonumber(socks_port) + } or nil + } or {{ + protocol = "socks", + local_address = "0.0.0.0", + ocal_port = tonumber(socks_port) + }}, + servers = { + { + server = "127.0.0.1", + server_port = (tonumber(local_port) == 0 and tonumber(chain_local_port) or tonumber(local_port)), + method = server.sslocal_method, + password = server.sslocal_password + } + } +} +local chain_vmess = { + inbounds = (local_port ~= "0") and { + { + port = (chain_local_port == "0" and tonumber(server.local_port) or tonumber(chain_local_port)), + protocol = "dokodemo-door", + settings = { + network = proto, + followRedirect = true + }, + streamSettings = { + sockopt = {tproxy = "redirect"} + }, + sniffing = { + enable = true, + destOverride = {"http","tls"} + } + }, + (proto:find("tcp") and socks_port ~= "0") and { + protocol = "socks", + port = tonumber(socks_port) + } or nil + } or { protocol = "socks",port = tonumber(socks_port) }, + outbound = { + protocol = "vmess", + settings = { + vnext = {{ + address = "127.0.0.1", + port = (tonumber(local_port) == 0 and tonumber(chain_local_port) or tonumber(local_port)), + users = {{ + id = (server.vmess_uuid), + security = server.vmess_method, + level = 0 + }} + }} + } + } +} +local tuic = { + relay = { + server = server.server_port and server.server .. ":" .. server.server_port, + ip = server.tuic_ip, + uuid = server.tuic_uuid, + password = server.tuic_passwd, + certificates = server.certificate and { server.certpath } or nil, + udp_relay_mode = server.udp_relay_mode, + congestion_control = server.congestion_control, + heartbeat = server.heartbeat and server.heartbeat .. "s" or nil, + timeout = server.timeout and server.timeout .. "s" or nil, + gc_interval = server.gc_interval and server.gc_interval .. "s" or nil, + gc_lifetime = server.gc_lifetime and server.gc_lifetime .. "s" or nil, + alpn = server.tls_alpn, + disable_sni = (server.disable_sni == "1") and true or false, + zero_rtt_handshake = (server.zero_rtt_handshake == "1") and true or false, + send_window = tonumber(server.send_window), + receive_window = tonumber(server.receive_window) + }, + ["local"] = { + server = tonumber(socks_port) and (server.tuic_dual_stack == "1" and "[::1]:" or "127.0.0.1:") .. (socks_port == "0" and local_port or tonumber(socks_port)), + dual_stack = (server.tuic_dual_stack == "1") and true or false, + max_packet_size = tonumber(server.tuic_max_package_size) + } +} +local config = {} +function config:new(o) + o = o or {} + setmetatable(o, self) + self.__index = self + return o +end +function config:handleIndex(index) + local switch = { + ss = function() + ss.protocol = socks_port + if server.plugin and server.plugin ~= "none" then + ss.plugin = server.plugin + ss.plugin_opts = server.plugin_opts or nil + end + print(json.stringify(ss, 1)) + end, + ssr = function() + ss.protocol = server.protocol + ss.protocol_param = server.protocol_param + ss.method = server.encrypt_method + ss.obfs = server.obfs + ss.obfs_param = server.obfs_param + print(json.stringify(ss, 1)) + end, + v2ray = function() + print(json.stringify(Xray, 1)) + end, + trojan = function() + print(json.stringify(trojan, 1)) + end, + naiveproxy = function() + print(json.stringify(naiveproxy, 1)) + end, + hysteria = function() + print(json.stringify(hysteria, 1)) + end, + shadowtls = function() + local chain_switch = { + sslocal = function() + if (chain:find("chain")) then + print(json.stringify(chain_sslocal, 1)) + else + print(json.stringify(shadowtls, 1)) + end + end, + vmess = function() + if (chain:find("chain")) then + print(json.stringify(chain_vmess, 1)) + else + print(json.stringify(shadowtls, 1)) + end + end + } + local ChainType = server.chain_type + if chain_switch[ChainType] then + chain_switch[ChainType]() + end + end, + tuic = function() + print(json.stringify(tuic, 1)) + end + } + if switch[index] then + switch[index]() + end +end +local f = config:new() +f:handleIndex(server.type) diff --git a/luci-app-ssr-plus/root/usr/share/shadowsocksr/genred2config.sh b/luci-app-ssr-plus/root/usr/share/shadowsocksr/genred2config.sh new file mode 100755 index 00000000..3750d3f9 --- /dev/null +++ b/luci-app-ssr-plus/root/usr/share/shadowsocksr/genred2config.sh @@ -0,0 +1,95 @@ +#!/bin/sh +argv1=$1 +argv2=$2 +argv3=$3 +argv4=$4 +argv5=$5 +argv6=$6 +argv7=$7 +argv8=$8 +argv9=$9 +cat <<-EOF >$argv1 + base { + log_debug = off; + log_info = off; + log = stderr; + daemon = on; + redirector = iptables; + reuseport = on; + } +EOF +tcp() { + if [ "$argv7" == "0" ]; then + cat <<-EOF >>$argv1 + redsocks { + bind = "0.0.0.0:$argv4"; + relay = "$argv5:$argv6"; + type = socks5; + autoproxy = 0; + timeout = 10; + } + EOF + else + cat <<-EOF >>$argv1 + redsocks { + bind = "0.0.0.0:$argv4"; + relay = "$argv5:$argv6"; + type = socks5; + autoproxy = 0; + timeout = 10; + login = "$argv8"; + password = "$argv9"; + } + EOF + fi +} +udp() { + if [ "$argv7" == "0" ]; then + cat <<-EOF >>$argv1 + redudp { + bind = "0.0.0.0:$argv4"; + relay = "$argv5:$argv6"; + type = socks5; + udp_timeout = 10; + } + EOF + else + cat <<-EOF >>$argv1 + redudp { + bind = "0.0.0.0:$argv4"; + relay = "$argv5:$argv6"; + type = socks5; + udp_timeout = 10; + login = "$argv8"; + password = "$argv9"; + } + EOF + fi +} +case "$argv2" in +socks5) + case "$argv3" in + tcp) + tcp + ;; + udp) + udp + ;; + *) + tcp + udp + ;; + esac + ;; +*) + cat <<-EOF >>$argv1 + redsocks { + bind = "0.0.0.0:$argv4"; + type = direct; + interface = $argv3; + autoproxy = 0; + timeout = 10; + } + EOF + ;; +esac diff --git a/luci-app-ssr-plus/root/usr/share/shadowsocksr/gfw2ipset.sh b/luci-app-ssr-plus/root/usr/share/shadowsocksr/gfw2ipset.sh new file mode 100755 index 00000000..66d2b255 --- /dev/null +++ b/luci-app-ssr-plus/root/usr/share/shadowsocksr/gfw2ipset.sh @@ -0,0 +1,47 @@ +#!/bin/sh +. $IPKG_INSTROOT/etc/init.d/shadowsocksr +netflix() { + if [ -f "$TMP_DNSMASQ_PATH/gfw_list.conf" ]; then + for line in $(cat /etc/ssrplus/netflix.list); do sed -i "/$line/d" $TMP_DNSMASQ_PATH/gfw_list.conf; done + for line in $(cat /etc/ssrplus/netflix.list); do sed -i "/$line/d" $TMP_DNSMASQ_PATH/gfw_base.conf; done + fi + cat /etc/ssrplus/netflix.list | sed '/^$/d' | sed '/#/d' | sed "/.*/s/.*/server=\/&\/127.0.0.1#$1\nipset=\/&\/netflix/" >$TMP_DNSMASQ_PATH/netflix_forward.conf +} +mkdir -p $TMP_DNSMASQ_PATH +if [ "$(uci_get_by_type global run_mode router)" == "oversea" ]; then + cp -rf /etc/ssrplus/oversea_list.conf $TMP_DNSMASQ_PATH/ +else + cp -rf /etc/ssrplus/gfw_list.conf $TMP_DNSMASQ_PATH/ + cp -rf /etc/ssrplus/gfw_base.conf $TMP_DNSMASQ_PATH/ +fi +case "$(uci_get_by_type global netflix_server nil)" in +nil) + rm -f $TMP_DNSMASQ_PATH/netflix_forward.conf + ;; +$(uci_get_by_type global global_server nil) | $switch_server | same) + netflix $dns_port + ;; +*) + netflix $tmp_shunt_dns_port + ;; +esac +for line in $(cat /etc/ssrplus/black.list); do sed -i "/$line/d" $TMP_DNSMASQ_PATH/gfw_list.conf; done +for line in $(cat /etc/ssrplus/black.list); do sed -i "/$line/d" $TMP_DNSMASQ_PATH/gfw_base.conf; done +for line in $(cat /etc/ssrplus/white.list); do sed -i "/$line/d" $TMP_DNSMASQ_PATH/gfw_list.conf; done +for line in $(cat /etc/ssrplus/white.list); do sed -i "/$line/d" $TMP_DNSMASQ_PATH/gfw_base.conf; done +for line in $(cat /etc/ssrplus/deny.list); do sed -i "/$line/d" $TMP_DNSMASQ_PATH/gfw_list.conf; done +for line in $(cat /etc/ssrplus/deny.list); do sed -i "/$line/d" $TMP_DNSMASQ_PATH/gfw_base.conf; done +cat /etc/ssrplus/black.list | sed '/^$/d' | sed '/#/d' | sed "/.*/s/.*/server=\/&\/127.0.0.1#$dns_port\nipset=\/&\/blacklist/" >$TMP_DNSMASQ_PATH/blacklist_forward.conf +cat /etc/ssrplus/white.list | sed '/^$/d' | sed '/#/d' | sed "/.*/s/.*/server=\/&\/127.0.0.1\nipset=\/&\/whitelist/" >$TMP_DNSMASQ_PATH/whitelist_forward.conf +cat /etc/ssrplus/deny.list | sed '/^$/d' | sed '/#/d' | sed "/.*/s/.*/address=\/&\//" >$TMP_DNSMASQ_PATH/denylist.conf +if [ "$(uci_get_by_type global adblock 0)" == "1" ]; then + cp -f /etc/ssrplus/ad.conf $TMP_DNSMASQ_PATH/ + if [ -f "$TMP_DNSMASQ_PATH/ad.conf" ]; then + for line in $(cat /etc/ssrplus/black.list); do sed -i "/$line/d" $TMP_DNSMASQ_PATH/ad.conf; done + for line in $(cat /etc/ssrplus/white.list); do sed -i "/$line/d" $TMP_DNSMASQ_PATH/ad.conf; done + for line in $(cat /etc/ssrplus/deny.list); do sed -i "/$line/d" $TMP_DNSMASQ_PATH/ad.conf; done + for line in $(cat /etc/ssrplus/netflix.list); do sed -i "/$line/d" $TMP_DNSMASQ_PATH/ad.conf; done + fi +else + rm -f $TMP_DNSMASQ_PATH/ad.conf +fi diff --git a/luci-app-ssr-plus/root/usr/share/shadowsocksr/ssrplusupdate.sh b/luci-app-ssr-plus/root/usr/share/shadowsocksr/ssrplusupdate.sh new file mode 100755 index 00000000..9424cfac --- /dev/null +++ b/luci-app-ssr-plus/root/usr/share/shadowsocksr/ssrplusupdate.sh @@ -0,0 +1,6 @@ +#!/bin/sh +/usr/bin/lua /usr/share/shadowsocksr/update.lua +sleep 2s +/usr/share/shadowsocksr/chinaipset.sh /var/etc/ssrplus/china_ssr.txt +sleep 2s +/usr/bin/lua /usr/share/shadowsocksr/subscribe.lua diff --git a/luci-app-ssr-plus/root/usr/share/shadowsocksr/subscribe.lua b/luci-app-ssr-plus/root/usr/share/shadowsocksr/subscribe.lua new file mode 100755 index 00000000..219f06ac --- /dev/null +++ b/luci-app-ssr-plus/root/usr/share/shadowsocksr/subscribe.lua @@ -0,0 +1,628 @@ +#!/usr/bin/lua + +------------------------------------------------ +-- This file is part of the luci-app-ssr-plus subscribe.lua +-- @author William Chan +------------------------------------------------ +require "luci.model.uci" +require "nixio" +require "luci.util" +require "luci.sys" +require "luci.jsonc" +require "luci.model.ipkg" +-- these global functions are accessed all the time by the event handler +-- so caching them is worth the effort +local tinsert = table.insert +local ssub, slen, schar, sbyte, sformat, sgsub = string.sub, string.len, string.char, string.byte, string.format, string.gsub +local jsonParse, jsonStringify = luci.jsonc.parse, luci.jsonc.stringify +local b64decode = nixio.bin.b64decode +local URL = require "url" +local cache = {} +local nodeResult = setmetatable({}, {__index = cache}) -- update result +local name = 'shadowsocksr' +local uciType = 'servers' +local ucic = luci.model.uci.cursor() +local proxy = ucic:get_first(name, 'server_subscribe', 'proxy', '0') +local switch = ucic:get_first(name, 'server_subscribe', 'switch', '1') +local subscribe_url = ucic:get_first(name, 'server_subscribe', 'subscribe_url', {}) +local filter_words = ucic:get_first(name, 'server_subscribe', 'filter_words', '过期时间/剩余流量') +local save_words = ucic:get_first(name, 'server_subscribe', 'save_words', '') +local v2_ss = luci.sys.exec('type -t -p ss-redir sslocal') ~= "" and "ss" or "v2ray" +local v2_tj = luci.sys.exec('type -t -p trojan') ~= "" and "trojan" or "v2ray" +local log = function(...) + print(os.date("%Y-%m-%d %H:%M:%S ") .. table.concat({...}, " ")) +end +local encrypt_methods_ss = { + -- plain + "none", + "plain", + -- aead + "aes-128-gcm", + "aes-192-gcm", + "aes-256-gcm", + "chacha20-ietf-poly1305", + "xchacha20-ietf-poly1305", + -- aead 2022 + "2022-blake3-aes-128-gcm", + "2022-blake3-aes-256-gcm", + "2022-blake3-chacha20-poly1305" + --[[ stream + "table", + "rc4", + "rc4-md5", + "aes-128-cfb", + "aes-192-cfb", + "aes-256-cfb", + "aes-128-ctr", + "aes-192-ctr", + "aes-256-ctr", + "bf-cfb", + "camellia-128-cfb", + "camellia-192-cfb", + "camellia-256-cfb", + "salsa20", + "chacha20", + "chacha20-ietf" ]] +} +-- 分割字符串 +local function split(full, sep) + full = full:gsub("%z", "") -- 这里不是很清楚 有时候结尾带个\0 + local off, result = 1, {} + while true do + local nStart, nEnd = full:find(sep, off) + if not nEnd then + local res = ssub(full, off, slen(full)) + if #res > 0 then -- 过滤掉 \0 + tinsert(result, res) + end + break + else + tinsert(result, ssub(full, off, nStart - 1)) + off = nEnd + 1 + end + end + return result +end +-- urlencode +local function get_urlencode(c) + return sformat("%%%02X", sbyte(c)) +end + +local function urlEncode(szText) + local str = szText:gsub("([^0-9a-zA-Z ])", get_urlencode) + str = str:gsub(" ", "+") + return str +end + +local function get_urldecode(h) + return schar(tonumber(h, 16)) +end +local function UrlDecode(szText) + return szText:gsub("+", " "):gsub("%%(%x%x)", get_urldecode) +end + +-- trim +local function trim(text) + if not text or text == "" then + return "" + end + return (sgsub(text, "^%s*(.-)%s*$", "%1")) +end +-- md5 +local function md5(content) + local stdout = luci.sys.exec('echo \"' .. urlEncode(content) .. '\" | md5sum | cut -d \" \" -f1') + -- assert(nixio.errno() == 0) + return trim(stdout) +end +-- base64 +local function base64Decode(text) + local raw = text + if not text then + return '' + end + text = text:gsub("%z", "") + text = text:gsub("_", "/") + text = text:gsub("-", "+") + local mod4 = #text % 4 + text = text .. string.sub('====', mod4 + 1) + local result = b64decode(text) + if result then + return result:gsub("%z", "") + else + return raw + end +end +-- 检查数组(table)中是否存在某个字符值 +-- https://www.04007.cn/article/135.html +local function checkTabValue(tab) + local revtab = {} + for k,v in pairs(tab) do + revtab[v] = true + end + return revtab +end +-- 处理数据 +local function processData(szType, content) + local result = {type = szType, local_port = 1234, kcp_param = '--nocomp'} + if szType == 'ssr' then + local dat = split(content, "/%?") + local hostInfo = split(dat[1], ':') + result.type = 'ssr' + result.server = hostInfo[1] + result.server_port = hostInfo[2] + result.protocol = hostInfo[3] + result.encrypt_method = hostInfo[4] + result.obfs = hostInfo[5] + result.password = base64Decode(hostInfo[6]) + local params = {} + for _, v in pairs(split(dat[2], '&')) do + local t = split(v, '=') + params[t[1]] = t[2] + end + result.obfs_param = base64Decode(params.obfsparam) + result.protocol_param = base64Decode(params.protoparam) + local group = base64Decode(params.group) + if group then + result.alias = "[" .. group .. "] " + end + result.alias = result.alias .. base64Decode(params.remarks) + elseif szType == 'vmess' then + local info = jsonParse(content) + result.type = 'v2ray' + result.v2ray_protocol = 'vmess' + result.server = info.add + result.server_port = info.port + result.transport = info.net + result.alter_id = info.aid + result.vmess_id = info.id + result.alias = info.ps + -- result.mux = 1 + -- result.concurrency = 8 + if info.net == 'ws' then + result.ws_host = info.host + result.ws_path = info.path + end + if info.net == 'h2' then + result.h2_host = info.host + result.h2_path = info.path + end + if info.net == 'tcp' then + if info.type and info.type ~= "http" then + info.type = "none" + end + result.tcp_guise = info.type + result.http_host = info.host + result.http_path = info.path + end + if info.net == 'kcp' then + result.kcp_guise = info.type + result.mtu = 1350 + result.tti = 50 + result.uplink_capacity = 5 + result.downlink_capacity = 20 + result.read_buffer_size = 2 + result.write_buffer_size = 2 + end + if info.net == 'grpc' then + if info.path then + result.serviceName = info.path + elseif info.serviceName then + result.serviceName = info.serviceName + end + end + if info.net == 'quic' then + result.quic_guise = info.type + result.quic_key = info.key + result.quic_security = info.securty + end + if info.security then + result.security = info.security + end + if info.tls == "tls" or info.tls == "1" then + result.tls = "1" + if info.sni and info.sni ~= "" then + result.tls_host = info.sni + elseif info.host then + result.tls_host = info.host + end + result.insecure = 1 + else + result.tls = "0" + end + elseif szType == "ss" then + local idx_sp = 0 + local alias = "" + if content:find("#") then + idx_sp = content:find("#") + alias = content:sub(idx_sp + 1, -1) + end + local info = content:sub(1, idx_sp - 1) + local hostInfo = split(base64Decode(info), "@") + local host = split(hostInfo[2], ":") + local userinfo = base64Decode(hostInfo[1]) + local method = userinfo:sub(1, userinfo:find(":") - 1) + local password = userinfo:sub(userinfo:find(":") + 1, #userinfo) + result.alias = UrlDecode(alias) + result.type = v2_ss + result.v2ray_protocol = (v2_ss == "v2ray") and "shadowsocks" or nil + result.encrypt_method_ss = method + result.password = password + result.server = host[1] + if host[2]:find("/%?") then + local query = split(host[2], "/%?") + result.server_port = query[1] + local params = {} + for _, v in pairs(split(query[2], '&')) do + local t = split(v, '=') + params[t[1]] = t[2] + end + if params.plugin then + local plugin_info = UrlDecode(params.plugin) + local idx_pn = plugin_info:find(";") + if idx_pn then + result.plugin = plugin_info:sub(1, idx_pn - 1) + result.plugin_opts = plugin_info:sub(idx_pn + 1, #plugin_info) + else + result.plugin = plugin_info + end + -- 部分机场下发的插件名为 simple-obfs,这里应该改为 obfs-local + if result.plugin == "simple-obfs" then + result.plugin = "obfs-local" + end + end + else + result.server_port = host[2]:gsub("/","") + end + if not checkTabValue(encrypt_methods_ss)[method] then + -- 1202 年了还不支持 SS AEAD 的屑机场 + result.server = nil + end + elseif szType == "sip008" then + result.type = v2_ss + result.v2ray_protocol = (v2_ss == "v2ray") and "shadowsocks" or nil + result.server = content.server + result.server_port = content.server_port + result.password = content.password + result.encrypt_method_ss = content.method + result.plugin = content.plugin + result.plugin_opts = content.plugin_opts + result.alias = content.remarks + if not checkTabValue(encrypt_methods_ss)[content.method] then + result.server = nil + end + elseif szType == "ssd" then + result.type = v2_ss + result.v2ray_protocol = (v2_ss == "v2ray") and "shadowsocks" or nil + result.server = content.server + result.server_port = content.port + result.password = content.password + result.encrypt_method_ss = content.method + result.plugin_opts = content.plugin_options + result.alias = "[" .. content.airport .. "] " .. content.remarks + if content.plugin == "simple-obfs" then + result.plugin = "obfs-local" + else + result.plugin = content.plugin + end + if not checkTabValue(encrypt_methods_ss)[content.encryption] then + result.server = nil + end + elseif szType == "trojan" then + local idx_sp = 0 + local alias = "" + if content:find("#") then + idx_sp = content:find("#") + alias = content:sub(idx_sp + 1, -1) + end + local info = content:sub(1, idx_sp - 1) + local hostInfo = split(info, "@") + local host = split(hostInfo[2], ":") + local userinfo = hostInfo[1] + local password = userinfo + result.alias = UrlDecode(alias) + result.type = v2_tj + result.v2ray_protocol = "trojan" + result.server = host[1] + -- 按照官方的建议 默认验证ssl证书 + result.insecure = "0" + result.tls = "1" + if host[2]:find("?") then + local query = split(host[2], "?") + result.server_port = query[1] + local params = {} + for _, v in pairs(split(query[2], '&')) do + local t = split(v, '=') + params[t[1]] = t[2] + end + if params.sni then + -- 未指定peer(sni)默认使用remote addr + result.tls_host = params.sni + end + else + result.server_port = host[2] + end + result.password = password + elseif szType == "vless" then + local url = URL.parse("http://" .. content) + local params = url.query + + result.alias = url.fragment and UrlDecode(url.fragment) or nil + result.type = "v2ray" + result.v2ray_protocol = "vless" + result.server = url.host + result.server_port = url.port + result.vmess_id = url.user + result.vless_encryption = params.encryption or "none" + result.transport = params.type or "tcp" + result.tls = (params.security == "tls" or params.security == "xtls") and "1" or "0" + result.tls_host = params.sni + result.tls_flow = (params.security == "tls" or params.security == "reality") and params.flow or nil + result.fingerprint = params.fp + result.reality = (params.security == "reality") and "1" or "0" + result.reality_publickey = params.pbk and UrlDecode(params.pbk) or nil + result.reality_shortid = params.sid + result.reality_spiderx = params.spx and UrlDecode(params.spx) or nil + if result.transport == "ws" then + result.ws_host = (result.tls ~= "1") and (params.host and UrlDecode(params.host)) or nil + result.ws_path = params.path and UrlDecode(params.path) or "/" + -- make it compatible with bullshit, "h2" transport is non-existent at all + elseif result.transport == "http" or result.transport == "h2" then + result.transport = "h2" + result.h2_host = params.host and UrlDecode(params.host) or nil + result.h2_path = params.path and UrlDecode(params.path) or nil + elseif result.transport == "kcp" then + result.kcp_guise = params.headerType or "none" + result.seed = params.seed + result.mtu = 1350 + result.tti = 50 + result.uplink_capacity = 5 + result.downlink_capacity = 20 + result.read_buffer_size = 2 + result.write_buffer_size = 2 + elseif result.transport == "quic" then + result.quic_guise = params.headerType or "none" + result.quic_security = params.quicSecurity or "none" + result.quic_key = params.key + elseif result.transport == "grpc" then + result.serviceName = params.serviceName + result.grpc_mode = params.mode or "gun" + elseif result.transport == "tcp" then + result.tcp_guise = params.headerType or "none" + if result.tcp_guise == "http" then + result.tcp_host = params.host and UrlDecode(params.host) or nil + result.tcp_path = params.path and UrlDecode(params.path) or nil + end + end + end + if not result.alias then + if result.server and result.server_port then + result.alias = result.server .. ':' .. result.server_port + else + result.alias = "NULL" + end + end + -- alias 不参与 hashkey 计算 + local alias = result.alias + result.alias = nil + local switch_enable = result.switch_enable + result.switch_enable = nil + result.hashkey = md5(jsonStringify(result)) + result.alias = alias + result.switch_enable = switch_enable + return result +end +-- wget +local function wget(url) + local stdout = luci.sys.exec('wget -q --user-agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36" --no-check-certificate -O- "' .. url .. '"') + return trim(stdout) +end + +local function check_filer(result) + do + -- 过滤的关键词列表 + local filter_word = split(filter_words, "/") + -- 保留的关键词列表 + local check_save = false + if save_words ~= nil and save_words ~= "" and save_words ~= "NULL" then + check_save = true + end + local save_word = split(save_words, "/") + + -- 检查结果 + local filter_result = false + local save_result = true + + -- 检查是否存在过滤关键词 + for i, v in pairs(filter_word) do + if tostring(result.alias):find(v, nil, true) then + filter_result = true + end + end + + -- 检查是否打开了保留关键词检查,并且进行过滤 + if check_save == true then + for i, v in pairs(save_word) do + if tostring(result.alias):find(v, nil, true) then + save_result = false + end + end + else + save_result = false + end + + -- 不等时返回 + if filter_result == true or save_result == true then + return true + else + return false + end + end +end + +local execute = function() + -- exec + do + if proxy == '0' then -- 不使用代理更新的话先暂停 + log('服务正在暂停') + luci.sys.init.stop(name) + end + for k, url in ipairs(subscribe_url) do + local raw = wget(url) + if #raw > 0 then + local nodes, szType + local groupHash = md5(url) + cache[groupHash] = {} + tinsert(nodeResult, {}) + local index = #nodeResult + -- SSD 似乎是这种格式 ssd:// 开头的 + if raw:find('ssd://') then + szType = 'ssd' + local nEnd = select(2, raw:find('ssd://')) + nodes = base64Decode(raw:sub(nEnd + 1, #raw)) + nodes = jsonParse(nodes) + local extra = {airport = nodes.airport, port = nodes.port, encryption = nodes.encryption, password = nodes.password} + local servers = {} + -- SS里面包着 干脆直接这样 + for _, server in ipairs(nodes.servers) do + tinsert(servers, setmetatable(server, {__index = extra})) + end + nodes = servers + -- SS SIP008 直接使用 Json 格式 + elseif jsonParse(raw) then + nodes = jsonParse(raw).servers or jsonParse(raw) + if nodes[1].server and nodes[1].method then + szType = 'sip008' + end + else + -- ssd 外的格式 + nodes = split(base64Decode(raw):gsub(" ", "_"), "\n") + end + for _, v in ipairs(nodes) do + if v then + local result + if szType then + result = processData(szType, v) + elseif not szType then + local node = trim(v) + local dat = split(node, "://") + if dat and dat[1] and dat[2] then + local dat3 = "" + if dat[3] then + dat3 = "://" .. dat[3] + end + if dat[1] == 'ss' or dat[1] == 'trojan' then + result = processData(dat[1], dat[2] .. dat3) + else + result = processData(dat[1], base64Decode(dat[2])) + end + end + else + log('跳过未知类型: ' .. szType) + end + -- log(result) + if result then + -- 中文做地址的 也没有人拿中文域名搞,就算中文域也有Puny Code SB 机场 + if not result.server or not result.server_port or result.alias == "NULL" or check_filer(result) or result.server:match("[^0-9a-zA-Z%-_%.%s]") or cache[groupHash][result.hashkey] then + log('丢弃无效节点: ' .. result.type .. ' 节点, ' .. result.alias) + else + -- log('成功解析: ' .. result.type ..' 节点, ' .. result.alias) + result.grouphashkey = groupHash + tinsert(nodeResult[index], result) + cache[groupHash][result.hashkey] = nodeResult[index][#nodeResult[index]] + end + end + end + end + log('成功解析节点数量: ' .. #nodes) + else + log(url .. ': 获取内容为空') + end + end + end + -- diff + do + if next(nodeResult) == nil then + log("更新失败,没有可用的节点信息") + if proxy == '0' then + luci.sys.init.start(name) + log('订阅失败, 恢复服务') + end + return + end + local add, del = 0, 0 + ucic:foreach(name, uciType, function(old) + if old.grouphashkey or old.hashkey then -- 没有 hash 的不参与删除 + if not nodeResult[old.grouphashkey] or not nodeResult[old.grouphashkey][old.hashkey] then + ucic:delete(name, old['.name']) + del = del + 1 + else + local dat = nodeResult[old.grouphashkey][old.hashkey] + ucic:tset(name, old['.name'], dat) + -- 标记一下 + setmetatable(nodeResult[old.grouphashkey][old.hashkey], {__index = {_ignore = true}}) + end + else + if not old.alias then + if old.server or old.server_port then + old.alias = old.server .. ':' .. old.server_port + log('忽略手动添加的节点: ' .. old.alias) + else + ucic:delete(name, old['.name']) + end + else + log('忽略手动添加的节点: ' .. old.alias) + end + end + end) + for k, v in ipairs(nodeResult) do + for kk, vv in ipairs(v) do + if not vv._ignore then + local section = ucic:add(name, uciType) + ucic:tset(name, section, vv) + ucic:set(name, section, "switch_enable", switch) + add = add + 1 + end + end + end + ucic:commit(name) + -- 如果原有服务器节点已经不见了就尝试换为第一个节点 + local globalServer = ucic:get_first(name, 'global', 'global_server', '') + if globalServer ~= "nil" then + local firstServer = ucic:get_first(name, uciType) + if firstServer then + if not ucic:get(name, globalServer) then + luci.sys.call("/etc/init.d/" .. name .. " stop > /dev/null 2>&1 &") + ucic:commit(name) + ucic:set(name, ucic:get_first(name, 'global'), 'global_server', ucic:get_first(name, uciType)) + ucic:commit(name) + log('当前主服务器节点已被删除,正在自动更换为第一个节点。') + luci.sys.call("/etc/init.d/" .. name .. " start > /dev/null 2>&1 &") + else + log('维持当前主服务器节点。') + luci.sys.call("/etc/init.d/" .. name .. " restart > /dev/null 2>&1 &") + end + else + log('没有服务器节点了,停止服务') + luci.sys.call("/etc/init.d/" .. name .. " stop > /dev/null 2>&1 &") + end + end + log('新增节点数量: ' .. add, '删除节点数量: ' .. del) + log('订阅更新成功') + end +end + +if subscribe_url and #subscribe_url > 0 then + xpcall(execute, function(e) + log(e) + log(debug.traceback()) + log('发生错误, 正在恢复服务') + local firstServer = ucic:get_first(name, uciType) + if firstServer then + luci.sys.call("/etc/init.d/" .. name .. " restart > /dev/null 2>&1 &") -- 不加&的话日志会出现的更早 + log('重启服务成功') + else + luci.sys.call("/etc/init.d/" .. name .. " stop > /dev/null 2>&1 &") -- 不加&的话日志会出现的更早 + log('停止服务成功') + end + end) +end diff --git a/luci-app-ssr-plus/root/usr/share/shadowsocksr/update.lua b/luci-app-ssr-plus/root/usr/share/shadowsocksr/update.lua new file mode 100755 index 00000000..e49825ef --- /dev/null +++ b/luci-app-ssr-plus/root/usr/share/shadowsocksr/update.lua @@ -0,0 +1,198 @@ +#!/usr/bin/lua + +------------------------------------------------ +-- This file is part of the luci-app-ssr-plus update.lua +-- By Mattraks +------------------------------------------------ +require "luci.sys" +require "luci.model.uci" +local icount = 0 +local args = arg[1] +local uci = luci.model.uci.cursor() +local TMP_DNSMASQ_PATH = "/tmp/dnsmasq.d/dnsmasq-ssrplus.d" +local TMP_PATH = "/var/etc/ssrplus" +-- match comments/title/whitelist/ip address/excluded_domain +local comment_pattern = "^[!\\[@]+" +local ip_pattern = "^%d+%.%d+%.%d+%.%d+" +local domain_pattern = "([%w%-%_]+%.[%w%.%-%_]+)[%/%*]*" +local excluded_domain = {"apple.com", "sina.cn", "sina.com.cn", "baidu.com", "byr.cn", "jlike.com", "weibo.com", "zhongsou.com", "youdao.com", "sogou.com", "so.com", "soso.com", "aliyun.com", "taobao.com", "jd.com", "qq.com"} +-- gfwlist parameter +local mydnsip = '127.0.0.1' +local mydnsport = '5335' +local ipsetname = 'gfwlist' +local bc = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' +-- base64decoding +local function base64_dec(data) + data = string.gsub(data, '[^' .. bc .. '=]', '') + return (data:gsub('.', function(x) + if (x == '=') then + return '' + end + local r, f = '', (bc:find(x) - 1) + for i = 6, 1, -1 do + r = r .. (f % 2 ^ i - f % 2 ^ (i - 1) > 0 and '1' or '0') + end + return r; + end):gsub('%d%d%d?%d?%d?%d?%d?%d?', function(x) + if (#x ~= 8) then + return '' + end + local c = 0 + for i = 1, 8 do + c = c + (x:sub(i, i) == '1' and 2 ^ (8 - i) or 0) + end + return string.char(c) + end)) +end +-- check excluded domain +local function check_excluded_domain(value) + for k, v in ipairs(excluded_domain) do + if value:find(v) then + return true + end + end +end +-- gfwlist转码至dnsmasq格式 +local function generate_gfwlist(type) + local domains = {} + local out = io.open("/tmp/ssr-update." .. type, "w") + for line in io.lines("/tmp/ssr-update.tmp") do + if not (string.find(line, comment_pattern) or string.find(line, ip_pattern) or check_excluded_domain(line)) then + local start, finish, match = string.find(line, domain_pattern) + if (start) then + domains[match] = true + end + end + end + for k, v in pairs(domains) do + out:write(string.format("server=/%s/%s#%s\n", k, mydnsip, mydnsport)) + out:write(string.format("ipset=/%s/%s\n", k, ipsetname)) + end + out:close() + os.remove("/tmp/ssr-update.tmp") +end + +-- adblock转码至dnsmasq格式 +local function generate_adblock(type) + local domains = {} + local out = io.open("/tmp/ssr-update." .. type, "w") + for line in io.lines("/tmp/ssr-update.tmp") do + if not (string.find(line, comment_pattern)) then + local start, finish, match = string.find(line, domain_pattern) + if (start) then + domains[match] = true + end + end + end + for k, v in pairs(domains) do + out:write(string.format("address=/%s/\n", k)) + end + out:close() + os.remove("/tmp/ssr-update.tmp") +end + +local log = function(...) + if args then + print("{ret=" .. table.concat({...}, ",retcount=") .. "}") + else + print(os.date("%Y-%m-%d %H:%M:%S ") .. table.concat({...}, " ")) + end +end + +local function update(url, file, type, file2) + local Num = 1 + local refresh_cmd = "wget --no-check-certificate -q -O /tmp/ssr-update." .. type .. " " .. url + local sret = luci.sys.call(refresh_cmd) + if sret == 0 then + if type == "gfw_data" then + local gfwlist = io.open("/tmp/ssr-update." .. type, "r") + local decode = gfwlist:read("*a") + if not decode:find("google") then + decode = base64_dec(decode) + end + gfwlist:close() + -- 写回gfwlist + gfwlist = io.open("/tmp/ssr-update.tmp", "w") + gfwlist:write(decode) + gfwlist:close() + generate_gfwlist(type) + Num = 2 + end + if type == "ad_data" then + local adblock = io.open("/tmp/ssr-update." .. type, "r") + local decode = adblock:read("*a") + if decode:find("address=") then + adblock:close() + else + adblock:close() + -- 写回adblock + adblock = io.open("/tmp/ssr-update.tmp", "w") + adblock:write(decode) + adblock:close() + generate_adblock(type) + end + end + local new_md5 = luci.sys.exec("echo -n $([ -f '/tmp/ssr-update." .. type .. "' ] && md5sum /tmp/ssr-update." .. type .. " | awk '{print $1}')") + local old_md5 = luci.sys.exec("echo -n $([ -f '" .. file .. "' ] && md5sum " .. file .. " | awk '{print $1}')") + if new_md5 == old_md5 then + if args then + log(1) + else + log("你已经是最新数据,无需更新!") + end + else + icount = luci.sys.exec("cat /tmp/ssr-update." .. type .. " | wc -l") + luci.sys.exec("cp -f /tmp/ssr-update." .. type .. " " .. file) + if file2 then + luci.sys.exec("cp -f /tmp/ssr-update." .. type .. " " .. file2) + end + if type == "gfw_data" or type == "ad_data" then + luci.sys.call("/usr/share/shadowsocksr/gfw2ipset.sh") + else + luci.sys.call("/usr/share/shadowsocksr/chinaipset.sh " .. TMP_PATH .. "/china_ssr.txt") + end + if args then + log(0, tonumber(icount) / Num) + else + log("更新成功! 新的总纪录数:" .. tostring(tonumber(icount) / Num)) + end + end + else + if args then + log(-1) + else + log("更新失败!") + end + end + os.remove("/tmp/ssr-update." .. type) +end + +if args then + if args == "gfw_data" then + update(uci:get_first("shadowsocksr", "global", "gfwlist_url"), "/etc/ssrplus/gfw_list.conf", args, TMP_DNSMASQ_PATH .. "/gfw_list.conf") + os.exit(0) + end + if args == "ip_data" then + update(uci:get_first("shadowsocksr", "global", "chnroute_url"), "/etc/ssrplus/china_ssr.txt", args, TMP_PATH .. "/china_ssr.txt") + os.exit(0) + end + if args == "ad_data" then + update(uci:get_first("shadowsocksr", "global", "adblock_url"), "/etc/ssrplus/ad.conf", args, TMP_DNSMASQ_PATH .. "/ad.conf") + os.exit(0) + end + if args == "nfip_data" then + update(uci:get_first("shadowsocksr", "global", "nfip_url"), "/etc/ssrplus/netflixip.list", args) + os.exit(0) + end +else + log("正在更新【GFW列表】数据库") + update(uci:get_first("shadowsocksr", "global", "gfwlist_url"), "/etc/ssrplus/gfw_list.conf", "gfw_data", TMP_DNSMASQ_PATH .. "/gfw_list.conf") + log("正在更新【国内IP段】数据库") + update(uci:get_first("shadowsocksr", "global", "chnroute_url"), "/etc/ssrplus/china_ssr.txt", "ip_data", TMP_PATH .. "/china_ssr.txt") + if uci:get_first("shadowsocksr", "global", "adblock", "0") == "1" then + log("正在更新【广告屏蔽】数据库") + update(uci:get_first("shadowsocksr", "global", "adblock_url"), "/etc/ssrplus/ad.conf", "ad_data", TMP_DNSMASQ_PATH .. "/ad.conf") + end + -- log("正在更新【Netflix IP段】数据库") + -- update(uci:get_first("shadowsocksr", "global", "nfip_url"), "/etc/ssrplus/netflixip.list", "nfip_data") +end diff --git a/luci-app-unblockneteasemusic b/luci-app-unblockneteasemusic deleted file mode 160000 index 375cf4c1..00000000 --- a/luci-app-unblockneteasemusic +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 375cf4c122fa124b587ef561ad30d6934ece1316 diff --git a/luci-app-unblockneteasemusic/.github/ISSUE_TEMPLATE/bug-report.yml b/luci-app-unblockneteasemusic/.github/ISSUE_TEMPLATE/bug-report.yml new file mode 100644 index 00000000..3e58fee2 --- /dev/null +++ b/luci-app-unblockneteasemusic/.github/ISSUE_TEMPLATE/bug-report.yml @@ -0,0 +1,58 @@ +name: Bug 报告 +description: 在使用过程中遇到错误或非预期行为。 +labels: + - bug +body: + - type: textarea + id: description + attributes: + label: Bug 描述 + description: 简明地描述您所遇到的 Bug。 + validations: + required: true + - type: textarea + id: expected + attributes: + label: 预期行为 + description: 简明地描述您所希望发生的行为。 + - type: textarea + id: behaviour + attributes: + label: 实际行为 + description: 简明地描述实际发生的行为。 + - type: textarea + id: reproduce + attributes: + label: 复现步骤 + description: 复现报告行为的步骤。 + - type: textarea + id: debug-log + attributes: + label: 调试报告 + description: | + 使用下面的命令打印调试报告,以便我们排查问题。请注意,您只需贴上最后的链接,不必复制整个输出。 + 如果您使用 JavaScript 版本的插件,可以直接在 `状态信息` 中点击 `打印报告`。 + ```/usr/bin/unm-debug``` + validations: + required: true + - type: textarea + id: additional + attributes: + label: 其他信息 + description: 其他任何您认为有意义的信息。 + - type: checkboxes + id: terms + attributes: + label: 条款 + description: 提交此 issue 即表明您同意以下条款。 + options: + - label: 我确认我使用的插件是由 UnblockNeteaseMusic 项目或 ImmortalWrt 项目官方发行。 + required: true + - label: 我确认我已经升级到了最新的插件版本(包括核心和插件)。 + required: true + - label: 我确认我安装了正确版本的插件(基于 lua 语言的 LuCI 只能使用 2.x 版本)。 + required: true + - label: 我确认我没有混用 iptables 和 nftables 规则。 + required: true + - label: 我确认我已经在对应的客户端正确安装了 CA 证书。 + required: true diff --git a/luci-app-unblockneteasemusic/.github/ISSUE_TEMPLATE/config.yml b/luci-app-unblockneteasemusic/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..bd9dfe4e --- /dev/null +++ b/luci-app-unblockneteasemusic/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,2 @@ +--- +blank_issues_enabled: false diff --git a/luci-app-unblockneteasemusic/.github/ISSUE_TEMPLATE/feature-request.yml b/luci-app-unblockneteasemusic/.github/ISSUE_TEMPLATE/feature-request.yml new file mode 100644 index 00000000..94c654a5 --- /dev/null +++ b/luci-app-unblockneteasemusic/.github/ISSUE_TEMPLATE/feature-request.yml @@ -0,0 +1,27 @@ +name: 功能请求 +description: 请求加入新的功能以满足您的日常使用所需。 +labels: + - enhancement +body: + - type: textarea + id: description + attributes: + label: 需求描述 + description: 清晰明了地描述您的需求。 + validations: + required: true + - type: textarea + id: expected + attributes: + label: 预期行为 + description: 简明地描述您所希望发生的行为。 + - type: input + id: openwrt-version + attributes: + label: OpenWrt 版本 + description: 您所使用的 OpenWrt 版本号。 + - type: textarea + id: additional + attributes: + label: 其他信息 + description: 其他任何您认为有意义的信息。 diff --git a/luci-app-unblockneteasemusic/.github/build-ipk.sh b/luci-app-unblockneteasemusic/.github/build-ipk.sh new file mode 100755 index 00000000..52f66294 --- /dev/null +++ b/luci-app-unblockneteasemusic/.github/build-ipk.sh @@ -0,0 +1,79 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-3.0-only +# +# Copyright (C) 2021-2022 Tianling Shen + +export PKG_SOURCE_DATE_EPOCH="$(date "+%s")" + +BASE_DIR="$(cd "$(dirname $0)"; pwd)" +PKG_DIR="$BASE_DIR/.." + +function get_mk_value() { + awk -F "$1:=" '{print $2}' "$PKG_DIR/Makefile" | xargs +} + +PKG_NAME="$(get_mk_value "PKG_NAME")" +if [ "$RELEASE_TYPE" == "release" ]; then + PKG_VERSION="$(get_mk_value "PKG_VERSION")-$(get_mk_value "PKG_RELEASE")" +else + PKG_VERSION="dev-$PKG_SOURCE_DATE_EPOCH-$(git rev-parse --short HEAD)" +fi + +TEMP_DIR="$(mktemp -d -p $BASE_DIR)" +TEMP_PKG_DIR="$TEMP_DIR/$PKG_NAME" +mkdir -p "$TEMP_PKG_DIR/CONTROL/" +mkdir -p "$TEMP_PKG_DIR/lib/upgrade/keep.d/" +mkdir -p "$TEMP_PKG_DIR/usr/lib/lua/luci/" + +cp -fpR "$PKG_DIR/luasrc"/* "$TEMP_PKG_DIR/usr/lib/lua/luci/" +cp -fpR "$PKG_DIR/root"/* "$TEMP_PKG_DIR/" + +echo -e "/etc/config/unblockneteasemusic" > "$TEMP_PKG_DIR/CONTROL/conffiles" +cat > "$TEMP_PKG_DIR/lib/upgrade/keep.d/$PKG_NAME" <<-EOF +/usr/share/unblockneteasemusic/core/ +/usr/share/unblockneteasemusic/core_local_ver +/usr/share/unblockneteasemusic/server.crt +/usr/share/unblockneteasemusic/server.key +EOF + +cat > "$TEMP_PKG_DIR/CONTROL/control" <<-EOF + Package: $PKG_NAME + Version: $PKG_VERSION + Depends: libc,$(get_mk_value "LUCI_DEPENDS" | xargs | tr " +" ", ") + Source: https://github.com/UnblockNeteaseMusic/luci-app-unblockneteasemusic + SourceName: $PKG_NAME + Section: luci + SourceDateEpoch: $PKG_SOURCE_DATE_EPOCH + Maintainer: Tianling Shen + Architecture: all + Installed-Size: TO-BE-FILLED-BY-IPKG-BUILD + Description: LuCI support for UnblockNeteaseMusic +EOF + +echo -e '#!/bin/sh +[ "${IPKG_NO_SCRIPT}" = "1" ] && exit 0 +[ -s ${IPKG_INSTROOT}/lib/functions.sh ] || exit 0 +. ${IPKG_INSTROOT}/lib/functions.sh +default_postinst $0 $@' > "$TEMP_PKG_DIR/CONTROL/postinst" +chmod 0755 "$TEMP_PKG_DIR/CONTROL/postinst" + +echo -e "[ -n "\${IPKG_INSTROOT}" ] || { + (. /etc/uci-defaults/$PKG_NAME) && rm -f /etc/uci-defaults/$PKG_NAME + rm -f /tmp/luci-indexcache + rm -rf /tmp/luci-modulecache/ + exit 0 +}" > "$TEMP_PKG_DIR/CONTROL/postinst-pkg" +chmod 0755 "$TEMP_PKG_DIR/CONTROL/postinst-pkg" + +echo -e '#!/bin/sh +[ -s ${IPKG_INSTROOT}/lib/functions.sh ] || exit 0 +. ${IPKG_INSTROOT}/lib/functions.sh +default_prerm $0 $@' > "$TEMP_PKG_DIR/CONTROL/prerm" +chmod 0755 "$TEMP_PKG_DIR/CONTROL/prerm" + +curl -fsSL "https://raw.githubusercontent.com/openwrt/openwrt/master/scripts/ipkg-build" -o "$TEMP_DIR/ipkg-build" +chmod 0755 "$TEMP_DIR/ipkg-build" +"$TEMP_DIR/ipkg-build" -m "" "$TEMP_PKG_DIR" "$TEMP_DIR" + +mv "$TEMP_DIR/${PKG_NAME}_${PKG_VERSION}_all.ipk" "$BASE_DIR" +rm -rf "$TEMP_DIR" diff --git a/luci-app-unblockneteasemusic/.github/workflows/build-ipk.yml b/luci-app-unblockneteasemusic/.github/workflows/build-ipk.yml new file mode 100644 index 00000000..cbbeccf7 --- /dev/null +++ b/luci-app-unblockneteasemusic/.github/workflows/build-ipk.yml @@ -0,0 +1,61 @@ +name: Build ipk for luci-app-unblockneteasemusic + +on: + push: + branches: + - 'master' + paths: + - 'luasrc/**' + - 'root/**' + - 'Makefile' + - '.github/**' + + pull_request: + branches: + - 'master' + types: + - opened + - synchronize + - reopened + paths: + - 'luasrc/**' + - 'root/**' + - 'Makefile' + - '.github/**' + + release: + types: + - published + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout source tree + uses: actions/checkout@v3 + + - name: Build ipk file + env: + RELEASE_TYPE: ${{ github.event_name }} + run: | + pushd .github + fakeroot bash build-ipk.sh + echo "ASSET_NAME=$(ls *.ipk)" >> $GITHUB_ENV + popd + + - name: Publishing to GitHub Artifacts + uses: actions/upload-artifact@v3 + if: github.event_name != 'release' + with: + name: ${{ env.ASSET_NAME }} + path: .github/*.ipk + + - name: Publishing to GitHub Releases + uses: floralatin/upload-release-action@3688e13ae053ba3052eb4f0cfe03e78deb8f88d7 + if: github.event_name == 'release' + with: + repo_token: ${{ github.token }} + file: .github/*.ipk + tag: ${{ github.ref }} + file_glob: true diff --git a/luci-app-unblockneteasemusic/LICENSE b/luci-app-unblockneteasemusic/LICENSE new file mode 100644 index 00000000..f288702d --- /dev/null +++ b/luci-app-unblockneteasemusic/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/luci-app-unblockneteasemusic/Makefile b/luci-app-unblockneteasemusic/Makefile new file mode 100644 index 00000000..e9d41331 --- /dev/null +++ b/luci-app-unblockneteasemusic/Makefile @@ -0,0 +1,24 @@ +# SPDX-License-Identifier: GPL-3.0-only +# +# Copyright (C) 2019-2022 Tianling Shen + +include $(TOPDIR)/rules.mk + +LUCI_TITLE:=LuCI support for UnblockNeteaseMusic +LUCI_DEPENDS:=+dnsmasq-full +ipset +node \ + @(PACKAGE_libustream-mbedtls||PACKAGE_libustream-openssl||PACKAGE_libustream-wolfssl) +LUCI_PKGARCH:=all + +PKG_NAME:=luci-app-unblockneteasemusic +PKG_VERSION:=2.14 +PKG_RELEASE:=3 + +PKG_MAINTAINER:=Tianling Shen + +define Package/luci-app-unblockneteasemusic/conffiles +/etc/config/unblockneteasemusic +endef + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/luci-app-unblockneteasemusic/README.md b/luci-app-unblockneteasemusic/README.md new file mode 100644 index 00000000..6a6c41f7 --- /dev/null +++ b/luci-app-unblockneteasemusic/README.md @@ -0,0 +1,63 @@ +### 项目简介 +这是一个用于解除网易云音乐播放限制的 OpenWrt 插件,完整支持 播放 / 下载 无版权 / 收费 歌曲
+原理为通过获取其他平台的音乐播放链接,替换网易云音乐内 无版权 / 收费 歌曲链接
+ +[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2FUnblockNeteaseMusic%2Fluci-app-unblockneteasemusic.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2FUnblockNeteaseMusic%2Fluci-app-unblockneteasemusic?ref=badge_shield) + +### 功能说明 +1. 支持自定义音源选择,一般设置默认即可;如需高音质音乐,推荐选择“酷我”或“咪咕” +2. 支持使用 IPset / Hosts 自动劫持相关请求,客户端无需设置代理即可使用 +3. 支持 HTTPS 劫持,客户端信任证书后即可正常使用 +4. 支持将服务公开至公网(默认监听局域网),支持开启严格模式 +5. 支持设定代理,支持指定网易云音乐服务器 IP,支持设定 EndPoint +6. 支持手动/自动更新 Core,确保插件正常运作 +7. 支持设定 JOOX/Migu/QQ Cookie / Youtube API,以正常使用相关音源 +8. 支持无损音质(目前支持 酷狗、酷我、咪咕、pyncmd、QQ 音源) + +### 编译 +```bash + #进入 OpenWrt 源码 package 目录 + cd package + #克隆插件源码 + git clone --branch master https://github.com/UnblockNeteaseMusic/luci-app-unblockneteasemusic.git + #返回上一层目录 + cd .. + #配置 + make menuconfig + #在 luci -> application 选中插件,开始编译 + make package/luci-app-unblockneteasemusic/compile V=s +``` + +### 使用方法 +- #### 路由器插件配置 +1. 在路由器 LuCI 界面“服务”选项中找到“解除网易云音乐播放限制” +2. 勾选“启用本插件” +3. “音源接口”选择“默认”(高音质音源推荐选择“酷我”或“咪咕”) +4. 点击“保存&应用” +- 现在您局域网下的所有设备,(一般情况下)无需任何设置即可自动解除网易云音乐播放限制 +- ##### 特别说明 +1. 首次使用本插件时,将会在后台下载核心程序,故启动时间可能会稍微长一点 +2. 如需使用网页端,请额外安装 Tampermonkey 插件:[NeteaseMusic UI Unlocker](https://greasyfork.org/zh-CN/scripts/382285-neteasemusic-ui-unlocker) +3. 推荐在客户端信任 [UnblockNeteaseMusic 证书](https://raw.githubusercontent.com/UnblockNeteaseMusic/server/enhanced/ca.crt),以便 HTTPS 通讯(若您不放心,也可以[自行签发证书](https://github.com/nondanee/UnblockNeteaseMusic/issues/48#issuecomment-477870013)) + +### 效果图 +#### LuCI 界面 + ![Image text](https://raw.githubusercontent.com/UnblockNeteaseMusic/luci-app-unblockneteasemusic/master/views/view1.jpg) + ![Image text](https://raw.githubusercontent.com/UnblockNeteaseMusic/luci-app-unblockneteasemusic/master/views/view2.jpg) + ![Image text](https://raw.githubusercontent.com/UnblockNeteaseMusic/luci-app-unblockneteasemusic/master/views/view3.jpg) +#### UWP 网易云音乐客户端 + ![Image text](https://raw.githubusercontent.com/UnblockNeteaseMusic/luci-app-unblockneteasemusic/master/views/view4.jpg) + +### 鸣谢 +[UnblockNeteaseMusic](https://github.com/UnblockNeteaseMusic/server)的开发者:[nondanee](https://github.com/nondanee)、[pan93412](https://github.com/pan93412)、[1715173329](https://github.com/1715173329)
+[luci-app-unblockmusic](https://github.com/maxlicheng/luci-app-unblockmusic)的开发者:[maxlicheng](https://github.com/maxlicheng)
+[luci-app-unblockmusic(二次修改)](https://github.com/coolsnowwolf/lede/tree/master/package/lean/luci-app-unblockmusic)的开发者:[Lean](https://github.com/coolsnowwolf)
+IPSet 劫持方式指导:[恩山 692049#125 楼](https://www.right.com.cn/forum/forum.php?mod=viewthread&tid=692049&page=9#pid4104303) [rufengsuixing](https://github.com/rufengsuixing/luci-app-unblockmusic) [binsee](https://github.com/binsee/luci-app-unblockmusic)
+Hosts劫持方式指导:[UnblockNeteaseMusic](https://github.com/nondanee/UnblockNeteaseMusic) [云音乐安卓又搞事啦](https://jixun.moe/post/netease-android-hosts-bypass/)
+核心程序版本检测方法指导:[vernesong](https://github.com/vernesong) + +### 协议 +本项目使用 [GPL-3.0-only](https://spdx.org/licenses/GPL-3.0-only.html) 协议授权
+在遵循此协议的前提下,你可以自由修改和分发 + +[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2FUnblockNeteaseMusic%2Fluci-app-unblockneteasemusic.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2FUnblockNeteaseMusic%2Fluci-app-unblockneteasemusic?ref=badge_large) diff --git a/luci-app-unblockneteasemusic/luasrc/controller/unblockneteasemusic.lua b/luci-app-unblockneteasemusic/luasrc/controller/unblockneteasemusic.lua new file mode 100644 index 00000000..44f73b9d --- /dev/null +++ b/luci-app-unblockneteasemusic/luasrc/controller/unblockneteasemusic.lua @@ -0,0 +1,69 @@ +-- SPDX-License-Identifer: GPL-3.0-only +-- Copyright (C) 2019-2022 Tianling Shen + +module("luci.controller.unblockneteasemusic", package.seeall) + +function index() + if not nixio.fs.access("/etc/config/unblockneteasemusic") then + return + end + + local page + page = entry({"admin", "services", "unblockneteasemusic"}, firstchild(), _("解除网易云音乐播放限制"), 50) + page.dependent = false + page.acl_depends = { "luci-app-unblockneteasemusic" } + + entry({"admin", "services", "unblockneteasemusic", "general"}, cbi("unblockneteasemusic/main"), _("基本设定"), 1) + entry({"admin", "services", "unblockneteasemusic", "upgrade"}, form("unblockneteasemusic/upgrade"), _("更新组件"), 2).leaf = true + entry({"admin", "services", "unblockneteasemusic", "log"}, form("unblockneteasemusic/log"), _("日志"), 3) + + entry({"admin", "services", "unblockneteasemusic", "status"}, call("act_status")).leaf = true + entry({"admin", "services", "unblockneteasemusic", "update_core"}, call("act_update_core")) + entry({"admin", "services", "unblockneteasemusic", "remove_core"}, call("act_remove_core")) +end + +function act_status() + local stat = luci.util.ubus("service", "list", { name = "unblockneteasemusic" }) + local running = next(stat) and next(stat.unblockneteasemusic) and stat.unblockneteasemusic.instances.unblockneteasemusic.running or false + + local e = { running = running } + luci.http.prepare_content("application/json") + luci.http.write_json(e) +end + +function update_core() + local core_cloud_ver = luci.sys.exec("wget -qO- 'https://api.github.com/repos/UnblockNeteaseMusic/server/commits?sha=enhanced&path=precompiled' | jsonfilter -e '@[0].sha'") + local core_cloud_ver_mini = string.sub(core_cloud_ver, 1, 7) + local core_local_ver + if (not core_cloud_ver) or (not core_cloud_ver_mini) then + return "1" + else + core_local_ver = luci.sys.exec("cat '/usr/share/unblockneteasemusic/core_local_ver' 2>'/dev/null'") + if not core_local_ver or (core_local_ver ~= core_cloud_ver) then + luci.sys.call("rm -f /usr/share/unblockneteasemusic/update_core_successfully") + luci.sys.call("/usr/share/unblockneteasemusic/update.sh update_core_from_luci") + if not nixio.fs.access("/usr/share/unblockneteasemusic/update_core_successfully") then + return "2" + else + luci.sys.call("rm -f /usr/share/unblockneteasemusic/update_core_successfully") + return core_cloud_ver_mini + end + else + return "0" + end + end +end + +function act_update_core() + luci.http.prepare_content("application/json") + luci.http.write_json({ + ret = update_core(); + }) +end + +function act_remove_core() + local ret = {} + ret.ret = luci.sys.call("cd /usr/share/unblockneteasemusic && rm -rf core/* && rm -f core_local_ver") == 0 + luci.http.prepare_content("application/json") + luci.http.write_json(ret) +end diff --git a/luci-app-unblockneteasemusic/luasrc/model/cbi/unblockneteasemusic/log.lua b/luci-app-unblockneteasemusic/luasrc/model/cbi/unblockneteasemusic/log.lua new file mode 100644 index 00000000..5e2c81a4 --- /dev/null +++ b/luci-app-unblockneteasemusic/luasrc/model/cbi/unblockneteasemusic/log.lua @@ -0,0 +1,14 @@ +local fs = require "nixio.fs" +local conffile = "/var/run/unblockneteasemusic/run.log" + +f = SimpleForm("logview") + +t = f:field(TextValue, "conf") +t.rmempty = true +t.rows = 15 +function t.cfgvalue() + return fs.readfile(conffile) or "" +end +t.readonly="readonly" + +return f diff --git a/luci-app-unblockneteasemusic/luasrc/model/cbi/unblockneteasemusic/main.lua b/luci-app-unblockneteasemusic/luasrc/model/cbi/unblockneteasemusic/main.lua new file mode 100644 index 00000000..0dcc03c4 --- /dev/null +++ b/luci-app-unblockneteasemusic/luasrc/model/cbi/unblockneteasemusic/main.lua @@ -0,0 +1,246 @@ +local m, s, o + +m = Map("unblockneteasemusic", translate("解除网易云音乐播放限制")) +m.description = translate("原理:采用 [Bilibili/JOOX/酷狗/酷我/咪咕/pyncmd/QQ/Youtube] 等音源,替换网易云音乐 无版权/收费 歌曲链接
具体使用方法参见:GitHub @UnblockNeteaseMusic/luci-app-unblockneteasemusic") + +m:section(SimpleSection).template = "unblockneteasemusic/status" + +s = m:section(NamedSection, "config", "unblockneteasemusic") + +o = s:option(Flag, "enable", translate("启用本插件")) +o.description = translate("启用本插件以解除网易云音乐播放限制") +o.default = 0 +o.rmempty = false + +o = s:option(Value, "music_source", translate("音源接口")) +o:value("default", translate("默认")) +o:value("bilibili", translate("Bilibili音乐")) +o:value("joox", translate("JOOX音乐")) +o:value("kugou", translate("酷狗音乐")) +o:value("kuwo", translate("酷我音乐")) +o:value("migu", translate("咪咕音乐")) +o:value("pyncmd", translate("网易云音乐(pyncmd)")) +o:value("qq", translate("QQ音乐")) +o:value("youtube", translate("Youtube音乐")) +o:value("youtubedl", translate("Youtube音乐(youtube-dl)")) +o:value("ytdlp", translate("Youtube音乐(yt-dlp)")) +o.description = translate("自定义模式下,多个音源请用空格隔开") +o.default = "default" +o.rmempty = false + +o = s:option(Flag, "use_custom_cookie", translate("使用自定义 Cookie")) +o.description = translate("使用自定义 Cookie 请求音源接口") +o.default = 0 +o.rmempty = false + +o = s:option(Value, "joox_cookie", translate("JOOX Cookie")) +o.description = translate("在 joox.com 获取,需要 wmid 和 session_key 值") +o.placeholder = "wmid=; session_key=" +o.datatype = "string" +o:depends("use_custom_cookie", 1) + +o = s:option(Value, "migu_cookie", translate("Migu Cookie")) +o.description = translate("通过抓包手机客户端请求获取,需要 aversionid 值") +o.datatype = "string" +o:depends("use_custom_cookie", 1) + +o = s:option(Value, "qq_cookie", translate("QQ Cookie")) +o.description = translate("在 y.qq.com 获取,需要 uin 和 qm_keyst值") +o.placeholder = "uin=; qm_keyst=" +o.datatype = "string" +o:depends("use_custom_cookie", 1) + +o = s:option(Value, "youtube_key", translate("Youtube API Key")) +o.description = translate("API Key 申请地址:https://developers.google.com/youtube/v3/getting-started#before-you-start") +o.datatype = "string" +o:depends("use_custom_cookie", 1) + +o = s:option(Flag, "follow_source_order", translate("顺序查询")) +o.description = translate("默认为并行查询并返回第一个结果,开启后将严格按照配置音源的顺序进行查询") +o.default = 0 + +o = s:option(Flag, "search_album", translate("附加专辑名")) +o.description = translate("在其他音源搜索歌曲时携带专辑名称(默认搜索条件 歌曲名 - 歌手,启用后搜索条件 歌曲名 - 歌手 专辑名)") +o.default = 0 + +o = s:option(Flag, "enable_flac", translate("启用无损音质")) +o.description = translate("目前仅支持酷狗、酷我、咪咕、pyncmd、QQ 音源") +o.default = 0 + +o = s:option(Flag, "select_max_br", translate("选取最高音质")) +o.description = translate("选择所有音源中的最高码率替换音频。") +o.default = 0 + +o = s:option(ListValue, "replace_music_source", translate("音源替换")) +o.description = translate("当音乐音质低于指定数值时,尝试强制使用其他平台的高音质版本进行替换") +o:value("dont_replace", translate("不强制替换音乐音源")) +o:value("lower_than_192kbps", translate("当音质低于 192 Kbps(中)时")) +o:value("lower_than_320kbps", translate("当音质低于 320 Kbps(高)时")) +o:value("lower_than_999kbps", translate("当音质低于 999 Kbps(无损)时")) +o:value("replace_all", translate("替换所有音乐音源")) +o.default = "dont_replace" + +o = s:option(Flag, "disable_upgrade_check", translate("禁用更新检查")) +o.description = translate("禁止客户端检查更新,全平台支持") +o.default = 0 + +o = s:option(Flag, "block_ads", translate("屏蔽广告")) +o.description = translate("启用后,可屏蔽应用内部分广告。") +o.default = 0 + +o = s:option(ListValue, "local_vip", translate("伪装本地 VIP")) +o.description = translate("设置后,可以使用去广告、个性换肤、鲸云音效等本地功能") +o:value("", translate("禁用")) +o:value("cvip", translate("CVIP")) +o:value("svip", translate("SVIP")) + +o = s:option(Flag, "auto_update", translate("启用自动更新")) +o.description = translate("启用后,每天将定时自动检查最新版本并更新") +o.default = 0 + +o = s:option(ListValue, "update_time", translate("检查更新时间")) +for update_time_hour = 0,23 do + o:value(update_time_hour, update_time_hour..":00") +end +o.default = "3" +o.description = translate("设定每天自动检查更新时间") +o:depends("auto_update", 1) + +o = s:option(Button,"certificate", translate("HTTPS 证书")) +o.inputtitle = translate("下载 CA 根证书") +o.description = translate("Linux/iOS/MacOSX 在信任根证书后方可正常使用") +o.inputstyle = "reload" +o.write = function() + act_download_cert() +end + +function act_download_cert() + local t, e + t = nixio.open("/usr/share/unblockneteasemusic/core/ca.crt","r") + luci.http.header('Content-Disposition', 'attachment; filename="ca.crt"') + luci.http.prepare_content("application/octet-stream") + while true do + e = t:read(nixio.const.buffersize) + if (not e) or (#e == 0) then + break + else + luci.http.write(e) + end + end + t:close() + luci.http.close() +end + +o = s:option(Flag, "advanced_mode", translate("启用进阶设置")) +o.description = translate("非必要不推荐使用") +o.default = 0 + +o = s:option(ListValue, "log_level", translate("日志等级")) +o:value("debug", translate("调试")); +o:value("info", translate("信息(默认)")) +o:value("silent", translate("静默")) +o.default = "info"; +o:depends("advanced_mode", 1) + +o = s:option(Value, "http_port", translate("HTTP 监听端口")) +o.description = translate("程序监听的 HTTP 端口,不可与 其他程序/HTTPS 共用一个端口") +o.placeholder = "5200" +o.default = "5200" +o.datatype = "port" +o:depends({advanced_mode = true, hijack_ways = "dont_hijack"}) +o:depends({advanced_mode = true, hijack_ways = "use_ipset"}) + +o = s:option(Value, "https_port", translate("HTTPS 监听端口")) +o.description = translate("程序监听的 HTTPS 端口,不可与 其他程序/HTTP 共用一个端口") +o.placeholder = "5201" +o.default = "5201" +o.datatype = "port" +o:depends({advanced_mode = true, hijack_ways = "dont_hijack"}) +o:depends({advanced_mode = true, hijack_ways = "use_ipset"}) + +o = s:option(Value, "endpoint_url", translate("EndPoint")) +o.description = translate("具体说明参见:https://github.com/UnblockNeteaseMusic/server") +o.default = "https://music.163.com" +o.placeholder = "https://music.163.com" +o.datatype = "string" +o:depends("advanced_mode", 1) + +o = s:option(Value, "cnrelay", translate("UNM bridge 服务器")) +o.description = translate("使用 UnblockNeteaseMusic 中继桥(bridge)以获取音源信息") +o.placeholder = "http(s)://host:port" +o.datatype = "string" +o:depends("advanced_mode", 1) + +o = s:option(ListValue, "hijack_ways", translate("劫持方法")) +o:value("dont_hijack", translate("不开启劫持")) +o:value("use_ipset", translate("使用 IPSet 劫持")) +o:value("use_hosts", translate("使用 Hosts 劫持")) +o.description = translate("如果使用Hosts劫持,程序监听的 HTTP/HTTPS 端口将被锁定为 80/443") +o.default = "dont_hijack" +o:depends("advanced_mode", 1) + +o = s:option(Flag, "pub_access", translate("部署到公网")) +o.description = translate("默认仅监听局域网,如需提供公开访问请勾选此选项") +o.default = 0 +o:depends("advanced_mode", 1) + +o = s:option(Flag, "strict_mode", translate("启用严格模式")) +o.description = translate("若将服务部署到公网,则强烈建议使用严格模式,此模式下仅放行网易云音乐所属域名的请求;注意:该模式下不能使用全局代理") +o.default = 0 +o:depends("advanced_mode", 1) + +o = s:option(Value, "netease_server_ip", translate("网易云服务器 IP")) +o.description = translate("通过 ping music.163.com 即可获得 IP 地址,仅限填写一个") +o.placeholder = "59.111.181.38" +o.datatype = "ipaddr" +o:depends("advanced_mode", 1) + +o = s:option(Value, "proxy_server_ip", translate("代理服务器地址")) +o.description = translate("使用代理服务器获取音乐信息") +o.placeholder = "http(s)://host:port" +o.datatype = "string" +o:depends("advanced_mode", 1) + +o = s:option(Value, "self_issue_cert_crt", translate("自签发证书公钥位置")) +o.description = translate("[公钥] 默认使用 UnblockNeteaseMusic 项目提供的 CA 证书,您可以指定为您自己的证书") +o.placeholder = "/usr/share/unblockneteasemusic/core/server.crt" +o.datatype = "file" +o:depends("advanced_mode", 1) + +o = s:option(Value, "self_issue_cert_key", translate("自签发证书私钥位置")) +o.description = translate("[私钥] 默认使用 UnblockNeteaseMusic 项目提供的 CA 证书,您可以指定为您自己的证书") +o.placeholder = "/usr/share/unblockneteasemusic/core/server.key" +o.datatype = "file" +o:depends("advanced_mode", 1) + +s = m:section(TypedSection, "acl_rule", translate("例外客户端规则"), translate("可以为局域网客户端分别设置不同的例外模式,默认无需设置")) +s.template = "cbi/tblsection" +s.sortable = true +s.anonymous = true +s.addremove = true + +o = s:option(Flag, "enable", ("启用")) +o.width = "33%" +o.default = 0 +o.rmempty = false + +o = s:option(Value, "ip_addr", translate("IP 地址")) +o.width = "33%" +o.datatype = "ip4addr" +o.placeholder = "0.0.0.0/0" +o.rmempty = false +luci.ip.neighbors({ family = 4 }, function(entry) + if entry.reachable then + o:value(entry.dest:string()) + end +end) + +o = s:option(ListValue, "filter_mode", translate("规则")) +o.width = "33%" +o.default = "disable_all" +o.rmempty = false +o:value("disable_all", translate("不代理 HTTP 和 HTTPS")) +o:value("disable_http", translate("不代理 HTTP")) +o:value("disable_https", translate("不代理 HTTPS")) + +return m diff --git a/luci-app-unblockneteasemusic/luasrc/model/cbi/unblockneteasemusic/upgrade.lua b/luci-app-unblockneteasemusic/luasrc/model/cbi/unblockneteasemusic/upgrade.lua new file mode 100644 index 00000000..3657302a --- /dev/null +++ b/luci-app-unblockneteasemusic/luasrc/model/cbi/unblockneteasemusic/upgrade.lua @@ -0,0 +1,19 @@ +local m, o + +m = SimpleForm("Version") +m.reset = false +m.submit = false + +o = m:field(DummyValue, "remove_core", translate("删除核心")) +o.rawhtml = true +o.template = "unblockneteasemusic/remove_core" +o.value = translate("") +o.description = "删除核心后,需手动点击下面的按钮重新下载,有助于解决版本冲突问题" + +o = m:field(DummyValue, "update_core", translate("更新核心")) +o.rawhtml = true +o.template = "unblockneteasemusic/update_core" +o.value = translate("") +o.description = "更新完毕后会自动在后台重启插件,无需手动重启" + +return m diff --git a/luci-app-unblockneteasemusic/luasrc/view/unblockneteasemusic/remove_core.htm b/luci-app-unblockneteasemusic/luasrc/view/unblockneteasemusic/remove_core.htm new file mode 100644 index 00000000..df97046f --- /dev/null +++ b/luci-app-unblockneteasemusic/luasrc/view/unblockneteasemusic/remove_core.htm @@ -0,0 +1,32 @@ +<%+cbi/valueheader%> + + + + + +<%=self.value%> + +<%+cbi/valuefooter%> diff --git a/luci-app-unblockneteasemusic/luasrc/view/unblockneteasemusic/status.htm b/luci-app-unblockneteasemusic/luasrc/view/unblockneteasemusic/status.htm new file mode 100644 index 00000000..022c2efd --- /dev/null +++ b/luci-app-unblockneteasemusic/luasrc/view/unblockneteasemusic/status.htm @@ -0,0 +1,21 @@ + + +
+

+ <%:Collecting data...%> +

+
diff --git a/luci-app-unblockneteasemusic/luasrc/view/unblockneteasemusic/update_core.htm b/luci-app-unblockneteasemusic/luasrc/view/unblockneteasemusic/update_core.htm new file mode 100644 index 00000000..8acb275e --- /dev/null +++ b/luci-app-unblockneteasemusic/luasrc/view/unblockneteasemusic/update_core.htm @@ -0,0 +1,36 @@ +<%+cbi/valueheader%> + + + + + +<%=self.value%> + +<%+cbi/valuefooter%> diff --git a/luci-app-unblockneteasemusic/root/etc/config/unblockneteasemusic b/luci-app-unblockneteasemusic/root/etc/config/unblockneteasemusic new file mode 100644 index 00000000..ce807ea6 --- /dev/null +++ b/luci-app-unblockneteasemusic/root/etc/config/unblockneteasemusic @@ -0,0 +1,7 @@ + +config unblockneteasemusic 'config' + option enable '0' + option disable_upgrade_check '1' + option auto_update '1' + option update_time '3' + diff --git a/luci-app-unblockneteasemusic/root/etc/init.d/unblockneteasemusic b/luci-app-unblockneteasemusic/root/etc/init.d/unblockneteasemusic new file mode 100755 index 00000000..fa653a0b --- /dev/null +++ b/luci-app-unblockneteasemusic/root/etc/init.d/unblockneteasemusic @@ -0,0 +1,247 @@ +#!/bin/sh /etc/rc.common +# SPDX-License-Identifier: GPL-3.0-only +# +# Copyright (C) 2019-2023 Tianling Shen + +USE_PROCD=1 + +START=99 +STOP=10 + +NAME="unblockneteasemusic" +UNM_DIR="/usr/share/$NAME" +RUN_DIR="/var/run/$NAME" + +IPT_N="iptables -t nat" +IPT_INPUT_RULE="unm_input_rule" + +is_enabled() { + local enabled + config_get_bool enabled "$1" "$2" "${3:-0}" + if [ "$enabled" -eq "1" ]; then + return 0 + else + return 1 + fi +} + +append_param() { + procd_append_param command "$1" $2 +} + +append_param_arg() { + local value + config_get value "$1" "$2" $4 + [ -n "$value" ] && append_param "$3" "$value" +} + +append_param_env() { + local value + config_get value "$1" "$2" $4 + [ -n "$value" ] && procd_append_param env "$3"="$value" +} + +append_param_boolenv() { + is_enabled "$1" "$2" "$4" && procd_append_param env "$3"="true" +} + +append_filter_client() { + local cfg="$1" + + is_enabled "$cfg" "enable" || return 1 + + local ip_addr filter_mode + config_get ip_addr "$cfg" "ip_addr" + config_get filter_mode "$cfg" "filter_mode" + [ -n "$ip_addr" -a -n "$filter_mode" ] || return 1 + + case "${filter_mode}" in + "disable_http") + ipset -! add "acl_neteasemusic_http" "${ip_addr}" + ;; + "disable_https") + ipset -! add "acl_neteasemusic_https" "${ip_addr}" + ;; + "disable_all") + ipset -! add "acl_neteasemusic_http" "${ip_addr}" + ipset -! add "acl_neteasemusic_https" "${ip_addr}" + ;; + esac +} + +start_service() { + config_load "$NAME" + is_enabled "config" "enable" || return 1 + + local update_time + config_get update_time "config" "update_time" "3" + sed -i "/$NAME/d" /etc/crontabs/root + echo -e "30 2 * * * /etc/init.d/unblockneteasemusic" >> "/etc/crontabs/root" + ! is_enabled "config" "auto_update" || echo -e "0 ${update_time} * * * $UNM_DIR/update.sh update_core" >> "/etc/crontabs/root" + /etc/init.d/cron restart + + mkdir -p "$RUN_DIR" + [ -s "$UNM_DIR/core/app.js" ] || { rm -f "$UNM_DIR/local_ver"; sh "$UNM_DIR/update.sh" "update_core_non_restart"; } + [ -s "$UNM_DIR/core/app.js" ] || { echo "Core Not Found, please download it before starting." >> "$RUN_DIR/run.log"; return 1; } + + procd_open_instance "$NAME" + procd_set_param command node "$UNM_DIR/core/app.js" + append_param "-a" "0.0.0.0" + + local http_port https_port hijack_ways + config_get http_port "config" "http_port" "5200" + config_get https_port "config" "https_port" "5201" + config_get hijack_ways "config" "hijack_ways" "use_ipset" + [ "$hijack_ways" != "use_hosts" ] || { http_port="80"; https_port="443"; } + append_param "-p" "${http_port}":"${https_port}" + + if is_enabled "config" "pub_access"; then + iptables -N "$IPT_INPUT_RULE" + iptables -t filter -I INPUT -j "$IPT_INPUT_RULE" + iptables -t filter -A "$IPT_INPUT_RULE" -p tcp --dport "${http_port}" -j ACCEPT + iptables -t filter -A "$IPT_INPUT_RULE" -p tcp --dport "${https_port}" -j ACCEPT + + echo "/etc/init.d/$NAME restart" > "$RUN_DIR/fw3.include" + fi + + local music_source + config_get music_source "config" "music_source" "default" + [ "$music_source" != "default" ] || music_source="kugou kuwo migu pyncmd" + append_param -o "$music_source" + + append_param_arg "config" "cnrelay" "-c" + append_param_arg "config" "endpoint_url" "-e" "https://music.163.com" + append_param_arg "config" "netease_server_ip" "-f" + append_param_arg "config" "proxy_server_ip" "-u" + is_enabled "config" "strict_mode" && append_param "-s" + + local log_level + config_get log_level "config" "log_level" "info" + procd_set_param env LOG_FILE="$RUN_DIR/run.log" + procd_append_param env LOG_LEVEL="$log_level" + + append_param_env "config" "joox_cookie" "JOOX_COOKIE" + append_param_env "config" "kuwo_cookie" "KUWO_COOKIE" + append_param_env "config" "migu_cookie" "MIGU_COOKIE" + append_param_env "config" "qq_cookie" "QQ_COOKIE" + append_param_env "config" "youtube_key" "YOUTUBE_KEY" + append_param_env "config" "self_issue_cert_crt" "SIGN_CERT" "$UNM_DIR/core/server.crt" + append_param_env "config" "self_issue_cert_key" "SIGN_KEY" "$UNM_DIR/core/server.key" + append_param_env "config" "local_vip" "ENABLE_LOCAL_VIP" + + append_param_boolenv "config" "follow_source_order" "FOLLOW_SOURCE_ORDER" + append_param_boolenv "config" "search_album" "SEARCH_ALBUM" + append_param_boolenv "config" "enable_flac" "ENABLE_FLAC" + append_param_boolenv "config" "select_max_br" "SELECT_MAX_BR" + append_param_boolenv "config" "disable_upgrade_check" "DISABLE_UPGRADE_CHECK" + append_param_boolenv "config" "block_ads" "BLOCK_ADS" + case "$(config_get "config" "replace_music_source")" in + "lower_than_192kbps") procd_append_param env MIN_BR="192000" ;; + "lower_than_320kbps") procd_append_param env MIN_BR="320000" ;; + "lower_than_999kbps") procd_append_param env MIN_BR="600000" ;; + "replace_all") procd_append_param env MIN_BR="9999999" ;; + esac + + procd_set_param stdout 1 + procd_set_param stderr 1 + procd_set_param respawn + + local lan_addr="$(uci -q get network.lan.ipaddr)" + if [ "${hijack_ways}" = "use_ipset" ]; then + mkdir -p "/tmp/dnsmasq.d" + rm -f "/tmp/dnsmasq.d/dnsmasq-$NAME.conf" + cat <<-EOF > "/tmp/dnsmasq.d/dnsmasq-$NAME.conf" + dhcp-option=252,http://${lan_addr}:${http_port}/proxy.pac + ipset=/.music.163.com/neteasemusic + ipset=/interface.music.163.com/neteasemusic + ipset=/interface3.music.163.com/neteasemusic + ipset=/apm.music.163.com/neteasemusic + ipset=/apm3.music.163.com/neteasemusic + ipset=/clientlog.music.163.com/neteasemusic + ipset=/clientlog3.music.163.com/neteasemusic + EOF + /etc/init.d/dnsmasq reload 2>"/dev/null" + + ipset create "acl_neteasemusic_http" hash:ip + ipset create "acl_neteasemusic_https" hash:ip + ipset create "neteasemusic" hash:ip + config_foreach append_filter_client "acl_rule" + + local netease_music_ips="$(wget -qO- "http://httpdns.n.netease.com/httpdns/v2/d?domain=music.163.com,interface.music.163.com,interface3.music.163.com,apm.music.163.com,apm3.music.163.com,clientlog.music.163.com,clientlog3.music.163.com" |jsonfilter -e '@.data.*.ip.*')" + local netease_music_ips2="$(wget -qO- "https://music.httpdns.c.163.com/d" --post-data="music.163.com,interface.music.163.com,interface3.music.163.com,apm.music.163.com,apm3.music.163.com,clientlog.music.163.com,clientlog3.music.163.com" |jsonfilter -e '@.dns.*["ips"].*')" + echo -e "${netease_music_ips}\n${netease_music_ips2}" | sort -u | awk '{print "ipset add neteasemusic "$1}' | sh + + $IPT_N -N "netease_cloud_music" + for local_addr in "0.0.0.0/8" "10.0.0.0/8" "127.0.0.0/8" "169.254.0.0/16" "172.16.0.0/12" "192.168.0.0/16" "224.0.0.0/4" "240.0.0.0/4"; do + $IPT_N -A "netease_cloud_music" -d "${local_addr}" -j "RETURN" + done + + $IPT_N -A "netease_cloud_music" -p "tcp" -m "set" ! --match-set "acl_neteasemusic_http" "src" --dport "80" -j "REDIRECT" --to-ports "${http_port}" + $IPT_N -A "netease_cloud_music" -p "tcp" -m "set" ! --match-set "acl_neteasemusic_https" "src" --dport "443" -j "REDIRECT" --to-ports "${https_port}" + $IPT_N -I "PREROUTING" -p "tcp" -m "set" --match-set "neteasemusic" "dst" -j "netease_cloud_music" + + echo "/etc/init.d/$NAME restart" > "$RUN_DIR/fw3.include" + elif [ "${hijack_ways}" = "use_hosts" ]; then + mkdir -p "/tmp/dnsmasq.d" + rm -f "/tmp/dnsmasq.d/dnsmasq-$NAME.conf" + cat <<-EOF > "/tmp/dnsmasq.d/dnsmasq-$NAME.conf" + dhcp-option=252,http://${lan_addr}:${http_port}/proxy.pac + address=/music.163.com/${lan_addr} + address=/interface.music.163.com/${lan_addr} + address=/interface3.music.163.com/${lan_addr} + address=/apm.music.163.com/${lan_addr} + address=/apm3.music.163.com/${lan_addr} + address=/clientlog.music.163.com/${lan_addr} + address=/clientlog3.music.163.com/${lan_addr} + address=/music.httpdns.c.163.com/0.0.0.0 + EOF + /etc/init.d/dnsmasq reload 2>"/dev/null" + + ip route add "223.252.199.10" dev lo + fi + + procd_close_instance + + procd_open_instance "log-check" + procd_set_param command "$UNM_DIR/log_check.sh" + procd_set_param respawn + procd_close_instance +} + +stop_service() { + config_load "$NAME" + + sed -i "/$NAME/d" "/etc/crontabs/root" + /etc/init.d/cron restart + + local settable + iptables -t filter -D INPUT -j "$IPT_INPUT_RULE" 2>"/dev/null" + iptables -F "$IPT_INPUT_RULE" 2>"/dev/null" + iptables -X "$IPT_INPUT_RULE" 2>"/dev/null" + + $IPT_N -D "PREROUTING" -p "tcp" -m set --match-set "neteasemusic" "dst" -j "netease_cloud_music" 2>"/dev/null" + $IPT_N -F "netease_cloud_music" 2>"/dev/null" + $IPT_N -X "netease_cloud_music" 2>"/dev/null" + + for settable in "acl_neteasemusic_http" "acl_neteasemusic_https" "neteasemusic"; do + ipset destroy "$settable" 2>"/dev/null" + done + + echo > "$RUN_DIR/fw3.include" + + rm -f "/tmp/dnsmasq.d/dnsmasq-$NAME.conf" + /etc/init.d/dnsmasq reload 2>"/dev/null" + + ip route del "223.252.199.10" 2>"/dev/null" + + rm -f "$RUN_DIR/run.log" +} + +reload_service() { + stop + start +} + +service_triggers() { + procd_add_reload_trigger "$NAME" +} diff --git a/luci-app-unblockneteasemusic/root/etc/uci-defaults/luci-unblockneteasemusic b/luci-app-unblockneteasemusic/root/etc/uci-defaults/luci-unblockneteasemusic new file mode 100755 index 00000000..900c6253 --- /dev/null +++ b/luci-app-unblockneteasemusic/root/etc/uci-defaults/luci-unblockneteasemusic @@ -0,0 +1,24 @@ +#!/bin/sh + +sed -e "s,local_vip '1',local_vip 'cvip',g" \ + -e "/local_vip '0'/d" \ + -i "/etc/config/unblockneteasemusic" + +uci -q batch <<-EOF >"/dev/null" + delete ucitrack.@unblockneteasemusic[-1] + add ucitrack unblockneteasemusic + set ucitrack.@unblockneteasemusic[-1].init=unblockneteasemusic + commit ucitrack +EOF + +uci -q batch <<-EOF >"/dev/null" + delete firewall.unblockneteasemusic + set firewall.unblockneteasemusic=include + set firewall.unblockneteasemusic.type=script + set firewall.unblockneteasemusic.path=/var/run/unblockneteasemusic/fw3.include + set firewall.unblockneteasemusic.reload=1 + commit firewall +EOF + +rm -f /tmp/luci-indexcache +exit 0 diff --git a/luci-app-unblockneteasemusic/root/usr/bin/unm-debug b/luci-app-unblockneteasemusic/root/usr/bin/unm-debug new file mode 100755 index 00000000..30f93fcb --- /dev/null +++ b/luci-app-unblockneteasemusic/root/usr/bin/unm-debug @@ -0,0 +1,17 @@ +#!/bin/sh +# Copyright (C) 2021-2022 Tianling Shen + +command -v "curl" >"/dev/null" || { echo -e "curl is not found."; exit 1; } + +RUN_DIR="/var/run/unblockneteasemusic" +mkdir -p "$RUN_DIR" +/usr/share/unblockneteasemusic/debugging.sh 2>&1 | tee "$RUN_DIR/unm-debugging-output.txt" + +catbox_link="$(curl -fsS -F "reqtype=fileupload" -F "time=72h" -F "fileToUpload=@$RUN_DIR/unm-debugging-output.txt" "https://litterbox.catbox.moe/resources/internals/api.php")" +transfer_link="$(curl -fsS --upload-file "$RUN_DIR/unm-debugging-output.txt" "https://transfer.sh/unm-debugging-output.txt")" +echo -e "\n" +echo -e "Log is available at:" +echo -e "$catbox_link" +echo -e "$transfer_link" + +rm -f "$RUN_DIR/unm-debugging-output.txt" diff --git a/luci-app-unblockneteasemusic/root/usr/share/rpcd/acl.d/luci-app-unblockneteasemusic.json b/luci-app-unblockneteasemusic/root/usr/share/rpcd/acl.d/luci-app-unblockneteasemusic.json new file mode 100644 index 00000000..06f07423 --- /dev/null +++ b/luci-app-unblockneteasemusic/root/usr/share/rpcd/acl.d/luci-app-unblockneteasemusic.json @@ -0,0 +1,11 @@ +{ + "luci-app-unblockneteasemusic": { + "description": "Grant UCI access for luci-app-unblockneteasemusic", + "read": { + "uci": [ "unblockneteasemusic" ] + }, + "write": { + "uci": [ "unblockneteasemusic" ] + } + } +} diff --git a/luci-app-unblockneteasemusic/root/usr/share/unblockneteasemusic/debugging.sh b/luci-app-unblockneteasemusic/root/usr/share/unblockneteasemusic/debugging.sh new file mode 100755 index 00000000..a4b8098a --- /dev/null +++ b/luci-app-unblockneteasemusic/root/usr/share/unblockneteasemusic/debugging.sh @@ -0,0 +1,95 @@ +#!/bin/sh +# Copyright (C) 2021-2022 Tianling Shen + +. /lib/functions.sh + +NAME="unblockneteasemusic" + +command -v "curl" >"/dev/null" || { echo -e "curl is not found."; exit 1; } + +echo -e "Launching luci-app-unblockneteasmusic Debugging Tool..." +echo -e "\n" + +echo -e "OpenWrt info:" +ubus call system board || cat "/etc/openwrt_release" +echo -e "\n" + +echo -e "uclient-fetch info:" +opkg info uclient-fetch +opkg info libustream-* +opkg info wget-ssl +wget -O- 'https://api.github.com/repos/UnblockNeteaseMusic/server/commits?sha=enhanced&path=precompiled' | jsonfilter -e '@[0].sha' || echo -e "Failed to connect to GitHub with uclient-fetch." +echo -e "\n" + +echo -e "Node.js info:" +opkg info node +echo -e "Node.js is placed at $(command -v node || echo "Not Found")" +echo -e "Node.js version: $(node -v 2>"/dev/null" || echo "Not Found")" +echo -e "\n" + +echo -e "luci-app-unblockneteasmusic info:" +opkg info "luci-app-unblockneteasemusic" +ls -lh "/etc/config/$NAME" "/etc/init.d/$NAME" "/usr/share/$NAME" +cat "/etc/config/$NAME" | sed -e "s,joox_cookie .*,joox_cookie 'set',g" \ + -e "s,migu_cookie .*,migu_cookie 'set',g" \ + -e "s,qq_cookie .*,qq_cookie 'set',g" \ + -e "s,youtube_key .*,youtube_key 'set',g" \ + -e "s,proxy_server_ip .*,proxy_server_ip 'set',g" +echo -e "\n" + +echo -e "UnblockNeteaseMusic Node.js info:" +echo -e "Git HEAD version: $(cat "/usr/share/$NAME/core_local_ver" 2>"/dev/null" || echo "Not Found")" +echo -e "Core version: $(node "/usr/share/$NAME/core/app.js" -v 2>"/dev/null" || echo "Not Found")" +ls -lh "/usr/share/$NAME/core" 2>"/dev/null" +echo -e "\n" + +echo -e "Netease networking info:" +curl -fsv "http://music.163.com/song/media/outer/url?id=641644.mp3" 2>&1 | grep "Location" || echo -e "Cannot connect to NeteaseMusic." +curl -sSL "http://httpdns.n.netease.com/httpdns/v2/d?domain=music.163.com" || echo -e "Cannot connect to Netease HTTPDNS." +config_load "$NAME" +config_get custom_proxy "config" "proxy_server_ip" +[ -n "$custom_proxy" ] && { curl -sL -x "$custom_proxy" "http://music.163.com/song/media/outer/url?id=641644.mp3" 2>&1 | grep "Location" || echo -e "Cannot connect to NeteaseMusic via proxy."; } +echo -e "\n" + +echo -e "Port status:" +config_get unm_port "config" "http_port" "5200" +config_get unm_ports "config" "https_port" "5201" +[ "$(config_get "config" "hijack_ways")" = "use_hosts" ] && { unm_port="80"; unm_ports="443"; } +netstat -tlpen | grep "$unm_port" || echo -e "No instance found on port $unm_port." +netstat -tlpen | grep "$unm_ports" || echo -e "No instance found on port $unm_ports." +echo -e "\n" + +echo -e "PROCD running info:" +running_stat="$(ubus call service list '{"name": "unblockneteasemusic", "verbose": true}' | \ + sed -e 's,"JOOX_COOKIE".*","JOOX_COOKIE": "set",g' \ + -e 's,"MIGU_COOKIE".*","MIGU_COOKIE": "set",g' \ + -e 's,"QQ_COOKIE".*","QQ_COOKIE": "set",g' \ + -e 's,"YOUTUBE_KEY".*","YOUTUBE_KEY": "set",g')" +[ "$(echo -e "$running_stat" | jsonfilter -e "@.$NAME.instances.$NAME.running")" == "true" ] || is_stopped=1 +echo -e "$running_stat" + +echo -e "\n" + +[ -n "$is_stopped" ] || { + echo -e "Firewall info:" + iptables -t "nat" -L "netease_cloud_music" 2>"/dev/null" || echo -e 'Chain "netease_cloud_music" not found.' + echo -e "" + ipset list "neteasemusic" 2>"/dev/null" || echo -e 'Table "neteasemusic" not found.' + echo -e "" + ipset list "acl_neteasemusic_http" 2>"/dev/null" || echo -e 'Table "acl_neteasemusic_http" not found.' + echo -e "" + ipset list "acl_neteasemusic_https" 2>"/dev/null" || echo -e 'Table "acl_neteasemusic_https" not found.' + echo -e "" + cat "/tmp/dnsmasq.d/dnsmasq-$NAME.conf" + echo -e "\n" + + echo -e "Testing source replacing..." + lan_ip="$(uci -q get "network.lan.ipaddr" || echo "127.0.0.1")" + + curl -sSL -X "POST" "https://music.163.com/weapi/song/enhance/player/url/v1?csrf_token=" --data "params=bf3kf%2BOyalbxNS%2FeHAXquH8D2nt2YrhBzww4zy5rj2H%2BeAhdOIaGh4HHHzcoREFcu9Ve35LUgc%2BGE1YJD1HxrJ87ucm5zK%2FFn1lLvHFv1A8ZAuyU1afjG28s2Xja6zpfg00T0EcCeqkK61OpTfAaqw%3D%3D&encSecKey=6bab0dfa7ee3b292f9263a7af466636731cdbbd1d8747c9178c17477e70be899b7788c4a4e315c9fdb8c6e787603db6f9dff62c356f164d35b16b7f2d9ad5ede3cc7336130605521a8f916d308ce86b15c32b81c883ae2ba9c244444d91e1683be93fa0ea3e2a85207c9d693b86b5bb31adb002dd56c0bbcce9c73ec3bf5c105" + echo -e "" + curl -ksSL -X "POST" -x "http://$lan_ip:$unm_port" "https://music.163.com/weapi/song/enhance/player/url/v1?csrf_token=" --data "params=bf3kf%2BOyalbxNS%2FeHAXquH8D2nt2YrhBzww4zy5rj2H%2BeAhdOIaGh4HHHzcoREFcu9Ve35LUgc%2BGE1YJD1HxrJ87ucm5zK%2FFn1lLvHFv1A8ZAuyU1afjG28s2Xja6zpfg00T0EcCeqkK61OpTfAaqw%3D%3D&encSecKey=6bab0dfa7ee3b292f9263a7af466636731cdbbd1d8747c9178c17477e70be899b7788c4a4e315c9fdb8c6e787603db6f9dff62c356f164d35b16b7f2d9ad5ede3cc7336130605521a8f916d308ce86b15c32b81c883ae2ba9c244444d91e1683be93fa0ea3e2a85207c9d693b86b5bb31adb002dd56c0bbcce9c73ec3bf5c105" + echo -e "" +} + +cat "/var/run/$NAME/run.log" 2>"/dev/null" || echo -e "Log is not avaiable." diff --git a/luci-app-unblockneteasemusic/root/usr/share/unblockneteasemusic/log_check.sh b/luci-app-unblockneteasemusic/root/usr/share/unblockneteasemusic/log_check.sh new file mode 100755 index 00000000..b43162dd --- /dev/null +++ b/luci-app-unblockneteasemusic/root/usr/share/unblockneteasemusic/log_check.sh @@ -0,0 +1,14 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-3.0-only +# Copyright (C) 2019-2023 Tianling Shen + +NAME="unblockneteasemusic" + +log_max_size="10" #使用KB计算 +log_file="/var/run/$NAME/run.log" + +while true; do + sleep 300 + [ -s "$log_file" ] || continue + [ "$(( $(ls -l "$log_file" | awk -F ' ' '{print $5}') / 1024 >= log_max_size))" -eq "0" ] || echo "" > "$log_file" +done diff --git a/luci-app-unblockneteasemusic/root/usr/share/unblockneteasemusic/update.sh b/luci-app-unblockneteasemusic/root/usr/share/unblockneteasemusic/update.sh new file mode 100755 index 00000000..abebf0b1 --- /dev/null +++ b/luci-app-unblockneteasemusic/root/usr/share/unblockneteasemusic/update.sh @@ -0,0 +1,104 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-3.0-only +# Copyright (C) 2019-2023 Tianling Shen + +NAME="unblockneteasemusic" +UNM_DIR="/usr/share/$NAME" +RUN_DIR="/var/run/$NAME" +mkdir -p "$RUN_DIR" + +LOCK="$RUN_DIR/update_core.lock" +LOG="$RUN_DIR/run.log" + +check_core_if_already_running() { + if [ -e "$LOCK" ]; then + echo -e "\nA task is already running." >> "$LOG" + exit 2 + else + touch "$LOCK" + fi +} + +clean_log(){ + echo "" > "$LOG" +} + +check_core_latest_version() { + core_latest_ver="$(wget -qO- 'https://api.github.com/repos/UnblockNeteaseMusic/server/commits?sha=enhanced&path=precompiled' | jsonfilter -e '@[0].sha')" + [ -n "$core_latest_ver" ] || { echo -e "\nFailed to check latest core version, please try again later." >> "$LOG"; rm -f "$LOCK"; exit 1; } + if [ ! -e "$UNM_DIR/core_local_ver" ]; then + clean_log + echo -e "Local version: NOT FOUND, latest version: $core_latest_ver." >> "$LOG" + update_core + else + if [ "$(cat $UNM_DIR/core_local_ver)" != "$core_latest_ver" ]; then + clean_log + echo -e "Local version: $(cat $UNM_DIR/core_local_ver 2>"/dev/null"), latest version: $core_latest_ver." >> "$LOG" + update_core + else + echo -e "\nLocal version: $(cat $UNM_DIR/core_local_ver 2>"/dev/null"), latest version: $core_latest_ver." >> "$LOG" + echo -e "You're already using the latest version." >> "$LOG" + rm -f "$LOCK" + exit 3 + fi + fi +} + +update_core() { + echo -e "Updating core..." >> "$LOG" + + mkdir -p "$UNM_DIR/core" + rm -rf "$UNM_DIR/core"/* + + for file in $(wget -qO- "https://api.github.com/repos/UnblockNeteaseMusic/server/contents/precompiled" | jsonfilter -e '@[*].path') + do + wget "https://fastly.jsdelivr.net/gh/UnblockNeteaseMusic/server@$core_latest_ver/$file" -qO "$UNM_DIR/core/${file##*/}" + [ -s "$UNM_DIR/core/${file##*/}" ] || { + echo -e "Failed to download ${file##*/}." >> "$LOG" + rm -f "$LOCK" + exit 1 + } + done + + for cert in "ca.crt" "server.crt" "server.key" + do + wget "https://fastly.jsdelivr.net/gh/UnblockNeteaseMusic/server@$core_latest_ver/$cert" -qO "$UNM_DIR/core/$cert" + [ -s "$UNM_DIR/core/${cert}" ] || { + echo -e "Failed to download ${cert}." >> "$LOG" + rm -f "$LOCK" + exit 1 + } + done + + [ -z "$update_core_from_luci" ] || touch "$UNM_DIR/update_core_successfully" + echo -e "$core_latest_ver" > "$UNM_DIR/core_local_ver" + [ -n "$non_restart" ] || /etc/init.d/"$NAME" restart + + echo -e "Succeeded in updating core." > "$LOG" + echo -e "Current core version: $core_latest_ver.\n" >> "$LOG" + rm -f "$LOCK" +} + +case "$1" in + "update_core") + check_core_if_already_running + check_core_latest_version + ;; + "update_core_non_restart") + non_restart=1 + check_core_if_already_running + check_core_latest_version + ;; + "update_core_from_luci") + update_core_from_luci=1 + check_core_if_already_running + check_core_latest_version + ;; + "remove_core") + "/etc/init.d/$NAME" stop + rm -rf "$UNM_DIR/core" "$UNM_DIR/core_local_ver" "$LOCK" + ;; + *) + echo -e "Usage: $0 update_core | remove_core" + ;; +esac diff --git a/luci-app-unblockneteasemusic/views/view1.jpg b/luci-app-unblockneteasemusic/views/view1.jpg new file mode 100644 index 00000000..ad5acca9 Binary files /dev/null and b/luci-app-unblockneteasemusic/views/view1.jpg differ diff --git a/luci-app-unblockneteasemusic/views/view2.jpg b/luci-app-unblockneteasemusic/views/view2.jpg new file mode 100644 index 00000000..da74790c Binary files /dev/null and b/luci-app-unblockneteasemusic/views/view2.jpg differ diff --git a/luci-app-unblockneteasemusic/views/view3.jpg b/luci-app-unblockneteasemusic/views/view3.jpg new file mode 100644 index 00000000..633154e0 Binary files /dev/null and b/luci-app-unblockneteasemusic/views/view3.jpg differ diff --git a/luci-app-unblockneteasemusic/views/view4.jpg b/luci-app-unblockneteasemusic/views/view4.jpg new file mode 100644 index 00000000..7144b8a4 Binary files /dev/null and b/luci-app-unblockneteasemusic/views/view4.jpg differ diff --git a/luci-app-wechatpush b/luci-app-wechatpush deleted file mode 160000 index 4649b21c..00000000 --- a/luci-app-wechatpush +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 4649b21cebe036f3abc16c81e546c22e46129818 diff --git a/luci-app-wechatpush/Makefile b/luci-app-wechatpush/Makefile new file mode 100644 index 00000000..02ad0b3b --- /dev/null +++ b/luci-app-wechatpush/Makefile @@ -0,0 +1,23 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=luci-app-serverchan +PKG_VERSION:=2.06.2 +PKG_RELEASE:=10 + +PKG_MAINTAINER:=tty228 + +LUCI_TITLE:=LuCI support for serverchan +LUCI_PKGARCH:=all +LUCI_DEPENDS:=+iputils-arping +curl +jq + +define Package/$(PKG_NAME)/conffiles +/etc/config/serverchan +/usr/share/serverchan/api/diy.json +/usr/share/serverchan/api/logo.jpg +/usr/share/serverchan/api/ipv4.list +/usr/share/serverchan/api/ipv6.list +endef + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/luci-app-wechatpush/README.md b/luci-app-wechatpush/README.md new file mode 100644 index 00000000..ed2fdd2a --- /dev/null +++ b/luci-app-wechatpush/README.md @@ -0,0 +1,45 @@ +# 简介 +- 用于 OpenWRT 路由器上进行 微信/Telegram 推送的插件 +- 支持列表: +- 微信推送/Server酱 https://sct.ftqq.com/ +- 企业微信/应用推送 https://work.weixin.qq.com/api/doc/90000/90135/90248 +- 微信推送/WxPusher https://wxpusher.zjiecode.com/docs +- 微信推送/推送加 http://www.pushplus.plus/ +- Telegram/BotFather https://t.me/BotFather +- 精力有限,如需要钉钉推送、飞书推送、Bark推送等请尝试 https://github.com/zzsj0928/luci-app-pushbot +- 依赖 iputils-arping + curl + jq 命令,安装前请 `opkg update`,小内存路由谨慎安装 + + +#### 主要功能 +- 路由 IP、IPv6 变动推送 +- 设备 上线、离线 推送 +- 设备在线列表及流量使用情况 +- CPU 负载、温度监视、PVE 宿主机温度监控 +- 路由运行状态定时推送 +- 路由 Web、SSH 登录提示,自动拉黑、端口敲门 +- 无人值守任务 + +#### 已知问题 +- 基于 X86 OpenWrt v19.07.10 制作,不同系统不同设备,可能会遇到各种问题,**如获取到错误的温度信息、页面显示错误、报错等,自行适配** +- 部分设备无法读取到设备名,脚本使用 `cat /tmp/dhcp.leases` 命令读取设备名,**如果 DHCP 中不存在设备名,则无法读取设备名**(如二级路由设备、静态IP设备、OpenWrt 作为旁路网关等情况),请使用设备名备注,或在高级设置处设置从光猫获取 +- 使用主动探测设备连接的方式检测设备在线状态,以避免 Wi-Fi 休眠机制,主动探测较为耗时,**如遇设备休眠频繁,请自行调整超时设置** +- 流量统计功能依赖 wrtbwmon ,自行选装或编译,**该插件与 Routing/NAT 、Flow Offloading 冲突,开启无法获取流量,自行选择** + +#### PS +- 新功能看情况开发,忙得头晕眼花 +- 欢迎各种代码提交 +- 审美无能,推送样式将就用吧 +- 提交bug时请尽量带上设备信息,日志与描述如执行 /usr/share/serverchan/serverchan 后的提示、日志信息、/tmp/serverchan/ 目录下的文件信息,**并附上 sh -x /usr/share/serverchan/serverchan t1 的详细运行信息** ) +- 三言两句恕我无能为力 + +#### Download +- [luci-app-serverchan](https://github.com/tty228/luci-app-serverchan/releases) +- [wrtbwmon](https://github.com/brvphoenix/wrtbwmon) +- [luci-app-wrtbwmon](https://github.com/brvphoenix/luci-app-wrtbwmon) +- **L大版本直接编译 luci-app-wrtbwmon ,非原版 LuCI 如使用以上 wrtbwmon,请注意安装版本号** + +#### Donate +如果你觉得此项目对你有帮助,请捐助我们,以使项目能持续发展,更加完善。 + +![image](https://github.com/tty228/Python-100-Days/blob/master/res/WX.jpg) + diff --git a/luci-app-wechatpush/luasrc/controller/serverchan.lua b/luci-app-wechatpush/luasrc/controller/serverchan.lua new file mode 100644 index 00000000..aa612c88 --- /dev/null +++ b/luci-app-wechatpush/luasrc/controller/serverchan.lua @@ -0,0 +1,34 @@ +module("luci.controller.serverchan", package.seeall) + +function index() + if not nixio.fs.access("/etc/config/serverchan") then + return + end + + local page = entry({"admin", "services", "serverchan"}, alias("admin", "services", "serverchan", "setting"), _("微信推送"), 30) + page.dependent = true + page.acl_depends = { "luci-app-serverchan" } + + entry({"admin", "services", "serverchan", "setting"}, cbi("serverchan/setting"), _("配置"), 40).leaf = true + entry({"admin", "services", "serverchan", "advanced"}, cbi("serverchan/advanced"), _("高级设置"), 50).leaf = true + entry({"admin", "services", "serverchan", "client"}, form("serverchan/client"), _("在线设备"), 80) + entry({"admin", "services", "serverchan", "log"}, form("serverchan/log"), _("日志"), 99).leaf = true + entry({"admin", "services", "serverchan", "get_log"}, call("get_log")).leaf = true + entry({"admin", "services", "serverchan", "clear_log"}, call("clear_log")).leaf = true + entry({"admin", "services", "serverchan", "status"}, call("act_status")).leaf = true +end + +function act_status() + local e = {} + e.running = luci.sys.call("busybox ps|grep -v grep|grep -c serverchan >/dev/null") == 0 + luci.http.prepare_content("application/json") + luci.http.write_json(e) +end + +function get_log() + luci.http.write(luci.sys.exec("[ -f '/tmp/serverchan/serverchan.log' ] && cat /tmp/serverchan/serverchan.log")) +end + +function clear_log() + luci.sys.call("echo '' > /tmp/serverchan/serverchan.log") +end diff --git a/luci-app-wechatpush/luasrc/model/cbi/serverchan/advanced.lua b/luci-app-wechatpush/luasrc/model/cbi/serverchan/advanced.lua new file mode 100644 index 00000000..8a1177a5 --- /dev/null +++ b/luci-app-wechatpush/luasrc/model/cbi/serverchan/advanced.lua @@ -0,0 +1,168 @@ +local nt = require "luci.sys".net +local fs = require "nixio.fs" + +m = Map("serverchan", translate("提示:")) +m.description = translate("如果你不了解这些选项的含义,请不要修改这些选项") + +s = m:section(TypedSection, "serverchan", "高级设置") +s.anonymous = true +s.addremove = false + +a = s:option(Value, "up_timeout", translate('设备上线检测超时(s)')) +a.default = "2" +a.optional = false +a.datatype = "uinteger" + +a = s:option(Value, "down_timeout", translate('设备离线检测超时(s)')) +a.default = "20" +a.optional = false +a.datatype = "uinteger" + +a = s:option(Value, "timeout_retry_count", translate('离线检测次数')) +a.default = "2" +a.optional = false +a.datatype = "uinteger" +a.description = translate("若无二级路由设备,信号强度良好,可以减少以上数值
因夜间 wifi 休眠较为玄学,遇到设备频繁推送断开,烦请自行调整参数
..╮(╯_╰)╭..") + +a = s:option(Value, "thread_num", translate('最大并发进程数')) +a.default = "3" +a.datatype = "uinteger" +a.description = translate("低性能设备请勿更改设置值,或酌情减少参数") + +a = s:option(Value, "soc_code", "自定义温度读取命令") +a.rmempty = true +a:value("", translate("默认")) +a:value("pve", translate("PVE 虚拟机")) +a.description = translate("自定义命令如需使用特殊符号,如引号、$、!等,则需要自行转义,并在保存后查看 /etc/config/serverchan 文件 soc_code 设置项是否保存正确
可以使用 eval `echo $(uci get serverchan.serverchan.soc_code)` 命令查看命令输出及错误信息
执行结果需为纯数字(可带小数),用于温度对比") + +a = s:option(Value, "server_host", translate("宿主机地址")) +a.rmempty = true +a.default = "10.0.0.2" +a.description = translate("") +a:depends({soc_code = "pve"}) + +a = s:option(Value, "server_port", translate("宿主机 SSH 端口")) +a.rmempty = true +a.default = "22" +a.description = translate("SSH 端口默认为 22,如有自定义,请填写自定义 SSH 端口
请确认已经设置好密钥登陆,否则会引起脚本无法运行等错误!
PVE 安装 sensors 命令自行百度
密钥登陆例(自行修改地址与端口号):
opkg update #更新列表
opkg install openssh-client openssh-keygen #安装openssh客户端
echo -e \"\\n\" | ssh-keygen -t rsa # 生成密钥文件(空密码)
pve_host=`uci get serverchan.serverchan.server_host` || pve_host=\"10.0.0.3\" # 读取配置文件中的 pve 主机地址,如果不存在请自行填写
pve_port=`uci get serverchan.serverchan.server_port` || pve_host=\"22\" # 读取配置文件中的 pve 主机 ssh 端口号,,如果不存在请自行填写
ssh root@${pve_host} -p ${pve_port} \"tee -a ~/.ssh/id_rsa.pub\" < ~/.ssh/id_rsa.pub # 传送公钥到 PVE
ssh root@${pve_host} -p ${pve_port} \"cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys\" # 写入公钥到 PVE
ssh -i /root/.ssh/id_rsa root@${pve_host} -p ${pve_port} sensors # 使用私钥连接 PVE 测试温度命令
刷机党自行将 /root/.ssh/ 加入备份列表,避免重复操作") +a:depends({soc_code = "pve"}) + +a = s:option(Button, "soc", translate("测试温度命令")) +a.inputtitle = translate("输出信息") +a.write = function() + luci.sys.call("/usr/share/serverchan/serverchan soc") + luci.http.redirect(luci.dispatcher.build_url("admin", "services", "serverchan", "advanced")) +end + +if nixio.fs.access("/tmp/serverchan/soc_tmp") then +e = s:option(TextValue,"soc_tmp") +e.rows = 2 +e.readonly = true +e.cfgvalue = function() + return luci.sys.exec("cat /tmp/serverchan/soc_tmp && rm -f /tmp/serverchan/soc_tmp") +end +end + +a = s:option(Flag, "gateway_info_enable", translate("从光猫获取主机名等信息")) +a.default = 0 +a.rmempty = true +a.description = translate("适用于 OpenWrt 作为旁路网关,无法获取设备主机名及完整的局域网设备列表时
仅测试通过 HG5143F/HN8145V 天翼网关,不保证通用性") + +a = s:option(Value, "gateway_host_url", translate('光猫登录地址 URL')) +a.rmempty = true +a.default = "http://192.168.1.1/cgi-bin/luci" +a:depends({gateway_info_enable = "1"}) + +a = s:option(Value, "gateway_info_url", translate('设备列表 JSON URL')) +a.rmempty = true +a.default = "http://192.168.1.1/cgi-bin/luci/admin/allInfo" +a.description = translate('使用 F12 控制台自行抓取
ip、devName、model 为必须项,JSON 文件信息范例:
{"pc1":{"brand":"","devName":"RouterOS","onlineTime":45,"model":"","upSpeed":229376,"downSpeed":7707033,"type":"pc","ip":"192.168.1.7"}}') +a:depends({gateway_info_enable = "1"}) + +a = s:option(Value, "gateway_logout_url", translate('光猫注销登录 URL')) +a.rmempty = true +a.default = "http://192.168.1.1/cgi-bin/luci/admin/logout" +a.description = translate("非必须项,但可能会影响其他用户登录 Web 管理页面,如 HG5143F") +a:depends({gateway_info_enable = "1"}) + +a = s:option(Value, "gateway_username_id", translate('登录页面帐号输入框 ID')) +a.rmempty = true +a.default = "username" +a:depends({gateway_info_enable = "1"}) + +a = s:option(Value, "gateway_password_id", translate('登录页面密码输入框 ID')) +a.rmempty = true +a.default = "psd" +a.description = translate("浏览器右键-检查元素") +a:depends({gateway_info_enable = "1"}) + +a = s:option(Value, "gateway_username", translate('光猫登录帐号')) +a.rmempty = true +a.default = "useradmin" +a:depends({gateway_info_enable = "1"}) + +a = s:option(Value, "gateway_password", translate('光猫登录密码')) +a.rmempty = true +a.description = translate("使用普通账号即可,不需要超密") +a:depends({gateway_info_enable = "1"}) + +a = s:option(Flag, "err_enable", translate("无人值守任务")) +a.default = 0 +a.rmempty = true +a.description = translate("请确认脚本可以正常运行,否则可能造成频繁重启等错误!") + +a = s:option(Flag, "err_sheep_enable", translate("仅在免打扰时段重拨")) +a.default = 0 +a.rmempty = true +a.description = translate("避免白天重拨 DDNS 域名等待解析,此功能不影响断网检测
因夜间跑流量问题,该功能可能不稳定") +a:depends({err_enable = "1"}) + +a = s:option(DynamicList, "err_device_aliases", translate("关注列表")) +a.rmempty = true +a.description = translate("只会在列表中设备都不在线时才会执行
免打扰时段一小时后,关注设备五分钟低流量(约100kb/m)将视为离线") +nt.mac_hints(function(mac, name) a :value(mac, "%s (%s)" %{ mac, name }) end) +a:depends({err_enable = "1"}) + +a = s:option(ListValue, "network_err_event", translate("网络断开时")) +a.default = "" +a:depends({err_enable = "1"}) +a:value("", translate("无操作")) +a:value("1", translate("重启路由器")) +a:value("2", translate("重新拨号")) +a:value("3", translate("修改相关设置项,尝试自动修复网络")) +a.description = translate("选项 1 选项 2 不会修改设置,并最多尝试 2 次。
选项 3 会将设置项备份于 /usr/share/serverchan/configbak 目录,并在失败后还原。
【!!无法保证兼容性!!】不熟悉系统设置项,不会救砖请勿使用") + +a = s:option(ListValue, "system_time_event", translate("定时重启")) +a.default = "" +a:depends({err_enable = "1"}) +a:value("", translate("无操作")) +a:value("1", translate("重启路由器")) +a:value("2", translate("重新拨号")) + +a = s:option(Value, "autoreboot_time", "系统运行时间大于") +a.rmempty = true +a.default = "24" +a.datatype = "uinteger" +a:depends({system_time_event = "1"}) +a.description = translate("单位为小时") + +a = s:option(Value, "network_restart_time", "网络在线时间大于") +a.rmempty = true +a.default = "24" +a.datatype = "uinteger" +a:depends({system_time_event = "2"}) +a.description = translate("单位为小时") + +a = s:option(Flag, "public_ip_event", translate("重拨尝试获取公网 IP")) +a.default = 0 +a.rmempty = true +a:depends({err_enable = "1"}) +a.description = translate("重拨时不会推送 IP 变动通知,并会导致你的域名无法及时更新 IP 地址
请确认你可以通过重拨获取公网 IP,否则这不仅徒劳无功还会引起频繁断网
移动等大内网你就别挣扎了!!") + +a = s:option(Value, "public_ip_retry_count", "当天最大重试次数") +a.rmempty = true +a.default = "10" +a.datatype = "uinteger" +a:depends({public_ip_event = "1"}) + +return m diff --git a/luci-app-wechatpush/luasrc/model/cbi/serverchan/client.lua b/luci-app-wechatpush/luasrc/model/cbi/serverchan/client.lua new file mode 100644 index 00000000..c082a992 --- /dev/null +++ b/luci-app-wechatpush/luasrc/model/cbi/serverchan/client.lua @@ -0,0 +1,34 @@ +f = SimpleForm("serverchan") +f.reset = false +f.submit = false + +local o = require "luci.dispatcher" +local fs = require "nixio.fs" +local jsonc = require "luci.jsonc" +local sys = require "luci.sys" + +local sessions = {} +local session_path = "/var/serverchan/client" +if fs.access(session_path) then + for filename in fs.dir(session_path) do + local session_file = session_path .. "/" .. filename + local file = io.open(session_file, "r") + local t = jsonc.parse(file:read("*a")) + if t then + t.session_file = session_file + sessions[#sessions + 1] = t + end + file:close() + end +end + +local client_count = sys.exec("cat /tmp/serverchan/ipAddress | wc -l") +t = f:section(Table, sessions, translate("当前共 ".. client_count .. "台设备在线")) +t:option(DummyValue, "name", translate("主机名")) +t:option(DummyValue, "mac", translate("MAC")) +t:option(DummyValue, "ip", translate("IP")) +t:option(DummyValue, "usage", translate("总计流量")) +t:option(DummyValue, "uptime", translate("在线时间")) + + +return f diff --git a/luci-app-wechatpush/luasrc/model/cbi/serverchan/log.lua b/luci-app-wechatpush/luasrc/model/cbi/serverchan/log.lua new file mode 100644 index 00000000..d794f7d7 --- /dev/null +++ b/luci-app-wechatpush/luasrc/model/cbi/serverchan/log.lua @@ -0,0 +1,6 @@ +f = SimpleForm("serverchan") +f.reset = false +f.submit = false +f:append(Template("serverchan/serverchan_log")) + +return f diff --git a/luci-app-wechatpush/luasrc/model/cbi/serverchan/setting.lua b/luci-app-wechatpush/luasrc/model/cbi/serverchan/setting.lua new file mode 100644 index 00000000..4715d2a3 --- /dev/null +++ b/luci-app-wechatpush/luasrc/model/cbi/serverchan/setting.lua @@ -0,0 +1,536 @@ +local nt = require "luci.sys".net +local fs = require "nixio.fs" +local e = luci.model.uci.cursor() +local net = require "luci.model.network".init() +local sys = require "luci.sys" +local ifaces = sys.net:devices() + +m = Map("serverchan", translate("ServerChan"), +translate("「Server酱」,英文名「ServerChan」,是一款从服务器推送报警信息和日志到微信的工具。

如果你在使用中遇到问题,请到这里提交:") +.. [[]] +.. translate("GitHub 项目地址") +.. [[]] +) + +m:section(SimpleSection).template = "serverchan/serverchan_status" + +s = m:section(NamedSection, "serverchan", "serverchan", translate("")) +s:tab("basic", translate("基本设置")) +s:tab("content", translate("推送内容")) +s:tab("ipset", translate("自动封禁")) +s:tab("crontab", translate("定时推送")) +s:tab("disturb", translate("免打扰")) +s.addremove = false +s.anonymous = true + +-- 基本设置 +a = s:taboption("basic", Flag, "serverchan_enable", translate("启用")) +a.rmempty = true + +a = s:taboption("basic", MultiValue, "lite_enable", translate("精简模式")) +a:value("device", translate("精简当前设备列表")) +a:value("nowtime", translate("精简当前时间")) +a:value("content", translate("只推送标题")) +a.widget = "checkbox" +a.default = nil +a.optional = true + +a = s:taboption("basic", ListValue, "jsonpath", translate("推送模式")) +a.default = "/usr/share/serverchan/api/serverchan.json" +a.rmempty = true +a:value("/usr/share/serverchan/api/serverchan.json", translate("微信 Server酱")) +a:value("/usr/share/serverchan/api/qywx_mpnews.json", translate("企业微信 图文消息")) +a:value("/usr/share/serverchan/api/qywx_markdown.json", translate("企业微信 markdown版(不支持公众号)")) +a:value("/usr/share/serverchan/api/wxpusher.json", translate("微信 wxpusher")) +a:value("/usr/share/serverchan/api/pushplus.json", translate("微信 pushplus")) +a:value("/usr/share/serverchan/api/telegram.json", translate("Telegram")) +a:value("/usr/share/serverchan/api/diy.json", translate("自定义推送")) + +a = s:taboption("basic", Value, "sckey", translate('微信推送/新旧共用'), translate("").."Server酱 sendkey 点击这里
") +a.rmempty = true +a:depends("jsonpath", "/usr/share/serverchan/api/serverchan.json") + +a = s:taboption("basic", Value, "corpid", translate('企业ID(corpid)'), translate("").."获取说明 点击这里") +a.rmempty = true +a:depends("jsonpath", "/usr/share/serverchan/api/qywx_mpnews.json") +a:depends("jsonpath", "/usr/share/serverchan/api/qywx_markdown.json") + +a = s:taboption("basic", Value, "userid", translate('帐号(userid)')) +a.rmempty = true +a.description = translate("群发到应用请填入 @all ") +a:depends("jsonpath", "/usr/share/serverchan/api/qywx_mpnews.json") +a:depends("jsonpath", "/usr/share/serverchan/api/qywx_markdown.json") + +a = s:taboption("basic", Value, "agentid", translate('应用id(agentid)')) +a.rmempty = true +a:depends("jsonpath", "/usr/share/serverchan/api/qywx_mpnews.json") +a:depends("jsonpath", "/usr/share/serverchan/api/qywx_markdown.json") + +a = s:taboption("basic", Value, "corpsecret", translate('应用密钥(Secret)')) +a.rmempty = true +a:depends("jsonpath", "/usr/share/serverchan/api/qywx_mpnews.json") +a:depends("jsonpath", "/usr/share/serverchan/api/qywx_markdown.json") + +a = s:taboption("basic", Value, "mediapath", translate('图片缩略图文件路径')) +a.rmempty = true +a.default = "/usr/share/serverchan/api/logo.jpg" +a:depends("jsonpath", "/usr/share/serverchan/api/qywx_mpnews.json") +a.description = translate("只支持 2MB 以内 JPG,PNG 格式
900*383 或 2.35:1 为佳 ") + +a = s:taboption("basic", Value, "wxpusher_apptoken", translate('appToken'), translate("").."获取 appToken 点击这里
") +a.rmempty = true +a:depends("jsonpath", "/usr/share/serverchan/api/wxpusher.json") + +a = s:taboption("basic", Value,"wxpusher_uids",translate('uids')) +a.rmempty = true +a:depends("jsonpath", "/usr/share/serverchan/api/wxpusher.json") + +a = s:taboption("basic", Value, "wxpusher_topicIds", translate('topicIds(群发)'), translate("").."接口说明 点击这里
") +a.rmempty = true +a:depends("jsonpath", "/usr/share/serverchan/api/wxpusher.json") + +a = s:taboption("basic", Value, "pushplus_token", translate('pushplus_token'), translate("").."获取pushplus_token 点击这里
") +a.rmempty = true +a:depends("jsonpath", "/usr/share/serverchan/api/pushplus.json") + +a = s:taboption("basic", Value, "tg_token", translate("TG_token"), translate("").."获取机器人点击这里
与创建的机器人发一条消息,开启对话
") +a.rmempty = true +a:depends("jsonpath", "/usr/share/serverchan/api/telegram.json") + +a = s:taboption("basic", Value, "chat_id", translate('TG_chatid'), translate("").."获取 chat_id 点击这里") +a.rmempty = true +a:depends("jsonpath", "/usr/share/serverchan/api/telegram.json") + +a = s:taboption("basic", TextValue, "diy_json", translate("自定义推送")) +a.optional = false +a.rows = 28 +a.wrap = "soft" +a.cfgvalue = function(self, section) + return fs.readfile("/usr/share/serverchan/api/diy.json") +end +a.write = function(self, section, value) + fs.writefile("/usr/share/serverchan/api/diy.json", value:gsub("\r\n", "\n")) +end +a:depends("jsonpath", "/usr/share/serverchan/api/diy.json") + +a = s:taboption("basic", Button, "__add", translate("发送测试")) +a.inputtitle = translate("发送") +a.inputstyle = "apply" +function a.write(self, section) + luci.sys.call("cbi.apply") + luci.sys.call("/usr/share/serverchan/serverchan test &") +end + +a = s:taboption("basic", Value, "device_name", translate('本设备名称')) +a.rmempty = true +a.description = translate("在推送信息标题中会标识本设备名称,用于区分推送信息的来源设备") + +a = s:taboption("basic", Value, "sleeptime", translate('检测时间间隔(s)')) +a.rmempty = true +a.optional = false +a.default = "60" +a.datatype = "and(uinteger,min(10))" +a.description = translate("越短的时间响应越及时,但会占用更多的系统资源") + +a = s:taboption("basic", ListValue, "oui_data", translate("MAC设备信息数据库")) +a.rmempty = true +a.default = "" +a:value("", translate("关闭")) +a:value("1", translate("简化版")) +a:value("2", translate("完整版")) +a:value("3", translate("网络查询")) +a.description = translate("需下载 4.36 MB 原始数据,处理后完整版约 1.2 MB,简化版约 250 kB
若无梯子,请勿使用网络查询") + +a = s:taboption("basic", Flag, "oui_dir", translate("下载到内存")) +a.rmempty = true +a:depends("oui_data", "1") +a:depends("oui_data", "2") +a.description = translate("懒得做自动更新了,下载到内存中,重启会重新下载
若无梯子,还是下到机身吧") + +a = s:taboption("basic", Flag, "reset_regularly", translate("每天零点重置流量数据")) +a.rmempty = true + +a = s:taboption("basic", Flag, "debuglevel", translate("开启日志")) +a.rmempty = true + +a = s:taboption("basic", DynamicList, "device_aliases", translate("设备别名")) +a.rmempty = true +a.description = translate("
请输入设备 MAC 和设备别名,用“-”隔开,如:
XX:XX:XX:XX:XX:XX-我的手机") + +-- 设备状态 +a = s:taboption("content", ListValue, "serverchan_ipv4", translate("IPv4 变动通知")) +a.rmempty = true +a.default = "" +a:value("", translate("关闭")) +a:value("1", translate("通过接口获取")) +a:value("2", translate("通过URL获取")) + +a = s:taboption("content", ListValue, "ipv4_interface", translate("接口名称")) +a.rmempty = true +a:depends({serverchan_ipv4 = "1"}) +for _, iface in ipairs(ifaces) do + if not (iface == "lo" or iface:match("^ifb.*")) then + local nets = net:get_interface(iface) + nets = nets and nets:get_networks() or {} + for k, v in pairs(nets) do + nets[k] = nets[k].sid + end + nets = table.concat(nets, ",") + a:value(iface, ((#nets > 0) and "%s (%s)" % {iface, nets} or iface)) + end +end +a.description = translate("
一般选择 wan 接口,多拨环境请自行选择") + +a = s:taboption("content", TextValue, "ipv4_list", translate("IPv4 API列表")) +a.optional = false +a.rows = 8 +a.wrap = "soft" +a.cfgvalue = function(self, section) + return fs.readfile("/usr/share/serverchan/api/ipv4.list") +end +a.write = function(self, section, value) + fs.writefile("/usr/share/serverchan/api/ipv4.list", value:gsub("\r\n", "\n")) +end +a.description = translate("
会因服务器稳定性、连接频繁等原因导致获取失败
如接口可以正常获取 IP,不推荐使用
从以上列表中随机地址访问") +a:depends({serverchan_ipv4 = "2"}) + +a = s:taboption("content", ListValue, "serverchan_ipv6", translate("IPv6 变动通知")) +a.rmempty = true +a.default = "disable" +a:value("0", translate("关闭")) +a:value("1", translate("通过接口获取")) +a:value("2", translate("通过URL获取")) + +a = s:taboption("content", ListValue, "ipv6_interface", translate("接口名称")) +a.rmempty = true +a:depends({serverchan_ipv6 = "1"}) +for _, iface in ipairs(ifaces) do + if not (iface == "lo" or iface:match("^ifb.*")) then + local nets = net:get_interface(iface) + nets = nets and nets:get_networks() or {} + for k, v in pairs(nets) do + nets[k] = nets[k].sid + end + nets = table.concat(nets, ",") + a:value(iface, ((#nets > 0) and "%s (%s)" % {iface, nets} or iface)) + end +end +a.description = translate("
一般选择 wan 接口,多拨环境请自行选择") + +a = s:taboption("content", TextValue, "ipv6_list", translate("IPv6 API列表")) +a.optional = false +a.rows = 8 +a.wrap = "soft" +a.cfgvalue = function(self, section) + return fs.readfile("/usr/share/serverchan/api/ipv6.list") +end +a.write = function(self, section, value) + fs.writefile("/usr/share/serverchan/api/ipv6.list", value:gsub("\r\n", "\n")) +end +a.description = translate("
会因服务器稳定性、连接频繁等原因导致获取失败
如接口可以正常获取 IP,不推荐使用
从以上列表中随机地址访问") +a:depends({serverchan_ipv6 = "2"}) + +a = s:taboption("content", Flag, "serverchan_up", translate("设备上线通知")) +a.default = 1 +a.rmempty = true + +a = s:taboption("content", Flag, "serverchan_down", translate("设备下线通知")) +a.default = 1 +a.rmempty = true + +a = s:taboption("content", Flag, "cpuload_enable", translate("CPU 负载报警")) +a.default = 1 +a.rmempty = true + +a = s:taboption("content", Value, "cpuload", "负载报警阈值") +a.default = 2 +a.rmempty = true +a:depends({cpuload_enable = "1"}) + +a = s:taboption("content", Flag, "temperature_enable", translate("CPU 温度报警")) +a.default = 1 +a.rmempty = true +a.description = translate("请确认设备可以获取温度,如需修改命令,请移步高级设置") + +a = s:taboption("content", Value, "temperature", "温度报警阈值") +a.rmempty = true +a.default = "80" +a.datatype = "and(uinteger,min(1))" +a:depends({temperature_enable = "1"}) +a.description = translate("
设备报警只会在连续五分钟超过设定值时才会推送
而且一个小时内不会再提醒第二次") + +a = s:taboption("content", Flag, "client_usage", translate("设备异常流量")) +a.default = 0 +a.rmempty = true + +a = s:taboption("content", Value, "client_usage_max", "每分钟流量限制") +a.default = "10M" +a.rmempty = true +a:depends({client_usage = "1"}) +a.description = translate("设备异常流量警报(byte),你可以追加 K 或者 M") + +a = s:taboption("content", Flag, "client_usage_disturb", translate("异常流量免打扰")) +a.default = 1 +a.rmempty = true +a:depends({client_usage = "1"}) + +a = s:taboption("content", DynamicList, "client_usage_whitelist", translate("异常流量关注列表")) +nt.mac_hints(function(mac, name) a:value(mac, "%s (%s)" %{ mac, name }) end) +a.rmempty = true +a:depends({client_usage_disturb = "1"}) +a.description = translate("请输入设备 MAC") + +a = s:taboption("content", Flag, "web_logged", translate("web 登录提醒")) +a.default = 0 +a.rmempty = true + +a = s:taboption("content", Flag, "ssh_logged", translate("ssh 登录提醒")) +a.default = 0 +a.rmempty = true + +a = s:taboption("content", Flag, "web_login_failed", translate("web 错误尝试提醒")) +a.default = 0 +a.rmempty = true + +a = s:taboption("content", Flag, "ssh_login_failed", translate("ssh 错误尝试提醒")) +a.default = 0 +a.rmempty = true + +a = s:taboption("content", Value, "login_max_num", "错误尝试次数") +a.default = "3" +a.datatype = "and(uinteger,min(1))" +a:depends("web_login_failed", "1") +a:depends("ssh_login_failed", "1") +a.description = translate("超过次数后推送提醒,并可选自动拉黑") + +-- 自动封禁 + +a = s:taboption("ipset", Flag, "web_login_black", translate("自动拉黑非法登录设备")) +a.default = 0 +a.rmempty = true +a:depends("web_login_failed", "1") +a:depends("ssh_login_failed", "1") + +a = s:taboption("ipset", Value, "ip_black_timeout", "拉黑时间(秒)") +a.default = "86400" +a.datatype = "and(uinteger,min(0))" +a:depends("web_login_black", "1") +a.description = translate("0 为永久拉黑,慎用
如不幸误操作,请更改设备 IP 进入 LUCI 界面清空规则") + +a = s:taboption("ipset", DynamicList, "ip_white_list", translate("白名单 IP 列表")) +a.datatype = "ipaddr" +a.rmempty = true +luci.ip.neighbors({family = 4}, function(entry) + if entry.reachable then + a:value(entry.dest:string()) + end +end) +a:depends("web_logged", "1") +a:depends("ssh_logged", "1") +a:depends("web_login_failed", "1") +a:depends("ssh_login_failed", "1") +a.description = translate("忽略推送,仅在日志中记录,并忽略拉黑操作,暂不支持掩码位表示") + +a = s:taboption("ipset", Flag, "port_knocking", translate("端口敲门")) +a.default = 0 +a.rmempty = true +a.description = translate("登录成功后开放端口") + +a = s:taboption("ipset", Value, "ip_port_white", "端口") +a.default = "" +a.rmempty = true +a.description = translate("例:'22'、'21:25'、'21:25,135:139'") +a:depends("port_knocking", "1") + +a = s:taboption("ipset", DynamicList, "port_forward_list", "端口转发") +a.default = "" +a.rmempty = true +a.description = translate("例:将本机(10.0.0.1)的 13389 端口转发到 10.0.0.2 的3389:
'10.0.0.1,13389,10.0.0.2,3389'
IPv6 未测试") +a:depends("port_knocking", "1") + +a = s:taboption("ipset", Value, "ip_white_timeout", "放行时间(秒)") +a.default = "600" +a.rmempty = true +a.datatype = "and(uinteger,min(0))" +a.description = translate("0 为永久放行,慎用
连接成功后不断开就不需要重新连接,故不需要设置太大
注:响应时间与检测间隔和每一次检测所需的时间相关,故反应不是很快,将就用吧") +a:depends("port_knocking", "1") + +a = s:taboption("ipset", TextValue, "ip_black_list", translate("IP 黑名单列表")) +a.optional = false +a.rows = 8 +a.wrap = "soft" +a.cfgvalue = function(self, section) + return fs.readfile("/usr/share/serverchan/api/ip_blacklist") +end +a.write = function(self, section, value) + fs.writefile("/usr/share/serverchan/api/ip_blacklist", value:gsub("\r\n", "\n")) +end +a:depends("web_login_black", "1") +a.description = translate("可在此处添加或删除,timeout 后的数字为剩余时间(秒),添加时只需要输入 IP") + +-- 定时推送 +a = s:taboption("crontab", ListValue, "crontab", translate("定时任务设定")) +a.rmempty = true +a.default = "" +a:value("", translate("关闭")) +a:value("1", translate("定时发送")) +a:value("2", translate("间隔发送")) + +a = s:taboption("crontab", ListValue, "regular_time", translate("发送时间")) +a.rmempty = true +for t = 0, 23 do +a:value(t, translate("每天"..t.."点")) +end +a.default = 8 +a.datatype = uinteger +a:depends("crontab", "1") + +a = s:taboption("crontab", ListValue, "regular_time_2", translate("发送时间")) +a.rmempty = true +a:value("", translate("关闭")) +for t = 0, 23 do +a:value(t, translate("每天"..t.."点")) +end +a.default = "关闭" +a.datatype = uinteger +a:depends("crontab", "1") + +a = s:taboption("crontab", ListValue, "regular_time_3", translate("发送时间")) +a.rmempty = true + +a:value("", translate("关闭")) +for t = 0, 23 do +a:value(t, translate("每天"..t.."点")) +end +a.default = "关闭" +a.datatype = uinteger +a:depends("crontab", "1") + +a = s:taboption("crontab", ListValue, "interval_time", translate("发送间隔")) +a.rmempty = true +for t = 1, 23 do +a:value(t, translate(t.."小时")) +end +a.default = 6 +a.datatype = uinteger +a:depends("crontab", "2") +a.description = translate("
从 00:00 开始,每 * 小时发送一次") + +a = s:taboption("crontab", Value, "send_title", translate("微信推送标题")) +a:depends("crontab", "1") +a:depends("crontab", "2") +a.placeholder = "OpenWrt By tty228 路由状态:" +a.description = translate("
使用特殊符号可能会造成发送失败") + +a = s:taboption("crontab", Flag, "router_status", translate("系统运行情况")) +a.default = 1 +a:depends("crontab", "1") +a:depends("crontab", "2") + +a = s:taboption("crontab", Flag, "router_temp", translate("设备温度")) +a.default = 1 +a:depends("crontab", "1") +a:depends("crontab", "2") + +a = s:taboption("crontab", Flag, "router_wan", translate("WAN信息")) +a.default = 1 +a:depends("crontab", "1") +a:depends("crontab", "2") + +a = s:taboption("crontab", Flag, "client_list", translate("客户端列表")) +a.default = 1 +a:depends("crontab", "1") +a:depends("crontab", "2") + +e = s:taboption("crontab", Button, "_add", translate("手动发送")) +e.inputtitle = translate("发送") +e:depends("crontab", "1") +e:depends("crontab", "2") +e.inputstyle = "apply" +function e.write(self, section) +luci.sys.call("cbi.apply") + luci.sys.call("/usr/share/serverchan/serverchan send &") +end + +-- 免打扰 +a = s:taboption("disturb", ListValue, "serverchan_sheep", translate("免打扰时段设置"), translate("在指定整点时间段内,暂停推送消息
免打扰时间中,定时推送也会被阻止。")) +a.rmempty = true +a:value("", translate("关闭")) +a:value("1", translate("模式一:脚本挂起")) +a:value("2", translate("模式二:静默模式")) +a.description = translate("模式一停止一切检测,包括无人值守。") + +a = s:taboption("disturb", ListValue, "starttime", translate("免打扰开始时间")) +a.rmempty = true + +for t = 0, 23 do +a:value(t, translate("每天"..t.."点")) +end +a.default = 0 +a.datatype = uinteger +a:depends({serverchan_sheep = "1"}) +a:depends({serverchan_sheep = "2"}) + +a = s:taboption("disturb", ListValue, "endtime", translate("免打扰结束时间")) +a.rmempty = true + +for t = 0, 23 do +a:value(t, translate("每天"..t.."点")) +end +a.default = 8 +a.datatype = uinteger +a:depends({serverchan_sheep = "1"}) +a:depends({serverchan_sheep = "2"}) + +a = s:taboption("disturb", ListValue, "macmechanism", translate("MAC过滤")) +a:value("", translate("disable")) +a:value("allow", translate("忽略列表内设备")) +a:value("block", translate("仅通知列表内设备")) +a:value("interface", translate("仅通知此接口设备")) +a.rmempty = true + +a = s:taboption("disturb", DynamicList, "serverchan_whitelist", translate("忽略列表")) +nt.mac_hints(function(mac, name) a :value(mac, "%s (%s)" %{ mac, name }) end) +a.rmempty = true +a:depends({macmechanism = "allow"}) +a.description = translate("AA:AA:AA:AA:AA:AA\\|BB:BB:BB:BB:BB:B 可以将多个 MAC 视为同一用户
任一设备在线后不再推送,设备全部离线时才会推送,避免双 wifi 频繁推送") + +a = s:taboption("disturb", DynamicList, "serverchan_blacklist", translate("关注列表")) +nt.mac_hints(function(mac, name) a:value(mac, "%s (%s)" %{ mac, name }) end) +a.rmempty = true +a:depends({macmechanism = "block"}) +a.description = translate("AA:AA:AA:AA:AA:AA\\|BB:BB:BB:BB:BB:B 可以将多个 MAC 视为同一用户
任一设备在线后不再推送,设备全部离线时才会推送,避免双 wifi 频繁推送") + +a = s:taboption("disturb", ListValue, "serverchan_interface", translate("接口名称")) +a:depends({macmechanism = "interface"}) +a.rmempty = true + +for _, iface in ipairs(ifaces) do + if not (iface == "lo" or iface:match("^ifb.*")) then + local nets = net:get_interface(iface) + nets = nets and nets:get_networks() or {} + for k, v in pairs(nets) do + nets[k] = nets[k].sid + end + nets = table.concat(nets, ",") + a:value(iface, ((#nets > 0) and "%s (%s)" % {iface, nets} or iface)) + end +end + +a = s:taboption("disturb", ListValue, "macmechanism2", translate("MAC过滤2")) +a:value("", translate("disable")) +a:value("MAC_online", translate("列表内任意设备在线时免打扰")) +a:value("MAC_offline", translate("列表内设备都离线后免打扰")) +a.rmempty = true + +a = s:taboption("disturb", DynamicList, "MAC_online_list", translate("在线免打扰列表")) +nt.mac_hints(function(mac, name) a:value(mac, "%s (%s)" %{ mac, name }) end) +a.rmempty = true +a:depends({macmechanism2 = "MAC_online"}) + +a = s:taboption("disturb", DynamicList, "MAC_offline_list", translate("任意离线免打扰列表")) +nt.mac_hints(function(mac, name) a:value(mac, "%s (%s)" %{ mac, name }) end) +a.rmempty = true +a:depends({macmechanism2 = "MAC_offline"}) + +return m diff --git a/luci-app-wechatpush/luasrc/view/serverchan/serverchan_log.htm b/luci-app-wechatpush/luasrc/view/serverchan/serverchan_log.htm new file mode 100644 index 00000000..56fe70d6 --- /dev/null +++ b/luci-app-wechatpush/luasrc/view/serverchan/serverchan_log.htm @@ -0,0 +1,33 @@ +<% +local dsp = require "luci.dispatcher" +-%> + + +
+ <%:自动刷新%> + + +
diff --git a/luci-app-wechatpush/luasrc/view/serverchan/serverchan_status.htm b/luci-app-wechatpush/luasrc/view/serverchan/serverchan_status.htm new file mode 100644 index 00000000..e36561dd --- /dev/null +++ b/luci-app-wechatpush/luasrc/view/serverchan/serverchan_status.htm @@ -0,0 +1,22 @@ + + +
+

+ <%:Collecting data...%> +

+
diff --git a/luci-app-wechatpush/root/etc/config/serverchan b/luci-app-wechatpush/root/etc/config/serverchan new file mode 100644 index 00000000..82001daa --- /dev/null +++ b/luci-app-wechatpush/root/etc/config/serverchan @@ -0,0 +1,11 @@ + +config serverchan 'serverchan' + option serverchan_enable '0' + option sleeptime '60' + option serverchan_ipv6 '0' + option serverchan_up '1' + option serverchan_down '1' + option cpuload_enable '1' + option cpuload '2' + option temperature_enable '0' + diff --git a/luci-app-wechatpush/root/etc/init.d/serverchan b/luci-app-wechatpush/root/etc/init.d/serverchan new file mode 100755 index 00000000..fca7dc2a --- /dev/null +++ b/luci-app-wechatpush/root/etc/init.d/serverchan @@ -0,0 +1,26 @@ +#!/bin/sh /etc/rc.common + +START=99 +STOP=10 + +start() { + state=`pgrep -f "/usr/share/serverchan/serverchan"` + if [ ! -z "$state" ]; then + restart + else + /usr/share/serverchan/serverchan & + fi + echo "serverchan is starting now ..." +} + +stop() { + kill -9 `pgrep -f "/usr/share/serverchan/serverchan"` 2>/dev/null + echo "serverchan exit ..." +} + +restart(){ + stop + sleep 1 + start + echo "restarted." +} diff --git a/luci-app-wechatpush/root/etc/uci-defaults/luci-serverchan b/luci-app-wechatpush/root/etc/uci-defaults/luci-serverchan new file mode 100755 index 00000000..4b4c9d43 --- /dev/null +++ b/luci-app-wechatpush/root/etc/uci-defaults/luci-serverchan @@ -0,0 +1,11 @@ +#!/bin/sh + +uci -q batch <<-EOF >/dev/null + delete ucitrack.@serverchan[-1] + add ucitrack serverchan + set ucitrack.@serverchan[-1].init=serverchan + commit ucitrack +EOF + +rm -rf /tmp/luci-* +exit 0 \ No newline at end of file diff --git a/luci-app-wechatpush/root/usr/share/rpcd/acl.d/luci-app-serverchan.json b/luci-app-wechatpush/root/usr/share/rpcd/acl.d/luci-app-serverchan.json new file mode 100644 index 00000000..8f1e66f1 --- /dev/null +++ b/luci-app-wechatpush/root/usr/share/rpcd/acl.d/luci-app-serverchan.json @@ -0,0 +1,11 @@ +{ + "luci-app-serverchan": { + "description": "Grant UCI access for luci-app-serverchan", + "read": { + "uci": [ "serverchan" ] + }, + "write": { + "uci": [ "serverchan" ] + } + } +} diff --git a/luci-app-wechatpush/root/usr/share/serverchan/api/diy.json b/luci-app-wechatpush/root/usr/share/serverchan/api/diy.json new file mode 100644 index 00000000..8839f6d2 --- /dev/null +++ b/luci-app-wechatpush/root/usr/share/serverchan/api/diy.json @@ -0,0 +1,42 @@ +{ + "_//": "-------------------------------------------------------------------------------", + "_readme": "这是 自定义 api 文件,这里以 telegram 为例", + "_readme": "特殊符号请使用斜杠转义,变量使用 ${var} 表示", + "_//": "-------------------------------------------------------------------------------", + "_api": "【DIY 推送】", + "_url": "api 地址", + "_data": "生成的 json 文件路径,一般不需要改,如 api 不支持 json,请参考 serverchan 推送接口", + "_content_type": "post 内容类型,这里为 json", + "_//": "-------------------------------------------------------------------------------", + "_str_title_start": "标题粗体字开始符号", + "_str_title_end": "标题粗体字结束符号", + "_str_linefeed": "换行符号", + "_str_splitline": "换行+分隔符", + "_str_space": "空格", + "_str_tab": "TAB(用在行首,生成文字区块)", + "_//": "-------------------------------------------------------------------------------", + "_type": + { + "_readme": "下文中,text 为 telegram 推送需要的键值名称,参见 telegram 官方文档,后面的内容为生成标题所需要的字符串和变量,${1} 为标题内容变量,${nowtime} 为推送时间,${2} 为推送内容变量", + "_readme": "下文中,chat_id 为 telegram 推送需要的键值名称,参见 telegram 官方文档,${chat_id} 为从脚本配置中读取名为 chat_id 的变量,其实就是你填写的机器人的 chat_id ", + "_readme": "type 对象因为需要转义变量,前后必须使用 斜杠+双引号 转义", + "_readme": "参照上文说明,填写下文相关参数" + }, + "_//": "-------------------------------------------------------------------------------", + + "url": "https://api.telegram.org/bot${tg_token}/sendMessage", + "data": "@${tempjsonpath}", + "content_type": "Content-Type: application/json", + "str_title_start": "", + "str_title_end": "", + "str_linefeed": "\\n", + "str_splitline": "\\n----\\n", + "str_space": " ", + "str_tab": " ", + "type": + { + "text":"\"${str_title_start}${1}${str_title_end}${str_splitline}${nowtime}${2}\"", + "chat_id":"\"${chat_id}\"", + "parse_mode":"\"HTML\"" + } +} diff --git a/luci-app-wechatpush/root/usr/share/serverchan/api/ip_blacklist b/luci-app-wechatpush/root/usr/share/serverchan/api/ip_blacklist new file mode 100644 index 00000000..e69de29b diff --git a/luci-app-wechatpush/root/usr/share/serverchan/api/ipv4.list b/luci-app-wechatpush/root/usr/share/serverchan/api/ipv4.list new file mode 100644 index 00000000..2da5af84 --- /dev/null +++ b/luci-app-wechatpush/root/usr/share/serverchan/api/ipv4.list @@ -0,0 +1,8 @@ +cip.cc +ddns.oray.com/checkip +www.net.cn/static/customercare/yourip.asp +myip.ipip.net/s +ip.3322.net +ip.threep.top +10086.cn/web-Center/commonservice/getUserIp.do --referer http://10086.cn -XPOST +https://www.taobao.com/help/getip.php -H 'authority: www.taobao.com' \ No newline at end of file diff --git a/luci-app-wechatpush/root/usr/share/serverchan/api/ipv6.list b/luci-app-wechatpush/root/usr/share/serverchan/api/ipv6.list new file mode 100644 index 00000000..70cf0b0c --- /dev/null +++ b/luci-app-wechatpush/root/usr/share/serverchan/api/ipv6.list @@ -0,0 +1,5 @@ +ipv6.ddnspod.com +speed.neu6.edu.cn/getIP.php +6.ipw.cn +10086.cn/web-Center/commonservice/getUserIp.do --referer http://10086.cn -XPOST +https://www.taobao.com/help/getip.php -H 'authority: www.taobao.com' \ No newline at end of file diff --git a/luci-app-wechatpush/root/usr/share/serverchan/api/logo.jpg b/luci-app-wechatpush/root/usr/share/serverchan/api/logo.jpg new file mode 100644 index 00000000..a89fa5cc Binary files /dev/null and b/luci-app-wechatpush/root/usr/share/serverchan/api/logo.jpg differ diff --git a/luci-app-wechatpush/root/usr/share/serverchan/api/pushplus.json b/luci-app-wechatpush/root/usr/share/serverchan/api/pushplus.json new file mode 100644 index 00000000..965d2581 --- /dev/null +++ b/luci-app-wechatpush/root/usr/share/serverchan/api/pushplus.json @@ -0,0 +1,21 @@ +{ + "_api": "这是 pushplus api 文件", + "_api": "【pushplus】", + + "url": "http://www.pushplus.plus/send", + "data": "@${tempjsonpath}", + "content_type": "Content-Type: application/json", + "str_title_start": "##### ", + "str_title_end": "", + "str_linefeed": "\\n", + "str_splitline": "\\n----\\n", + "str_space": " ", + "str_tab": " ", + "type": + { + "title": "\"${1}\"", + "content": "\"${2}\"", + "token": "\"${pushplus_token}\"", + "template":"\"markdown\"" + } +} diff --git a/luci-app-wechatpush/root/usr/share/serverchan/api/qywx_markdown.json b/luci-app-wechatpush/root/usr/share/serverchan/api/qywx_markdown.json new file mode 100644 index 00000000..35c53b7d --- /dev/null +++ b/luci-app-wechatpush/root/usr/share/serverchan/api/qywx_markdown.json @@ -0,0 +1,23 @@ +{ + "_api": "这是企业微信 markdown 模板信息 api 文件", + "_api": "【企业微信】", + + "url": "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$(curl -s \"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=${corpid}&corpsecret=${corpsecret}\"|jq '.access_token' | sed 's/\"//g')", + "data": "@${tempjsonpath}", + "content_type": "Content-Type: application/json", + "str_title_start": "#### ", + "str_title_end": "", + "str_linefeed": "\\n", + "str_splitline": "\\n\\n", + "str_space": " ", + "str_tab": "> ", + "type": + { + "touser": "\"${userid}\"", + "msgtype": "\"markdown\"", + "agentid": "\"${agentid}\"", + "markdown": { + "content": "\"${1}${str_linefeed}${nowtime}${2}\"" + } + } +} diff --git a/luci-app-wechatpush/root/usr/share/serverchan/api/qywx_mpnews.json b/luci-app-wechatpush/root/usr/share/serverchan/api/qywx_mpnews.json new file mode 100644 index 00000000..258b7db7 --- /dev/null +++ b/luci-app-wechatpush/root/usr/share/serverchan/api/qywx_mpnews.json @@ -0,0 +1,33 @@ +{ + "_api": "这是企业微信图文信息 api 文件", + "_api": "【企业微信】", + + "url": "\"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$(curl -s \"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=${corpid}&corpsecret=${corpsecret}\"|jq '.access_token'|sed 's/\"//g')\"", + "data": "@${tempjsonpath}", + "content_type": "Content-Type: application/json", + "str_title_start": "

", + "str_title_end": "

", + "str_linefeed": "\\n", + "str_splitline": "
", + "str_space": " ", + "str_tab": "
  • ", + "type": + { + "touser": "\"${userid}\"", + "msgtype": "\"mpnews\"", + "agentid": "\"${agentid}\"", + "mpnews":{ + "articles":[ + { + "title": "\"${nowtime}${str_linefeed}${1}\"", + "thumb_media_id": "\"`curl \"https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token=$(curl -s \"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=${corpid}&corpsecret=${corpsecret}\"|jq '.access_token'|sed 's/\"//g')&type=image\" -F \"file=@${mediapath}\"|jq '.media_id'|sed 's/\"//g'`\"", + "author": "\"\"", + "content_source_url": "\"\"", + "content": "\"${2}\"", + "digest": "\"\"" + } + ] + }, + "safe":0 + } +} diff --git a/luci-app-wechatpush/root/usr/share/serverchan/api/serverchan.json b/luci-app-wechatpush/root/usr/share/serverchan/api/serverchan.json new file mode 100644 index 00000000..a0a8245e --- /dev/null +++ b/luci-app-wechatpush/root/usr/share/serverchan/api/serverchan.json @@ -0,0 +1,17 @@ +{ + "_api": "这是 serverchan api 文件", + "_api": "【serverchan】", + + "url": "\"https://sctapi.ftqq.com/${sckey}.send\"", + "data": "\"text=${1}&desp=${nowtime}${str_linefeed}${2}\"", + "content_type": "Content-Type:application/x-www-form-urlencoded", + "str_title_start": "#### ", + "str_title_end": "", + "str_linefeed": "%0D%0A%0D%0A", + "str_splitline": "%0D%0A%0D%0A----%0D%0A%0D%0A", + "str_space": " ", + "str_tab": " ", + "type": + { + } +} diff --git a/luci-app-wechatpush/root/usr/share/serverchan/api/telegram.json b/luci-app-wechatpush/root/usr/share/serverchan/api/telegram.json new file mode 100644 index 00000000..3638365c --- /dev/null +++ b/luci-app-wechatpush/root/usr/share/serverchan/api/telegram.json @@ -0,0 +1,20 @@ +{ + "_api": "这是 telegram api 文件", + "_api": "【telegram】", + + "url": "https://api.telegram.org/bot${tg_token}/sendMessage", + "data": "@${tempjsonpath}", + "content_type": "Content-Type: application/json", + "str_title_start": "", + "str_title_end": "", + "str_linefeed": "\\n", + "str_splitline": "\\n----\\n", + "str_space": " ", + "str_tab": " ", + "type": + { + "text":"\"${str_title_start}${1}${str_title_end}${str_splitline}${nowtime}${2}\"", + "chat_id":"\"${chat_id}\"", + "parse_mode":"\"HTML\"" + } +} diff --git a/luci-app-wechatpush/root/usr/share/serverchan/api/wxpusher.json b/luci-app-wechatpush/root/usr/share/serverchan/api/wxpusher.json new file mode 100644 index 00000000..20443462 --- /dev/null +++ b/luci-app-wechatpush/root/usr/share/serverchan/api/wxpusher.json @@ -0,0 +1,23 @@ +{ + "_api": "这是 wxpusher api 文件", + "_api": "【wxpusher】", + + "url": "http://wxpusher.zjiecode.com/api/send/message", + "data": "@${tempjsonpath}", + "content_type": "Content-Type: application/json", + "str_title_start": "#### ", + "str_title_end": "", + "str_linefeed": "\\n", + "str_splitline": "\\n----\\n", + "str_space": " ", + "str_tab": " ", + "type": + { + "summary":"\"${1}\"", + "content":"\"${2}\"", + "appToken":"\"${wxpusher_apptoken}\"", + "topicIds":"[\"${wxpusher_topicIds}\"]", + "uids":"[\"${wxpusher_uids}\"]", + "contentType":3 + } +} diff --git a/luci-app-wechatpush/root/usr/share/serverchan/serverchan b/luci-app-wechatpush/root/usr/share/serverchan/serverchan new file mode 100755 index 00000000..157f211e --- /dev/null +++ b/luci-app-wechatpush/root/usr/share/serverchan/serverchan @@ -0,0 +1,1436 @@ +#!/bin/sh + +# 读取设置文件 +function get_config(){ + while [[ "$*" != "" ]]; do + eval ${1}='`uci get serverchan.serverchan.$1`' 2>/dev/null + shift + done +} + +# 初始化设置信息 +function read_config(){ + get_config "serverchan_enable" "lite_enable" "device_name" "sleeptime" "oui_data" "oui_dir" "reset_regularly" "debuglevel" "device_aliases" \ + "serverchan_ipv4" "ipv4_interface" "serverchan_ipv6" "ipv6_interface" "serverchan_up" "serverchan_down" "cpuload_enable" "cpuload" "temperature_enable" "temperature" "client_usage" "client_usage_max" "client_usage_disturb" "client_usage_whitelist" "web_logged" "ssh_logged" "web_login_failed" "ssh_login_failed" "login_max_num" "web_login_black" "ip_white_list" "ip_black_timeout" "port_knocking" "ip_white_timeout" "ip_port_white" "port_forward_list" \ + "regular_time" "regular_time_2" "regular_time_3" "interval_time" \ + "serverchan_sheep" "starttime" "endtime" "serverchan_whitelist" "serverchan_blacklist" "serverchan_interface" "MAC_online_list" "MAC_offline_list" \ + "up_timeout" "down_timeout" "timeout_retry_count" "thread_num" "soc_code" "server_host" "server_port" "err_enable" "err_sheep_enable" "err_device_aliases" "network_err_event" "system_time_event" "autoreboot_time" "network_restart_time" "public_ip_event" "public_ip_retry_count" \ + "jsonpath" "sckey" "corpid" "userid" "agentid" "corpsecret" "mediapath" "wxpusher_apptoken" "wxpusher_uids" "wxpusher_topicIds" "pushplus_token" "tg_token" "chat_id" \ + "gateway_info_enable" "gateway_host_url" "gateway_info_url" "gateway_logout_url" "gateway_username_id" "gateway_password_id" "gateway_username" "gateway_password" + + for str_version in "wrtbwmon" "iputils-arping" "curl" "iw"; do + eval `echo ${str_version:0:2}"_version"`=`opkg list-installed|grep -w ^${str_version}|awk '{print $3}'` 2>/dev/null + done + dir="/tmp/serverchan/" && mkdir -p ${dir} && mkdir -p ${dir}/client + tempjsonpath="/tmp/serverchan/temp.json" + ip_blacklist_path="/usr/share/serverchan/api/ip_blacklist" + [ ! -z "$oui_dir" ] && [ "$oui_dir" -eq "1" ] && oui_base="${dir}oui_base.txt" || oui_base="/usr/share/serverchan/oui_base.txt" + debuglevel=`echo "$debuglevel"` && [ -z "$debuglevel" ] && logfile="/dev/null" || logfile="${dir}serverchan.log" + serverchan_blacklist=`echo "$serverchan_blacklist"|sed 's/ /\n/g'` 2>/dev/null + serverchan_whitelist=`echo "$serverchan_whitelist"|sed 's/ /\n/g'` 2>/dev/null + device_aliases=`echo "$device_aliases"|sed 's/ /\n/g'|sed 's/-/ /'` 2>/dev/null + err_device_aliases=`echo "$err_device_aliases"|sed 's/ /\n/g'` 2>/dev/null + client_usage_whitelist=`echo "$client_usage_whitelist"|sed 's/ /\n/g'` 2>/dev/null + ip_white_list=`echo "$ip_white_list"|sed 's/ /\n/g'` 2>/dev/null + mark_mac_list="${MAC_online_list} ${MAC_offline_list}" + mark_mac_list=`echo "$mark_mac_list"|sed 's/ /\n/g'|sed 's/-/ /'` 2>/dev/null + ipv4_urllist=`cat /usr/share/serverchan/api/ipv4.list` 2>/dev/null + ipv6_urllist=`cat /usr/share/serverchan/api/ipv6.list` 2>/dev/null + port_forward_list=`echo "$port_forward_list"|sed 's/ /\n/g'|sed 's/,/ /g'` 2>/dev/null + [ -z "$serverchan_ipv4" ] && serverchan_ipv4=0 + [ -z "$serverchan_ipv6" ] && serverchan_ipv6=0 + [ -z "$sleeptime" ] && sleeptime="60" + [ -z "$ip_black_timeout" ] && ip_black_timeout="86400" + [ -z "$ip_white_timeout" ] && ip_white_timeout="600" + [ "$iw_version" ] && wlan_interface=`iw dev 2>/dev/null|grep Interface|awk '{print $2}'` >/dev/null 2>&1 + [ -z "$up_timeout" ] || [ "$up_timeout" -eq "0" ] && up_timeout="2" + [ -z "$down_timeout" ] || [ "$down_timeout" -eq "0" ] && down_timeout="20";down_timeout=`expr ${down_timeout} / 2 + 1` + [ -z "$timeout_retry_count" ] && timeout_retry_count="2";[ "$timeout_retry_count" -eq "0" ] && timeout_retry_count="1" + [ -z "$server_port" ] && server_port="22" + str_title_start=`jq -r '.str_title_start' ${jsonpath}` + str_title_end=`jq -r '.str_title_end' ${jsonpath}` + str_linefeed=`jq -r '.str_linefeed' ${jsonpath}` + str_splitline=`jq -r '.str_splitline' ${jsonpath}` + str_space=`jq -r '.str_space' ${jsonpath}` + str_tab=`jq -r '.str_tab' ${jsonpath}` + disturb_text=`jq -r '._api' ${jsonpath}` + ( echo "$lite_enable"|grep -q "content" ) && str_title_start="" && str_title_end="" && str_splitline="" && str_linefeed="" && str_tab="" +} + +# 初始化 +function serverchan_init(){ + enable_detection + if [ -f "/usr/share/serverchan/errlog" ]; then + cat /usr/share/serverchan/errlog > ${logfile} + echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】载入上次重启前日志" >> ${logfile} + echo "--------------------------------------------------------" >> ${logfile} + fi + down_oui & + get_syslog + set_ip_black + + rm -f ${dir}fd1 ${dir}sheep_usage ${dir}old_sheep_usage ${dir}client_usage_aliases ${dir}old_client_usage_aliases /usr/share/serverchan/errlog >/dev/null 2>&1 + [ ! -f "/usr/sbin/wrtbwmon" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【info】未安装 wrtbwmon ,流量统计不可用" >> ${logfile} + [ -z "$ip_version" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】无法获取依赖项 iputils-arping 版本号,请确认插件是否正常运行" >> ${logfile} + [ -z "$cu_version" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】无法获取依赖项 curl 版本号,请确认插件是否正常运行" >> ${logfile} + [ -z "${sckey}${tg_token}${pushplus_token}${corpid}${wxpusher_apptoken}${wxpusher_uids}${wxpusher_topicIds}" -a "${jsonpath}" != "/usr/share/serverchan/api/diy.json" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】请填写正确的 key " >> ${logfile} && return 1 + local interfacelist=`getinterfacelist` && [ -z "$interfacelist" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】无法获取接口在线时间等信息,可能存在多个接口或配置错误,请确认插件是否正常运行" >> ${logfile} + return 0 +} + +# 推送 +function diy_send(){ + ( ! echo "$lite_enable"|grep -q "content" ) && ( ! echo "$lite_enable"|grep -q "nowtime" ) && local nowtime=`date "+%Y-%m-%d %H:%M:%S"` + ! jq -r '.' ${3} >/dev/null 2>&1 && echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】json 文件格式错误,这不是一个标准的 json 文件,请检查 ${3} 文件是否有特殊符号未转义或语法错误" >> ${logfile} && return 1 + local diyurl=`jq -r .url ${3}` && local diyurl=`eval echo ${diyurl}` + local type=`jq -r '.type' ${3}` && local type=`eval echo ${type}` + local data=`jq -r '.data' ${3}` && local data=`eval echo ${data}` + local content_type=`jq -r '.content_type' ${3}` + ! jq "$type" ${3} > ${tempjsonpath} && echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】type:{ } 字段转义变量后格式错误,请检查 type:{ } 字段内是否有特殊符号未转义或语法错误" >> ${logfile} && return 1 + + [ $4 ] && echo '{"url":"'${diyurl}'","content_type":"'${content_type}'","type":'`jq "$type" ${3}`'}' > ${dir}debug_send_json + [ $4 ] && echo -e "${send_title}" "${send_content}" > ${dir}debug_send_content + [ $4 ] && cat ${tempjsonpath} > ${dir}debug_send_data + [ $4 ] && ! jq -r '.' ${dir}debug_send_json && echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】转义变量后格式错误,请检查 ${dir}debug_send_json 字段内是否有特殊符号未转义或语法错误" >> ${logfile} + [ $4 ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【debug】json 文件已保存至:${dir}debug_send_json" >> ${logfile} + [ $4 ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【debug】推送内容预览文件保存至:${dir}debug_send_content" >> ${logfile} + [ $4 ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【debug】如果收不到信息,请检查 ${dir}debug_send_data 文件,或使用下列命令手动测试返回值 (可能需要关闭日志自动刷新方便选中)" >> ${logfile} + [ $4 ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【debug】"'curl -X POST -H "'$content_type'" -d "@'${dir}debug_send_data'" "'${diyurl}'" ' >> ${logfile} + + curl -X POST -H "$content_type" -d "$data" "${diyurl}" + [ $? -ne "0" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】网络错误或 URL 错误,推送失败,curl 返回值为 ${tmp_value}" >> ${logfile} && return 1 || return 0 +} + +# 下载设备MAC厂商信息 +function down_oui(){ + [ -f ${oui_base} ] && local logrow=$(grep -c "" ${oui_base}) || local logrow="0" + [ $logrow -lt "10" ] && rm -f ${oui_base} >/dev/null 2>&1 + if [ ! -z "$oui_data" ] && [ "$oui_data" -ne "3" ] && [ ! -f ${oui_base} ]; then + echo "`date "+%Y-%m-%d %H:%M:%S"` 【初始化】设备MAC厂商信息不存在,重新下载" >> ${logfile} + wget --no-check-certificate -t 3 -T 15 -O ${dir}oui.txt https://standards-oui.ieee.org/oui/oui.txt >/dev/null 2>&1 + if [ -f ${dir}oui.txt ] && [ "$oui_data" -eq "1" ]; then + cat ${dir}oui.txt|grep "base 16"|grep -i "apple\|aruba\|asus\|autelan\|belkin\|bhu\|buffalo\|cctf\|cisco\|comba\|datang\|dell\|dlink\|dowell\|ericsson\|fast\|feixun\|\ +fiberhome\|fujitsu\|grentech\|h3c\|hisense\|hiwifi\|honghai\|honghao\|hp\|htc\|huawei\|intel\|jinli\|jse\|lenovo\|lg\|liteon\|malata\|meizu\|mercury\|meru\|moto\|netcore\|\ +netgear\|nokia\|omron\|oneplus\|oppo\|philips\|router_unkown\|samsung\|shanzhai\|sony\|start_net\|sunyuanda\|tcl\|tenda\|texas\|tianyu\|tp-link\|ubq\|undefine\|VMware\|\ +utstarcom\|volans\|xerox\|xiaomi\|zdc\|zhongxing\|smartisan" > ${oui_base} && echo "`date "+%Y-%m-%d %H:%M:%S"` 【初始化】设备MAC厂商信息下载成功" >> ${logfile} || echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】设备MAC厂商信息下载失败" >> ${logfile} + fi + if [ -f ${dir}oui.txt ] && [ "$oui_data" -eq "2" ]; then + cat ${dir}oui.txt|grep "base 16" > ${oui_base} && echo "`date "+%Y-%m-%d %H:%M:%S"` 【初始化】设备MAC厂商信息下载成功" >> ${logfile} || echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】设备MAC厂商信息下载失败" >> ${logfile} + fi + rm -f ${dir}oui.txt >/dev/null 2>&1 + fi +} + +# 清理临时文件 +function deltemp(){ + unset title content ipAddress_logrow online_list online_mac mac_online_status gatewayinfo gateway_iplist + rm -f ${dir}title ${dir}content ${dir}tmp_downlist ${dir}send_enable.lock ${tempjsonpath} ${dir}cookies.txt >/dev/null 2>&1 + [ ! -f ${dir}ipAddress ] && rm -f ${dir}client/* >/dev/null 2>&1 + LockFile unlock + [ -f ${logfile} ] && local logrow=$(grep -c "" ${logfile}) || local logrow="0" + [ $logrow -gt 500 ] && sed -i '1,100d' ${logfile} && echo "`date "+%Y-%m-%d %H:%M:%S"` 【清理】日志超出上限,删除前 100 条" >> ${logfile} +} + +# 检测程序开关 +function enable_detection(){ + [ ! "$1" ] && local time_n=1 + for i in `seq 1 $time_n`; do + get_config serverchan_enable;[ -z "$serverchan_enable" ] || [ "$serverchan_enable" -eq "0" ] && `/etc/init.d/serverchan stop` || sleep 1 + done +} + +# 获取 ip +function getip(){ + [ ! "$1" ] && return + + # 从接口获取 IPv4 + if [ $1 == "wanipv4" ] ;then + [ ! -z "$ipv4_interface" ] && local wanIP=$(/sbin/ifconfig ${ipv4_interface}|awk '/inet addr/ {print $2}'|awk -F: '{print $2}'|grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}') + [ -z "$ipv4_interface" ] && local wanIP=$(getinterfacelist|grep '\"address\"'|grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}') + echo "$wanIP" + + # 从 URL 获取 IPv4 + elif [ $1 == "hostipv4" ] ;then + local url_number=`echo "$ipv4_urllist"|wc -l` + local rand_number=`rand 1 $url_number` + function get_hostipv4() + { + local ipv4_URL=`echo "$ipv4_urllist"| sed -n "${1}p"|sed -e 's/\r//g'` + [ ! -z "$ipv4_interface" ] && local tmp_hostIP=$(curl -k -s -4 --interface ${ipv4_interface} -m 5 ${ipv4_URL}) || local tmp_hostIP=$(curl -k -s -4 -m 5 ${ipv4_URL}) + [ -z "$tmp_hostIP" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【info】IP 获取失败,当前使用的 API 为 $ipv4_URL" >> ${logfile} + echo $tmp_hostIP|grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'|head -n1 + } + local hostIP=`get_hostipv4 ${rand_number}` + [ -z $hostIP ] && local rand_number=`expr $rand_number + 1` && [ $rand_number -gt $url_number ] && local rand_number=1;[ -z $hostIP ] && local hostIP=`get_hostipv4 ${rand_number}` + [ -z $hostIP ] && local rand_number=`expr $rand_number + 1` && [ $rand_number -gt $url_number ] && local rand_number=1;[ -z $hostIP ] && local hostIP=`get_hostipv4 ${rand_number}` + [ -z $hostIP ] && [ `expr $(date +%s) - $(date -r /usr/share/serverchan/api/ipv4.list +%s)` -gt "86400" ] && wget --no-check-certificate -t 3 -T 15 -O /usr/share/serverchan/api/ipv4.list https://raw.githubusercontent.com/tty228/luci-app-serverchan/master/root/usr/share/serverchan/api/ipv4.list >/dev/null 2>&1 && ipv4_urllist=`cat /usr/share/serverchan/api/ipv4.list` 2>/dev/null && echo "`date "+%Y-%m-%d %H:%M:%S"` 【info】多次获取 IP 失败,重新同步 API 列表" >> ${logfile} + [ ! -z $hostIP ] && echo $hostIP + + # 从接口获取 IPv6 + elif [ $1 == "wanipv6" ] ;then + [ ! -z "$ipv6_interface" ] && local wanIPv6=$(ip addr show ${ipv6_interface}|grep -v deprecated|grep -A1 'inet6 [^f:]'|sed -nr ':a;N;s#^ +inet6 ([a-f0-9:]+)/.+? scope global .*? valid_lft ([0-9]+sec) .*#\2 \1#p;ta'|sort -nr|head -n1|awk '{print $2}') + [ -z "$ipv6_interface" ] && local wanIPv6=$(ip addr show|grep -v deprecated|grep -A1 'inet6 [^f:]'|sed -nr ':a;N;s#^ +inet6 ([a-f0-9:]+)/.+? scope global .*? valid_lft ([0-9]+sec) .*#\2 \1#p;ta'|sort -nr|head -n1|awk '{print $2}') + echo "$wanIPv6" + + # 从 URL 获取 IPv6 + elif [ $1 == "hostipv6" ] ;then + local urlv6_number=`echo "$ipv6_urllist"|wc -l` + local rand_numberv6=`rand 1 $urlv6_number` + function get_hostipv6() + { + local ipv6_URL=`echo "$ipv6_urllist"| sed -n "${1}p"|sed -e 's/\r//g'` + [ ! -z "$ipv6_interface" ] && local tmp_hostIPv6=$(curl -k -s -6 --interface ${ipv6_interface} -m 5 ${ipv6_URL}) || local tmp_hostIPv6=$(curl -k -s -6 -m 5 ${ipv6_URL}) + [ -z "$tmp_hostIPv6" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【info】IP 获取失败,当前使用的 API 为 $ipv6_URL" >> ${logfile} + echo $tmp_hostIPv6|grep -oE "([\da-fA-F0-9]{1,4}(:{1,2})){1,15}[\da-fA-F0-9]{1,4}"|head -n1 + } + local hostIPv6=`get_hostipv6 ${rand_numberv6}` + [ -z $hostIPv6 ] && local rand_numberv6=`expr $rand_numberv6 + 1` && [ $rand_numberv6 -gt $urlv6_number ] && local rand_numberv6=1;[ -z $hostIPv6 ] && local hostIPv6=`get_hostipv6 ${rand_numberv6}` + [ -z $hostIPv6 ] && local rand_numberv6=`expr $rand_numberv6 + 1` && [ $rand_numberv6 -gt $urlv6_number ] && local rand_numberv6=1;[ -z $hostIPv6 ] && local hostIPv6=`get_hostipv6 ${rand_numberv6}` + [ -z $hostIPv6 ] && [ `expr $(date +%s) - $(date -r /usr/share/serverchan/api/ipv4.list +%s)` -gt "86400" ] && wget --no-check-certificate -t 3 -T 15 -O /usr/share/serverchan/api/ipv6.list https://raw.githubusercontent.com/tty228/luci-app-serverchan/master/root/usr/share/serverchan/api/ipv6.list >/dev/null 2>&1 && ipv6_urllist=`cat /usr/share/serverchan/api/ipv4.list` 2>/dev/null && echo "`date "+%Y-%m-%d %H:%M:%S"` 【info】多次获取 IP 失败,重新同步 API 列表" >> ${logfile} + [ ! -z $hostIPv6 ] && echo $hostIPv6 + fi +} + +# 获取接口信息 +function getinterfacelist(){ + [ `ubus list|grep -w -i "network.interface.wan"|wc -l` -ge "1" ] && ubus call network.interface.wan status && return + local ubuslist=`ubus list|grep -i "network.interface."|grep -v "loopback"|grep -v -i "wan6"|grep -v -i "lan6"|grep -v -i "ipsec_server*"|grep -v -i "VPN*"|grep -v -i "DOCKER*"` + [ `echo "${ubuslist}" |wc -l` -eq "1" ] && ubus call ${ubuslist} status && return +} + +# 获取接口在线时间 +function getinterfaceuptime(){ + getinterfacelist|grep \"uptime\"|sed $'s/\"uptime": //g'|sed $'s/\,//g' +} + +# 查询 MAC 地址 +function getmac(){ + # 已保存的 MAC + [ -f "${dir}ipAddress" ] && local tmp_mac=`cat ${dir}ipAddress|grep -w ${1}|awk '{print $2}'|grep -v "^$"|sort -u|head -n1` + ( echo "$tmp_mac"|grep -q "unknown" ) && unset tmp_mac # 为unknown时重新读取 + [ -f "${dir}tmp_downlist" ] && [ -z "$tmp_mac" ] && local tmp_mac=`cat ${dir}tmp_downlist|grep -w ${1}|awk '{print $2}'|grep -v "^$"|sort -u|head -n1` + # DHCP + ( echo "$tmp_mac"|grep -q "unknown" ) && unset tmp_mac # 为unknown时重新读取 + [ -f "/tmp/dhcp.leases" ] && [ -z "$tmp_mac" ] && local tmp_mac=`cat /tmp/dhcp.leases|grep -w ${1}|awk '{print $2}'|grep -v "^$"|sort -u|head -n1` + # arp + [ -z "$tmp_mac" ] && local tmp_mac=`cat /proc/net/arp|grep "0x2\|0x6"|grep -w ${1}|awk '{print $4}'|grep -v "^$"|sort -u|head -n1` + + [ -z "$tmp_mac" ] && local tmp_mac="unknown" + echo $tmp_mac |tr -d '\n\r' +} + +# 查询主机名 +function getname(){ + # 自定义备注 + local tmp_name=`echo "$device_aliases"|grep -i $2|awk '{print $2}'|grep -v "^$"|sort -u|head -n1` + [ -f "${dir}ipAddress" ] && [ -z "$tmp_name" ] && local tmp_name=`cat ${dir}ipAddress|grep -w ${1}|awk '{print $3}'|grep -v "^$"|sort -u|head -n1` + # 已保存的 主机名 + ( ! echo "$tmp_name"|grep -q -w "unknown\|*" ) && [ ! -z "$tmp_name" ] && echo "$tmp_name" && return || unset tmp_name # 为unknown时重新读取 + [ -f "${dir}tmp_downlist" ] && [ -z "$tmp_name" ] && local tmp_name=`cat ${dir}tmp_downlist|grep -w ${1}|awk '{print $3}'|grep -v "^$"|sort -u|head -n1` + # 静态地址备注名 + ( ! echo "$tmp_name"|grep -q -w "unknown\|*" ) && [ ! -z "$tmp_name" ] && echo "$tmp_name" && return || unset tmp_name # 为unknown时重新读取 + [ -z "$dhcp_config" ] && dhcp_config=`uci show dhcp|grep "ip\|mac\|name"` + for dhcp_config_str in "host" "domain"; do + [ -z "$dhcp_config_str" ] && break # 退出整个循环 + local dhcp_ip_n=`echo "$dhcp_config"|grep -w ^dhcp.@${dhcp_config_str}.*ip=.${1}|sed -nr 's#^dhcp.(.*).ip.*#\1#gp'` 2>/dev/null + [ ! -z "$dhcp_ip_n" ] && [ -z "$tmp_name" ] && local tmp_name=`uci get dhcp.${dhcp_ip_n}.name` 2>/dev/null + local dhcp_mac_n=`echo "$dhcp_config"|grep -i ^dhcp.@${dhcp_config_str}.*mac=.${2}|sed -nr 's#^dhcp.(.*).mac.*#\1#gp'` 2>/dev/null + [ ! -z "$dhcp_mac_n" ] && [ -z "$tmp_name" ] && local tmp_name=`uci get dhcp.${dhcp_ip_n}.name` 2>/dev/null + [ ! -z "$tmp_name" ] && break + done + # DHCP + ( ! echo "$tmp_name"|grep -q -w "unknown\|*" ) && [ ! -z "$tmp_name" ] && echo "$tmp_name" && return || unset tmp_name # 为unknown时重新读取 + [ -f "/tmp/dhcp.leases" ] && [ -z "$tmp_name" ] && local tmp_name=`cat /tmp/dhcp.leases|grep -w ${1}|awk '{print $4}'|grep -v "^$"|sort -u|head -n1` + # 光猫 + ( ! echo "$tmp_name"|grep -q -w "unknown\|*" ) && [ ! -z "$tmp_name" ] && echo "$tmp_name" && return || unset tmp_name # 为unknown时重新读取 + local tmp_name=`echo "$gatewayinfo"|grep -w ${1}|awk '{print $2}'` + # MAC设备信息数据库 + ( ! echo "$tmp_name"|grep -q -w "unknown\|*" ) && [ ! -z "$tmp_name" ] && echo "$tmp_name" && return || unset tmp_name # 为unknown时重新读取 + [ -f "$oui_base" ] && local tmp_name=$(cat $oui_base|grep -i $(echo "$2"|cut -c 1,2,4,5,7,8)|sed -nr 's#^.*16)..(.*)#\1#gp'|sed 's/ /_/g') + [ ! -z "$oui_data" ] && [ "$oui_data" -eq "4" ] && local tmp_name=$(curl -sS "https://standards-oui.ieee.org/oui/oui.txt"|grep -i $(echo "$2"|cut -c 1,2,4,5,7,8)|sed -nr 's#^.*16)..(.*)#\1#gp'|sed 's/ /_/g') + + [ -z "$tmp_name" ] && local tmp_name="unknown" + echo $tmp_name |tr -d '\n\r' +} + +# 从光猫处获取设备信息 +function getgateway(){ + [ -z "$gateway_info_enable" ] || [ "$gateway_info_enable" -ne "1" ] && return + # 登录 + local loginfo=`curl -s -L "${gateway_host_url}" -c ${dir}cookies.txt -d "${gateway_username_id}=${gateway_username}&${gateway_password_id}=${gateway_password}"` 2>/dev/null + [ ! -z "$loginfo" ] && local mytoken=$(echo $loginfo |sed 's/{/\n/g' | grep token |awk '/realRestart/{print $2}'| sed $'s/\'//g') + # 获取 + [ ! -z "$mytoken" ] && local get_gateway=`curl -s -b ${dir}cookies.txt "${gateway_info_url}" -d 'token='$mytoken | jq '.[] | iterables| "\(.ip) \(.devName) \(.model)"'|sed 's/unknown//g'|sed 's/ / /g'|sed 's/ /_/g'|sed 's/_/ /'|sed 's/\"//g'` + # 注销 + [ ! -z "$get_gateway" ] && [ ! -z "$gateway_logout_url" ] && curl -s -b ${dir}cookies.txt "${gateway_logout_url}" -d 'token='$mytoken 2>/dev/null + [ -z "$get_gateway" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【info】获取光猫信息失败,可能当前用户未注销或设置错误" >> ${logfile} + + echo "$get_gateway" +} + +# 查询设备接口 +function getinterface(){ + [ -z "${1}" ] && return + [ "${1}" == "unknown" ] && return + + [ -f "${dir}ipAddress" ] && local ip_interface=`cat ${dir}ipAddress|grep -w ${1}|awk '{print $5}'|grep -v "^$"|sort -u|head -n1` + [ -f "${dir}tmp_downlist" ] && [ -z "$ip_interface" ] && local ip_interface=`cat ${dir}tmp_downlist|grep -w ${1}|awk '{print $5}'|grep -v "^$"|sort -u|head -n1` + if [ -z "$ip_interface" ] && [ ! -z "$wlan_interface" ]; then + for interface in $wlan_interface; do + local ip_interface=`iw dev $interface station dump 2>/dev/null|grep Station|grep -i -w ${1}|sed -nr 's#^.*on (.*))#\1#gp'` >/dev/null 2>&1 + [ ! -z "$ip_interface" ] && echo "$ip_interface" && return + done + fi + [ -z "$ip_interface" ] && local ip_interface=`cat /proc/net/arp|grep "0x2\|0x6"|grep -i -w ${1}|awk '{print $6}'|grep -v "^$"|sort -u|head -n1` + echo $ip_interface |tr -d '\n\r' +} + +# ping +function getping(){ + local ip_interface=`getinterface ${2}` + [ "$iw_version" ] && [ "$ip_interface" ] && local wlan_online=`iw dev ${ip_interface} station dump 2>/dev/null|grep -i -w ${2}|grep Station` >/dev/null 2>&1 + [ "$wlan_online" ] && return 0 + for i in `seq 1 ${4}`; do + ( ! echo "$ip_ms"|grep -q "ms" ) && local interface=`cat /proc/net/arp|grep -w ${1}|awk '{print $6}'|grep -v "^$"|sort -u|head -n1` && [ ! -z "$interface" ] && local ip_ms=`arping -I ${interface} -c 20 -f -w ${3} ${1}` 2>/dev/null + ( ! echo "$ip_ms"|grep -q "ms" ) && local ip_ms=`ping -c 5 -w ${3} ${1}|grep -v '100% packet loss'` 2>/dev/null + ( ! echo "$ip_ms"|grep -q "ms" ) && sleep 1 + done + ( echo "$ip_ms"|grep -q "ms" ) +} + +# CPU 占用率 +function getcpu(){ + local AT=$(cat /proc/stat|grep "^cpu "|awk '{print $2+$3+$4+$5+$6+$7+$8 " " $2+$3+$4+$7+$8}') + sleep 3 + local BT=$(cat /proc/stat|grep "^cpu "|awk '{print $2+$3+$4+$5+$6+$7+$8 " " $2+$3+$4+$7+$8}') + printf "%.01f%%" $(echo ${AT} ${BT}|awk '{print (($4-$2)/($3-$1))*100}') +} + +# 获取SOC温度 (取所有传感器温度最大值) +function soc_temp(){ + # Intel + [ -z "$soc_code" ] && local soctemp=`sensors -j 2>/dev/null|jq -r '."coretemp-isa-0000"."Package id 0"."temp1_input"'` + # AMD + [ -z "$soc_code" ] && [ -z "$soctemp" ] || [ "$soctemp" == "null" ] && local soctemp=`sensors -j 2>/dev/null|jq '."k10temp-pci-00c3"."Tctl"."temp1_input"'` + [ -z "$soc_code" ] && [ -z "$soctemp" ] || [ "$soctemp" == "null" ] && local soctemp=`sensors -j 2>/dev/null|jq '."zenpower-pci-00c3"."Tctl"."temp1_input"'` + + # 通用(只能取最高温度,不一定是 CPU,特殊设备自行修改) + # 将 grep °C 改为温度所在行的特别字符串,如 grep Core 0 等,就可以指定设备了 + [ -z "$soc_code" ] && [ -z "$soctemp" ] || [ "$soctemp" == "null" ] && local soctemp=`sensors 2>/dev/null|grep °C|sed -nr 's#^.*:.*\+(.*)°C .*#\1#gp'|sort -nr|head -n1` + # 将 thermal_zone* 改为 thermal_zone0 thermal_zone1 等,就可以指定设备了 + [ -z "$soc_code" ] && [ -z "$soctemp" ] || [ "$soctemp" == "null" ] && local soctemp=`cat /sys/class/thermal/thermal_zone*/temp 2>/dev/null|sort -nr|head -n1|cut -c-2` + + # Intel + [ "$soc_code" == "pve" ] && [ ! -z "$server_host" ] || [ "$soctemp" == "null" ] && local soctemp=`ssh -i /root/.ssh/id_rsa root@${server_host} -p ${server_port} sensors -j 2>/dev/null|jq -r '."coretemp-isa-0000"."Package id 0"."temp1_input"'` + # AMD + [ "$soc_code" == "pve" ] && [ ! -z "$server_host" ] && [ -z "$soctemp" ] || [ "$soctemp" == "null" ] && local soctemp=`ssh -i /root/.ssh/id_rsa root@${server_host} -p ${server_port} sensors -j 2>/dev/null|jq '."k10temp-pci-00c3"."Tctl"."temp1_input"'` + [ "$soc_code" == "pve" ] && [ ! -z "$server_host" ] && [ -z "$soctemp" ] || [ "$soctemp" == "null" ] && local soctemp=`ssh -i /root/.ssh/id_rsa root@${server_host} -p ${server_port} sensors -j 2>/dev/null|jq '."zenpower-pci-00c3"."Tctl"."temp1_input"'` + # PVE 应该没啥特殊设备了,懒得写了 + + [ ! -z "$soctemp" ] && echo "$soctemp" && return + [ ! -z "$soc_code" ] && eval `echo "$soc_code"` 2>/dev/null +} + +# 流量数据 +function usage(){ + [ ! -f "/usr/sbin/wrtbwmon" ] || [ ! "$1" ] && return + # 更新 + if [ $1 == "update" ] ;then + function version_le() { test "$(echo "$@"|tr " " "\n"|sort -n|head -n 1)" == "$1"; } + function version_ge() { test "$(echo "$@"|tr " " "\n"|sort -r|head -n 1)" == "$1"; } + [ ! -z "$wr_version" ] && ( version_ge "${wr_version}" "1.2.0" ) && wrtbwmon -f ${dir}usage.db 2>/dev/null && return + [ ! -z "$wr_version" ] && ( version_le "${wr_version}" "1.0.0" ) || [ -z "$wr_version" ] && wrtbwmon update ${dir}usage.db 2>/dev/null && return + # 获取 + elif [ $1 == "get" ] ;then + [ ! -f "${dir}usage.db" ] && [ ! "$3" ] && echo `bytes_for_humans 0` && return + [ ! -f "${dir}usage.db" ] && [ "$3" ] && echo 0 && return + [ -z "$total_n" ] && total_n=`cat ${dir}usage.db|head -n1|grep "total"|sed 's/,/\n/g'|awk '/total/{print NR}'` 2>/dev/null + [ -z "$total_n" ] && total_n="6" + [ "$2" ] && local tmptotal=`cat ${dir}usage.db|sed 's/,,,/,0,0,/g'|sed 's/,,/,0,/g'|sed 's/,/ /g'|grep -i -w ${2}|awk "{print "'$'$total_n"}"|grep -v "^$"|sort -u|head -n1` 2>/dev/null + [ -z "$tmptotal" ] && local tmptotal="0" + [ ! "$3" ] && echo `bytes_for_humans ${tmptotal}` || echo $tmptotal + # 剔除 + elif [ $1 == "down" ] ;then + [ "$2" ] && sed -i "/,${2},/d" ${dir}usage.db 2>/dev/null + fi +} + +# 流量数据单位换算 +function bytes_for_humans { + [ ! "$1" ] && return + [ "$1" -gt 1073741824 ] && echo "`awk 'BEGIN{printf "%.2f\n",'$1'/'1073741824'}'` GB" && return + [ "$1" -gt 1048576 ] && echo "`awk 'BEGIN{printf "%.2f\n",'$1'/'1048576'}'` MB" && return + [ "$1" -gt 1024 ] && echo "`awk 'BEGIN{printf "%.2f\n",'$1'/'1024'}'` KB" && return + echo "${1} bytes" +} + +# 设备异常流量检测 +function get_client_usage(){ + [ -z "$client_usage" ] && return + [ "$client_usage" -ne "1" ] && return + [ -z "$client_usage_max" ] && return + + [ -z "$get_client_usage_time" ] && get_client_usage_time=`date +%s` + ( echo $client_usage_max|sed -r 's/.*(.)$/\1/'|grep -q "K\|k" ) && client_usage_max=`expr ${client_usage_max%?} \* 1024` + ( echo $client_usage_max|sed -r 's/.*(.)$/\1/'|grep -q "M\|m" ) && client_usage_max=`expr ${client_usage_max%?} \* 1048576` + ( echo $client_usage_max|sed -r 's/.*(.)$/\1/'|grep -q "G\|g" ) && client_usage_max=`expr ${client_usage_max%?} \* 1073741824` + [ -z "$client_usage_disturb" ] && client_usage_disturb="0" + [ "$client_usage_disturb" -eq "0" ] && [ -f "${dir}ipAddress" ] && local MACLIST=`cat ${dir}ipAddress|awk '{print $2}'|grep -v "^$"|sort -u` + [ "$client_usage_disturb" -eq "1" ] && [ ! -z "$client_usage_whitelist" ] && local MACLIST=`echo "$client_usage_whitelist"` + [ -z "$MACLIST" ] && return + + if [ "$((`date +%s`-$get_client_usage_time))" -ge "60" ]; then + > ${dir}client_usage_aliases + for mac in $MACLIST; do + ( ! cat ${dir}ipAddress|grep -q -i -w $mac|grep -v "^$"|sort -u|head -n1 ) && continue + echo "$mac" `usage get ${mac} bytes` >> ${dir}client_usage_aliases + [ -f "${dir}old_client_usage_aliases" ] && get_client_usage_bytes=`cat ${dir}old_client_usage_aliases|grep -i -w $mac|awk '{print $2}'|grep -v "^$"|sort -u|head -n1` || continue + [ -z "$get_client_usage_bytes" ] && get_client_usage_bytes="0" + if [ "$((`usage get ${mac} bytes`-$get_client_usage_bytes))" -ge "$client_usage_max" ]; then + local ip=`cat ${dir}ipAddress|grep -i -w $mac|awk '{print $1}'|grep -v "^$"|sort -u|head -n1` + local ip_name=`getname ${ip} ${mac}` + local tmp_usage=$(bytes_for_humans $(expr `usage get ${mac} bytes` - ${get_client_usage_bytes})) + local time_up=`cat ${dir}ipAddress|grep -w ${ip}|awk '{print $4}'|grep -v "^$"|sort -u|head -n1` + local ip_total=`usage get $mac` && [ ! -z "$ip_total" ] && local ip_total="${str_linefeed}${str_tab}总计流量: ${str_space}${str_space}${str_space}${str_space}${ip_total}" + local time1=`date +%s` + local time1=$(time_for_humans `expr ${time1} - ${time_up}`) + if [ -z "$title" ]; then + title="${ip_name} 流量异常" + content="${content}${str_splitline}${str_title_start} 设备流量异常${str_title_end}${str_linefeed}${str_tab}客户端名:${str_space}${str_space}${str_space}${str_space}${str_space}${ip_name}${str_linefeed}${str_tab}客户端IP: ${str_space}${str_space}${str_space}${str_space}${ip}${str_linefeed}${str_tab}客户端MAC:${str_space}${str_space}${str_space}${str_space}${mac}$ip_total${str_linefeed}${str_tab}一分钟内流量: ${str_space}${str_space}${tmp_usage}${str_linefeed}${str_tab}在线时间: ${str_space}${str_space}${str_space}${str_space}${time1}" + elif ( echo "$title"|grep -q "流量异常" ); then + title="${ip_name} ${title}" + content="${content}${str_splitline}${str_tab}客户端名:${str_space}${str_space}${str_space}${str_space}${str_space}${ip_name}${str_linefeed}${str_tab}客户端IP: ${str_space}${str_space}${str_space}${str_space}${ip}${str_linefeed}${str_tab}客户端MAC:${str_space}${str_space}${str_space}${str_space}${mac}$ip_total${str_linefeed}${str_tab}一分钟内流量: ${str_space}${str_space}${str_space}${tmp_usage}${str_linefeed}${str_tab}在线时间: ${str_space}${str_space}${str_space}${str_space}${time1}" + else + title="设备状态变化" + content="${content}${str_splitline}${str_title_start} 设备流量异常${str_title_end}${str_linefeed}${str_tab}客户端名:${str_space}${str_space}${str_space}${str_space}${str_space}${ip_name}${str_linefeed}${str_tab}客户端IP: ${str_space}${str_space}${str_space}${str_space}${ip}${str_linefeed}${str_tab}客户端MAC:${str_space}${str_space}${str_space}${str_space}${mac}$ip_total${str_linefeed}${str_tab}一分钟内流量: ${str_space}${str_space}${str_space}${tmp_usage}${str_linefeed}${str_tab}在线时间: ${str_space}${str_space}${str_space}${str_space}${time1}" + fi + fi + done + cat ${dir}client_usage_aliases > ${dir}old_client_usage_aliases + get_client_usage_time=`date +%s` + fi +} + +# 时间单位换算 +function time_for_humans { + [ ! "$1" ] && return + + if [ "$1" -lt 60 ]; then + echo "${1} 秒" + elif [ "$1" -lt 3600 ]; then + local usetime_min=`expr $1 / 60` + local usetime_sec=`expr $usetime_min \* 60` + local usetime_sec=`expr $1 - $usetime_sec` + echo "${usetime_min} 分 ${usetime_sec} 秒" + elif [ "$1" -lt 86400 ]; then + local usetime_hour=`expr $1 / 3600` + local usetime_min=`expr $usetime_hour \* 3600` + local usetime_min=`expr $1 - $usetime_min` + local usetime_min=`expr $usetime_min / 60` + echo "${usetime_hour} 小时 ${usetime_min} 分" + else + local usetime_day=`expr $1 / 86400` + local usetime_hour=`expr $usetime_day \* 86400` + local usetime_hour=`expr $1 - $usetime_hour` + local usetime_hour=`expr $usetime_hour / 3600` + echo "${usetime_day} 天 ${usetime_hour} 小时" + fi +} + +# 计算字符真实长度 +function length_str { + [ ! "$1" ] && return + + local length_zh=`echo "$1"|awk '{print gensub(/[\u4e00-\u9FA5A-Za-z0-9_]/,"","g",$0)}'|awk -F "" '{print NF}'` + local length_en=`echo "$1"|awk '{print gensub(/[^\u4e00-\u9FA5A-Za-z0-9_]/,"","g",$0)}'|awk -F "" '{print NF}'` + + echo `expr $length_zh / 3 \* 2 + $length_en` +} + +# 截取字符,避免中文乱码 +function cut_str { + [ ! "$1" ] && return + [ ! "$2" ] && return + + [ `length_str $1` -le "$2" ] && echo "$1" && return + local temp_length=$2 + while [ $(length_str `echo "$1"|cut -c -$temp_length`) -lt "$2" ]; do + temp_length=`expr $temp_length + 1` + done + while [ $(printf "%d" \'`echo "$1"|cut -c $temp_length`) -ge "128" ] && [ $(printf "%d" \'`echo "$1"|cut -c $temp_length`) -lt "224" ]; do + temp_length=`expr $temp_length + 1` + done + temp_length=`expr $temp_length - 1` + + echo $(echo "$1"|cut -c -$temp_length)"..." +} + +# 随机数 +function rand(){ + local min=$1 + local max=$(($2- $min + 1)) + local num=$(date +%s%N) + echo $(($num % $max + $min)) +} + +# 在线设备列表 +function serverchan_first(){ + [ -f "${dir}ipAddress" ] && local IPLIST=`cat ${dir}ipAddress|awk '{print $1}'|grep -v "^$"|sort -u` + for ip in $IPLIST; do + read -u 5 + { + down $ip + echo "" >&5 + }& + done + wait + unset ip IPLIST + + local IPLIST=`cat /proc/net/arp|grep "0x2\|0x6"|awk '{print $1}'|grep -v "^169.254."|grep -v "^$"|sort -u|grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'` + gatewayinfo=`getgateway` + local gateway_iplist=`echo "${gatewayinfo}"|awk '{print $1}'` + [ ! -z "$gateway_iplist" ] && local IPLIST=`echo -e "${IPLIST}\n${gateway_iplist}"|grep -v "^$"|sort -u` + for ip in $IPLIST; do + read -u 5 + { + up $ip + echo "" >&5 + }& + done + + wait +} + +# 创建计划任务 +function serverchan_cron(){ + function del_cron(){ + ( echo `crontab -l 2>/dev/null`|grep -q "serverchan" ) && crontab -l > conf && sed -i "/serverchan/d" conf && crontab conf && rm -f conf >/dev/null 2>&1 + } + function re_cron(){ + /etc/init.d/cron stop + /etc/init.d/cron start + } + del_cron + if [ -z "$serverchan_enable" ]; then + re_cron + return + fi + + # 重置流量 + if [ ! -z "$reset_regularly" ] && [ "$reset_regularly" -eq "1" ]; then + crontab -l 2>/dev/null > conf && echo -e "0 0 * * * rm /tmp/serverchan/usage.db >/dev/null 2>&1" >> conf && crontab conf && rm -f conf >/dev/null 2>&1 + crontab -l 2>/dev/null > conf && echo -e "0 0 * * * rm /tmp/serverchan/usage6.db >/dev/null 2>&1" >> conf && crontab conf && rm -f conf >/dev/null 2>&1 + fi + [ ! -z "$regular_time_2" ] && local regular_time_2=",${regular_time_2}" + [ ! -z "$regular_time_3" ] && local regular_time_3=",${regular_time_3}" + # 定时发送 + if [ ! -z "$regular_time" ] || [ ! -z "$regular_time_2" ] || [ ! -z "$regular_time_3" ]; then + crontab -l 2>/dev/null > conf && echo -e "0 $regular_time$regular_time_2$regular_time_3 * * * /usr/share/serverchan/serverchan send &" >> conf && crontab conf && rm -f conf >/dev/null 2>&1 + # 间隔发送 + elif [ ! -z "$interval_time" ]; then + crontab -l 2>/dev/null > conf && echo -e "0 */$interval_time * * * /usr/share/serverchan/serverchan send &" >> conf && crontab conf && rm -f conf >/dev/null 2>&1 + fi + + re_cron +} + +# 免打扰检测 +function serverchan_disturb(){ + [ -z "$serverchan_sheep" ] || [ -z "$starttime" ] || [ -z "$endtime" ] && return 0 + + # 非免打扰时间 + if [ `date +%H` -ge $endtime -a $starttime -lt $endtime ] || [ `date +%H` -lt $starttime -a $starttime -lt $endtime ] || [ `date +%H` -lt $starttime -a `date +%H` -ge $endtime -a $starttime -gt $endtime ]; then + unset sheep_starttime + rm -f ${dir}sheep_usage ${dir}old_sheep_usage 2>/dev/null + disturb_text=`jq -r '._api' ${jsonpath}` + return 0 + # 免打扰 + else + [ -z "$sheep_starttime" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【免打扰】夜深了,该休息了" >> ${logfile} && sheep_starttime=`date +%s` + # 挂起 + if [ "$serverchan_sheep" -eq "1" ] ;then + while [ `date +%H` -lt "$endtime" ]; do + enable_detection + sleep $sleeptime + done + # 静默 + elif [ "$serverchan_sheep" -eq "2" ] ;then + disturb_text="【免打扰】" + return 1 + fi + fi +} + +# 文件锁 +function LockFile(){ + if [ $1 = "lock" ] ;then + [ ! -f "${dir}serverchan.lock" ] && > ${dir}serverchan.lock && return + while [ -f "${dir}serverchan.lock" ]; do + enable_detection 1 + done + LockFile lock + fi + [ $1 = "unlock" ] && rm -f ${dir}serverchan.lock >/dev/null 2>&1 + return 0 +} + +# 检测黑白名单 +function blackwhitelist(){ + [ ! "$1" ] && return 1 + + [ -z "$serverchan_whitelist" ] && [ -z "$serverchan_blacklist" ] && [ -z "$serverchan_interface" ] && [ -z "$MAC_online_list" ] && [ -z "$MAC_offline_list" ] && return 0 + [ ! -z "$serverchan_whitelist" ] && ( echo "$serverchan_whitelist"|grep -q -i -w $1 ) && return 1 + [ ! -z "$serverchan_blacklist" ] && ( ! echo "$serverchan_blacklist"|grep -q -i -w $1 ) && return 1 + [ ! -z "$serverchan_interface" ] && ( ! echo `getinterface ${1}`|grep -q -i -w $serverchan_interface ) && return 1 + [ ! -z "$MAC_online_list" ] && [ ! -z "$mac_online_status" ] && return 1 + [ ! -z "$MAC_online_list" ] && ( echo "$MAC_online_list"|grep -q -i -w $1 ) && return 1 + [ ! -z "$MAC_offline_list" ] && [ -z "$mac_online_status" ] && return 1 + + return 0 +} + +# 重启网络服务 +function network_restart(){ +cat>${dir}network_restart</dev/null 2>&1 & +/etc/init.d/firewall restart >/dev/null 2>&1 & +/etc/init.d/dnsmasq restart >/dev/null 2>&1 & +EOF + chmod 0755 ${dir}network_restart && ${dir}network_restart + rm -f ${dir}network_restart >/dev/null 2>&1 +} + +# 查看无人值守任务设备是否在线 +function geterrdevicealiases(){ + [ -z "$err_device_aliases" ] && return + [ -f ${dir}ipAddress ] && local logrow=$(grep -c "" ${dir}ipAddress) || local logrow="0";[ $logrow -eq "0" ] && return + + local MACLIST=`cat ${dir}ipAddress|awk '{print $2}'|grep -v "^$"|sort -u` + for mac in $MACLIST; do + [ -z "$err_mac" ] && [ ! -z "$mac" ] && local err_mac=`echo "$err_device_aliases"|grep -i $mac|grep -v "^$"|sort -u|head -n1` + done + # 进入免打扰时间已经超过一小时 + if [ ! -z "$sheep_starttime" ] && [ "$((`date +%s`-$sheep_starttime))" -ge "3600" ]; then + > ${dir}sheep_usage + local MACLIST=`echo "$err_device_aliases"|grep -v "^$"|sort -u` + for mac in $MACLIST; do + [ ! -z "$mac" ] && local tmptotal=`usage get ${mac} bytes` + [ ! -z "$tmptotal" ] && awk 'BEGIN{printf "%.0f\n",'$tmptotal'/'204800'}' 2>/dev/null >> ${dir}sheep_usage + done + old_sheep_usage=`cat ${dir}old_sheep_usage` 2>/dev/null + sheep_usage=`cat ${dir}sheep_usage` 2>/dev/null + [ "$old_sheep_usage" == "$sheep_usage" ] && [ -z "$sheep_nousage_starttime" ] && sheep_nousage_starttime=`date +%s` + [ "$old_sheep_usage" != "$sheep_usage" ] && unset sheep_nousage_starttime && cat ${dir}sheep_usage 2>/dev/null > ${dir}old_sheep_usage + [ ! -z "$sheep_nousage_starttime" ] && [ "$((`date +%s`-$sheep_nousage_starttime))" -ge "300" ] && unset err_mac + fi + [ -z "$err_mac" ] +} + +# 无人值守任务 +function unattended(){ + [ -z "$err_enable" ] || [ "$err_enable" -ne "1" ] && return + [ ! -z "$err_sheep_enable" ] && [ "$err_sheep_enable" -eq "1" ] && [ -z "$sheep_starttime" ] && return + geterrdevicealiases;[ $? -eq "1" ] && return + + if [ ! -z "$system_time_event" ]; then + local interfaceuptime=`getinterfaceuptime` + if [ ! -z "$autoreboot_time" ] && [ `cat /proc/uptime|awk -F. '{run_hour=$1/3600;printf("%d",run_hour)}'` -ge "$autoreboot_time" ] && [ "$system_time_event" -eq "1" ]; then + echo "`date "+%Y-%m-%d %H:%M:%S"` 【无人值守任务】重启路由器咯" >> ${logfile} + cat ${logfile} > /usr/share/serverchan/errlog + sleep 2 && reboot && exit + elif [ ! -z "$network_restart_time" ] && [ ! -z "$interfaceuptime" ] && [ `echo "$interfaceuptime"|awk -F. '{run_hour=$1/3600;printf("%d",run_hour)}'` -ge "$network_restart_time" ] && [ "$system_time_event" -eq "2" ]; then + echo "`date "+%Y-%m-%d %H:%M:%S"` 【无人值守任务】重新拨号咯" >> ${logfile} + ifup wan >/dev/null 2>&1 + sleep 60 + fi + fi + + # 重拨尝试获取公网 IP、待弃用或改进 + [ -z "$public_ip_today" ] && public_ip_today=`date +"%d"` + [ -z "$public_ip_count" ] && public_ip_count="0" + [ $public_ip_today -ne `date +"%d"` ] && public_ip_today=`date +"%d"` && public_ip_count=1 + if [ ! -z "$public_ip_event" ] && [ ! -z "$public_ip_retry_count" ] && [ "$public_ip_count" -le "$public_ip_retry_count" ]; then + public_ip_count=`expr $public_ip_count + 1` + local wanIP=`getip wanipv4` + local hostIP=`getip hostipv4` + if [ ! -z "$wanIP" ] && [ ! -z "$hostIP" ] && ( ! echo "$wanIP"|grep -q -w ${hostIP} );then + echo "`date "+%Y-%m-%d %H:%M:%S"` 【无人值守任务】重拨尝试获取公网 ip,当前第 $public_ip_count 次 " >> ${logfile} + ifup wan >/dev/null 2>&1 + sleep 60 + local wanIP=`getip wanipv4` && local hostIP=`getip hostipv4` + [ ! -z "$serverchan_ipv4" ] && [ "$serverchan_ipv4" -eq "1" ] && local IPv4=${wanIP} + [ ! -z "$serverchan_ipv4" ] && [ "$serverchan_ipv4" -eq "2" ] && local IPv4=${hostIP} + [ ! -z "$serverchan_ipv6" ] && [ "$serverchan_ipv6" -eq "1" ] && local IPv6=`getip wanipv6` + [ ! -z "$serverchan_ipv6" ] && [ "$serverchan_ipv6" -eq "2" ] && local IPv6=`getip hostipv6` + [ ! -z "$wanIP" ] && [ ! -z "$hostIP" ] && ( ! echo "$wanIP"|grep -q -w ${hostIP} ) && echo IPv4 $IPv4 > ${dir}ip && echo -e IPv6 $last_IPv6 >> ${dir}ip + fi + fi +} + +# 检测网络状态 +function rand_geturl(){ + # 获取网络状态 + function getcheck(){ + local urllist="https://www.163.com https://www.qq.com https://www.baidu.com https://www.qidian.com https://www.douban.com" + local url_number=`expr $(echo "$urllist"|grep -o ' '|wc -l) + 1` + local url_str=`echo "$urllist"|awk -v i=$(rand 1 $url_number) '{print $i}'` + echo `curl -k -s -w "%{http_code}" -m 5 ${url_str} -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.58" -o /dev/null` + } + local check=`getcheck` + while [ -z "$check" ] || [[ $check -ne 200 && $check -ne 301 && $check -ne 302 ]]; do + local check=`getcheck` + if [ ! -z "$check" ] && [[ $check -eq 200 || $check -eq 301 || $check -eq 302 ]]; then + [ ! -z "$network_enable" ] && [ "$network_enable" -eq "404" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【网络状态】网络恢复正常.." >> ${logfile} + local network_enable="200" + else + [ -z "$network_enable" ] || [ "$network_enable" -eq "200" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!!】当前网络不通!停止检测! " >> ${logfile} + local network_enable="404" + # 无人值守、待弃用或改进 + [ -z "$network_err_time" ] && network_err_time=`date +%s` + if [ ! -z "$network_err_event" ] && [ "$((`date +%s`-$network_err_time))" -ge "600" ]; then + > ${dir}send_enable.lock && serverchan_first && deltemp + geterrdevicealiases + if [ "$?" -eq "0" ]; then + [ -f /usr/share/serverchan/autoreboot_count ] && retry_count=`cat /usr/share/serverchan/autoreboot_count` && rm -f /usr/share/serverchan/autoreboot_count >/dev/null 2>&1 + [ ! -z ${retry_count} ] && retry_count=0;retry_count=`expr $retry_count + 1` + if [ "$network_err_event" -eq "1" ] ;then + if [ "$retry_count" -lt "3" ] ;then + echo "$retry_count" > /usr/share/serverchan/autoreboot_count + echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!!】正在尝试重启路由,当前第 $retry_count 次 " >> ${logfile} + cat ${logfile} > /usr/share/serverchan/errlog + sleep 2 && reboot && exit + fi + [ "$retry_count" -eq "3" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!!】已经重启路由2次,修复失败,请主人自行修复哦" >> ${logfile} + elif [ "$network_err_event" -eq "2" ] ;then + [ "$retry_count" -lt "3" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!!】正在尝试重启网络,当前第 $retry_count 次 " >> ${logfile} && ifup wan >/dev/null 2>&1 + [ "$retry_count" -eq "3" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!!】已经重启网络2次,修复失败,请主人自行修复哦 " >> ${logfile} + elif [ "$network_err_event" -eq "3" ] ;then + if [ "$retry_count" -eq "1" ] ;then + echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!!】正在尝试修复网络,当前第 1 次,重启网络服务中 " >> ${logfile} && network_restart + elif [ "$retry_count" -eq "2" ] ;then + echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!!】正在尝试修复网络,当前第 2 次,关闭可能造成网络断开的软件" >> ${logfile} + [ `uci get koolproxy.@global[0].enabled 2>/dev/null` -eq "1" ] && [ `uci get koolproxy.@global[0].koolproxy_mode 2>/dev/null` -eq "1" ] && /etc/init.d/koolproxy stop >/dev/null 2>&1 + [ `uci get adbyby.@adbyby[0].enable 2>/dev/null` -eq "1" ] && [ `uci get adbyby.@adbyby[0].wan_mode 2>/dev/null` -eq "0" ] && /etc/init.d/adbyby stop >/dev/null 2>&1 + [ `uci get passwall.@global[0].enabled 2>/dev/null` -eq "1" ] && [ `uci get passwall.@global[0].proxy_mode 2>/dev/null|grep global` ] && /etc/init.d/koolproxy stop >/dev/null 2>&1 + local shadowsocksr_enabled=`uci get shadowsocksr.@global[0].global_server 2>/dev/null|grep nil` + local shadowsocksr_run_mode=`uci get shadowsocksr.@global[0].run_mode 2>/dev/null|grep all` + [ -z "$shadowsocksr_enabled" ] && [ ! -z "$shadowsocksr_run_mode" ] && /etc/init.d/shadowsocksr stop >/dev/null 2>&1 + sleep 60 && network_restart + elif [ "$retry_count" -eq "3" ] ;then + echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!!】正在尝试修复网络,当前第 3 次,备份设置项,并修改相关设置" >> ${logfile} + mkdir -p /usr/share/serverchan/configbak + cp -p -f /etc/config/network /usr/share/serverchan/configbak/network + cp -p -f /etc/config/dhcp /usr/share/serverchan/configbak/dhcp + cp -p -f /etc/config/firewall /usr/share/serverchan/configbak/firewall + cp -p -f /etc/firewall.user /usr/share/serverchan/configbak/firewall.user + uci set network.wan.peerdns='0' + uci delete network.wan.dns + uci add_list network.wan.dns='223.5.5.5' + uci add_list network.wan.dns='119.29.29.29' + uci delete network.wan.mtu + uci commit network + uci set dhcp.@dnsmasq[0].port='53' + uci set dhcp.@dnsmasq[0].resolvfile='/tmp/resolv.conf.auto' + uci delete dhcp.@dnsmasq[0].server + uci delete dhcp.@dnsmasq[0].noresolv + uci commit dhcp + uci delete firewall.redirect + >/etc/firewall.user + uci commit firewall + sleep 60 && network_restart + elif [ "$retry_count" -eq "4" ] ;then + echo "$retry_count" > /usr/share/serverchan/autoreboot_count + cat ${logfile} > /usr/share/serverchan/errlog + sleep 2 && reboot && exit + elif [ "$retry_count" -eq "5" ] ;then + echo "$retry_count" > /usr/share/serverchan/autoreboot_count + echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!!】修复失败,还原设置中,请自行检查网络设置" >> ${logfile} + cp -p -f /usr/share/serverchan/configbak/network /etc/config/network + cp -p -f /usr/share/serverchan/configbak/dhcp /etc/config/dhcp + cp -p -f /usr/share/serverchan/configbak/firewall /etc/config/firewall + cp -p -f /usr/share/serverchan/configbak/firewall.user /etc/firewall.user + cat ${logfile} > /usr/share/serverchan/errlog + sleep 2 && reboot && exit + fi + fi + fi + elif [ -f /usr/share/serverchan/autoreboot_count ]; then + network_err_time=`expr $network_err_time - 600` && sleep 60 + fi + enable_detection + sleep $sleeptime + fi + continue + done + rm -f /usr/share/serverchan/autoreboot_count >/dev/null 2>&1 +} + +# 检测 ip 状况 +function ip_changes(){ + [ ! -z "$serverchan_ipv4" ] && [ "$serverchan_ipv4" -eq "1" ] && local IPv4=`getip wanipv4` + [ ! -z "$serverchan_ipv4" ] && [ "$serverchan_ipv4" -eq "2" ] && local IPv4=`getip hostipv4` + [ ! -z "$serverchan_ipv6" ] && [ "$serverchan_ipv6" -eq "1" ] && local IPv6=`getip wanipv6` + [ ! -z "$serverchan_ipv6" ] && [ "$serverchan_ipv6" -eq "2" ] && local IPv6=`getip hostipv6` + + # 存在临时文件 + if [ -f ${dir}ip ]; then + local last_IPv4=$(cat "${dir}ip"|grep IPv4|awk '{print $2}'|grep -v "^$"|sort -u|head -n1) + local last_IPv6=$(cat "${dir}ip"|grep IPv6|awk '{print $2}'|grep -v "^$"|sort -u|head -n1) + if [ ! -z "$serverchan_ipv4" ] && [ "$serverchan_ipv4" -ne "0" ] && [ ! -z "$IPv4" ] && ( ! echo ${IPv4}|grep -w -q ${last_IPv4} ); then + echo "`date "+%Y-%m-%d %H:%M:%S"` ${disturb_text}当前IP:${IPv4}" >> ${logfile} + echo IPv4 $IPv4 > ${dir}ip && echo -e IPv6 $last_IPv6 >> ${dir}ip + title="IP 地址变化" + content="${content}${str_splitline}${str_title_start} IP 地址变化${str_title_end}${str_linefeed}${str_tab}当前 IP:${IPv4}" + fi + + if [ ! -z "$serverchan_ipv6" ] && [ "$serverchan_ipv6" -ne "0" ] && [ ! -z "$IPv6" ] && ( ! echo "$IPv6"|grep -w -q ${last_IPv6} ); then + echo "`date "+%Y-%m-%d %H:%M:%S"` ${disturb_text}当前IPv6:${IPv6}" >> ${logfile} + echo IPv4 $IPv4 > ${dir}ip && echo -e IPv6 $IPv6 >> ${dir}ip + [ -z "$title" ] && title="IPv6 地址变化" + [ ! -z "$title" ] && title="IP 地址变化" + content="${content}${str_splitline}${str_title_start} IPv6 地址变化${str_title_end}${str_linefeed}${str_tab}当前 IPv6:${IPv6}" + fi + + # 临时文件目录为空 + else + echo "`date "+%Y-%m-%d %H:%M:%S"` ${disturb_text}路由器已经重启!" >> ${logfile} + [ ! -z "$serverchan_ipv4" ] && [ "$serverchan_ipv4" -ne "0" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 当前IP: ${IPv4}" >> ${logfile} + [ ! -z "$serverchan_ipv6" ] && [ "$serverchan_ipv6" -ne "0" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 当前IPv6: ${IPv6}" >> ${logfile} + echo IPv4 $IPv4 > ${dir}ip && echo -e IPv6 $IPv6 >> ${dir}ip + title="路由器重新启动" + content="${content}${str_splitline}${str_title_start} 路由器重新启动${str_title_end}" + [ ! -z "$serverchan_ipv4" ] && [ "$serverchan_ipv4" -ne "0" ] && content="${content}${str_linefeed}${str_tab}当前IP:${IPv4}" + [ ! -z "$serverchan_ipv6" ] && [ "$serverchan_ipv6" -ne "0" ] && content="${content}${str_linefeed}${str_tab}当前IPv6:${IPv6}" + fi + + # IP 变化,悄咪咪的重启 ddns 和 zerotier + if [ ! -z "$content" ] ;then + [ -z "$ddns_enabled" ] && ddns_enabled=$(uci show ddns|grep "enabled"|grep "1") + [ -z "$ddns_enabled" ] && ddns_logrow=0 || ddns_logrow=$(echo "$ddns_enabled"|wc -l) + if [ $ddns_logrow -ge 1 ]; then + /etc/init.d/ddns restart >/dev/null 2>&1 + fi + [ -z "$zerotier_enabled" ] && zerotier_enabled=$(uci get zerotier.sample_config.enabled) + if [ ! -z "$zerotier_enabled" ] && [ $zerotier_enabled -eq "1" ] ; then + /etc/init.d/zerotier restart >/dev/null 2>&1 + fi + fi +} + +# 检测设备上线 +function up(){ + [ -f ${dir}ipAddress ] && ( cat ${dir}ipAddress|grep -q -w $1 ) && return + + local ip_mac=`getmac $1` + local ip_name=`getname ${1} ${ip_mac}` + local ip_interface=`getinterface ${ip_mac}` + getping ${1} ${ip_mac} ${up_timeout} "1";local ping_online=$? + + # 连通 + if [ "$ping_online" -eq "0" ]; then + LockFile lock + [ ! -z "$serverchan_blacklist" ] && local tmp_mac=`echo "${serverchan_blacklist}"|grep -w -i ${ip_mac}` + [ ! -z "$serverchan_whitelist" ] && local tmp_mac=`echo "${serverchan_whitelist}"|grep -w -i ${ip_mac}` + echo "{'ip': '${1}','mac': '${ip_mac}','name': '${ip_name}','uptime': '0秒','interface': '${ip_interface}','usage': '0 bytes'}" > ${dir}client/${1} + # ??? + if [ ! -z "$tmp_mac" ] && ( cat ${dir}ipAddress|grep -q -w -i ${tmp_mac} ); then + usage down ${1} + echo "${1} ${ip_mac} ${ip_name} `date +%s` ${ip_interface}" >> ${dir}ipAddress + LockFile unlock && return + # ??? + elif [ ! -z "$tmp_mac" ] && [ -f "${dir}tmp_downlist" ] && ( cat ${dir}tmp_downip|grep -q -w -i ${tmp_mac} ); then + local tmp_downip=`cat ${dir}tmp_downlist|grep -w -i ${tmp_mac}|awk '{print $1}'|grep -v "^$"|sort -u|head -n1` + usage down $tmp_downip + sed -i "/^${tmp_downip} /d" ${dir}tmp_downlist + LockFile unlock && return + fi + # 从离线二次验证区恢复信息 + [ -f "${dir}tmp_downlist" ] && local tmp_downip=`cat ${dir}tmp_downlist|grep -w ${1}|grep -v "^$"|sort -u|head -n1` + if [ ! -z "$tmp_downip" ]; then + cat ${dir}tmp_downlist|grep -w ${1}|grep -v "^$"|sort -u|head -n1 >> ${dir}ipAddress + sed -i "/^${1} /d" ${dir}tmp_downlist + # up + else + usage down $1 + echo "$1 ${ip_mac} ${ip_name} `date +%s` ${ip_interface}" >> ${dir}ipAddress + blackwhitelist ${ip_mac};local ip_blackwhite=$? + [ -f "${dir}send_enable.lock" ] || [ -z "$serverchan_up" ] || [ -z "$ip_blackwhite" ] && LockFile unlock && return + [ ! -z "$serverchan_up" ] && [ "$serverchan_up" -ne "1" ] && LockFile unlock && return + [ -z "$ip_blackwhite" ] || [ "$ip_blackwhite" -ne "0" ] && LockFile unlock && return + + [ -f "${dir}title" ] && local title=`cat ${dir}title` + [ -f "${dir}content" ] && local content=`cat ${dir}content` + if [ -z "$title" ]; then + local title="$ip_name 连接了你的路由器" + local content="${str_splitline}${str_title_start} 新设备连接${str_title_end}${str_linefeed}${str_tab}客户端名:${str_space}${str_space}${str_space}${str_space}${str_space}${ip_name}${str_linefeed}${str_tab}客户端IP: ${str_space}${str_space}${str_space}${str_space}${1}${str_linefeed}${str_tab}客户端MAC:${str_space}${str_space}${str_space}${str_space}${ip_mac}${str_linefeed}${str_tab}网络接口:${str_space}${str_space}${str_space}${str_space}${str_space}${ip_interface}" + elif ( echo ${title}|grep -q "连接了你的路由器" ); then + local title="${ip_name} ${title}" + local content="${str_splitline}${str_tab}客户端名:${str_space}${str_space}${str_space}${str_space}${str_space}${ip_name}${str_linefeed}${str_tab}客户端IP: ${str_space}${str_space}${str_space}${str_space}${1}${str_linefeed}${str_tab}客户端MAC:${str_space}${str_space}${str_space}${str_space}${ip_mac}${str_linefeed}${str_tab}网络接口:${str_space}${str_space}${str_space}${str_space}${str_space}${ip_interface}" + else + local title="设备状态变化" + local content="${str_splitline}${str_title_start} 新设备连接${str_title_end}${str_linefeed}${str_tab}客户端名:${str_space}${str_space}${str_space}${str_space}${str_space}${ip_name}${str_linefeed}${str_tab}客户端IP: ${str_space}${str_space}${str_space}${str_space}${1}${str_linefeed}${str_tab}客户端MAC:${str_space}${str_space}${str_space}${str_space}${ip_mac}${str_linefeed}${str_tab}网络接口:${str_space}${str_space}${str_space}${str_space}${str_space}${ip_interface}" + fi + echo "`date "+%Y-%m-%d %H:%M:%S"` ${disturb_text}新设备 ${ip_name} ${1} 连接了">> ${logfile} + #[ ! -z "$serverchan_blacklist" ] && local title="你偷偷关注的设备上线了" + [ ! -z "$title" ] && echo "$title" >${dir}title + [ ! -z "$content" ] && echo -n "$content" >>${dir}content + fi + fi + LockFile unlock +} + +# 检测设备离线 +function down(){ + local ip_mac=`getmac $1` + local ip_name=`getname ${1} ${ip_mac}` + local ip_interface=`getinterface ${ip_mac}` + + getping ${1} ${ip_mac} ${down_timeout} ${timeout_retry_count};local ping_online=$? + # 离线,置入二次验证区 + if [ "$ping_online" -eq "1" ]; then + LockFile lock + [ ! -f "${dir}send_enable.lock" ] && cat ${dir}ipAddress|grep -w ${1}|grep -v "^$"|sort -u|head -n1 >> ${dir}tmp_downlist + sed -i "/^${1} /d" ${dir}ipAddress + rm -f ${dir}client/${1} >/dev/null 2>&1 + LockFile unlock + # 更新主机名或 MAC + else + local tmp_name=`cat ${dir}ipAddress|grep -w ${1}|awk '{print $3}'|grep -v "^$"|sort -u|head -n1` + local tmp_mac=`cat ${dir}ipAddress|grep -w ${1}|awk '{print $2}'|grep -v "^$"|sort -u|head -n1` + if [ ${ip_name} != ${tmp_name} ] || [ ${ip_mac} != ${tmp_mac} ]; then + LockFile lock + local tmp_str=$(echo "$1 ${ip_mac} ${ip_name} `cat ${dir}ipAddress|grep -w ${1}|awk '{print $4}'|grep -v "^$"|sort -u|head -n1` ${ip_interface}") + sed -i "/^${1} /d" ${dir}ipAddress + echo "$tmp_str" >> ${dir}ipAddress + LockFile unlock + fi + local time_up=`cat ${dir}ipAddress|grep -w ${1}|awk '{print $4}'|grep -v "^$"|sort -u|head -n1` + local time1=`date +%s` + local time1=$(time_for_humans `expr ${time1} - ${time_up}`) + echo "{'ip': '${1}','mac': '${ip_mac}','name': '${ip_name}','uptime': '${time1}','interface': '${ip_interface}','usage': '`usage get $ip_mac`'}" > ${dir}client/${1} + fi +} + +# 设备离线通知 +function down_send(){ + [ ! -f "${dir}tmp_downlist" ] && return + + local IPLIST=`cat ${dir}tmp_downlist|awk '{print $1}'` + for ip in $IPLIST; do + local ip_mac=`getmac ${ip}` + blackwhitelist ${ip_mac};local ip_blackwhite=$? + [ -z "$serverchan_down" ] || [ -z "$ip_blackwhite" ] && continue + [ ! -z "$serverchan_down" ] && [ "$serverchan_down" -ne "1" ] && continue + [ -z "$ip_blackwhite" ] || [ "$ip_blackwhite" -ne "0" ] && continue + [ ! -z "$serverchan_blacklist" ] && local tmp_mac=`echo "${serverchan_blacklist}"|grep -w -i ${ip_mac}` + [ ! -z "$serverchan_whitelist" ] && local tmp_mac=`echo "${serverchan_whitelist}"|grep -w -i ${ip_mac}` + [ ! -z "$tmp_mac" ] && ( cat ${dir}ipAddress|grep -q -w -i ${tmp_mac} ) && continue + + local ip_name=`getname ${ip} ${ip_mac}` + local time_up=`cat ${dir}tmp_downlist|grep -w ${ip}|awk '{print $4}'|grep -v "^$"|sort -u|head -n1` + local ip_total=`usage get $ip_mac` && [ ! -z "$ip_total" ] && local ip_total="${str_linefeed}${str_tab}总计流量: ${str_space}${str_space}${str_space}${str_space}${ip_total}" + local time1=`date +%s` + local time1=$(time_for_humans `expr ${time1} - ${time_up}`) + if [ -z "$title" ]; then + title="${ip_name} 断开连接" + content="${content}${str_splitline}${str_title_start} 设备断开连接${str_title_end}${str_linefeed}${str_tab}客户端名:${str_space}${str_space}${str_space}${str_space}${str_space}${ip_name}${str_linefeed}${str_tab}客户端IP: ${str_space}${str_space}${str_space}${str_space}${ip}${str_linefeed}${str_tab}客户端MAC:${str_space}${str_space}${str_space}${str_space}${ip_mac}$ip_total${str_linefeed}${str_tab}在线时间: ${str_space}${str_space}${str_space}${str_space}${time1}" + elif ( echo "$title"|grep -q "断开连接" ); then + title="${ip_name} ${title}" + content="${content}${str_splitline}${str_tab}客户端名:${str_space}${str_space}${str_space}${str_space}${str_space}${ip_name}${str_linefeed}${str_tab}客户端IP: ${str_space}${str_space}${str_space}${str_space}${ip}${str_linefeed}${str_tab}客户端MAC:${str_space}${str_space}${str_space}${str_space}${ip_mac}$ip_total${str_linefeed}${str_tab}在线时间: ${str_space}${str_space}${str_space}${str_space}${time1}" + else + title="设备状态变化" + content="${content}${str_splitline}${str_title_start} 设备断开连接${str_title_end}${str_linefeed}${str_tab}客户端名:${str_space}${str_space}${str_space}${str_space}${str_space}${ip_name}${str_linefeed}${str_tab}客户端IP: ${str_space}${str_space}${str_space}${str_space}${ip}${str_linefeed}${str_tab}客户端MAC:${str_space}${str_space}${str_space}${str_space}${ip_mac}$ip_total${str_linefeed}${str_tab}在线时间: ${str_space}${str_space}${str_space}${str_space}${time1}" + fi + echo "`date "+%Y-%m-%d %H:%M:%S"` ${disturb_text}设备 ${ip_name} ${ip} 断开连接 " >> ${logfile} + done + + rm -f ${dir}tmp_downlist >/dev/null 2>&1 +} + +# 当前设备列表 +function current_device(){ + ( echo "$lite_enable"|grep -q "content" ) || ( echo "$lite_enable"|grep -q "device" ) && return + [ -f ${dir}ipAddress ] && local logrow=$(grep -c "" ${dir}ipAddress) || local logrow="0";[ $logrow -eq "0" ] && return + + [ -f ${dir}usage.db ] && local ip_total_db="总计流量${str_space}${str_space}${str_space}${str_space}" + content="${content}${str_splitline}${str_title_start} 现有在线设备 ${logrow} 台,具体如下${str_title_end}${str_linefeed}${str_tab}IP 地址${str_space}${str_space}${str_space}${str_space}${str_space}${str_space}${str_space}${str_space}${str_space}${ip_total_db}客户端名" + local IPLIST=`cat ${dir}ipAddress|awk '{print $1}'` + for ip in $IPLIST; do + local ip_mac=`getmac ${ip}` + local ip_total=`usage get ${ip_mac}` + local ip_name=`getname ${ip} ${ip_mac}` + local ip_name=`cut_str $ip_name 15` + if [ "${#ip}" -lt "15" ]; then + local n=`expr 15 - ${#ip}` + for i in `seq 1 $n`; do + local ip="${ip}${str_space}" + done + unset i n + fi + if [ ! -z "$ip_total" ]; then + local n=`expr 11 - ${#ip_total}` + for i in `seq 1 $n`; do + local ip_total="${ip_total}${str_space}" + done + fi + content="${content}${str_linefeed}${str_tab}${ip}${ip_total}${ip_name}" + unset i n ip_total ip_mac ip_name + done +} + +# 检测 cpu 状态 +function cpu_load(){ + if [ ! -z "$temperature_enable" ] && [ "$temperature_enable" -eq "1" ] && [ ! -z "$temperature" ]; then + [ -z "$temperature_time" ] && temperature_time=`date +%s` + local cpu_wendu=`soc_temp`; + [ -z "$cpu_wendu" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】无法读取设备温度,请检查命令" >> ${logfile} + + if [ `expr $cpu_wendu \> $temperature` -eq "1" ]; then + echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!警报!!】 CPU 温度过高: ${cpu_wendu}" >> ${logfile} + else + temperature_time=`date +%s` + fi + + if [ "$((`date +%s`-$temperature_time))" -ge "300" ] && [ -z "$temperaturecd_time" ]; then + title="CPU 温度过高!" + temperaturecd_time=`date +%s` + echo "`date "+%Y-%m-%d %H:%M:%S"` ${disturb_text} CPU 温 度过高: ${cpu_wendu}" >> ${logfile} + content="${content}${str_splitline}${str_title_start} CPU 温度过高${str_title_end}${str_linefeed}${str_tab}CPU 温度已连续五分钟超过预设${str_linefeed}${str_tab}接下来一小 时不再提示${str_linefeed}${str_tab}当前温度:${cpu_wendu}℃" + elif [ ! -z "$temperaturecd_time" ] && [ "$((`date +%s`-$temperaturecd_time))" -ge "3300" ] ;then + unset temperaturecd_time + fi + fi + + if [ ! -z "$cpuload_enable" ] && [ "$cpuload_enable" -eq "1" ] && [ ! -z "$cpuload" ]; then + [ -z "$cpuload_time" ] && cpuload_time=`date +%s` + local cpu_fuzai=`cat /proc/loadavg|awk '{print $1}'` 2>/dev/null + [ -z "$cpu_fuzai" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】无法读取设备负载,请检查命令" >> ${logfile} + + if [ `expr $cpu_fuzai \> $cpuload` -eq "1" ]; then + echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!警报!!】 CPU 负载过高: ${cpu_fuzai}" >> ${logfile} + cputop log + else + cpuload_time=`date +%s` + fi + + if [ "$((`date +%s`-$cpuload_time))" -ge "300" ] && [ -z "$cpucd_time" ]; then + unset getlogtop + if [ ! -z "$title" ] && ( echo "$title"|grep -q "过高" ); then + title="设备报警!" + else + title="CPU 负载过高!" + fi + cpucd_time=`date +%s` + echo "`date "+%Y-%m-%d %H:%M:%S"` ${disturb_text} CPU 负 载过高: ${cpu_fuzai}" >> ${logfile} + content="${content}${str_splitline}${str_title_start} CPU 负载过高${str_title_end}${str_linefeed}${str_tab}CPU 负载已连续五分钟超过预设${str_linefeed}${str_tab}接下来一小 时不再提示${str_linefeed}${str_tab}当前负载:${cpu_fuzai}" + cputop + elif [ ! -z "$cpucd_time" ] && [ "$((`date +%s`-$cpucd_time))" -ge "3300" ] ;then + unset cpucd_time + fi + fi +} + +# CPU 占用前三 +function cputop(){ + [ -z "$1" ] && content="${content}${str_splitline}${str_title_start} 当前 CPU 占用前三的进程${str_title_end}" + local gettop=`top -bn 1|grep -v "top -bn 1"` + for i in `seq 5 7`; do + local top_name=`echo "${gettop}"|awk 'NR=='${i}|awk '{print ($8 ~ /\/bin\/sh|\/bin\/bash/) ? $9 : $8}'` + local top_load=`echo "${gettop}"|awk 'NR=='${i}|awk '{print $7}'` + local temp_top="${top_name} ${top_load}" + [ ! -z "$1" ] && local logtop="$logtop $temp_top" + [ -z "$1" ] && content="${content}${str_linefeed}${str_tab}${temp_top}" + done + unset i + [ ! -z "$1" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!警报!!】 CPU 占用前三: ${logtop}" >> ${logfile} +} + +# 生成日志监控文件,避免后台影响 wait 语句 +function get_syslog(){ + kill -9 `pgrep -f "logread -f -p notice"` 2>/dev/null + [ -z "$web_logged" ] && [ -z "$ssh_logged" ] && [ -z "$web_login_failed" ] && [ -z "$ssh_login_failed" ] && return + rm -f ${dir}login_monitor >/dev/null 2>&1 + +cat>${dir}get_syslog<> ${dir}login_monitor & +EOF + chmod 0755 ${dir}get_syslog && ${dir}get_syslog + rm -f ${dir}get_syslog >/dev/null 2>&1 +} + +# 登陆提醒通知 +function login_send(){ + [ -z "$web_logged" ] && [ -z "$ssh_logged" ] && [ -z "$web_login_failed" ] && [ -z "$ssh_login_failed" ] && return + [ ! -f ${dir}login_monitor ] && return + # 登录 + cat ${dir}login_monitor|grep -i "accepted login"|awk '{print $4" "$8" "$NF}' >> ${dir}web_login + cat ${dir}login_monitor|grep -i "Password auth succeeded\|Pubkey auth succeeded"|awk '{print $4" "$8" "$NF}'|sed -nr 's#^(.*):.[0-9]{1,5}#\1#gp' | sed -e 's/%.*//' >> ${dir}ssh_login + + # 非法登录 + cat ${dir}login_monitor|grep -i "failed login"|awk '{print $NF}' >> ${dir}web_failed + cat ${dir}login_monitor|grep -i "Bad password attempt\|Login attempt for nonexistent user from"|awk '{print $NF}'|sed -nr 's#^(.*):.[0-9]{1,5}#\1#gp'|sed -e 's/%.*//' >> ${dir}ssh_failed + # 读取信息后清空,避免重复统计次数 + echo "" > ${dir}login_monitor + set_ip_black + + # Web 登录提醒 + for login_ip in `cat ${dir}web_login|awk '{print $3}'|grep -v "^$"|sort -u`; do + [ -z "$login_ip" ] && continue + add_ip_white ${login_ip} + local login_time=`cat ${dir}web_login|grep -w ${login_ip}|awk '{print $1}'|grep -v "^$"|sort -u|head -n1` + local login_mode=`cat ${dir}web_login|grep -w ${login_ip}|awk '{print $2}'|grep -v "^$"|sort -u|head -n1` + echo "$ip_white_list"|grep -w -q "$login_ip" && echo "`date "+%Y-%m-%d"` ${login_time} 【info】设备 ${login_ip} 通过 Web ${login_mode} 登陆了路由器 " >> ${logfile} && continue + if [ ! -z "$web_logged" ] && [ "$web_logged" -eq "1" ]; then + if [ -z "$title" ]; then + title="${login_ip} 通过 Web 登陆了路由器" + content="${content}${str_splitline}${str_title_start} 登陆信息${str_title_end}${str_linefeed}${str_tab}时间:${str_space}${str_space}${str_space}${str_space}${str_space}${login_time}${str_linefeed}${str_tab}设备 IP: ${str_space}${str_space}${str_space}${str_space}${login_ip}${content_mode}" + elif ( echo "$title"|grep -q "登陆了路由器" ); then + title="${login_ip} ${title}" + content="${content}${str_splitline}${str_tab}时间:${str_space}${str_space}${str_space}${str_space}${str_space}${login_time}${str_linefeed}${str_tab}设备 IP: ${str_space}${str_space}${str_space}${str_space}${login_ip}${content_mode}" + else + title="设备状态变化" + content="${content}${str_splitline}${str_title_start} 登陆信息${str_title_end}${str_linefeed}${str_tab}时间:${str_space}${str_space}${str_space}${str_space}${str_space}${login_time}${str_linefeed}${str_tab}设备 IP: ${str_space}${str_space}${str_space}${str_space}${login_ip}${content_mode}" + fi + fi + sed -i "/^${login_ip}$/d" ${dir}ssh_failed + sed -i "/^${login_ip}$/d" ${dir}web_failed + echo "`date "+%Y-%m-%d"` ${login_time} ${disturb_text}设备 ${login_ip} 通过 Web ${login_mode} 登陆了路由器 " >> ${logfile} + done + echo "" > ${dir}web_login + unset login_ip login_time login_mode + # SSH 登录提醒 + for login_ip in `cat ${dir}ssh_login|awk '{print $3}'|grep -v "^$"|sort -u`; do + [ -z "$login_ip" ] && continue + add_ip_white ${login_ip} + local login_time=`cat ${dir}ssh_login|grep -w ${login_ip}|awk '{print $1}'|grep -v "^$"|sort -u|head -n1` + local login_mode=`cat ${dir}ssh_login|grep -w ${login_ip}|awk '{print $2}'|grep -v "^$"|sort -u|head -n1` + echo "$ip_white_list"|grep -w -q "$login_ip" && echo "`date "+%Y-%m-%d"` ${login_time} 【info】设备 ${login_ip} 通过 SSH ${login_mode} 登陆了路由器 " >> ${logfile} && continue + [ ! -z "$login_mode" ] && local content_mode="${str_linefeed}${str_tab}登录方式: ${str_space}${str_space}${str_space}${str_space}${login_mode}" + if [ ! -z "$ssh_logged" ] && [ "$ssh_logged" -eq "1" ]; then + if [ -z "$title" ]; then + title="${login_ip} 通过 SSH 登陆了路由器" + content="${content}${str_splitline}${str_title_start} 登陆信息${str_title_end}${str_linefeed}${str_tab}时间:${str_space}${str_space}${str_space}${str_space}${str_space}${login_time}${str_linefeed}${str_tab}设备 IP: ${str_space}${str_space}${str_space}${str_space}${login_ip}${content_mode}" + elif ( echo "$title"|grep -q "登陆了路由器" ); then + title="${login_ip} ${title}" + content="${content}${str_splitline}${str_tab}时间:${str_space}${str_space}${str_space}${str_space}${str_space}${login_time}${str_linefeed}${str_tab}设备 IP: ${str_space}${str_space}${str_space}${str_space}${login_ip}${content_mode}" + else + title="设备状态变化" + content="${content}${str_splitline}${str_title_start} 登陆信息${str_title_end}${str_linefeed}${str_tab}时间:${str_space}${str_space}${str_space}${str_space}${str_space}${login_time}${str_linefeed}${str_tab}设备 IP: ${str_space}${str_space}${str_space}${str_space}${login_ip}${content_mode}" + fi + fi + sed -i "/^${login_ip}$/d" ${dir}ssh_failed + echo "`date "+%Y-%m-%d"` ${login_time} ${disturb_text}设备 ${login_ip} 通过 SSH ${login_mode} 登陆了路由器 " >> ${logfile} + done + echo "" > ${dir}ssh_login + unset login_ip login_time login_mode + # Web 非法登录 + for login_ip in `cat ${dir}web_failed|awk '{print $1}'|grep -v "^$"|sort -u`; do + [ -z "$login_ip" ] && continue + echo "$ip_white_list"|grep -w -q "$login_ip" && continue + local login_sum=`cat ${dir}web_failed|grep -w "${login_ip}"|wc -l` + if [ "$login_sum" -ge "$login_max_num" ] ;then + if [ ! -z "$web_login_failed" ] && [ "$web_login_failed" -eq "1" ]; then + if [ -z "$title" ]; then + title="${login_ip} 通过 Web 频繁尝试登陆" + content="${content}${str_splitline}${str_title_start} 登陆信息${str_title_end}${str_linefeed}${str_tab}设备 IP: ${str_space}${str_space}${str_space}${str_space}${login_ip}" + elif ( echo "$title"|grep -q "频繁尝试登陆" ); then + title="${login_ip} ${title}" + content="${content}${str_splitline}${str_tab}设备 IP: ${str_space}${str_space}${str_space}${str_space}${login_ip}" + else + title="设备状态变化" + content="${content}${str_splitline}${str_title_start} 登陆信息${str_title_end}${str_linefeed}${str_tab}设备 IP: ${str_space}${str_space}${str_space}${str_space}${login_ip}" + fi + fi + sed -i "/^${login_ip}$/d" ${dir}web_failed + echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】设备 ${login_ip} 通过 Web 频繁尝试登陆" >> ${logfile} + add_ip_black $login_ip + fi + done + unset login_ip login_sum + # SSH 非法登录 + for login_ip in `cat ${dir}ssh_failed|awk '{print $1}'|grep -v "^$"|sort -u`; do + [ -z "$login_ip" ] && continue + echo "$ip_white_list"|grep -w -q "$login_ip" && continue + local login_sum=`cat ${dir}ssh_failed|grep -w "${login_ip}"|wc -l` + if [ "$login_sum" -ge "$login_max_num" ] ;then + if [ ! -z "$ssh_login_failed" ] && [ "$ssh_login_failed" -eq "1" ]; then + if [ -z "$title" ]; then + title="${login_ip} 通过 SSH 频繁尝试登陆" + content="${content}${str_splitline}${str_title_start} 登陆信息${str_title_end}${str_linefeed}${str_tab}设备 IP: ${str_space}${str_space}${str_space}${str_space}${login_ip}" + elif ( echo "$title"|grep -q "频繁尝试登陆" ); then + title="${login_ip} ${title}" + content="${content}${str_splitline}${str_tab}设备 IP: ${str_space}${str_space}${str_space}${str_space}${login_ip}" + else + title="设备状态变化" + content="${content}${str_splitline}${str_title_start} 登陆信息${str_title_end}${str_linefeed}${str_tab}设备 IP: ${str_space}${str_space}${str_space}${str_space}${login_ip}" + fi + fi + sed -i "/^${login_ip}$/d" ${dir}ssh_failed + echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】设备 ${login_ip} 通过 SSH 频繁尝试登陆" >> ${logfile} + add_ip_black $login_ip + fi + done + unset login_ip login_sum +} + +# 添加白名单,懒得写删除项和信息显示了,感觉没啥必要 +function add_ip_white(){ + [ ! "$1" ] && return + [ -z "$port_knocking" ] || [ "$port_knocking" -ne "1" ] && return + + # 开放端口 + if ( echo ${1}|grep -q -Eo "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" ); then + ipset list ip_whitelist >/dev/null 2>&1 || ipset create ip_whitelist hash:ip timeout ${ip_white_timeout} >/dev/null 2>&1 + # 开放端口 + iptables -C INPUT -m set --match-set ip_whitelist src -p tcp -m multiport --dport ${ip_port_white} -j ACCEPT >/dev/null 2>&1 || iptables -I INPUT -m set --match-set ip_whitelist src -p tcp -m multiport --dport ${ip_port_white} -j ACCEPT >/dev/null 2>&1 + # 端口转发 + for port_forward in `echo "$port_forward_list"`; do + iptables -t nat -C PREROUTING -m set --match-set ip_whitelist src -p tcp --dport `echo ${port_forward}|awk '{print $2}'` -j DNAT --to-destination "`echo ${port_forward}|awk '{print $3}'`:`echo ${port_forward}|awk '{print $4}'`" >/dev/null 2>&1 || iptables -t nat -I PREROUTING -m set --match-set ip_whitelist src -p tcp --dport `echo ${port_forward}|awk '{print $2}'` -j DNAT --to-destination "`echo ${port_forward}|awk '{print $3}'`:`echo ${port_forward}|awk '{print $4}'`" >/dev/null 2>&1 + iptables -t nat -C POSTROUTING -m set --match-set ip_whitelist src -p tcp -d `echo ${port_forward}|awk '{print $3}'` --dport `echo ${port_forward}|awk '{print $4}'` -j SNAT --to-source `echo ${port_forward}|awk '{print $1}'` >/dev/null 2>&1 || iptables -t nat -I POSTROUTING -m set --match-set ip_whitelist src -p tcp -d `echo ${port_forward}|awk '{print $3}'` --dport `echo ${port_forward}|awk '{print $4}'` -j SNAT --to-source `echo ${port_forward}|awk '{print $1}'` >/dev/null 2>&1 + done + + unset port_forward + ipset -exist add ip_whitelist ${1} timeout ${ip_white_timeout} + + elif ( echo ${1}|grep -q -oE "([\da-fA-F0-9]{1,4}(:{1,2})){1,15}[\da-fA-F0-9]{1,4}" ); then + ipset list ip_whitelistv6 >/dev/null 2>&1 || ipset create ip_whitelistv6 hash:ip timeout ${ip_white_timeout} family inet6 >/dev/null 2>&1 + # 开放端口 + ip6tables -C INPUT -m set --match-set ip_whitelistv6 src -p tcp -m multiport --dport ${ip_port_white} -j ACCEPT >/dev/null 2>&1 || ip6tables -I INPUT -m set --match-set ip_whitelistv6 src -p tcp -m multiport --dport ${ip_port_white} -j ACCEPT >/dev/null 2>&1 + # 端口转发 + for port_forward in `echo "$port_forward_list"`; do + ip6tables -t nat -C PREROUTING -m set --match-set ip_whitelist src -p tcp --dport `echo ${port_forward}|awk '{print $2}'` -j DNAT --to-destination "`echo ${port_forward}|awk '{print $3}'`:`echo ${port_forward}|awk '{print $4}'`" >/dev/null 2>&1 || ip6tables -t nat -I PREROUTING -m set --match-set ip_whitelist src -p tcp --dport `echo ${port_forward}|awk '{print $2}'` -j DNAT --to-destination "`echo ${port_forward}|awk '{print $3}'`:`echo ${port_forward}|awk '{print $4}'`" >/dev/null 2>&1 + ip6tables -t nat -C POSTROUTING -m set --match-set ip_whitelist src -p tcp -d `echo ${port_forward}|awk '{print $3}'` --dport `echo ${port_forward}|awk '{print $4}'` -j SNAT --to-source `echo ${port_forward}|awk '{print $1}'` >/dev/null 2>&1 || ip6tables -t nat -I POSTROUTING -m set --match-set ip_whitelist src -p tcp -d `echo ${port_forward}|awk '{print $3}'` --dport `echo ${port_forward}|awk '{print $4}'` -j SNAT --to-source `echo ${port_forward}|awk '{print $1}'` >/dev/null 2>&1 + done + + unset port_forward + ipset -exist add ip_whitelistv6 ${1} timeout ${ip_white_timeout} + fi +} + +# 添加黑名单 +function add_ip_black(){ + [ ! "$1" ] && return + ( ipset -q test ip_blacklist ${1} ) && continue + ( ipset -q test ip_blacklistv6 ${1} ) && continue + + [ "$1" ] && echo "$1 timeout ${ip_black_timeout}" >> ${ip_blacklist_path} + # 检查并添加 + if ( echo ${1}|grep -q -Eo "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" ); then + ipset list ip_blacklist >/dev/null 2>&1 || ipset create ip_blacklist hash:ip timeout ${ip_black_timeout} >/dev/null 2>&1 + iptables -C INPUT -m set --match-set ip_blacklist src -j DROP >/dev/null 2>&1 || iptables -I INPUT -m set --match-set ip_blacklist src -j DROP >/dev/null 2>&1 + ipset add ip_blacklist ${1} timeout ${ip_black_timeout} + elif ( echo ${1}|grep -q -oE "([\da-fA-F0-9]{1,4}(:{1,2})){1,15}[\da-fA-F0-9]{1,4}" ); then + ipset list ip_blacklistv6 >/dev/null 2>&1 || ipset create ip_blacklistv6 hash:ip timeout ${ip_black_timeout} family inet6 >/dev/null 2>&1 + ip6tables -C INPUT -m set --match-set ip_blacklistv6 src -j DROP >/dev/null 2>&1 || ip6tables -I INPUT -m set --match-set ip_blacklistv6 src -j DROP >/dev/null 2>&1 + ipset add ip_blacklistv6 ${1} timeout ${ip_black_timeout} + fi +} + +# 移出黑名单 +function del_ip_black(){ + [ ! "$1" ] && return + + sed -i "/^${1}/d" ${ip_blacklist_path} + if ( echo ${1}|grep -q -Eo "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" ); then + ipset list ip_blacklist >/dev/null 2>&1 && ipset -! del ip_blacklist ${1} + elif ( echo ${1}|grep -oE "([\da-fA-F0-9]{1,4}(:{1,2})){1,15}[\da-fA-F0-9]{1,4}" ); then + ipset list ip_blacklistv6 >/dev/null 2>&1 && ipset -! del ip_blacklistv6 ${1} + fi +} + +# 设置防火墙列表 +function set_ip_black(){ + # 检查换行,避免出错 + [ `tail -n1 "${ip_blacklist_path}" | wc -l` -eq "0" ] && echo -e >> ${ip_blacklist_path} + # 如果黑名单列表为空,移除集合并退出 + if [ ! -z "$web_login_black" ] && [ "$web_login_black" -eq "0" ] || [ -z "$web_login_black" ] || [ ! -f ${ip_blacklist_path} ] || [ -z "`cat ${ip_blacklist_path}`" ]; then + iptables -D INPUT -m set --match-set ip_blacklist src -j DROP >/dev/null 2>&1 + ipset destroy ip_blacklist >/dev/null 2>&1 + ip6tables -D INPUT -m set --match-set ip_blacklistv6 src -j DROP >/dev/null 2>&1 + ipset destroy ip_blacklistv6 >/dev/null 2>&1 + return + fi + # 从 ip_blacklist 文件逐行添加黑名单,add_ip_black() 处验证是否重复 + for ip_black in `cat ${ip_blacklist_path}|awk '{print $1}'`; do + add_ip_black ${ip_black} + done + # 当 ip_blacklist 文件清除 IP 时,移除防火墙规则 + for fw_ip_blacklist in `ipset list ip_blacklist 2>/dev/null|grep -Eo "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"`; do + [ -z "$fw_ip_blacklist" ] && continue + local fw_info_blacklist=`ipset list ip_blacklist 2>/dev/null|grep -w -i ${fw_ip_blacklist}` + cat ${ip_blacklist_path}|grep -q -w -i ${fw_ip_blacklist} && sed -i "/^${fw_ip_blacklist}/d" ${ip_blacklist_path} && echo ${fw_info_blacklist} >> ${ip_blacklist_path} || del_ip_black ${fw_ip_blacklist} + done + for fw_ip_blacklistv6 in `ipset list ip_blacklistv6 2>/dev/null|grep -Eo "([\da-fA-F0-9]{1,4}(:{1,2})){1,15}[\da-fA-F0-9]{1,4}"`; do + [ -z "$fw_ip_blacklistv6" ] && continue + local fw_info_blacklistv6=`ipset list ip_blacklistv6 2>/dev/null|grep -w -i ${fw_ip_blacklistv6}` + cat ${ip_blacklist_path}|grep -q -w -i ${fw_ip_blacklistv6} && sed -i "/^${fw_ip_blacklistv6}/d" ${ip_blacklist_path} && echo ${fw_info_blacklistv6} >> ${ip_blacklist_path} || del_ip_black ${fw_ip_blacklistv6} + done +} + +# 发送定时数据 +function send(){ + echo "`date "+%Y-%m-%d %H:%M:%S"` 【定时数据】创建定时任务" >> ${logfile} + serverchan_disturb;local send_disturb=$? + get_config "send_title" "router_status" "router_temp" "router_wan" "client_list" + + [ -z "$send_title" ] && local send_title="路由状态:" + [ ! -z "$1" ] && local send_title="发送测试:" && local send_content="${str_splitline}${str_title_start}内容1${str_title_end}${str_linefeed}${str_tab}设备1${str_linefeed}${str_tab}设备2${str_splitline}${str_title_start}内容2${str_title_end}${str_linefeed}${str_tab}设备3${str_linefeed}${str_tab}设备4" + [ -z "$1" ] && [ ! -z "$client_list" ] && [ "$client_list" -eq "1" ] && > ${dir}send_enable.lock && serverchan_first & + + if [ -z "$1" ] && [ ! -z "$router_status" ] && [ "$router_status" -eq "1" ]; then + local systemload=`cat /proc/loadavg|awk '{print $1" "$2" "$3}'` + local cpuload=`getcpu` + local ramload=`free -m|sed -n '2p'|awk '{printf "%.2f%%\n",($3/$2)*100}'` + local Qwai=`curl -o /dev/null --connect-timeout 5 -s -w %{http_code} www.google.com` + if [[ $Qwai -eq 200 || $Qwai -eq 301 || $Qwai -eq 302 ]]; then + local Qwai_status="已连通!" + else + local Qwai_status="已断开!" + fi + local systemstatustime=`cat /proc/uptime|awk -F. '{run_days=$1 / 86400;run_hour=($1 % 86400)/3600;run_minute=($1 % 3600)/60;run_second=$1 % 60;printf("运行时间:%d天%d时%d分%d秒",run_days,run_hour,run_minute,run_second)}'`;unset run_days run_hour run_minute run_second + local send_content="${send_content}${str_splitline}${str_title_start} 系统运行状态${str_title_end}" + local send_content="${send_content}${str_linefeed}${str_tab}平均负载:${systemload}" + local send_content="${send_content}${str_linefeed}${str_tab}CPU占用:${cpuload}" + local send_content="${send_content}${str_linefeed}${str_tab}内存占用:${ramload}" + local send_content="${send_content}${str_linefeed}${str_tab}全球互联:${Qwai_status}" + local send_content="${send_content}${str_linefeed}${str_tab}${systemstatustime}" + fi + + if [ -z "$1" ] && [ ! -z "$router_temp" ] && [ "$router_temp" -eq "1" ]; then + local cputemp=`soc_temp` + [ ! -z "$cputemp" ] && local send_content="${send_content}${str_splitline}${str_title_start} 设备温度${str_title_end}${str_linefeed}${str_tab}CPU:${cputemp}℃" + [ -z "$cputemp" ] && local send_content="${send_content}${str_splitline}${str_title_start} 设备温度${str_title_end}${str_linefeed}${str_tab}无法获取设备温度" + fi + + if [ -z "$1" ] && [ ! -z "$router_wan" ] && [ "$router_wan" -eq "1" ]; then + local send_wanIP=`getip wanipv4`;local send_hostIP=`getip hostipv4` + local send_content="${send_content}${str_splitline}${str_title_start} WAN 口信息${str_title_end}${str_linefeed}${str_tab}接口 IPv4:${send_wanIP}" + local send_content="${send_content}${str_linefeed}${str_tab}外网 IPv4:${send_hostIP}" + if [ ! -z "$serverchan_ipv6" ] && [ "$serverchan_ipv6" -ne "0" ]; then + local send_wanIPv6=`getip wanipv6`;local send_hostIPv6=`getip hostipv6` + local send_content="${send_content}${str_linefeed}${str_tab}接口 IPv6:${send_wanIPv6}" + local send_content="${send_content}${str_linefeed}${str_tab}外网 IPv6:${send_hostIPv6}" + fi + ( ! echo "$send_wanIP"|grep -q -w ${send_hostIP} ) && local send_content="${send_content}${str_linefeed}${str_tab}外网 IP 与接口 IP 不一致,你的 IP 可能不是公网 IP" + local interfaceuptime=`getinterfaceuptime` + [ ! -z "$interfaceuptime" ] && local wanstatustime=`getinterfaceuptime|awk -F. '{run_days=$1 / 86400;run_hour=($1 % 86400)/3600;run_minute=($1 % 3600)/60;run_second=$1 % 60;printf("在线时间:%d天%d时%d分%d秒",run_days,run_hour,run_minute,run_second)}'` && unset run_days run_hour run_minute run_second + local send_content="${send_content}${str_linefeed}${str_tab}${wanstatustime}" + fi + + if [ -z "$1" ] && [ ! -z "$client_list" ] && [ "$client_list" -eq "1" ]; then + wait + local IPLIST=`cat ${dir}ipAddress 2>/dev/null|awk '{print $1}'` + [ -f ${dir}ipAddress ] && local logrow=$(grep -c "" ${dir}ipAddress) || local logrow="0" + [ "$logrow" -eq "0" ] && local send_content="${send_content}${str_splitline}${str_title_start} 当前无在线设备${str_title_end}" || local send_content="${send_content}${str_splitline}${str_title_start} 现有在线设备 ${logrow} 台${str_title_end}" + for ip in $IPLIST; do + local time_up=`cat ${dir}ipAddress|grep -w ${ip}|awk '{print $4}'|grep -v "^$"|sort -u|head -n1` + local time1=`date +%s` + local time1=$(time_for_humans `expr ${time1} - ${time_up}`) + local ip_mac=`getmac ${ip}` + local ip_name=`getname ${ip} ${ip_mac}` + local ip_total=`usage get ${ip_mac}`;[ ! -z "$ip_total" ] && local ip_total="总计流量:${ip_total} " + local ip_name=`cut_str $ip_name 18` + local send_content="${send_content}${str_linefeed}${str_tab}【${ip_name}】 ${ip}${str_linefeed}${str_tab}${ip_total}在线 ${time1}" + unset ip_total time_down time_up time1 ip_mac ip_name + done + fi + [ ! -z "$device_name" ] && local send_title="【$device_name】${send_title}" + [ -z "$send_content" ] && local send_content="${str_splitline}${str_title_start} 我遇到了一个难题${str_title_end}${str_linefeed}${str_tab}定时发送选项错误,你没有选择需要发送的项目,该怎 么办呢${str_splitline}" + [ "$send_disturb" -eq "0" ] && diy_send "${send_title}" "${send_content}" "${jsonpath}" "$1" >/dev/null 2>&1 + [ $? -eq 1 ] && [ "$send_disturb" -eq "0" ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】定时推送失败,请检查网络或设置信息" >> ${logfile} || echo "`date "+%Y-%m-%d %H:%M:%S"` ${disturb_text}定时推送任务完成" >> ${logfile} + deltemp +} + +# 初始化 +read_config +deltemp +serverchan_cron + +# 限制并发进程 +[ -z "$thread_num" ] || [ "$thread_num" -eq "0" ] && thread_num=5 +[ "$1" ] && [ $1 == "t1" ] && thread_num=1 +[ -e ${dir}fd1 ] || mkfifo ${dir}fd1 +exec 5<>${dir}fd1 +rm -f ${dir}fd1 >/dev/null 2>&1 +for i in `seq 1 $thread_num`; do + echo >&5 +done +unset i + +# 启动参数 +if [ "$1" ] ;then + [ $1 == "send" ] && send + [ $1 == "soc" ] && echo `soc_temp` > ${dir}soc_tmp + [ $1 == "test" ] && send test + [ $1 == "t1" ] || exit +fi + +# 载入在线设备 +serverchan_init;[ $? -eq 1 ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】读取设置出错,请检查设置项 " >> ${logfile} && exit +echo "`date "+%Y-%m-%d %H:%M:%S"` 【初始化】载入在线设备" >> ${logfile} +> ${dir}send_enable.lock && serverchan_first && deltemp +echo "`date "+%Y-%m-%d %H:%M:%S"` 【初始化】初始化完成" >> ${logfile} + +# 循环 +while [ "$serverchan_enable" -eq "1" ]; do + deltemp + usage update + serverchan_disturb;disturb=$? + + [ -f ${dir}ipAddress ] && ipAddress_logrow=$(grep -c "" ${dir}ipAddress) || ipAddress_logrow="0"; + if [ $ipAddress_logrow -ne "0" ]; then + online_list=`cat ${dir}ipAddress|awk '{print $2}'|grep -v "^$"|sort -u` + for online_mac in $online_list; do + [ ! -z "$online_mac" ] && mac_online_status="`echo "$mark_mac_list"|grep -i $online_mac|grep -v "^$"|sort -u|head -n1`${mac_online_status}" + done + fi + + # 网络状态与 IP 变动 + if [ "$serverchan_ipv4" -ne "0" ] || [ "$serverchan_ipv6" -ne "0" ]; then + rand_geturl + ip_changes + fi + + # 设备列表 + if [ ! -f "${dir}send_enable.lock" ]; then + [ ! -z "$title" ] && echo "$title" > ${dir}title + [ ! -z "$content" ] && echo "$content" > ${dir}content + serverchan_first + [ -f "${dir}title" ] && title=`cat ${dir}title` && rm -f ${dir}title >/dev/null 2>&1 + [ -f "${dir}content" ] && content=`cat ${dir}content` && rm -f ${dir}content >/dev/null 2>&1 + fi + + # 离线二次验证区推送 + [ ! -f "${dir}send_enable.lock" ] && down_send + + # 当前设备列表 + [ ! -z "$content" ] && [ ! -f "${dir}send_enable.lock" ] && current_device + + # 无人值守任务 + [ ! -f "${dir}send_enable.lock" ] && unattended + + # CPU 检测 + [ ! -f "${dir}send_enable.lock" ] && cpu_load + + # 异常流量检测 + [ ! -f "${dir}send_enable.lock" ] && get_client_usage + + # 登陆提醒通知 + [ ! -f "${dir}send_enable.lock" ] && login_send + + # 推送 + if [ ! -f "${dir}send_enable.lock" ] && [ ! -z "$title" ] && [ ! -z "$content" ]; then + [ ! -z "$device_name" ] && title="【$device_name】$title" + ( echo "$lite_enable"|grep -q "content" ) && content="$title" + [ "$disturb" -eq "0" ] && diy_send "${title}" "${content}" "${jsonpath}" >/dev/null 2>&1 + fi + + # 等待定时任务推送完成 + while [ -f "${dir}send_enable.lock" ]; do + sleep $sleeptime + done + + sleep $sleeptime +done diff --git a/luci-app-wifidog b/luci-app-wifidog deleted file mode 160000 index 3a2fdff5..00000000 --- a/luci-app-wifidog +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 3a2fdff5584ef8ecb143f0ad254f2972ec5f2f2d diff --git a/luci-app-wifidog/LICENSE b/luci-app-wifidog/LICENSE new file mode 100644 index 00000000..d6a93266 --- /dev/null +++ b/luci-app-wifidog/LICENSE @@ -0,0 +1,340 @@ +GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {description} + Copyright (C) {year} {fullname} + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + {signature of Ty Coon}, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. + diff --git a/luci-app-wifidog/Makefile b/luci-app-wifidog/Makefile new file mode 100644 index 00000000..4e9ab2fd --- /dev/null +++ b/luci-app-wifidog/Makefile @@ -0,0 +1,20 @@ +#PO = wifidog +#by walkingsky + +include $(TOPDIR)/rules.mk + +LUCI_TITLE:=LuCI wifidog config +LUCI_DEPENDS:=+wifidog +LUCI_PKGARCH:=all +PKG_NAME:=luci-app-wifidog +PKG_VERSION:=2.0 +PKG_RELEASE:=2 + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature +# +# +# +# + diff --git a/luci-app-wifidog/README.md b/luci-app-wifidog/README.md new file mode 100644 index 00000000..9b170313 --- /dev/null +++ b/luci-app-wifidog/README.md @@ -0,0 +1,40 @@ +luci-wifidog +=========== + +wifidog的luci管理界面,基于lede的可编译package + + +--- +## 安装方法 + +克隆本项目到本地 +将目录名称由 luci-wifidog 改名成 luci-app-wifidog +复制 luci-app-wifidog 目录到本地lede的目录树中,目录结构如下:lede/package/feeds/luci/luci-app-wifidog + +注意:里面的脚本要注意文件格式及可执行属性,到了linux系统里要用chmod及dos2unix命令作适当调整 +/etc/init.d/wifidog +/etc/uci-defaults/luci-wifidog + + +## 编译 + +编译是sdk环境中要有wifidog选项: +1. 执行make menuconfig,在LuCI -》3. Applications-》luci-app-wifidog 找到该包,勾选上。 +2. 编译整个sdk + +--- +## 使用方法 for wifidog v1.3.0 + +首先需要安装wifidog +```bash +opkg update +opkg install wifidog +``` + + +拷贝各文件到相应文件夹中替换原文件, __注意:__ +/etc/uci-defaults  +/etc/init.d/wifidog 替换源文件, 并使用 chmod +x wifidog 增加可执行权限. + +在LUCI中就可以看见出现wifidog配置菜单了,填写相应参数,保存+应用; +LUCI -> System -> Startup  找到Wiifidog 启用之,重启路由器即可自动执行脚本运行wifidog,并生效配置。 diff --git a/luci-app-wifidog/luasrc/controller/wifidog.lua b/luci-app-wifidog/luasrc/controller/wifidog.lua new file mode 100644 index 00000000..7fe8a113 --- /dev/null +++ b/luci-app-wifidog/luasrc/controller/wifidog.lua @@ -0,0 +1,16 @@ +--[[ + walkingsky + tangxn_1@163.com +]]-- + +module("luci.controller.wifidog", package.seeall) + + +function index() + local fs = require "nixio.fs" + --if fs.access("/usr/bin/wifidog") then + entry({"admin", "services","wifidog"}, cbi("wifidog/wifidog_cfg"), "wifidog配置") + --end + +end + diff --git a/luci-app-wifidog/luasrc/model/cbi/wifidog/wifidog_cfg.lua b/luci-app-wifidog/luasrc/model/cbi/wifidog/wifidog_cfg.lua new file mode 100644 index 00000000..c72390e3 --- /dev/null +++ b/luci-app-wifidog/luasrc/model/cbi/wifidog/wifidog_cfg.lua @@ -0,0 +1,116 @@ +--[[ + walkingsky + tangxn_1@163.com +]]-- + +local sys = require "luci.sys" +local fs = require "nixio.fs" +local uci = require "luci.model.uci".cursor() + +m = Map("wifidog", "wifidog执行参数配置","") + +--if fs.access("/usr/bin/wifidog") then + + s = m:section(TypedSection, "wifidog", "wifidog配置") + s.anonymous = true + s.addremove = false + + + s:tab("general", "通用配置") + s:tab("servers", "认证服务器配置") + s:tab("advanced", "高级配置") + + + --通用配置 + wifi_enable = s:taboption("general",Flag, "wifidog_enable", translate("是否启用wifidog"),"打开或关闭wifidog") + + local t = io.popen("ifconfig | grep HWaddr | awk -F\" \" '{print $5}' | awk '$1~//{print;exit}' | sed 's/://g'") + local temp = t:read("*all") + gatewayID = s:taboption("general",Value,"gateway_id","设备id(GatewayID)","默认为路由器MAC地址") + gatewayID.default=temp + + gateway_interface = s:taboption("general",Value,"gateway_interface","内网接口","设置内网接口,默认'br-lan'") + externalinterface = s:taboption("general",Value,"externalinterface","外网接口","WAN口接口,默认eth0.2") + externalinterface.default = "eth0.2" + + + + --服务器配置项 + + server_hostname = s:taboption("servers",Value,"server_hostname","认证服务器:主机名","域名或ip") + server_httpport = s:taboption("servers",Value,"server_httpport","认证服务器:web服务端口","默认80端口") + server_path = s:taboption("servers",Value,"server_path","认证服务器:url路径","最后要加/,例如:'/','/wifidog/';默认'/wifidog/'") + server_sslAvailable = s:taboption("servers",Flag,"server_sslAvailable","启用SSL","默认不打开") + server_sslport = s:taboption("servers",Value,"server_sslport","SSL端口","默认'443'") + server_LoginScriptPathFragment = s:taboption("servers",Value,"server_LoginScriptPathFragment","服务器login接口脚本url路径段","默认'login/?'") + server_PortalScriptPathFragment = s:taboption("servers",Value,"server_PortalScriptPathFragment","服务器portal接口脚本url路径段","默认'portal/?'") + server_PingScriptPathFragment = s:taboption("servers",Value,"server_PingScriptPathFragment","服务器ping接口脚本url路径段","默认'ping/?'") + server_AuthScriptPathFragment = s:taboption("servers",Value,"server_AuthScriptPathFragment","服务器auth接口脚本url路径段","默认'auth/?'") + server_MsgScriptPathFragment = s:taboption("servers",Value,"server_MsgScriptPathFragment","服务器消息接口脚本url路径段","默认'gw_message.php?'") + + --gateway_hostname.default = "www.test.com" + server_httpport.default = "80" + server_path.default = "/wifidog/" + server_sslAvailable.default = server_sslAvailable.disabled + server_sslport.default = "443" + server_LoginScriptPathFragment.default = "login/?" + server_PortalScriptPathFragment.default = "portal/?" + server_PingScriptPathFragment.default = "ping/?" + server_AuthScriptPathFragment.default = "auth/?" + server_MsgScriptPathFragment.default = "gw_message.php?" + + --高级配置 + + --deamo_enable = s:taboption("advanced",Flag, "deamo_enable", "是否启用监护功能","检测wifidog意外退出后,重启wifidog") + --deamo_enable:depends("wifidog_enable","1") + gateway_port = s:taboption("advanced",Value, "gateway_port", "wifidog监听端口","默认'2060'") + gateway_port.default = "2060" + + check_interval = s:taboption("advanced",Value, "check_interval", "和服务器通讯间隔,单位秒","默认'60'") + check_interval.default = "60" + + client_timeout = s:taboption("advanced",Value, "client_timeout", "客户端掉线超时时间倍数,(通讯间隔的倍数)","默认'5',即5倍的服务器通讯时间间隔后,仍然检测不到客户端,则自动下线该客户端") + client_timeout.default = "5" + + s = m:section(TypedSection, "trustedmaclist", "MAC白名单列表","") + s.anonymous = true + s.addremove = true + s.template = "cbi/tblsection" + + mac = s:option(Value, "mac", "mac地址") + mac.rmempty = false + mac.datatype = "list(macaddr)" + + --sys.net.arptable(function(entry) + luci.ip.neighbors(function(entry) + mac:value( + entry["HW address"], + entry["HW address"] .. " (" .. entry["IP address"] .. ")" + ) + end) + + s = m:section(TypedSection, "allowrule", "默认允许访问的服务","") + s.anonymous = true + s.addremove = true + s.template = "cbi/tblsection" + + udp_tcp = s:option(ListValue, "protocol","协议") + udp_tcp:value('tcp') + udp_tcp:value('udp') + --udp_tcp:value('icmp') + + ip = s:option(Value, "ip", "IP地址") + ip.datatype = "ip4addr" + ip.rmempty = false + + port = s:option(Value,"port","端口号") + port.rmempty = false + port.datatype = "range(1,65535)" + +--else +-- m.pageaction = false +--end + + +return m + diff --git a/luci-app-wifidog/root/etc/config/wifidog b/luci-app-wifidog/root/etc/config/wifidog new file mode 100644 index 00000000..9b4c5422 --- /dev/null +++ b/luci-app-wifidog/root/etc/config/wifidog @@ -0,0 +1,27 @@ +config wifidog 'wifidog' + option wifidog_enable '1' + + + option gateway_interface 'br-lan' + option externalinterface 'eth0.2' + + + option server_hostname 'www.test.com' + option server_httpport '80' + option server_path '/wifidog/' + + option server_sslAvailable '0' + option server_sslport '443' + option server_LoginScriptPathFragment 'login/?' + option server_PortalScriptPathFragment 'portal/?' + option server_PingScriptPathFragment 'ping/?' + option server_AuthScriptPathFragment 'auth/?' + option server_MsgScriptPathFragment 'gw_message.php?' + + option gateway_port '2060' + option check_interval '60' + option client_timeout '5' + +config trustedmaclist + +config allowrule diff --git a/luci-app-wifidog/root/etc/init.d/wifidog b/luci-app-wifidog/root/etc/init.d/wifidog new file mode 100644 index 00000000..372e1235 --- /dev/null +++ b/luci-app-wifidog/root/etc/init.d/wifidog @@ -0,0 +1,152 @@ +#!/bin/sh /etc/rc.common +# Copyright (C) 2006 OpenWrt.org +#modify by walkingsky + +START=65 +USE_PROCD=1 +EXTRA_COMMANDS="status" +EXTRA_HELP=" status Print the status of the service" + +local mac_args="TrustedMACList " +local allowrule="" + +add_mac(){ + config_load wifidog + local cfg="$1" + config_get mac "$cfg" mac + if [ "$mac_args" = "TrustedMACList " ]; then + mac_args="$mac_args $mac" + else + mac_args="$mac_args,$mac" + fi +} + + +add_allowrule(){ + config_load wifidog + local cfg="$1" + config_get protocol "$cfg" protocol + config_get ip "$cfg" ip + config_get port "$cfg" port + + allowrule="$allowrule + FirewallRule allow $protocol port $port to $ip " +} + + +#wifidog ?? +create_config(){ + + config_load wifidog + + + gateway_id=`ifconfig | grep HWaddr | awk -F" " '{print $5}' | awk '$1~//{print;exit}' | sed 's/://g'` + config_get gateway_id "wifidog" "gateway_id" $gateway_id + config_get externalinterface "wifidog" "externalinterface" "eth0.2" + config_get gateway_interface "wifidog" "gateway_interface" "br-lan" + config_get server_hostname "wifidog" "server_hostname" "www.test.com" + config_get server_httpport "wifidog" "server_httpport" "80" + config_get server_path "wifidog" "server_path" "/wifidog/" + + config_get server_sslAvailable "wifidog" "server_sslAvailable" "0" + config_get server_sslport "wifidog" "server_sslport" "443" + config_get server_LoginScriptPathFragment "wifidog" "server_LoginScriptPathFragment" "login/?" + config_get server_PortalScriptPathFragment "wifidog" "server_PortalScriptPathFragment" "portal/?" + config_get server_PingScriptPathFragment "wifidog" "server_PingScriptPathFragment" "ping/?" + config_get server_AuthScriptPathFragment "wifidog" "server_AuthScriptPathFragment" "auth/?" + config_get server_MsgScriptPathFragment "wifidog" "server_MsgScriptPathFragment" "gw_message.php?" + config_get gateway_port "wifidog" "gateway_port" "2060" + config_get check_interval "wifidog" "check_interval" "60" + config_get client_timeout "wifidog" "client_timeout" "5" + + + if [ $server_sslAvailable -eq 0 ]; then + server_sslAvailable="no" + else + server_sslAvailable="yes" + fi + + config_foreach add_mac trustedmaclist + config_foreach add_allowrule allowrule + + if [ "$mac_args" = "TrustedMACList " ]; then + $mac_args="" + fi + + echo " +GatewayID $gateway_id +GatewayInterface $gateway_interface +externalinterface $externalinterface + +GatewayPort $gateway_port + +AuthServer { + Hostname $server_hostname + SSLAvailable $server_sslAvailable + SSLPort $server_sslport + HTTPPort $server_httpport + Path $server_path + LoginScriptPathFragment $server_LoginScriptPathFragment + PortalScriptPathFragment $server_PortalScriptPathFragment + MsgScriptPathFragment $server_MsgScriptPathFragment + PingScriptPathFragment $server_PingScriptPathFragment + AuthScriptPathFragment $server_AuthScriptPathFragment +} + +CheckInterval $check_interval +ClientTimeout $client_timeout + +$mac_args + +FirewallRuleSet validating-users { + FirewallRule allow to 0.0.0.0/0 +} + +FirewallRuleSet known-users { + FirewallRule allow to 0.0.0.0/0 +} + +FirewallRuleSet global { + $allowrule +} + +FirewallRuleSet unknown-users { + FirewallRule allow udp port 53 + FirewallRule allow tcp port 53 + FirewallRule allow udp port 67 + FirewallRule allow tcp port 67 +} + +FirewallRuleSet locked-users { + FirewallRule block to 0.0.0.0/0 +} +" > /etc/wifidog.conf + + + +} + +start_service() { + config_load wifidog + + config_get wifidog_enable "wifidog" "wifidog_enable" "0" + if [ $wifidog_enable -eq 0 ]; then + stop + exit + fi + + create_config + + sleep 1 + procd_open_instance + # -s: log to syslog + # -f: run in foreground + procd_set_param command /usr/bin/wifidog -s -f + procd_set_param respawn # respawn automatically if something died + procd_set_param file /etc/wifidog.conf + procd_close_instance +} + +status() { + /usr/bin/wdctl status +} diff --git a/luci-app-wifidog/root/etc/uci-defaults/luci-wifidog b/luci-app-wifidog/root/etc/uci-defaults/luci-wifidog new file mode 100644 index 00000000..1ae0190f --- /dev/null +++ b/luci-app-wifidog/root/etc/uci-defaults/luci-wifidog @@ -0,0 +1,13 @@ +#!/bin/sh + +uci -q batch <<-EOF >/dev/null + delete ucitrack.@wifidog[-1] + add ucitrack wifidog + set ucitrack.@wifidog[-1].init=wifidog + #delete ucitrack.@firewall[0].affects + add_list ucitrack.@firewall[0].affects=wifidog + commit ucitrack +EOF + +rm -f /tmp/luci-indexcache +exit 0 \ No newline at end of file diff --git a/luci-app-wifidog/root/usr/sbin/wifidog_check.sh b/luci-app-wifidog/root/usr/sbin/wifidog_check.sh new file mode 100644 index 00000000..fbfe94ba --- /dev/null +++ b/luci-app-wifidog/root/usr/sbin/wifidog_check.sh @@ -0,0 +1,10 @@ +#!/bin/sh +# +#walkingsky +#tangxn_1@163.com + +local run=`ps | grep "wifidog -c /tmp/wifidog.conf" | wc -l` + +if [ $run -lt 2 ]; then + wifidog -c /tmp/wifidog.conf +fi \ No newline at end of file diff --git a/luci-app-wifidog/root/usr/share/rpcd/acl.d/luci-app-wifidog.json b/luci-app-wifidog/root/usr/share/rpcd/acl.d/luci-app-wifidog.json new file mode 100644 index 00000000..a4eefdeb --- /dev/null +++ b/luci-app-wifidog/root/usr/share/rpcd/acl.d/luci-app-wifidog.json @@ -0,0 +1,11 @@ +{ + "luci-app-wifidog": { + "description": "Grant UCI access for luci-app-wifidog", + "read": { + "uci": [ "wifidog" ] + }, + "write": { + "uci": [ "wifidog" ] + } + } +} diff --git a/luci-app-wolplus/Makefile b/luci-app-wolplus/Makefile new file mode 100644 index 00000000..aeecba00 --- /dev/null +++ b/luci-app-wolplus/Makefile @@ -0,0 +1,18 @@ +# Copyright (C) 2016 Openwrt.org +# +# This is free software, licensed under the Apache License, Version 2.0 . +# + +include $(TOPDIR)/rules.mk + +LUCI_TITLE:=LuCI support for Wakeup-On-Lan-plus +LUCI_DEPENDS:=+etherwake +LUCI_PKGARCH:=all +PKG_VERSION:=1.0.2 +PKG_RELEASE:=1 + +PKG_MAINTAINER:=siwind + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/luci-app-wolplus/luasrc/controller/wolplus.lua b/luci-app-wolplus/luasrc/controller/wolplus.lua new file mode 100644 index 00000000..f5eb1a2f --- /dev/null +++ b/luci-app-wolplus/luasrc/controller/wolplus.lua @@ -0,0 +1,33 @@ +module("luci.controller.wolplus", package.seeall) +local t, a +local x = luci.model.uci.cursor() + +function index() + if not nixio.fs.access("/etc/config/wolplus") then return end + entry({"admin", "services", "wolplus"}, cbi("wolplus"), _("wolplus"), 95).dependent = true + entry( {"admin", "services", "wolplus", "awake"}, post("awake") ).leaf = true +end + +function awake(sections) + lan = x:get("wolplus",sections,"maceth") + mac = x:get("wolplus",sections,"macaddr") + local e = {} + cmd = "/usr/bin/etherwake -D -i " .. lan .. " -b " .. mac .. " 2>&1" + local p = io.popen(cmd) + local msg = "" + if p then + while true do + local l = p:read("*l") + if l then + if #l > 100 then l = l:sub(1, 100) .. "..." end + msg = msg .. l + else + break + end + end + p:close() + end + e["data"] = msg + luci.http.prepare_content("application/json") + luci.http.write_json(e) +end diff --git a/luci-app-wolplus/luasrc/model/cbi/wolplus.lua b/luci-app-wolplus/luasrc/model/cbi/wolplus.lua new file mode 100644 index 00000000..b7b4c789 --- /dev/null +++ b/luci-app-wolplus/luasrc/model/cbi/wolplus.lua @@ -0,0 +1,35 @@ +local i = require "luci.sys" +local t, e +t = Map("wolplus", translate("WOL Plus"), translate("Wake up your LAN device")) +t.template = "wolplus/index" +e = t:section(TypedSection, "macclient", translate("macclient")) +e.template = "cbi/tblsection" +e.anonymous = true +e.addremove = true +a = e:option(Value, "name", translate("name")) +a.optional = false +nolimit_mac = e:option(Value, "macaddr", translate("macaddr")) +nolimit_mac.rmempty = false +i.net.mac_hints(function(e, t) nolimit_mac:value(e, "%s (%s)" % {e, t}) end) +nolimit_eth = e:option(Value, "maceth", translate("maceth")) +nolimit_eth.rmempty = false +for t, e in ipairs(i.net.devices()) do if e ~= "lo" then nolimit_eth:value(e) end end +btn = e:option(Button, "_awake",translate("awake")) +btn.inputtitle = translate("awake") +btn.inputstyle = "apply" +btn.disabled = false +btn.template = "wolplus/awake" +function gen_uuid(format) + local uuid = i.exec("echo -n $(cat /proc/sys/kernel/random/uuid)") + if format == nil then + uuid = string.gsub(uuid, "-", "") + end + return uuid +end +function e.create(e, t) + local uuid = gen_uuid() + t = uuid + TypedSection.create(e, t) +end + +return t diff --git a/luci-app-wolplus/luasrc/view/wolplus/awake.htm b/luci-app-wolplus/luasrc/view/wolplus/awake.htm new file mode 100644 index 00000000..91cd71b1 --- /dev/null +++ b/luci-app-wolplus/luasrc/view/wolplus/awake.htm @@ -0,0 +1,3 @@ +<%+cbi/valueheader%> + " style="font-size: 100%;" type="button" onclick="onclick_awake(this.id)" <%=attr("name", section) .. attr("id", cbid) .. attr("value", self.inputtitle)%> /> +<%+cbi/valuefooter%> diff --git a/luci-app-wolplus/luasrc/view/wolplus/index.htm b/luci-app-wolplus/luasrc/view/wolplus/index.htm new file mode 100644 index 00000000..2991f946 --- /dev/null +++ b/luci-app-wolplus/luasrc/view/wolplus/index.htm @@ -0,0 +1,22 @@ +<% include("cbi/map") %> + + diff --git a/luci-app-wolplus/po/zh-cn/wolplus.po b/luci-app-wolplus/po/zh-cn/wolplus.po new file mode 100644 index 00000000..0c1d987b --- /dev/null +++ b/luci-app-wolplus/po/zh-cn/wolplus.po @@ -0,0 +1,26 @@ +msgid "wolplus" +msgstr "网络唤醒Plus" + +msgid "WOL Plus" +msgstr "网络唤醒Plus-增强版" + +msgid "Wake up your LAN device" +msgstr "网络唤醒您的局域网设备" + +msgid "macclient" +msgstr "客户端MAC设备列表" + +msgid "name" +msgstr "名称" + +msgid "macaddr" +msgstr "客户端MAC" + +msgid "maceth" +msgstr "网络接口" + +msgid "awake" +msgstr "唤醒" + +msgid "Please [Save & Apply] your changes first" +msgstr "请先保存并应用您的设置" diff --git a/luci-app-wolplus/po/zh_Hans/wolplus.po b/luci-app-wolplus/po/zh_Hans/wolplus.po new file mode 100644 index 00000000..608d97e7 --- /dev/null +++ b/luci-app-wolplus/po/zh_Hans/wolplus.po @@ -0,0 +1,26 @@ +msgid "wolplus" +msgstr "网络唤醒Plus" + +msgid "WOL Plus" +msgstr "网络唤醒Plus-增强版" + +msgid "Wake up your LAN device" +msgstr "网络唤醒您的局域网设备" + +msgid "macclient" +msgstr "客户端MAC设备列表" + +msgid "name" +msgstr "名称" + +msgid "macaddr" +msgstr "客户端MAC地址" + +msgid "maceth" +msgstr "用于唤醒的网络接口" + +msgid "awake" +msgstr "唤醒" + +msgid "Please [Save & Apply] your changes first" +msgstr "请先保存并应用您的设置" diff --git a/luci-app-wolplus/root/etc/config/wolplus b/luci-app-wolplus/root/etc/config/wolplus new file mode 100644 index 00000000..e69de29b diff --git a/luci-app-wolplus/root/etc/uci-defaults/luci-app-WOL-plus b/luci-app-wolplus/root/etc/uci-defaults/luci-app-WOL-plus new file mode 100644 index 00000000..61c4b1e5 --- /dev/null +++ b/luci-app-wolplus/root/etc/uci-defaults/luci-app-WOL-plus @@ -0,0 +1,11 @@ +#!/bin/sh + +uci -q batch <<-EOF >/dev/null + delete ucitrack.@wolplus[-1] + add ucitrack wolplus + set ucitrack.@wolplus[-1].init=wolplus + commit ucitrack +EOF + +rm -f /tmp/luci-indexcache +exit 0 diff --git a/luci-app-wolplus/root/usr/share/rpcd/acl.d/luci-app-services-wolplus.json b/luci-app-wolplus/root/usr/share/rpcd/acl.d/luci-app-services-wolplus.json new file mode 100644 index 00000000..08cbfba5 --- /dev/null +++ b/luci-app-wolplus/root/usr/share/rpcd/acl.d/luci-app-services-wolplus.json @@ -0,0 +1,11 @@ +{ + "luci-app-services-wolplus": { + "description": "Grant UCI access for luci-app-services-wolplus", + "read": { + "uci": [ "wolplus" ] + }, + "write": { + "uci": [ "wolplus" ] + } + } +} diff --git a/luci-theme-argon b/luci-theme-argon deleted file mode 160000 index cbad1c9f..00000000 --- a/luci-theme-argon +++ /dev/null @@ -1 +0,0 @@ -Subproject commit cbad1c9f998401d7cc4664690c3f23e80d2c1ac2 diff --git a/luci-theme-argon/.github/workflows/manual_release.yml b/luci-theme-argon/.github/workflows/manual_release.yml new file mode 100644 index 00000000..514ba17e --- /dev/null +++ b/luci-theme-argon/.github/workflows/manual_release.yml @@ -0,0 +1,140 @@ +# +# Copyright (c) 2022-2023 SMALLPROGRAM +# Description: Auto compile +# + +# +# Fork and compile the latest version yourself using Github Actions +# 1.Into the repository of your own fork +# 2.Into the repository [Settings] +# 3.[Code and automation - Actions] ↓ [General] → [Workflow permissions] ↓ Check the [Read and write permissions] and [Save] +# 4.Let's take [Actions] +# + +name: "Auto compile with OpenWrt SDK" +on: + repository_dispatch: + workflow_dispatch: + inputs: + ssh: + description: 'SSH connection to Actions' + required: false + default: 'false' + push: + branches: + - '18.06' + paths: + - 'luci-theme-argon/Makefile' +env: + TZ: Asia/Shanghai + +jobs: + job_check: + if: github.repository == ${{ github.repository }} + name: Check Version + runs-on: ubuntu-latest + outputs: + argon_version: ${{ steps.check_version.outputs.latest_version }} + has_update: ${{ steps.check_version.outputs.has_update }} + steps: + - name: Checkout + uses: actions/checkout@main + with: + fetch-depth: 0 + ref: '18.06' + + - name: Check version + id: check_version + env: + url_release: https://api.github.com/repos/${{ github.repository }}/releases/latest + run: | + latest_version=$(grep -oP 'PKG_VERSION:=\K.*' Makefile | sed 's/^/v/') + latest_release=$(wget -qO- -t1 -T2 ${{env.url_release}} | awk -F '"' '/tag_name/{print $4}') + has_update=$([ "${latest_version}" != "${latest_release}" ] && echo true || echo false) + echo "latest_version=${latest_version}" >> $GITHUB_OUTPUT + echo "has_update=${has_update}" >> $GITHUB_OUTPUT + echo "latest_version: ${latest_version}" + echo "latest_release: ${latest_release}" + echo "has_update: ${has_update}" + + - name: Generate new tag & release + if: steps.check_version.outputs.has_update == 'true' + uses: softprops/action-gh-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + name: For Lean's LEDE 18.06 LuCI + tag_name: ${{steps.check_version.outputs.latest_version}} + + job_build_argon: + name: Build Argon (18.06) + needs: job_check + if: needs.job_check.outputs.has_update == 'true' + runs-on: ubuntu-latest + steps: + - name: Install packages + run: | + echo "Install packages" + sudo -E apt-get -qq update + sudo -E apt-get -qq install build-essential clang flex bison g++ gawk gcc-multilib g++-multilib gettext git libncurses5-dev libssl-dev python3-distutils rsync unzip zlib1g-dev file wget + sudo -E apt-get -qq autoremove --purge + sudo -E apt-get -qq clean + + - name: Cache openwrt SDK + id: cache-sdk + uses: actions/cache@v3 + with: + path: sdk + key: openwrt-sdk-21.02-x86-64 + + - name: Initialization environment + if: steps.cache-sdk.outputs.cache-hit != 'true' + env: + url_sdk: https://archive.openwrt.org/releases/21.02.5/targets/x86/64/openwrt-sdk-21.02.5-x86-64_gcc-8.4.0_musl.Linux-x86_64.tar.xz + run: | + wget ${{ env.url_sdk }} + file_name=$(echo ${{env.url_sdk}} | awk -F/ '{print $NF}') + mkdir sdk && tar -xJf $file_name -C ./sdk --strip-components=1 + cd sdk + echo "src-git base https://github.com/openwrt/openwrt.git;openwrt-21.02" > feeds.conf + echo "src-git-full packages https://github.com/openwrt/packages.git;openwrt-21.02" >> feeds.conf + echo "src-git-full luci https://git.openwrt.org/project/luci.git;openwrt-18.06" >> feeds.conf + echo "src-git-full routing https://git.openwrt.org/feed/routing.git;openwrt-21.02" >> feeds.conf + git clone -b 18.06 https://github.com/${{ github.repository }}.git package/downloads/luci-theme-argon + ./scripts/feeds update -a + echo "CONFIG_PACKAGE_luci-theme-argon=m" > .config + ./scripts/feeds install -d n luci-theme-argon + make download -j8 + + - name: Configure Argon (18.06) + run: | + cd sdk + ./scripts/feeds install luci-theme-argon + echo "CONFIG_ALL_NONSHARED=n" > .config + echo "CONFIG_ALL_KMODS=n" >> .config + echo "CONFIG_ALL=n" >> .config + echo "CONFIG_AUTOREMOVE=n" >> .config + echo "CONFIG_LUCI_LANG_zh_Hans=y" >> .config + echo "CONFIG_PACKAGE_luci-theme-argon=m" >> .config + make defconfig + + - name: Compile Argon (18.06) + id: compile + run: | + cd sdk + echo "make package/luci-theme-argon/{clean,compile} -j$(nproc)" + make package/luci-theme-argon/{clean,compile} -j$(nproc) + mv bin/packages/x86_64/base/ ../ + rm .config .config.old + cd .. + echo "status=success" >> $GITHUB_OUTPUT + echo "FIRMWARE=$PWD" >> $GITHUB_ENV + + - name: Upload Argon (18.06) ipks to release + uses: softprops/action-gh-release@v1 + if: steps.compile.outputs.status == 'success' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{needs.job_check.outputs.argon_version}} + files: ${{ env.FIRMWARE }}/base/luci-theme*.ipk diff --git a/luci-theme-argon/.gitignore b/luci-theme-argon/.gitignore new file mode 100644 index 00000000..e1e0fe55 --- /dev/null +++ b/luci-theme-argon/.gitignore @@ -0,0 +1,3 @@ + +README_ZH.md +README.md diff --git a/luci-theme-argon/Makefile b/luci-theme-argon/Makefile new file mode 100644 index 00000000..6bb5b580 --- /dev/null +++ b/luci-theme-argon/Makefile @@ -0,0 +1,27 @@ +# +# Copyright (C) 2008-2019 Jerrykuku +# +# This is free software, licensed under the Apache License, Version 2.0 . +# + +include $(TOPDIR)/rules.mk + +LUCI_TITLE:=Argon Theme +LUCI_DEPENDS:=+curl +jsonfilter +PKG_VERSION:=1.8.3 +PKG_RELEASE:=20230710 + +include $(TOPDIR)/feeds/luci/luci.mk + + +define Package/luci-theme-argon/postinst +#!/bin/sh +sed -i ":a;$!N;s/tmpl.render.*sysauth_template.*return/local scope = { duser = default_user, fuser = user }\nlocal ok, res = luci.util.copcall\(luci.template.render_string, [[<% include\(\"themes\/\" .. theme .. \"\/sysauth\"\) %>]], scope\)\nif ok then\nreturn res\nend\nreturn luci.template.render\(\"sysauth\", scope\)/;ba" /usr/lib/lua/luci/dispatcher.lua +sed -i ":a;$!N;s/t.render.*sysauth_template.*return/local scope = { duser = h, fuser = a }\nlocal ok, res = luci.util.copcall\(luci.template.render_string, [[<% include\(\"themes\/\" .. theme .. \"\/sysauth\"\) %>]], scope\)\nif ok then\nreturn res\nend\nreturn luci.template.render\(\"sysauth\", scope\)/;ba" /usr/lib/lua/luci/dispatcher.lua +[ -f /usr/lib/lua/luci/view/themes/argon/out_header_login.htm ] && mv -f /usr/lib/lua/luci/view/themes/argon/out_header_login.htm /usr/lib/lua/luci/view/header_login.htm +rm -Rf /var/luci-modulecache +rm -Rf /var/luci-indexcache +exit 0 +endef + +# call BuildPackage - OpenWrt buildroot signature diff --git a/luci-theme-argon/Screenshots/screenshot_pc.jpg b/luci-theme-argon/Screenshots/screenshot_pc.jpg new file mode 100644 index 00000000..4c355449 Binary files /dev/null and b/luci-theme-argon/Screenshots/screenshot_pc.jpg differ diff --git a/luci-theme-argon/Screenshots/screenshot_phone.jpg b/luci-theme-argon/Screenshots/screenshot_phone.jpg new file mode 100644 index 00000000..8237a036 Binary files /dev/null and b/luci-theme-argon/Screenshots/screenshot_phone.jpg differ diff --git a/luci-theme-argon/htdocs/luci-static/argon/css/cascade.css b/luci-theme-argon/htdocs/luci-static/argon/css/cascade.css new file mode 100644 index 00000000..c289aaee --- /dev/null +++ b/luci-theme-argon/htdocs/luci-static/argon/css/cascade.css @@ -0,0 +1,3361 @@ +/** + * Argon is a clean HTML5 theme for LuCI. It is based on luci-theme-material and Argon Template + * + * luci-theme-argon + * Copyright 2020 Jerryk + * + * Have a bug? Please create an issue here on GitHub! + * https://github.com/jerrykuku/luci-theme-argon/issues + * + * luci-theme-bootstrap: + * Copyright 2008 Steven Barth + * Copyright 2008 Jo-Philipp Wich + * Copyright 2012 David Menting + * + * MUI: + * https://github.com/muicss/mui + * + * luci-theme-material: + * https://github.com/LuttyYang/luci-theme-material/ + * + * Argon Theme + * https://demos.creative-tim.com/argon-dashboard/index.html + * + * Login background + * https://unsplash.com/ + * + * Licensed to the public under the Apache License 2.0 + */ +/* + * Font generate by Icomoon + */ +/* + * Common Styles + */ +@import url("fonts.css?v=3"); +@import url("pure-min.css?v=1"); +:root { + /** general **/ + --primary: #5e72e4; + --dark-primary: #483d8b; + --background-color: #f4f5f7; + --font-color: #525f7f; + /** login form **/ + --login-form-background-color: #ffffff; + --darker: black; + --default: #525461; + --warning: #fb6340; + --footer-color: #aaa; + --menubar-background: #fff; + --menubar-scrollbar-thumb: #eee; + --menubar-text-color: #4c4c4c; + --blue: #5e72e4; + --indigo: #5603ad; + --purple: #8965e0; + --pink: #f3a4b5; + --red: #f5365c; + --orange: #fb6340; + --yellow: #ffd600; + --green: #2dce89; + --teal: #11cdef; + --cyan: #2bffc6; + --white: #fff; + --gray: #8898aa; + --gray-dark: #32325d; + --light: #ced4da; + --lighter: #e9ecef; + --secondary: #f7fafc; + --success: #2dce89; + --info: #11cdef; + --danger: #f5365c; + --light: #adb5bd; + --dark: #212529; + --neutral: #fff; + --login-form-bg-color: rgba(244, 245, 247, 0.8); + --blur-radius: 10px; + --blur-opacity: 0.5; + --blur-radius-dark: 10px; + --blur-opacity-dark: 0.5; + --font-family-sans-serif: "Google Sans", "Microsoft Yahei", "WenQuanYi Micro Hei", "sans-serif", "Helvetica Neue", "Helvetica", "Hiragino Sans GB"; + --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace; + --font-family-normal: Open Sans, PingFangSC-Regular, Microsoft Yahei, WenQuanYi Micro Hei, "Helvetica Neue", Helvetica, Hiragino Sans GB, sans-serif; +} +[data-theme="dark"] { + --primary: #483d8b; + --dark-primary: #483d8b; + --background-color: #1e1e1e; + --font-color: #cccccc; + --darker: black; + --default: #525461; + --warning: #fb6340; + --footer-color: #aaa; + --menubar-background: #fff; + --menubar-scrollbar-thumb: #f6f9fc; + --menubar-text-color: #4c4c4c; + --blue: #5e72e4; + --indigo: #5603ad; + --purple: #8965e0; + --pink: #f3a4b5; + --red: #f5365c; + --orange: #fb6340; + --yellow: #ffd600; + --green: #2dce89; + --teal: #11cdef; + --cyan: #2bffc6; + --white: #fff; + --gray: #8898aa; + --gray-dark: #32325d; + --light: #ced4da; + --lighter: #e9ecef; + --secondary: #f7fafc; + --success: #2dce89; + --info: #11cdef; + --danger: #f5365c; + --light: #adb5bd; + --dark: #212529; + --neutral: #fff; + --login-form-bg-color: rgba(244, 245, 247, 0.8); + --blur-radius: 10px; + --blur-opacity: 0.5; + --blur-radius-dark: 10px; + --blur-opacity-dark: 0.5; + --font-family-sans-serif: "Google Sans", "Microsoft Yahei", "WenQuanYi Micro Hei", "sans-serif", "Helvetica Neue", "Helvetica", "Hiragino Sans GB"; + --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace; + --font-family-normal: Open Sans, PingFangSC-Regular, Microsoft Yahei, WenQuanYi Micro Hei, "Helvetica Neue", Helvetica, Hiragino Sans GB, sans-serif; +} +html, +body { + margin: 0px; + padding: 0px; + height: 100%; + font-size: 16px; + font-family: "Google Sans", "Microsoft Yahei", "WenQuanYi Micro Hei", "sans-serif", "Helvetica Neue", "Helvetica", "Hiragino Sans GB"; + font-family: var(--font-family-sans-serif); +} +html { + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +body { + font-size: 0.875rem; + background-color: #f4f5f7; + background-color: var(--background-color); + color: #525f7f; + color: var(--font-color); +} +* { + margin: 0; + padding: 0; + box-sizing: border-box; + -webkit-tap-highlight-color: transparent; +} +::selection { + background-color: #5e72e4; + background-color: var(--primary); + color: #ffffff; + color: var(--white); +} +::-webkit-scrollbar { + width: 10px; + height: 10px; +} +::-webkit-scrollbar, +::-webkit-scrollbar-corner { + background: transparent; +} +::-webkit-scrollbar-thumb { + background: #9e9e9e; +} +::-webkit-scrollbar-thumb:hover { + background: #757575; +} +::-webkit-scrollbar-thumb:active { + background: #424242; +} +a:link, +a:visited, +a:active { + color: var(--primary); + text-decoration: none; +} +a:-webkit-any-link:not(li a, .main-left a, .brand, .pull-right a, .alert-message a, .login-container footer a, .cbi-button) { + color: -webkit-link; + cursor: pointer; + color: var(--primary); + text-shadow: 1px 1px 2px #ccc; +} +a:hover { + text-decoration: underline; +} +li { + list-style-type: none; +} +@-webkit-keyframes sparkle { + from { + background-position: 0 0; + } + to { + background-position: 0 -64px; + } +} +@-moz-keyframes sparkle { + from { + background-position: 0 0; + } + to { + background-position: 0 -64px; + } +} +@-o-keyframes sparkle { + from { + background-position: 0 0; + } + to { + background-position: 0 -64px; + } +} +@keyframes sparkle { + from { + background-position: 0 0; + } + to { + background-position: 0 -64px; + } +} +/*********************** +* +* Login Page +* +***************************/ +.login-container { + margin: auto; + height: 500px!important; + min-height: 500px!important; + left: 0; + right: 0; + bottom: 0; + margin-left: auto!important; + border-radius: 10px; +} +.login-form { + background-color: rgba(255, 255, 255, 0)!important; + border-radius: 10px; +} +.login-form .brand { + margin: 20px auto 20px 108px!important; +} +.input-group { + margin-bottom: 1rem!important; +} +.input-group input { + margin-bottom: 0!important; +} +.ftc { + bottom: 0!important; +} +.login-page { + height: 100%; +} +.login-page .video { + position: absolute; + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + background-color: #000; + background-color: var(--darker); + overflow: hidden; +} +.login-page .video video { + width: 100%; + height: 100%; + object-fit: cover; +} +.login-page .volume-control { + position: fixed; + right: 1rem; + top: 1rem; + width: 1.5rem; + height: 1.5rem; + z-index: 5000; + cursor: pointer; + background-size: contain; + background-image: url(../img/volume_high.svg); +} +.login-page .volume-control.mute { + background-image: url(../img/volume_off.svg); +} +.login-page .main-bg { + position: fixed; + width: 100%; + height: 100%; + left: 0; + top: 0; + background-image: url(../img/blank.png); + background-repeat: no-repeat; + background-position: center; + background-size: cover; + transition: all 0.5s; +} +.login-page .login-container { + height: 100%; + margin-left: 4.5rem; + position: absolute; + top: 0px; + display: flex; + flex-direction: column; + -webkit-box-pack: center; + justify-content: center; + align-items: flex-start; + min-height: 100%; + z-index: 2; + width: 420px; + box-shadow: rgba(0, 0, 0, 0.75) 0px 0px 35px -5px; + margin-left: 5%; + background: transparent; +} +.login-page .login-container .login-form { + display: flex; + flex-direction: column; + -webkit-box-align: center; + align-items: center; + position: absolute; + top: 0px; + width: 100%; + min-height: 100%; + max-width: 420px; + background-color: #fff; + background-color: var(--white); + overflow:hidden; +} +.login-page .login-container .login-form .brand { + display: flex; + -webkit-box-align: center; + align-items: center; + margin: 50px auto 15px auto; + color: #525461; + color: var(--default); +} +.login-page .login-container .login-form .brand .icon { + width: 50px; + height: auto; +} +.login-page .login-container .login-form .brand-text { + font-size: 1.8rem; + font-weight: 700; + letter-spacing: 1px; + margin-bottom: auto; + font-family: "TypoGraphica"; + width: 420px; + padding: 0 0.5rem 0.1rem 0.5rem; + text-align: center; + word-break: break-word; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; +} +.login-page .login-container .login-form .brand:hover { + text-decoration: none; +} +.login-page .login-container .login-form .form-login { + width: 420px; + padding: 20px 50px; + box-sizing: border-box; +} +.login-page .login-container .login-form .form-login .errorbox { + text-align: center; + color: #fb6340; + color: var(--warning); +} +.login-page .login-container .login-form .form-login .input-group { + margin-bottom: 1.25rem; + position: relative; +} +.login-page .login-container .login-form .form-login .input-group::before { + font-family: 'argon' !important; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + color: #525461; + color: var(--default); + font-size: 1.5rem; + position: absolute; + z-index: 100; + left: 10px; + top: 10px; +} +.login-page .login-container .login-form .form-login .input-group .border { + position: absolute; + width: 100%; + height: 1px; + bottom: 0; + border-bottom: 1px #5e72e4 solid; + border-bottom: 1px var(--primary) solid; + transform: scaleX(0); + transition: transform 0.3s; +} +.login-page .login-container .login-form .form-login .input-group input { + font-size: 1rem; + line-height: 1.5em; + display: block; + width: 100%; + padding: 0.5rem 0.75rem 0.5rem 3rem; + margin: 0.825rem 0; + box-sizing: border-box; + transition: all 0.3s cubic-bezier(0.68, -0.55, 0.265, 1.55); + color: #525461; + color: var(--default); + border: 0; + border-radius: 0; + border-bottom: 1px solid #fff; + border-bottom: 1px solid var(--white); + background-color: transparent; + background-clip: padding-box; + box-shadow: 0 3px 2px rgba(233, 236, 239, 0.05); + outline: none; +} +.login-page .login-container .login-form .form-login .input-group input:focus + .border { + transform: scaleX(1); +} +.login-page .login-container .login-form .form-login .input-group .cbi-input-password { + margin-bottom: 2rem; + position: relative; +} +.login-page .login-container .login-form .form-login .user-icon::before { + content: "\e971"; +} +.login-page .login-container .login-form .form-login .pass-icon::before { + content: "\e910"; +} +.login-page .login-container .login-form .cbi-button-apply { + width: 100% !important; + box-shadow: rgba(0, 0, 0, 0.1) 0px 0px 50px 0px; + font-weight: 600; + font-size: 15px; + color: #fff; + color: var(--white); + text-align: center; + width: 100%; + cursor: pointer; + min-height: 50px; + background-color: #5e72e4 !important; + background-color: var(--primary) !important; + border-radius: 6px; + outline: none; + border-width: initial; + border-style: none; + border-color: initial; + border-image: initial; + padding: 10px 0px; + margin: 30px 0px 100px; + transition: all 0.3s !important; + letter-spacing: 0.8rem; +} +.login-page .login-container .login-form .cbi-button-apply:hover, +.login-page .login-container .login-form .cbi-button-apply :focus { + opacity: 0.9; +} +.login-page .login-container footer { + box-sizing: border-box; + width: 100%; + text-align: center; + line-height: 1.6rem; + display: flex; + justify-content: space-evenly; + margin-top: auto; + padding: 0px 0px 30px; + z-index: 10; + color: #525461; + color: var(--default); + position: absolute; + bottom: 0; +} +.login-page .login-container footer, +.login-page .login-container footer a { + color: var(--default); +} +.login-page .login-container footer .ftc { + position: absolute; + bottom: 30px; + width: 100%; +} +.login-page .login-container footer .luci-link { + display: block; +} +.pull-right { + float: right; +} +.pull-left { + float: left; +} +@supports (-webkit-backdrop-filter: none) or (backdrop-filter: none) { + .login-page .login-container .login-form { + -webkit-backdrop-filter: blur(var(--blur-radius)); + backdrop-filter: blur(var(--blur-radius)); + background-color: rgba(244, 245, 247, var(--blur-opacity)); + } +} +/*********************** +* +* Header +* +***************************/ +header { + width: 100%; + padding: 0 0 0 0; + position: relative; +} +header .container { + margin-top: rem; + padding: 0.5rem 1rem 0 1rem; +} +header .container .pull-right > * { + position: relative; + top: 0.45rem; + cursor: pointer; +} +header::after { + content: ""; + position: absolute; + height: 2rem; + width: 100%; + background-color: #5e72e4 !important; + background-color: var(--primary) !important; +} +header.bg-primary { + background-color: #5e72e4 !important; + background-color: var(--primary) !important; +} +header .fill { + padding: 0.8rem 0; + border-bottom: 0px solid rgba(255, 255, 255, 0.08) !important; +} +header .fill .container { + height: 2rem; + padding: 0 1.25rem; +} +header .fill .container .brand { + font-size: 1.5rem; + color: #fff; + color: var(--white); + font-family: "TypoGraphica"; + text-decoration: none; + padding-left: 1rem; + cursor: default; + vertical-align: text-bottom; + display: none; +} +/*********************** +* +* Footer +* +***************************/ +footer { + text-align: right; + padding: 1rem; + font-size: 0.8rem; +} +footer a { + text-decoration: none; +} +/*********************** +* +* Main +* +***************************/ +@keyframes anim-rotate { + 0% { + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + } + 100% { + -webkit-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } +} +.main { + top: 0rem; + bottom: 0rem; + position: relative; + height: 100%; + width: 100%; + height: calc(100% - 4rem); +} +.main .main-left { + float: left; + width: 15%; + width: calc(0% + 15rem); + height: 100%; + background-color: #fff !important; + background-color: var(--menubar-background) !important; + box-shadow: rgba(0, 0, 0, 0.75) 0px 0px 15px -5px; + overflow-x: auto; + position: fixed; + z-index: 100; + transition: width 0.2s ease-in-out; + overflow-y: scroll; +} +.main .main-left::-webkit-scrollbar { + width: 5px; + height: 1px; +} +.main .main-left::-webkit-scrollbar-thumb { + background-color: #f6f9fc; + background-color: var(--menubar-scrollbar-thumb); +} +.main .main-left::-webkit-scrollbar-track { + background-color: transparent; +} +.main .main-left .sidenav-header { + padding: 1.5rem; + text-align: center; +} +.main .main-left .sidenav-header .brand { + font-size: 1.8rem; + color: #5e72e4; + color: var(--primary); + font-family: "TypoGraphica", sans-serif; + text-decoration: none; + padding-left: 0; + cursor: default; + vertical-align: text-bottom; + white-space: nowrap; +} +.main .main-left .nav { + margin-top: 0.5rem; +} +.main .main-left .nav li { + padding: 0rem; + cursor: pointer; +} +.main .main-left .nav li a { + color: #525f7f; + color: var(--default); + display: block; +} +.main .main-left .nav li:nth-last-child(1) { + font-size: 1.2rem; +} +.main .main-left .nav li:nth-last-child(1) .menu:after { + content: ""; +} +.main .main-left .nav li.slide { + padding: 0; +} +.main .main-left .nav li.slide ul { + display: none; +} +.main .main-left .nav li.slide ul li a { + position: relative; + margin: 0.1rem 1rem 0.1rem 3rem; + padding: 0.5rem 0rem 0.5rem 0; + text-decoration: none; + white-space: nowrap; + color: #4c4c4c; + color: var(--menubar-text-color); + transition: all 0.2s; + font-size: 0.875rem; +} +.main .main-left .nav li.slide ul li a::after { + content: ""; + position: absolute; + width: 00%; + height: 2px; + left: 0; + bottom: 0; + background-color: #5e72e4; + background-color: var(--primary); + transition: all 0.2s; +} +.main .main-left .nav li.slide ul li a:hover::after { + color: #000; + color: var(--darker); + width: 100%; +} +.main .main-left .nav li.slide .menu { + display: block; + margin: 0.1rem 0.5rem 0.1rem 0.5rem; + padding: 0.675rem 0 0.675rem 2.5rem; + border-radius: 0.375rem; + text-decoration: none; + cursor: default; + font-size: 1rem; + transition: all 0.2s; + position: relative; +} +.main .main-left .nav li.slide .menu::before { + font-family: 'argon' !important; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + position: absolute; + left: 0.8rem; + content: "\e915"; + color: #5e72e4; + color: var(--primary); +} +.main .main-left .nav li.slide .menu::after { + position: absolute; + right: 0.5rem; + top: 0.8rem; + font-family: 'argon' !important; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + /* Better Font Rendering =========== */ + -moz-osx-font-smoothing: grayscale; + content: '\e90f'; + transition: all 0.15s ease; + color: #ced4da; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + transition: all 0.3s; +} +.main .main-left .nav li.slide .menu:hover, +.main .main-left .nav li.slide .menu.active { + cursor: pointer; + color: #fff; + background: #5e72e4; + background: var(--primary); + box-shadow: 0 0 1px #ccc; +} +.main .main-left .nav li.slide .menu:hover a, +.main .main-left .nav li.slide .menu.active a { + color: #000; +} +.main .main-left .nav li.slide .menu:hover a::after, +.main .main-left .nav li.slide .menu.active a::after { + color: #000; + width: 100%; +} +.main .main-left .nav li.slide .menu:hover::before, +.main .main-left .nav li.slide .menu.active::before { + color: #fff !important; +} +.main .main-left .nav li.slide .menu:hover::after, +.main .main-left .nav li.slide .menu.active::after { + color: #fff; +} +.main .main-left .nav li.slide .menu.active::after { + transform: rotate(90deg); +} +.main .main-left .nav li.slide .menu[data-title=Status]:before { + content: "\e906"; + color: #5e72e4; + color: var(--primary); +} +.main .main-left .nav li.slide .menu[data-title=System]:before { + content: "\e90a"; + color: #fb6340; +} +.main .main-left .nav li.slide .menu[data-title=Services]:before { + content: "\e909"; + color: #11cdef; +} +.main .main-left .nav li.slide .menu[data-title=NAS]:before { + content: "\e90c"; + color: #f3a4b5; +} +.main .main-left .nav li.slide .menu[data-title=VPN]:before { + content: "\e90b"; + color: #aaad03; +} +.main .main-left .nav li.slide .menu[data-title=Network]:before { + content: "\e908"; + color: #8965e0; +} +.main .main-left .nav li.slide .menu[data-title=Bandwidth_Monitor]:before { + content: "\e90d"; + color: #2dce89; +} +.main .main-left .nav li.slide .menu[data-title=Docker]:before { + content: "\e911"; + color: #6699ff; +} +.main .main-left .nav li.slide .menu[data-title=Statistics]:before { + content: "\e913"; + color: #5603ad; +} +.main .main-left .nav li.slide .menu[data-title=Control]:before { + content: "\e912"; + color: #5e72e4; + color: var(--primary); +} +.main .main-left .nav li.slide .menu[data-title=Asterisk]:before { + content: "\e914"; + color: #fb6340; +} +.main .main-left .nav li.slide .menu[data-title=Logout]:before { + content: "\e907"; + color: #adb5bd; +} +.main .main-left .nav li.slide .slide-menu li a { + position: relative; + margin: 0.1rem 1rem 0.1rem 3rem; + padding: 0.5rem 0rem 0.5rem 0; + text-decoration: none; + white-space: nowrap; + color: rgba(0, 0, 0, 0.6); + transition: all 0.2s; + font-size: 0.875rem; +} +.main .main-left .nav li.slide .slide-menu li a::after { + content: ""; + position: absolute; + width: 00%; + height: 2px; + left: 0; + bottom: 0; + background-color: #5e72e4; + background-color: var(--primary); + transition: all 0.2s; + box-shadow: 0 0 1px #ccc; +} +.main .main-left .nav li.slide .slide-menu li a:hover::after { + color: #000; + width: 100%; +} +.main .main-left .nav li.slide .slide-menu .active a { + color: #000; +} +.main .main-left .nav li.slide .slide-menu .active a::after { + color: #000; + width: 100%; +} +.main .main-left .nav li.slide:last-child > .menu::after { + content: ""; +} +.main .main-right { + width: 85%; + width: calc(100% - 15rem); + float: right; + height: auto; + transition: width 0.3s ease-in-out; +} +.main .main-right #maincontent { + position: relative; + z-index: 50; +} +.main .main-right #maincontent .container { + margin: 0 1.25rem 1rem 1.25rem; +} +.main .main-right #maincontent .container p { + color: #32325d; + line-height: 1.5em; +} +.main .main-right #maincontent .container > div:nth-child(1).alert-message.warning > a { + font: inherit; + overflow: visible; + text-transform: none; + display: inline-block; + margin-bottom: 0; + font-weight: 400; + text-align: center; + white-space: nowrap; + vertical-align: middle; + touch-action: manipulation; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-image: none; + min-width: 6rem; + padding: 0.5rem 1rem; + font-size: 0.9rem; + line-height: 1.42857143; + color: #fff; + background-color: #5bc0de; + border-color: #46b8da; + margin-top: 2rem; + text-decoration: inherit; +} +.main .loading { + position: fixed; + width: 100%; + height: 100%; + z-index: 2000; + display: flex; + align-items: center; + justify-content: center; + background-color: #f8f9fe; + top: 0; +} +.main .loading span { + display: block; + text-align: center; + margin-top: 2rem; + color: #5e72e4; + color: var(--primary); + font-size: 2rem; +} +.main .loading span .loading-img { + animation: anim-rotate 2s infinite linear; + margin-right: 0.4rem; + display: inline-block; +} +.main .loading span .loading-img::before { + content: "\e603"; +} +/* button style */ +.cbi-button { + -webkit-appearance: none; + text-transform: uppercase; + height: auto; + color: rgba(0, 0, 0, 0.87); + background-color: #F0F0F0; + transition: all 0.2s ease-in-out; + display: inline-block; + padding: 0.75rem 0.8rem; + border: none; + border-radius: 0.2rem; + cursor: pointer; + -ms-touch-action: manipulation; + touch-action: manipulation; + background-image: none; + text-align: center; + vertical-align: middle; + white-space: nowrap; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + font-size: 0.875rem; + width: auto !important; + line-height: 1em; +} +.cbi-button:hover, +.cbi-button:focus, +.cbi-button:active { + outline: 0; + text-decoration: none; +} +.cbi-button:hover, +.cbi-button:focus { + box-shadow: 0 0px 2px rgba(0, 0, 0, 0.12), 0 2px 2px rgba(0, 0, 0, 0.2); +} +.cbi-button:active { + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.19), 0 5px 5px rgba(0, 0, 0, 0.23); +} +.cbi-button:disabled { + cursor: not-allowed; + pointer-events: none; + opacity: 0.6; + box-shadow: none; +} +.cbi-button-check { + margin-top: 0.25rem !important; +} +form.inline + form.inline, +.cbi-button + .cbi-button { + margin-left: 0rem; +} +.cbi-button-reset, +.cbi-input-remove { + color: #fff !important; + background-color: #f0ad4e !important; + border-color: #eea236 !important; +} +.cbi-input-find, +.cbi-input-save, +.cbi-button-add, +.cbi-button-save, +.cbi-button-find, +.cbi-input-reload, +.cbi-button-reload { + color: #fff !important; + background-color: #337ab7 !important; + border-color: #2e6da4 !important; +} +.cbi-value-field .cbi-input-apply, +.cbi-button-apply, +.cbi-button-edit { + color: #fff !important; + background-color: #5e72e4 !important; + background-color: var(--primary) !important; + border-color: #5e72e4 !important; + border-color: var(--primary) !important; +} +.node-services-vssr .ssr-button { + margin-left: 0.3rem; +} +.cbi-section-remove > .cbi-button, +.cbi-button-remove { + color: #fff !important; + background-color: #fb6340 !important; + border-color: #fb6340 !important; +} +.cbi-value-field .cbi-button-add, +.cbi-value-field .cbi-button-remove, +.cbi-value-field .cbi-button-neutral { + min-width: 2.5rem !important; +} +/* Replace LuCI's default file and folder type icons */ +img[src="/luci-static/resources/cbi/reload.gif"] { + content: url("/luci-static/argon/img/reload.webp"); +} +img[src="/luci-static/resources/cbi/file.gif"] { + content: url("/luci-static/argon/img/file.webp"); +} +img[src="/luci-static/resources/cbi/add.gif"] { + content: url("/luci-static/argon/img/add.webp"); +} +img[src="/luci-static/resources/cbi/remove.gif"] { + content: url("/luci-static/argon/img/remove.webp"); +} +img[src="/luci-static/resources/cbi/edit.gif"] { + content: url("/luci-static/argon/img/edit.webp"); +} +img[src="/luci-static/resources/cbi/fieldadd.gif"] { + content: url("/luci-static/argon/img/fieldadd.webp"); +} +img[src="/luci-static/resources/cbi/link.gif"] { + content: url("/luci-static/argon/img/link.webp"); +} +img[src="/luci-static/resources/cbi/find.gif"] { + content: url("/luci-static/argon/img/find.webp"); +} +img[src="/luci-static/resources/cbi/folder.gif"] { + content: url("/luci-static/argon/img/folder.webp"); +} +/* input */ +.cbi-value input[type="password"], +.cbi-value input[type="text"] { + min-width: 15rem; +} +/* select */ +.cbi-value-field .cbi-dropdown { + min-width: 15rem; +} +select { + min-width: 20rem; + appearance: none; + -webkit-appearance: none; + background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNTY1MzQ4MDM3OTIyIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjI1ODMiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCI+PGRlZnM+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4qIHsgdGV4dC1zaGFkb3c6IHRyYW5zcGFyZW50IDBweCAwcHggMHB4LCByZ2JhKDAsIDAsIDAsIDAuNSkgMHB4IDBweCAwcHggIWltcG9ydGFudDsgfQo8L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMjAuNDggMjQ1Ljc2aDk4My4wNEw1MTIgNzc4LjI0eiIgcC1pZD0iMjU4NCIgZmlsbD0iIzcwNzA3MCI+PC9wYXRoPjwvc3ZnPg==') !important; + background-position: 96%; + background-size: 8px; + background-repeat: no-repeat; +} +.th[data-type="button"], +.td[data-type="button"], +.th[data-type="fvalue"], +.td[data-type="fvalue"] { + flex: 1 1 2em; + text-align: center; +} +/*textarea*/ +textarea { + border: 1px solid #dee2e6 !important; + outline: none; + min-height: 14rem !important; + padding: 0.8rem !important; + background-color: #fff; + font-family: var(--font-family-monospace) !important; + font-size: inherit; + color: black; + border-radius: 0.375rem !important; + vertical-align: middle; +} +.cbi-value .cbi-value-field textarea { + margin: 0.25rem; +} +/* change */ +.uci-change-list { + font-family: monospace; +} +.uci-change-list ins, +.uci-change-legend-label ins { + text-decoration: none; + border: 1px solid #00FF00; + background-color: #CCFFCC; + display: block; + padding: 2px; +} +.uci-change-list del, +.uci-change-legend-label del { + text-decoration: none; + border: 1px solid #FF0000; + background-color: #FFCCCC; + display: block; + font-style: normal; + padding: 2px; +} +.uci-change-list var, +.uci-change-legend-label var { + text-decoration: none; + border: 1px solid #CCCCCC; + background-color: #EEEEEE; + display: block; + font-style: normal; + padding: 2px; +} +.uci-change-list var ins, +.uci-change-list var del { + border: none; + white-space: pre; + font-style: normal; + padding: 0px; +} +.uci-change-list ins strong { + display: inline; +} +.uci-change-legend { + padding: 5px; +} +.uci-change-legend-label { + display: flex; + align-items: center; + width: auto; + float: left; + margin-right: 2rem; +} +.uci-change-legend-label > ins, +.uci-change-legend-label > del, +.uci-change-legend-label > var { + float: left; + margin-right: 4px; + width: 10px; + height: 10px; + display: block; +} +.uci-change-legend-label var ins, +.uci-change-legend-label var del { + line-height: 0; + border: none; +} +.uci-change-list var, +.uci-change-list del, +.uci-change-list ins { + padding: 0.5rem; +} +/* other fix */ +input[type="checkbox"] { + appearance: none !important; + -webkit-appearance: none !important; + border: 1px solid #dee2e6; + width: 17px !important; + height: 17px !important; + padding: 0; + cursor: pointer; + transition: all 0.2s; + margin: 0.5rem 0.25rem 0.7rem 0.25rem; + vertical-align: middle; +} +input[type="checkbox"]:checked { + background-image: url('data:image/svg+xml,%3csvg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'0 0 8 8\'%3e%3cpath fill=\'%23fff\' d=\'M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z\'/%3e%3c/svg%3e') !important; + background-color: #5e72e4; + background-color: var(--primary); + background-size: 70%; + background-repeat: no-repeat; + background-position: center; +} +ul li .cbi-input-checkbox { + margin: 0.5rem 0.25rem 0.7rem 0.25rem !important; + vertical-align: middle !important; +} +.cbi-input-radio { + appearance: none !important; + -webkit-appearance: none !important; + border: 1px solid #dee2e6; + width: 16px !important; + height: 16px !important; + padding: 0; + border-radius: 50%; + cursor: pointer; + transition: all 0.2s; + margin: 0.25rem 0; +} +.cbi-input-radio:checked { + background-image: url('data:image/svg+xml,%3csvg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'-4 -4 8 8\'%3e%3ccircle r=\'3\' fill=\'%23fff\'/%3e%3c/svg%3e') !important; + background-color: #5e72e4; + background-color: var(--primary); + background-size: 70%; + background-repeat: no-repeat; + background-position: center; +} +.toggle { + position: relative; + display: block; + width: 40px; + height: 20px; + cursor: pointer; + -webkit-tap-highlight-color: transparent; + transform: translate3d(0, 0, 0); + margin: 1em 0; +} +.toggle:before { + content: ""; + position: relative; + top: 3px; + left: 3px; + width: 34px; + height: 14px; + display: block; + background: #9A9999; + border-radius: 8px; + transition: background 0.2s ease; +} +.toggle span { + position: absolute; + top: 0; + left: 0; + width: 20px; + height: 20px; + display: block; + background: white; + border-radius: 10px; + box-shadow: 0 3px 8px rgba(154, 153, 153, 0.5); + transition: all 0.2s ease; +} +.toggle span:before { + content: ""; + position: absolute; + display: block; + margin: -18px; + width: 56px; + height: 56px; + background: rgba(79, 46, 220, 0.5); + border-radius: 50%; + transform: scale(0); + opacity: 1; + pointer-events: none; +} +.cbi-input-checkbox:checked + .toggle:before { + background: #947ADA; +} +.cbi-input-checkbox:checked + .toggle span { + background: #4F2EDC; + transform: translateX(20px); + transition: all 0.2s cubic-bezier(0.8, 0.4, 0.3, 1.25), background 0.15s ease; + box-shadow: 0 3px 8px rgba(79, 46, 220, 0.2); +} +.cbi-input-checkbox:checked + .toggle span:before { + transform: scale(1); + opacity: 0; + transition: all 0.4s ease; +} +.cbi-value-field .cbi-input-checkbox, +.cbi-value-field .cbi-input-radio { + margin-top: 0.5rem; + height: 1rem; +} +.td .cbi-input-checkbox, +.td .cbi-input-radio { + margin-top: 0; +} +.cbi-value-field > input + .cbi-value-description { + padding: 0; +} +.cbi-value-field > ul > li { + display: flex; +} +.cbi-value-field > ul > li > label { + margin-top: 0rem; +} +.cbi-value-field > ul > li .ifacebadge { + background-color: #eee; + margin-left: 0.4rem; + margin-top: -0.5rem; +} +.cbi-section-table-row > .cbi-value-field .cbi-dropdown { + min-width: 7rem; +} +.cbi-section-create { + margin: 0; + padding-left: 0.5rem; + align-items: center; +} +.cbi-section-create > * { + margin: 0.25rem; +} +.cbi-section-remove { + padding: 0.5rem; +} +div.cbi-value var, +td.cbi-value-field var, +.td.cbi-value-field var { + font-style: italic; + color: var(--primary); + text-shadow: 1px 1px 2px #ccc; +} +small { + font-size: 90%; + white-space: normal; + line-height: 1.42857143; +} +.cbi-button-up, +.cbi-button-down { + display: inline-block; + min-width: 0; + padding: 0.2rem 0.6rem; + font-size: 1.2rem; + color: #5e72e4 !important; + color: var(--primary) !important; +} +.cbi-optionals { + padding: 1rem 1rem 0 1rem; + border-top: 1px solid #CCC; +} +.cbi-dropdown-container { + position: relative; +} +.cbi-tooltip-container { + cursor: help; +} +.cbi-tooltip { + position: absolute; + z-index: 1000; + left: -1000px; + opacity: 0; + transition: opacity 0.25s ease-out; + pointer-events: none; + box-shadow: 0 0 2px #444; +} +.cbi-tooltip-container:hover .cbi-tooltip { + left: auto; + opacity: 1; + transition: opacity 0.25s ease-in; +} +.cbi-map-descr + fieldset { + margin-top: 1rem; +} +.cbi-section > legend { + display: none !important; +} +/* Define the error text border breathe display animation */ +@keyframes error-border-breathe { + 0%{ + border-color: #fb6340; + } + 50%{ + border-color: transparent; + } + 100%{ + border-color: #fb6340; + } +} +/* Center display error text box */ +.cbi-section-error > ul{ + text-align: center; +} +/* Add border for error text box, and border breathe display animation to make it more noticeable */ +.cbi-section-error > ul > li { + font-weight: 600; + max-width: 60%; + color: #fb6340; + line-height: 1rem; + display: inline-block; + border: 2px solid #fb6340; + border-radius: 0.3rem; + animation: error-border-breathe 1.5s ease-in-out infinite; + padding-left: 4px; + padding-right: 4px; + padding-top: 2px; + padding-bottom: 2px; +} +.cbi-input-invalid, +.cbi-value-error input { + color: #fb6340; + border: 1px dashed #fb6340; +} +fieldset > fieldset { + margin: 0; + padding: 0; + border: none; + box-shadow: none; +} +.zonebadge .cbi-tooltip { + padding: 0.25rem; + background: inherit; + margin: -1.5rem 0 0 -0.5rem; +} +.zonebadge-empty { + background: repeating-linear-gradient(45deg, rgba(204, 204, 204, 0.5), rgba(204, 204, 204, 0.5) 5px, rgba(255, 255, 255, 0.5) 5px, rgba(255, 255, 255, 0.5) 10px); + color: #404040; +} +.zone-forwards { + display: flex; + min-width: 10rem; +} +.zone-forwards > * { + flex: 1 1 45%; +} +.zone-forwards > span { + flex-basis: 10%; + text-align: center; + padding: 0 0.25rem; +} +.zone-forwards .zone-src, +.zone-forwards .zone-dest { + display: flex; + flex-direction: column; +} +#diag-rc-output > pre { + background-color: #fff; + display: block; + padding: 8.5px; + margin: 0 0 18px; + line-height: 1.5rem; + white-space: pre-wrap; + word-wrap: break-word; + font-size: 1.4rem; + color: #404040; +} +input[name="ping"], +input[name="traceroute"], +input[name="nslookup"] { + width: 80%; +} +/* fix progress bar */ +#swaptotal > div, +#swapfree > div, +#memfree > div, +#membuff > div, +#conns > div, +#memtotal > div { + width: 100% !important; + height: 1.6rem !important; + line-height: 1.6rem; + border-radius: 0.25rem; + overflow: hidden; +} +#swaptotal > div > div, +#swapfree > div > div, +#memfree > div > div, +#membuff > div > div, +#conns > div > div, +#memtotal > div > div { + height: 100% !important; + background-color: #5e72e4 !important; + background-color: var(--primary) !important; + background-image: url(../img/trafficbar.png); + background-position: left top; + animation: sparkle 1000ms linear infinite; +} +#swaptotal > div > div > div > small, +#swapfree > div > div > div > small, +#memfree > div > div > div > small, +#membuff > div > div > div > small, +#conns > div > div > div > small, +#memtotal > div > div > div > small { + text-shadow: 1px 1px 2px #ccc; +} +/* fix multiple table */ +table table, +.table .table { + border: none; +} +.cbi-value-field table, +.cbi-value-field .table { + border: none; +} +td > table > tbody > tr > td, +.td > .table > .tbody > .tr > .td { + border: none; +} +.cbi-value-field > table > tbody > tr > td, +.cbi-value-field > .table > .tbody > .tr > .td { + border: none; +} +/* button style */ +.cbi-page-actions .cbi-button-apply, +.cbi-section-actions .cbi-button-edit, +.cbi-button-edit.important, +.cbi-button-apply.important, +.cbi-button-reload.important, +.cbi-button-action.important { + color: #fff; + background-color: #337ab7; +} +.cbi-page-actions .cbi-button-save, +.cbi-button-add.important, +.cbi-button-save.important, +.cbi-button-positive.important { + color: #fff; + background-color: #5bc0de; +} +.cbi-button-remove.important, +.cbi-button-reset.important, +.cbi-button-negative.important { + color: #fff; + background-color: #d9534f; +} +.cbi-button-find, +.cbi-button-link, +.cbi-button-neutral { + color: #fff !important; + border: 1px solid #f0ad4e !important; + background-color: #f0ad4e !important; +} +.cbi-button-edit, +.cbi-button-apply, +.cbi-button-reload, +.cbi-button-action { + color: #2e6da4; + border: 1px solid #2e6da4; + background-color: transparent; +} +.cbi-page-actions .cbi-button-apply + .cbi-button-save, +.cbi-button-add, +.cbi-button-save, +.cbi-button-positive { + color: #46b8da; + border: 1px solid #46b8da; + background-color: transparent; +} +.cbi-section-remove > .cbi-button, +.cbi-button-remove, +.cbi-button-reset, +.cbi-button-negative { + color: #fff !important; + border: 1px solid #d43f3a !important; + background-color: #fb6340 !important; +} +.cbi-page-actions .cbi-button-link:first-child { + float: left; +} +.a-to-btn { + text-decoration: none; +} +/* file selector button */ +::file-selector-button { + color: #fff; + border-radius: .25rem; + border: 1px solid #2e6da4; + padding: .4rem .5rem; + background-color: #337ab7; + box-sizing: border-box; + cursor: pointer; + transition: all 0.2s ease-in-out; +} +::file-selector-button:hover, +::file-selector-button:focus, +::file-selector-button:active { + outline: 0; + text-decoration: none; +} +::file-selector-button:hover, +::file-selector-button:focus { + box-shadow: 0 0px 2px rgba(0, 0, 0, 0.12), 0 2px 2px rgba(0, 0, 0, 0.2); +} +::file-selector-button:active { + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.19), 0 5px 5px rgba(0, 0, 0, 0.23); +} +/* table */ +.cbi-section-table .cbi-section-table-titles .cbi-section-table-cell { + width: auto !important; + background-color: #e9ecef; + background-color: var(--lighter); +} +.td.cbi-section-actions { + text-align: right; + vertical-align: middle; +} +.td.cbi-section-actions > * { + display: flex; +} +.td.cbi-section-actions > * > *, +.td.cbi-section-actions > * > form > * { + flex: 1 1 4em; + margin: 0 1px; +} +.td.cbi-section-actions > * > form { + display: inline-flex; + margin: 0; +} +/* desc */ +/* luci */ +.hidden { + display: none; +} +.left, +.left::before { + text-align: left !important; +} +.right, +.right::before { + text-align: right !important; +} +.center, +.center::before { + text-align: center !important; +} +.top { + align-self: flex-start !important; + vertical-align: top !important; +} +.bottom { + align-self: flex-end !important; + vertical-align: bottom !important; +} +.inline { + display: inline; +} +.cbi-page-actions { + border-top: 0px solid #eee; + padding-top: 0rem; + text-align: right; +} +#xhr_poll_status { + cursor: pointer; + display: inline-block; +} +#xhr_poll_status > .label.success { + background-color: #fff !important; + color: #32325d !important; +} +.label { + padding: 0.3rem 0.8rem; + font-size: 0.8rem; + font-weight: bold; + color: #ffffff !important; + text-transform: uppercase; + white-space: nowrap; + background-color: #bfbfbf; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + text-shadow: none; + text-decoration: none; +} +.notice { + background-color: #5BC0DE; +} +.showSide { + display: none; + color: #fff; + font-size: 1.4rem; +} +.darkMask { + width: 100%; + height: 100%; + position: fixed; + background-color: rgba(0, 0, 0, 0.56); + z-index: 99; + left: 0; + top: 0; + display: none; +} +#cbi-firewall-redirect table *, +#cbi-network-switch_vlan table *, +#cbi-firewall-zone table * { + font-size: small; +} +#cbi-firewall-redirect table input[type="text"], +#cbi-network-switch_vlan table input[type="text"], +#cbi-firewall-zone table input[type="text"] { + width: 5rem; +} +#cbi-firewall-redirect table select, +#cbi-network-switch_vlan table select, +#cbi-firewall-zone table select { + min-width: 3.5rem; +} +#cbi-network-switch_vlan .th, +#cbi-network-switch_vlan .td { + flex-basis: 12%; +} +/* Fix background color of table-titles */ +.cbi-section-node > .cbi-section-table > tbody > .cbi-section-table-titles th { + background-color: var(--lighter); + border: none; +} +/* Fix background color of table-descr */ +.cbi-section-node > .cbi-section-table > tbody > .cbi-section-table-descr th { + border: none; +} +/* Fix background color not change when the H tag is in the table rowstyle-1 */ +.cbi-section-node > .cbi-section-table > tbody > .cbi-rowstyle-1 th { + background-color: #fff; + border-top: 1px solid #ddd; + border-bottom: none; +} +/* Fix background color not change when the H tag is in the table rowstyle-2 */ +.cbi-section-node > .cbi-section-table > tbody > .cbi-rowstyle-2 th { + background-color: #f9f9f9; + border-top: 1px solid #ddd; + border-bottom: none; +} +/* Change the color of the H label in the table to make it more visible */ +th h1, td h1, +th h2, td h2, +th h3, td h3, +th h4, td h4, +th h5, td h5, +th h6, td h6 { + background: var(--lighter); +} +/* language fix */ +body.lang_pl.node-main-login .cbi-value-title { + width: 12rem; +} +/* applyreboot fix */ +#applyreboot-container { + margin: 2rem; +} +#applyreboot-section { + margin: 2rem; + line-height: 300%; +} +.table { + display: table; + position: relative; + color: #525f7f; + border-collapse: collapse; +} +.tr { + display: table-row; + border-bottom: 1px solid rgba(0, 0, 0, 0.05); +} +.thead { + display: table-header-group; +} +.tbody { + display: table-row-group; +} +.tfoot { + display: table-footer-group; +} +.td, +.th { + vertical-align: middle; + text-align: center; + display: table-cell; + padding: 1rem; + white-space: nowrap; +} +.th { + font-weight: bold; +} +.tr.placeholder { + height: 4em; +} +.tr.placeholder > .td { + position: absolute; + left: 0; + right: 0; + bottom: 0; + text-align: center; + background: inherit; +} +.table[width="33%"], +.th[width="33%"], +.td[width="33%"] { + width: 33%; + padding-left: 1.5rem; + padding-right: 1.5rem; +} +.table[width="100%"], +.th[width="100%"], +.td[width="100%"] { + width: 100%; +} +.table-titles .th { + padding: 0.75rem 1rem; + color: #8898aa; + background-color: #f6f9fc; +} +.col-1 { + flex: 1 1 30px !important; + -webkit-flex: 1 1 30px !important; +} +.col-2 { + flex: 2 2 60px !important; + -webkit-flex: 2 2 60px !important; +} +.col-3 { + flex: 3 3 90px !important; + -webkit-flex: 3 3 90px !important; +} +.col-4 { + flex: 4 4 120px !important; + -webkit-flex: 4 4 120px !important; +} +.col-5 { + flex: 5 5 150px !important; + -webkit-flex: 5 5 150px !important; +} +.col-6 { + flex: 6 6 180px !important; + -webkit-flex: 6 6 180px !important; +} +.col-7 { + flex: 7 7 210px !important; + -webkit-flex: 7 7 210px !important; +} +.col-8 { + flex: 8 8 240px !important; + -webkit-flex: 8 8 240px !important; +} +.col-9 { + flex: 9 9 270px !important; + -webkit-flex: 9 9 270px !important; +} +.col-10 { + flex: 10 10 300px !important; + -webkit-flex: 10 10 300px !important; + white-space: inherit; +} +.cbi-rowstyle-2 .cbi-button-up, +.cbi-rowstyle-2 .cbi-button-down { + background-color: var(--lighter); +} +.cbi-button-up, +.cbi-button-down, +.cbi-value-helpicon, +.showSide, +.main > .loading > span { + font-family: 'argon' !important; + font-style: normal !important; + font-weight: normal !important; + font-variant: normal !important; + text-transform: none !important; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.cbi-button-up { + transform: rotate(180deg); +} +select { + padding: 0.36rem 0.8rem; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; +} +select, +input { + font-size: 0.875rem; + transition: all 0.15s ease-in-out; + line-height: 1.5; + padding: 0.625rem 0.75rem; + color: #8898aa; + border: 1px solid #dee2e6; + border-radius: 0.25rem; + background-color: #fff; + background-clip: padding-box; + box-shadow: 0 3px 2px rgba(233, 236, 239, 0.05); + outline: none; + transition: box-shadow 0.15s ease; + margin: 0.25rem; +} +select:not([multiple="multiple"]):hover, +input:hover, +input:focus { + border-color: #5e72e4; + border-color: var(--primary); + outline: 0; + background-color: #fff; + box-shadow: 0 3px 9px rgba(50, 50, 9, 0), 3px 4px 8px rgba(94, 114, 228, 0.1); +} +select[multiple="multiple"] { + height: auto; +} +code { + color: #0099CC; +} +abbr { + color: #005470; + text-decoration: underline; + cursor: help; +} +hr { + margin: 1rem 0; + border-color: #EEE; + opacity: 0.1; +} +.kpi { + font-size: 0.875rem; +} +fieldset[id^="cbi-apply-"] { + position: fixed; + z-index: 200; + width: 20rem; + margin-left: -10rem; + margin-top: -5rem; + height: 10rem; + left: 50%; + top: 50%; + padding: 1rem; + box-sizing: border-box; + font-size: 1.2rem; + text-align: center; + box-shadow: rgba(0, 0, 0, 0.75) 0px 0px 15px -5px; + transition: all 0.3s; +} +[id^="cbi-apply-"] > .panel-title { + border-bottom: none; +} +[id^="cbi-apply-"] > [id^="cbi-apply-"] { + position: initial; + width: auto; + height: auto; + font-size: 0.875rem; + margin-left: 0rem; + margin-top: 0.8rem; + display: block; +} +.cbi-section > h3:first-child, +.panel-title { + font-size: 1.125rem; + width: 100%; + display: block; + margin: 0; + padding: 0.8755rem 1.5rem; + border-bottom: 1px solid #ddd; + letter-spacing: 0.1rem; + color: #32325d; + font-weight: normal; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} +table { + border-spacing: 0; + border-collapse: collapse; +} +table, +.table { + width: 100%; +} +table > tbody > tr > td, +table > tbody > tr > th, +table > tfoot > tr > td, +table > tfoot > tr > th, +table > thead > tr > td, +table > thead > tr > th, +.table > .tbody > .tr > .td, +.table > .tbody > .tr > .th, +.table > .tfoot > .tr > .td, +.table > .tfoot > .tr > .th, +.table > .thead > .tr > .td, +.table > .thead > .tr > .th { + padding: 0.5rem; + border-top: 1px solid #ddd; +} +.cbi-section-table-cell { + white-space: nowrap; + align-self: flex-end; + flex: 1 1 auto; +} +.cbi-section-table { + font-size: 0.875rem; + border: none; + margin: 0 !important; +} +.status-bar { + font-size: 0.875rem; +} +.cbi-section-table-row:last-child { + margin-bottom: 0; +} +.cbi-section-table-row > .cbi-value-field .cbi-dropdown, +.cbi-section-table-row > .cbi-value-field .cbi-input-select, +.cbi-section-table-row > .cbi-value-field .cbi-input-text, +.cbi-section-table-row > .cbi-value-field .cbi-input-password { + width: 100%; +} +.cbi-section-table-row > .cbi-value-field .cbi-input-text, +.cbi-section-table-row > .cbi-value-field .cbi-input-password { + min-width: 100px; +} +#lease6_status_table > tbody > .cbi-section-table-row.cbi-rowstyle-1 div, +#lease6_status_table > tbody > .cbi-section-table-row.cbi-rowstyle-2 div { + min-width: 100%; +} +.cbi-section-table-row > .cbi-value-field [data-dynlist] > input, +.cbi-section-table-row > .cbi-value-field input.cbi-input-password { + width: calc(100% - 1.5rem); +} +div > table > tbody > tr:nth-of-type(2n), +div > .table > .tbody > .tr:nth-of-type(2n) { + background-color: #f9f9f9; +} +div > table > tbody > tr:nth-of-type(2n), +div > .table > .tbody > .tr:nth-of-type(2n) { + background-color: #f9f9f9; +} +.danger { + background-color: #f5365c !important; + background-color: var(--danger) !important; + color: #fff !important; +} +/* Define the warning background-color breathe display animation */ +@keyframes warning-background-color-breathe { + 0%{ + color: #fff; + background-color: #fb6340; + } + 50%{ + color: #32325d; + background-color: #fff; + } + 100%{ + color: #fff; + background-color: #fb6340; + } +} +.warning, +.warning * { + background-color: #fb6340; + background-color: var(--warning); + color: #fff; + animation: warning-background-color-breathe 1.5s ease-in-out infinite !important; +} +.notice { + background-color: #5e72e4 !important; + background-color: var(--primary) !important; + color: #fff !important; +} +.success { + background-color: #2dce89 !important; + background-color: var(--success) !important; + color: #fff !important; +} +.errorbox, +.alert-message { + margin: 0 0 0 0; + padding: 1rem 2rem; + border: 0; + font-weight: normal; + font-style: normal; + line-height: 1.5em; + font-family: inherit; + min-width: inherit; + overflow: auto; + border-radius: 0.3rem; + background-color: #FFF; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0 2px 0 rgba(0, 0, 0, 0.12); +} +.errorbox { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236; +} +.alert-message.warning { + margin-bottom: 1rem; +} +.error { + color: red; +} +h1 { + font-size: 2rem; + padding-bottom: 10px; + border-bottom: 1px solid #eee; +} +h2 { + margin: 0 0 1rem 0; + font-size: 1.25rem; + letter-spacing: 0.1rem; + padding: 1rem 1.5rem; + color: #32325d; + border-radius: 0.375rem; + background: #fff; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.03); +} +#cbi-dropbear h2, +#cbi-dropbear .cbi-map-descr, +#cbi-dropbear .cbi-map-descr abbr, +#cbi-rc h2, +#cbi-rc .cbi-map-descr, +#cbi-distfeedconf h2, +#cbi-distfeedconf .cbi-map-descr, +#cbi-customfeedconf h2, +#cbi-customfeedconf .cbi-map-descr, +#cbi-download h2, +#cbi-filelist h2 { + color: #32325d !important; +} +h3 { + font-size: 1.15rem; + width: 100%; + display: block; + margin: 1rem 0; + color: #32325d; + font-weight: bold; + letter-spacing: 0.1rem; + padding: 1rem 1.5rem; + border-radius: 0.375rem; + background: var(--lighter); + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.03); +} +fieldset { + margin: 1.25rem 0 0 0; + padding: 0; + font-weight: normal; + font-style: normal; + line-height: 1; + font-family: inherit; + min-width: inherit; + overflow-x: auto; + overflow-y: hidden; + border: 1px solid rgba(0, 0, 0, 0.05); + border-radius: 0.375rem; + background-color: #fff; + box-shadow: 0 0 2rem 0 rgba(136, 152, 170, 0.15); + -webkit-overflow-scrolling: touch; +} +fieldset > legend { + display: none !important; +} +fieldset > fieldset { + margin: 0; + padding: 0; + border: none; + box-shadow: none; +} +fieldset.cbi-section p { + padding: 1em; +} +.panel-title { + width: 100%; + display: block; + margin-bottom: 0; + padding: 0.8755rem 1.5rem; + background-color: #fff; + border-bottom: 1px solid #ddd; + margin-bottom: 0rem; + letter-spacing: 0.1rem; + color: #32325d; + font-weight: 600; + position: sticky; + left: 0; +} +table { + border-spacing: 0; + border-collapse: collapse; + width: 100%; +} +table > tbody > tr > td, +table > tfoot > tr > td, +table > thead > tr > td { + font-size: 0.875rem; + color: #525f7f; + line-height: 1.4em; + vertical-align: middle !important; + padding: 0.8rem 1.5rem; + border-top: 1px solid #ddd; +} +table > tbody > tr > th, +table > tfoot > tr > th, +table > thead > tr > th { + padding-right: 1.5rem; + padding-left: 1.5rem; + color: #8898aa; + background-color: #f6f9fc; + font-size: 0.65rem; + padding-top: 0.75rem; + padding-bottom: 0.75rem; + letter-spacing: 1px; + border-bottom: 1px solid #e9ecef; +} +table > tbody > tr:first-child > td, +table > tfoot > tr:first-child > td, +table > thead > tr:first-child > td { + border-top: 0px; +} +.cbi-section-table-cell { + text-align: center; +} +.cbi-section-table-row { + text-align: center; +} +fieldset > table > tbody > tr:nth-of-type(2n) { + background-color: #f9f9f9; +} +/* fix multiple table */ +table table { + border: none; +} +.cbi-value-field table { + border: none; +} +td > table > tbody > tr > td { + border: none; +} +.cbi-value-field > table > tbody > tr > td { + border: none; +} +/* table */ +.tabs { + margin: 0 0 1rem 0; + padding: 0 1rem; + background-color: #FFFFFF; + border-radius: 0.375rem; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.03); + white-space: nowrap; + overflow-x: auto; +} +.tabs::-webkit-scrollbar, +.cbi-section::-webkit-scrollbar, +.cbi-section > *::-webkit-scrollbar, +textarea::-webkit-scrollbar, +div::-webkit-scrollbar { + width: 5px; + height: 5px; +} +.tabs::-webkit-scrollbar-thumb { + background-color: #9e9e9e; +} +.tabs::-webkit-scrollbar-thumb:hover { + background: #757575; +} +.tabs::-webkit-scrollbar-thumb:active { + background: #424242; +} +.tabs::-webkit-scrollbar-track { + background-color: transparent; +} +.tabs li[class~="active"], +.tabs li:hover { + cursor: pointer; + border-bottom: 0.18751rem solid #5e72e4; + border-bottom: 0.18751rem solid var(--primary); + color: #5e72e4; + color: var(--primary); + background-color: var(--light-subtabs-background); + margin-bottom: 0; + border-radius: 0; +} +.tabs li[class~="active"] a, +.tabs li:hover a { + color: #5e72e4; + color: var(--primary); +} +.tabs li { + font-size: 0.875rem; + display: inline-block; + padding: 0.875rem 0rem; + border-bottom: 0.18751rem solid rgba(0, 0, 0, 0); +} +.tabs li a { + text-decoration: none; + color: #404040; + padding: 0.5rem 0.8rem; +} +.tabs li:hover { + border-bottom: 0.18751rem solid #5e72e4; + border-bottom: 0.18751rem solid var(--primary); +} +.cbi-tabmenu { + color: white; + padding: 0.5rem 0.5rem 0 0.5rem; + white-space: nowrap; + overflow-x: auto; + border-bottom: 1px solid #ddd !important; +} +.cbi-tabmenu::-webkit-scrollbar { + width: 1px; + height: 5px; +} +.cbi-tabmenu::-webkit-scrollbar-thumb { + background-color: #9e9e9e; +} +.cbi-tabmenu::-webkit-scrollbar-thumb:hover { + background: #757575; +} +.cbi-tabmenu::-webkit-scrollbar-thumb:active { + background: #424242; +} +.cbi-tabmenu::-webkit-scrollbar-track { + background-color: transparent; +} +.cbi-tabmenu li { + background: #e3e3e3; + display: inline-block; + font-size: 0.875rem; + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; + padding: 0.5rem 0rem; + border-bottom: 0.18751rem solid rgba(0, 0, 0, 0); +} +.cbi-tabmenu li a { + text-decoration: none; + color: #404040; + padding: 0.5rem 0.8rem; +} +.cbi-tabmenu li:hover { + cursor: pointer; + border-bottom: 0.18751rem solid #5e72e4; + border-bottom: 0.18751rem solid var(--primary); + color: #5e72e4; + color: var(--primary); + background-color: var(--light-subtabs-background); + margin-bottom: 0; +} +.cbi-tabmenu li:hover a { + color: #525f7f; +} +.cbi-tabmenu li[class~="cbi-tab"] { + border-bottom: 0.18751rem solid #5e72e4; + border-bottom: 0.18751rem solid var(--primary); + color: var(--primary); + background-color: var(--light-subtabs-background); + margin-bottom: 0; +} +.cbi-tabmenu li[class~="cbi-tab"] a { + color: #5e72e4; + color: var(--primary); +} +.cbi-tab-descr { + margin: 1rem 1.5rem; + color: #32325d; + font-size: small; + line-height: 1.5em; +} +.cbi-dropdown { + display: inline-flex; + cursor: pointer; + position: relative; + padding: 0; + height: auto; +} +.cbi-dropdown:focus { + outline: 2px solid #4b6e9b; +} +.cbi-dropdown > ul { + margin: 0 !important; + padding: 0; + list-style: none; + overflow-x: hidden; + overflow-y: auto; + display: flex; + width: 100%; +} +.cbi-dropdown > ul.preview { + display: none; +} +.cbi-dropdown > .open { + border: 0px outset #eee; + flex-basis: 15px; + background: #fff; +} +.cbi-dropdown > .open, +.cbi-dropdown > .more { + flex-grow: 0; + flex-shrink: 0; + display: flex; + flex-direction: column; + justify-content: center; + text-align: center; + line-height: 2em; + padding: 0 0.25em; +} +.cbi-dropdown > .more, +.cbi-dropdown > ul > li[placeholder] { + color: #777; + font-weight: bold; + text-shadow: 1px 1px 0px #fff; + display: none; +} +.cbi-dropdown > ul > li { + display: none; + padding: 0.25em; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + flex-shrink: 1; + flex-grow: 1; + align-items: center; + align-self: center; + min-height: 20px; +} +.cbi-dropdown > ul > li .hide-open { + display: initial; +} +.cbi-dropdown > ul > li .hide-close { + display: none; +} +.cbi-dropdown > ul > li[display]:not([display="0"]) { + border-left: 1px solid #ccc; +} +.cbi-dropdown[empty] > ul { + max-width: 1px; +} +.cbi-dropdown > ul > li > form { + display: none; + margin: 0; + padding: 0; + pointer-events: none; +} +.cbi-dropdown > ul > li img { + vertical-align: middle; + margin-right: 0.25em; +} +.cbi-dropdown > ul > li > form > input[type="checkbox"] { + margin: 0; + height: auto; +} +.cbi-dropdown > ul > li input[type="text"] { + height: 20px; +} +.cbi-dropdown[open] { + position: relative; + border-color: #5e72e4; + border-color: var(--primary); +} +.cbi-dropdown[open] > ul.dropdown { + display: block; + background: #fff; + border-color: #5e72e4; + border-color: var(--primary); + position: absolute; + z-index: 1000; + max-width: none; + min-width: 100%; + width: auto; + box-shadow: 0 1px 3px rgba(50, 50, 93, 0.15), 0 1px 0 rgba(0, 0, 0, 0.05); +} +.cbi-dropdown > ul > li[display], +.cbi-dropdown[open] > ul.preview, +.cbi-dropdown[open] > ul.dropdown > li, +.cbi-dropdown[multiple] > ul > li > label, +.cbi-dropdown[multiple][open] > ul.dropdown > li, +.cbi-dropdown[multiple][more] > .more, +.cbi-dropdown[multiple][empty] > .more { + flex-grow: 1; + display: flex; + align-items: center; +} +.cbi-dropdown[empty] > ul > li, +.cbi-dropdown[optional][open] > ul.dropdown > li[placeholder], +.cbi-dropdown[multiple][open] > ul.dropdown > li > form { + display: block; +} +.cbi-dropdown[open] > ul.dropdown > li .hide-open { + display: none; +} +.cbi-dropdown[open] > ul.dropdown > li .hide-close { + display: initial; +} +.cbi-dropdown[open] > ul.dropdown > li { + border-bottom: 1px solid #ccc; +} +.cbi-dropdown[open] > ul.dropdown > li[selected] { + background: #b0d0f0; +} +.cbi-dropdown[open] > ul.dropdown > li.focus { + background: linear-gradient(90deg, #a3c2e8 0%, #84aad9 100%); +} +.cbi-dropdown[open] > ul.dropdown > li:last-child { + margin-bottom: 0; + border-bottom: none; +} +.cbi-dropdown[disabled] { + pointer-events: none; + opacity: 0.6; +} +.cbi-dropdown .zonebadge { + width: 100%; +} +.cbi-dropdown[open] .zonebadge { + width: 100%; +} +.cbi-dropdown { + font-size: 0.875rem; + transition: all 0.15s ease-in-out; + line-height: 1.5; + height: calc(2.75rem + 2px); + padding: 0m; + color: #8898aa; + border: 1px solid #dee2e6; + border-radius: 0.25rem; + background-color: #fff; + background-clip: padding-box; + box-shadow: 0 3px 2px rgba(233, 236, 239, 0.05); + margin: 0.25rem; +} +.cbi-value-field .cbi-dropdown { + min-width: 20rem; +} +.cbi-value-field .cbi-dropdown .zonebadge > .ifacebadge { + padding: 0rem 1rem; + margin: 0rem 0.3rem; + border: 1px solid #6C6C6C; +} +select[multiple="multiple"] { + height: auto; +} +.cbi-dropdown > ul { + margin: 0 !important; + padding: 0; + list-style: none; + overflow-x: hidden; + overflow-y: hidden; + display: flex; + width: 100%; +} +.cbi-section > legend { + display: none !important; +} +.cbi-section-remove:nth-of-type(2n), +.cbi-section-node:nth-of-type(2n) { + background-color: #f9f9f9; +} +.cbi-section-node-tabbed { + padding: 0; + margin-top: 0; +} +.cbi-section-node { + background: #fff; + border: 0; + border-radius: 0.375rem; + margin-bottom: 0px; + box-shadow: 0 0 0rem 0 rgba(136, 152, 170, 0.15); + overflow-x: auto; + overflow-y: hidden; + padding: 0rem 0; +} +#cbi-network-lan.cbi-section-node { + overflow-x: visible; + overflow-y: visible; +} +.cbi-section-node .cbi-value { + padding: 0.5rem 1rem 0.5rem 1rem !important; +} +.cbi-tabcontainer > .cbi-value:nth-of-type(2n), +.cbi-tabcontainer > .cbi-value:nth-of-type(2n)>textarea { + background-color: #f9f9f9; +} +.cbi-value-field, +.cbi-value-description { + display: table-cell; + line-height: 1.6; + font-size: 0.875rem; +} +/* Fix text position of the luci-app-filebrowser running state */ +#cbi-filebrowser > .cbi-section > .cbi-section > .cbi-value > .cbi-value-field, +/* Fix text position of the luci-apps running state of the [Control] type */ +form > .cbi-map > .cbi-section > .cbi-section-node > .cbi-value > .cbi-value-field font { + word-wrap: break-word; + font-size: 0.875rem; + line-height: 1.6; + padding: 0.7rem; + padding-left: 0; + text-align: right; + display: table-cell; +} +.cbi-value-helpicon > img { + display: none; +} +.cbi-value-helpicon:before { + content: "\f059"; +} +.cbi-value-description { + color: #8d8d8d; + opacity: 0.8; + font-size: small; + padding: 0.5rem; +} +.cbi-value-title { + word-wrap: break-word; + font-size: 0.875rem; + line-height: 1.6; + color: #525f7f; + padding: 0.7rem; + padding-left: 0; + width: 23rem; + text-align: right; + display: table-cell; +} +.cbi-value { + padding: 0.3rem 1rem; + display: inline-block; + width: 100%; +} +.cbi-section-table-descr > .cbi-section-table-cell, +.cbi-section-table-titles > .cbi-section-table-cell { + border: none; +} +.cbi-rowstyle-1 { + background-color: #fff; +} +.cbi-rowstyle-2 { + background-color: #fefefe; +} +.cbi-section-table .cbi-section-table-titles .cbi-section-table-cell { + width: auto !important; +} +/* desc */ +.cbi-section-descr { + padding: 1rem 1.5rem; + font-size: 0.7rem; + font-weight: 600; + line-height: 1.5em; + color: #525f7f; +} +.cbi-map-descr { + margin: 0rem 1.5rem 1rem 1.5rem; + color: #32325d; + font-size: small; + line-height: 1.5em; +} +/* input */ +.cbi-value input[type="password"], +.cbi-value input[type="text"] { + min-width: 20rem; +} +input[type="checkbox"] { + height: auto; +} +/* select */ +.cbi-value-field .ifacebadge { + display: inline-flex; + border-bottom: 0px solid #CCCCCC; + padding: 0.5rem 1rem; + box-shadow: none; +} +td > .ifacebadge { + background-color: #F0F0F0; + font-size: 0.9rem; +} +.ifacebadge > img { + float: right; + margin: 0 0.3rem; +} +#syslog { + width: 100%; + min-height: 15rem; + padding: 1rem; + line-height: 1.4em; + color: #1e1e1e; + border-radius: 0; + background-color: #fff; + border: none; + outline: none; +} +.ifacebadge { + display: inline-flex; + border-bottom: 0px solid #CCCCCC; + padding: 0.5rem 1rem; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + background: #fff; +} +td > .ifacebadge, +.td > .ifacebadge { + background-color: #e9ecef; + font-size: 0.9rem; + border-radius: 0.2rem; +} +.ifacebadge > em, +.ifacebadge > img { + display: inline-block; + margin: 0 0.3rem; + align-self: center; +} +.ifacebadge span { + line-height: 1.6em; +} +.network-status-table { + display: flex; + flex-wrap: wrap; +} +.network-status-table .ifacebox { + margin: 1rem; + flex-grow: 1; +} +.network-status-table .ifacebox-body { + display: flex; + flex-direction: column; + height: 100%; +} +.network-status-table .ifacebox-body > span { + flex: 10 10 auto; + height: 100%; + line-height: 1.7em; + padding-left: 2rem; + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} +.network-status-table .ifacebox-body > div { + display: flex; + flex-wrap: wrap; +} +.network-status-table .ifacebox-body .ifacebadge { + flex: 1 1 auto; + margin: 0; + padding: 0.5em; + min-width: 220px; + background-color: #fff; + align-items: center; +} +.ifacebox { + border: 1px solid #ccc; + border-radius: 0.375rem; + background-color: #f9f9f9; + display: inline-flex; + flex-direction: column; + line-height: 1.2em; + min-width: 100px; + overflow: hidden; +} +.ifacebox-head { + padding: 1rem; + background: #eee; +} +.ifacebox-head.active { + background: #5e72e4; + background: var(--primary); + color: #fff; +} +.ifacebox-body { + padding: 0.5em; +} +.cbi-image-button { + margin-left: 0.5rem; +} +#iwsvg, +#iwsvg2, +#bwsvg { + border: none !important; + border-radius: 0.375rem; + box-shadow: 0 0 2rem 0 rgba(136, 152, 170, 0.15); + overflow: hidden; +} +.cbi-image-button { + margin-left: 0.5rem; +} +.zonebadge { + padding: 0.2rem 0.5rem; + display: inline-block; + cursor: pointer; +} +.zonebadge > .ifacebadge { + padding: 0.2rem 1rem; + margin: 0.3rem; + border: 1px solid #6C6C6C; +} +.zonebadge > input[type="text"] { + padding: 0.16rem 1rem; + min-width: 10rem; + margin-top: 0.3rem; +} +.cbi-value-field .cbi-input-checkbox { + margin: 0.5rem 0.25rem 0.7rem 0.25rem; + vertical-align: middle; + height: 1rem; + line-height: 1.6; +} +.cbi-input-checkbox { + margin: 0.5rem 0.25rem 0.7rem 0.25rem; + vertical-align: middle; +} +.cbi-value-field .cbi-input-radio { + margin: 0rem 0.25rem; +} +.cbi-input-radio { + margin: 0rem 0.25rem; +} +.cbi-value-field > input + .cbi-value-description { + padding: 0; +} +.cbi-value-field > ul > li { + display: flex; + align-items: center; + font-size: 0.875rem; +} +.cbi-value-field > ul > li .ifacebadge { + font-size: 0.875rem; + background-color: #eee; + display: flex; + align-items: center; + margin-left: 0rem; + margin-top: 0rem; +} +.cbi-section-table-row > .cbi-value-field .cbi-input-select { + min-width: 7rem; +} +.cbi-section-create > .cbi-button-add { + margin: 0.75rem 0.75rem 0.75rem 0.25rem; +} +.cbi-section-remove { + padding: 0.5rem; +} +.cbi-optionals { + padding: 1rem 1rem 0 1rem; + border-top: 1px solid #CCC; +} +input[name="ping"], +input[name="traceroute"], +input[name="nslookup"] { + width: 80%; +} +.label { + padding: 0.3rem 0.8rem; + font-size: 0.8rem; + font-weight: bold; + color: #fff !important; + text-transform: uppercase; + white-space: nowrap; + background-color: #32325d; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + text-shadow: none; + text-decoration: none; +} +/* fix status overview */ +.node-status-overview > .main fieldset:nth-child(4) td:nth-child(2) { + white-space: normal; +} +.node-status-overview > .main #wan4_i, +.node-status-overview > .main #wan6_i { + min-width: 80px !important; +} +/* fix status processes */ +.node-status-processes > .main table tr td:nth-child(3) { + white-space: normal; +} +/* fix system reboot */ +.node-system-reboot > .main > .main-right p, +.node-system-reboot > .main > .main-right h3 { + padding-left: 2rem; + color: #fff; +} +/* fix Services Network Shares*/ +.node-services-samba > .main .cbi-tabcontainer:nth-child(3) .cbi-value-title { + margin-bottom: 1rem; + width: auto; +} +.node-services-samba > .main .cbi-tabcontainer:nth-child(3) .cbi-value-field { + display: list-item; +} +.node-services-samba > .main .cbi-tabcontainer:nth-child(3) .cbi-value-description { + padding-top: 1rem; +} +/* fix System Software*/ +.node-system-packages > .main table tr td:nth-child(1) { + width: auto !important; +} +.node-system-packages > .main table tr td:nth-last-child(1) { + white-space: normal; + font-size: small; + color: #404040; +} +.node-system-packages > .main .cbi-tabmenu > li > a, +.tabs > li > a { + padding: 0.5rem 0.8rem; +} +.node-system-packages > .main .cbi-value > pre { + background-color: #eee; + padding: 0.5rem; + overflow: auto; +} +.node-system-packages > .main .cbi-page-actions { + padding: 1rem 0; +} +.node-system-packages > .main .cbi-section-node:first-child .cbi-value-last { + line-height: 1.8em; +} +.node-system-packages > .main .cbi-section-node:first-child .cbi-value-last div[style="margin:3px 0; width:300px; height:10px; border:1px solid #000000; background-color:#80C080"] { + border: 1px solid #999999 !important; + width: 100% !important; + background-color: #fff !important; + height: 1.4rem !important; + border-radius: 0.25rem; + margin: 0.5rem 0; + overflow: hidden; +} +.node-system-packages > .main .cbi-section-node:first-child .cbi-value-last div[style="margin:3px 0; width:300px; height:10px; border:1px solid #000000; background-color:#80C080"] div { + border-right: 0 !important; + background-color: #5e72e4 !important; + background-color: var(--primary) !important; + height: 100% !important; + background-image: url(../img/trafficbar.png); + background-position: left top; + animation: sparkle 1000ms linear infinite; +} +.node-system-leds .cbi-section em { + display: block; +} +.cbi-tabmenu + .cbi-section { + margin-top: 0; +} +.cbi-section { + background: #fff; + border: 0; + border-radius: 0.375rem; + box-shadow: 0 0 2rem 0 rgba(136, 152, 170, 0.15); + overflow-x: auto; + overflow-y: hidden; +} +.cbi-section em { + font-size: 0.7rem; + font-weight: 600; + color: var(--primary); + text-shadow: 1px 1px 2px #ccc; + text-align: center; +} +.cbi-section h4 { + font-size: 0.7rem; + font-weight: 600; + color: #525f7f; +} +#content_syslog { + border-radius: 0.375rem; + box-shadow: 0 0 2rem 0 rgba(136, 152, 170, 0.15); + overflow: hidden; +} +.node-system-packages .cbi-section-node .cbi-value { + padding: 0.5rem 1rem; + font-size: 0.875rem; +} +.node-system-packages br { + display: none; +} +/* fix network firewall*/ +.node-network-firewall > .main .cbi-section-table-row > .cbi-value-field .cbi-input-select { + min-width: 4rem; +} +.node-network-firewall .cbi-section-table { + width: 100% !important; +} +.node-status-iptables fieldset, +.node-system-packages fieldset, +.node-system-flashops fieldset { + margin-top: 0; +} +.node-system-flashops fieldset > ul { + padding: 1rem; +} +.node-system-flashops fieldset + .cbi-page-actions { + margin-top: 1rem; +} +.node-status-iptables .cbi-tabmenu, +.node-system-packages .cbi-tabmenu, +.node-system-flashops .cbi-tabmenu { + border: none; +} +.node-system-flashops form.inline + form.inline { + margin-left: 0; +} +.Changes .cbi-section { + font-size: 0.875rem; + padding: 1rem; +} +.node-network-diagnostics { + font-size: 0.875rem; +} +.node-network-diagnostics #diag-rc-output { + display: block; + padding: 1rem; +} +.node-network-diagnostics #diag-rc-output pre { + font-size: 0.875rem; +} +.node-network-diagnostics .cbi-section div { + padding: 0 1.5rem; +} +.node-network-diagnostics input { + margin: 0.25rem !important; +} +.node-network-wireless .cbi-button-add { + margin-left: 0; +} +/* fix nlbw/display*/ +#detail-bubble.in { + z-index: 500; +} +.node-nlbw-display .cbi-section ul { + padding: 0.875rem 1.5rem; +} +.node-nlbw-backup form { + margin-left: 1.5rem; +} +.node-nas-usb_printer em { + display: block; +} +/* luci-app-passwall */ +#cbi-passwall #add_link_div, +#cbi-passwall #set_node_div { + background: #fffffff0; +} +#cbi-passwall .cbi-section-table tbody ._now_use { + background: #5e72e473 !important; +} +/* luci-app-commands */ +.commandbox h3 { + overflow: hidden; + text-overflow: ellipsis; +} +.commandbox code { + word-break: break-word; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; +} +div.commandbox { + height: 16em; +} +/* luci-app-ssr-plus */ +#cbi-shadowsocksr .cbi-map-descr h3 { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +/* luci-app-mwan3 */ +.node-status-mwan .cbi-tabmenu { + padding: 3rem 0.5rem 0 0.5rem; +} +/* luci-app-openclash */ +.node-services-openclash .cbi-tabmenu { + font-size: 0; +} +.node-services-openclash .cbi-tabmenu > li { + margin-right: 4px; +} +.node-services-openclash .cbi-tabmenu > li:last-child { + margin-right: 0; +} +/* luci-app-ddnsto */ +.node-services-ddnsto .cbi-section-node .cbi-value div { + display: table-cell; + line-height: 1.6; + font-size: 0.875rem; +} + +/* luci-app-dockerman */ +#cbi-dockerd > .cbi-section > br, +#cbi-docker > .cbi-section > br { + display: none; +} + +/* luci-app-diskman */ +#cbi-diskman > .cbi-section > br { + display: none; +} + +/* luci-app-istorex (Quick Start) */ +#app #main #page .app-container_body .btn-f, +#app #main #page .app-container_body .btn-r { + -webkit-user-select: none; /* Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+/Edge */ + user-select: none; /* Standard */ + width: 30px; +} + +/* luci-app-ttyd */ +.TTYD.node-system-terminal .main { + height: 100%!important; +} +.TTYD.node-system-terminal .main .main-right, +.TTYD.node-system-terminal .main .main-right #maincontent, +.TTYD.node-system-terminal .main .main-right #maincontent .container .cbi-map { + height: 100%!important; + display: flex!important; + flex-direction: column!important; +} +.TTYD.node-system-terminal .main .main-right #maincontent, +.TTYD.node-system-terminal .main .main-right #maincontent .container, +.TTYD.node-system-terminal .main .main-right #maincontent .container .cbi-map #terminal { + flex: 1!important; +} + +@media screen and (max-width: 1600px) { + .main .main-left { + width: calc(0% + 13rem); + } + .main .main-right { + width: calc(100% - 13rem); + } + .cbi-button:not(.cbi-button-up, .cbi-button-down) { + /*padding: 0.3rem 1.5rem;*/ + font-size: 0.8rem; + } + header > .container > .pull-right > * { + top: 0.35rem; + } + .label { + padding: 0.2rem 0.6rem; + } + .cbi-value-title { + width: 15rem; + padding-right: 0.6rem; + } + fieldset { + padding: 0; + } + .node-status-iptables > .main fieldset li > a { + padding: 0.3rem 0.6rem; + } +} +@media screen and (max-width: 1280px) { + header > .container { + margin-top: 0.25rem; + } + .main .main-left { + width: calc(0% + 13rem); + } + .main .main-right { + width: calc(100% - 13rem); + } + .cbi-tabmenu > li > a, + .tabs > li > a { + padding: 0.2rem 0.5rem; + } + .panel-title { + font-size: 1.1rem; + padding-bottom: 1rem; + } + table { + font-size: 0.7rem !important; + width: 100% !important; + } + .main > .main-left > .nav > li, + .main > .main-left > .nav > li a, + .main > .main-left > .nav > .slide > .menu { + font-size: 0.9rem; + } + .main > .main-left > .nav > .slide > .slide-menu > li > a { + font-size: 0.7rem; + } +} +@media screen and (max-width: 992px) { + .main .main-left { + width: 0; + position: fixed; + z-index: 100; + } + .main .main-right { + width: 100%; + } + .showSide { + padding: 0.1rem; + position: relative; + display: inline-block; + } + .showSide:hover { + text-decoration: none; + } + .showSide:before { + content: "\e20e"; + font-size: 1.7rem; + } + header > .fill > .container > .brand { + display: inline-block; + } + .node-network-diagnostics > .main .cbi-map fieldset > div * { + width: 100% !important; + } + .node-network-diagnostics > .main .cbi-map fieldset > div input[type="text"] { + margin: 3rem 0 0 0 !important; + } + .node-network-diagnostics > .main .cbi-map fieldset > div:nth-child(4) input[type="text"] { + margin: 0 !important; + } + .node-network-diagnostics > .main .cbi-map fieldset > div select, + .node-network-diagnostics > .main .cbi-map fieldset > div input[type="button"] { + margin: 1rem 0 0 0 !important; + } + .node-network-diagnostics > .main .cbi-map fieldset > div { + width: 100% !important; + } + #diag-rc-output > pre { + font-size: 1rem; + } +} +@media screen and (max-width: 500px) { + .login-page .login-container { + margin-left: 0rem !important; + width: 500px; + } + .login-page .login-container .login-form { + max-width: 500px; + } +} +@media screen and (max-width: 480px) { + body { + font-size: 0.8rem; + } + .pull-right { + float: right; + margin-top: 0rem !important; + } + .login-page .login-container { + margin-left: 0rem !important; + width: 100%; + } + .login-page .login-container .login-form .form-login .input-group::before { + color: #525461; + } + .login-page .login-container .login-form .form-login .input-group input { + color: #525461; + border-bottom: white 1px solid; + border-bottom: var(--white) 1px solid; + border-radius: 0; + } + fieldset { + padding: 0; + margin: 1rem 0 0 0; + } + .toggle { + margin: 0; + } + h2 { + font-size: 1.125rem; + } + .panel-title { + font-size: 1rem; + padding-bottom: 1rem; + } + #maincontent > .container { + margin: 0 1rem 1.5rem 1rem; + } + .main > .main-left > .nav > .slide > .menu { + font-size: 1rem; + } + .main > .main-left > .nav > .slide > .slide-menu > li > a { + font-size: 0.9rem; + } + .main > .main-left > .nav > .slide > .menu:after { + top: 0.9rem; + } + #ethinfo td { + padding: 0.75rem 0.2rem !important; + } + .cbi-value-title { + width: 100%; + min-width: 0rem !important; + display: block; + margin-top: 0.5rem; + margin-bottom: 0.5rem; + text-align: left; + padding: 0 0.25rem; + } + .cbi-value input[type="password"], + .cbi-value input[type="text"] { + min-width: 15rem; + } + select, + input { + width: 100% !important; + min-width: auto; + margin: 0.25rem 0; + } + input { + box-sizing: border-box; + } + .cbi-value > .cbi-value-field > div > input { + width: calc(100% - 1.5rem) !important; + } + .cbi-value > .cbi-value-field { + display: inline-block; + width: 100%; + position: relative; + } + .cbi-page-actions > div > input { + display: none; + } + ::-webkit-scrollbar { + width: 0px !important; + height: 0px !important; + } + .tabs > li > a { + font-size: 0.9rem; + } + select, + input { + font-size: 0.9rem; + } + .mobile-hide { + display: none !important; + } + .node-status-realtime table > tbody > tr > td, + .node-status-realtime table > tfoot > tr > td, + .node-status-realtime table > thead > tr > td { + font-size: 0.8125rem; + color: #525f7f; + line-height: 1.4em; + vertical-align: middle !important; + padding: 0.8rem 0rem; + border-top: 1px solid #ddd; + width: auto; + text-align: center; + } + .node-system-packages > .main .cbi-value.cbi-value-last > div { + width: 100% !important; + } + .node-system-packages .cbi-section-node .cbi-value { + padding: 0.3rem 1rem; + } + .node-system-packages > .main .cbi-value .cbi-value-field input { + width: 100%; + } + .node-system-leds .cbi-section em { + display: block; + } + .node-status-iptables > .main div > .cbi-map > form { + position: static !important; + margin: 0 0 2rem 0; + padding: 2rem; + border: 0; + font-weight: normal; + font-style: normal; + line-height: 1; + font-family: inherit; + min-width: inherit; + overflow-x: auto; + overflow-y: hidden; + border-radius: 0.375rem; + background-color: #FFF; + box-shadow: 0 0 2rem 0 rgba(136, 152, 170, 0.15); + -webkit-overflow-scrolling: touch; + } + .node-status-iptables > .main div > .cbi-map > form input[type="submit"] { + width: 100% !important; + margin: 0; + } + .node-status-iptables > .main div > .cbi-map > form input[type="submit"] + input[type="submit"] { + margin-top: 1rem; + } + .cbi-value input[type="text"]:has(+ img) { + width: 10rem !important; + } + .cbi-button-add { + margin-left: 0.5rem; + } + .node-network-network .cbi-section-table tr, + .node-network-network .cbi-section-table td { + display: block; + } + .node-network-network .cbi-section-table td { + width: 100% !important; + text-align: center !important; + padding: 0.8rem 1.5rem !important; + } + .node-network-network .cbi-section-table .cbi-section-table-titles { + display: flex; + } + .node-network-network .cbi-section-table .cbi-section-table-titles .cbi-section-table-cell { + flex: 1 !important; + } + .node-services-vssr .status-info { + font-size: 0.75rem; + } + .node-services-vssr .icon-con { + margin-top: 0.4rem; + } + .node-services-vssr .icon-con img { + width: 2.3rem !important; + height: auto; + } +} diff --git a/luci-theme-argon/htdocs/luci-static/argon/css/dark.css b/luci-theme-argon/htdocs/luci-static/argon/css/dark.css new file mode 100644 index 00000000..085c7f63 --- /dev/null +++ b/luci-theme-argon/htdocs/luci-static/argon/css/dark.css @@ -0,0 +1,836 @@ +body { + background: #1e1e1e; + color: #cccccc; +} + +.login-page .login-container .login-form { + background-color: #1e1e1e; +} + +.login-page .login-container .login-form .brand { + color: #adb5bd; +} + +.login-page .login-container .login-form .form-login .input-group::before { + color: #adb5bd; +} + +.login-page .login-container .login-form .form-login .input-group .border { + border-bottom: 1px var(--dark-primary) solid; +} + +.login-page .login-container .login-form .form-login .input-group input { + background-color: transparent !important; + color: #adb5bd; + border-bottom: #adb5bd 1px solid !important; + border-radius: 0; + border-top: none !important; + border-left: none !important; + border-right: none !important; + box-shadow: none; +} + +.login-page .login-container .login-form .form-login .input-group input:focus { + border-top: none !important; + border-left: none !important; + border-right: none !important; +} + +.login-page .login-container .login-form .form-login .cbi-button-apply { + background-color: #483d8b !important; + background-color: var(--dark-primary) !important; +} + +.login-page .login-container .login-form .form-login .cbi-button-apply:hover, +.login-page .login-container .login-form .form-login .cbi-button-apply:focus { + opacity: .9; +} + +.login-page .login-container footer, +.login-page .login-container footer a { + color: #adb5bd; +} + +header::after { + background-color: #1e1e1e !important; +} + +.main .main-left { + background-color: #333333 !important; + box-shadow: 0 0 .5rem 0 rgba(0,0,0,0.15); +} + +.main .main-left .sidenav-header .brand { + color: #ccc; +} + +.main .main-left .nav .slide .slide-menu .active a { + color: #fff !important; +} + +.main .main-left .nav .slide .slide-menu li a { + color: #cccccc; +} + +.main .main-left .nav .slide .slide-menu li a::after { + background-color: var(--dark-primary) !important; + box-shadow: 0 0 1px #000 !important; +} + +.main .main-left .nav .slide .slide-menu li a:hover { + background: none !important; +} + +.main .main-left .nav .slide .menu:hover, +.main .main-left .nav .slide .menu.active { + background-color: #483d8b !important; + background-color: var(--dark-primary) !important; + color: #fff !important; + box-shadow: 0 0 1px #000 !important; +} + +.main .main-left .nav .slide .menu[data-title=Status]:before { + color: var(--dark-primary) !important; +} + +.main .main-left .nav .slide .menu[data-title=Control]:before { + color: var(--dark-primary) !important; +} + +.main .main-left .nav li a { + color: #cccccc !important; +} + +.main .main-left .nav li a:hover { + background-color: #483d8b !important; + background-color: var(--dark-primary) !important; + color: #fff !important; +} + +.main .main-left::-webkit-scrollbar-thumb { + background-color: #252526 !important; +} + +.main .main-right { + background-color: #1e1e1e; +} + +h2 { + color: #ccc; + background: #333333; +} + +h3 { + color: #ccc; + border-bottom: 0; + background: #333333; +} + +a:link, +a:visited, +a:active { + color: var(--dark_webkit-any-link); +} + +a:-webkit-any-link:not(li a, .main-left a, .brand, .pull-right a, .alert-message a, .login-container footer a, .cbi-button) { + color: var(--dark_webkit-any-link) !important; + text-shadow: 1px 1px 2px #000 !important; +} + +input:-webkit-autofill { + background-color: #3c3c3c !important; +} + +input[type="checkbox"]:checked { + background-color: #483d8b !important; + background-color: var(--dark-primary) !important; +} + +.cbi-input-radio:checked { + background-color: #483d8b !important; + background-color: var(--dark-primary) !important; +} + +.cbi-value-field .cbi-input-apply, +.cbi-button-apply, +.cbi-button-edit { + color: #fff !important; + background-color: #483d8b !important; + background-color: var(--dark-primary) !important; + border-color: #483d8b !important; + border-color: var(--dark-primary) !important; +} + +.cbi-section em { + color: var(--dark_webkit-any-link); + text-shadow: 1px 1px 2px #000; +} + +header.bg-primary { + background-color: #1e1e1e !important; +} + +.cbi-map-descr { + color: #ccc; +} + +.cbi-section { + background: none; + box-shadow: 0 0 .5rem 0 rgba(0,0,0,0.35); +} + +.panel-title { + color: #ccc; + background-color: #333333; + border-bottom: 0px; +} + +table>tbody>tr>td, +table>tfoot>tr>td, +table>thead>tr>td { + color: #ccc; +} + +fieldset>table>tbody>tr:nth-of-type(2n) { + background-color: #252526; +} + +table>tbody>tr>td, +table>tfoot>tr>td, +table>thead>tr>td { + border-top: 1px solid #252526; +} + +#swaptotal>div>div, +#swapfree>div>div, +#memfree>div>div, +#membuff>div>div, +#conns>div>div, +#memtotal>div>div { + background-color: #483d8b !important; + background-color: var(--dark-primary) !important; +} + +#swaptotal>div>div>div>small, +#swapfree>div>div>div>small, +#memfree>div>div>div>small, +#membuff>div>div>div>small, +#conns>div>div>div>small, +#memtotal>div>div>div>small { + color: #ccc !important; + text-shadow: 1px 1px 2px #000 !important; +} + +.node-system-packages>.main .cbi-section-node:first-child .cbi-value-last { + line-height: 1.8em; +} + +.node-system-packages>.main .cbi-section-node:first-child .cbi-value-last div[style="margin:3px 0; width:300px; height:10px; border:1px solid #000000; background-color:#80C080"] { + border: 1px solid #999999 !important; + background-color: transparent !important; +} + +.node-system-packages>.main .cbi-section-node:first-child .cbi-value-last div[style="margin:3px 0; width:300px; height:10px; border:1px solid #000000; background-color:#80C080"] div { + background-color: #32325d !important; + background-color: var(--dark-primary) !important; +} + +table>tbody>tr>th, +table>tfoot>tr>th, +table>thead>tr>th { + background-color: #252526; + border-top: none; + border-bottom: black 1px solid !important; +} + +.cbi-rowstyle-2 { + background-color: #2c2c2c !important; +} + +.cbi-rowstyle-1 { + background-color: #252526; +} + +.cbi-section>h3:first-child, +.panel-title { + color: #ccc; + border-bottom: 0; +} + +.cbi-section-table .cbi-section-table-titles .cbi-section-table-cell { + background-color: #1e1e1f; +} + +.cbi-button { + color: #ccc; + background-color: #2c2c2c; +} + +.cbi-rowstyle-2 .cbi-button-up, +.cbi-rowstyle-2 .cbi-button-down { + background-color: #252526 !important; +} + +.cbi-section-node { + background: none; + border-radius: 0 0 .375rem .375rem; + padding: 0rem; +} + +abbr { + color: #8898aa; +} + +div>table>tbody>tr:nth-of-type(2n), +div>.table>.tbody>.tr:nth-of-type(2n) { + background-color: #252526; +} + +/* file selector button */ +::file-selector-button { + border: 1px solid darkseagreen !important; + background-color: darkseagreen !important; +} + +/* Fix background color of table-titles */ +.cbi-section-node>.cbi-section-table>tbody>.cbi-section-table-titles th { + background-color: #1e1e1e; + border: none !important; +} + +/* Fix background color of table-descr */ +.cbi-section-node>.cbi-section-table>tbody>.cbi-section-table-descr th { + background-color: #333333; + border: none !important; +} + +/* Fix background color not change when the H tag is in the table rowstyle-1 */ +.cbi-section-node>.cbi-section-table>tbody>.cbi-rowstyle-1 th { + background-color: #252526; + border-top: 1px solid #252526; + border-bottom: none !important; +} + +/* Fix background color not change when the H tag is in the table rowstyle-2 */ +.cbi-section-node>.cbi-section-table>tbody>.cbi-rowstyle-2 th { + background-color: #2c2c2c; + border-top: 1px solid #252526; + border-bottom: none !important; +} + +/* Change the color of the H label in the table to make it more visible */ +th h1, td h1, +th h2, td h2, +th h3, td h3, +th h4, td h4, +th h5, td h5, +th h6, td h6 { + background: var(--gray-dark); +} + +/* Improved the background color of each itemes in "UNSAVED CHANGES" (dark mode only) */ +.uci-change-list del, +.uci-change-legend-label del { + background-color: #fb74008c; +} +.uci-change-list var, +.uci-change-legend-label var { + background-color: #333333; +} +.uci-change-list ins, +.uci-change-legend-label ins { + background-color: #00ff0a45 !important; +} + +#content_syslog { + box-shadow: 0 0 .5rem 0 rgba(0,0,0,0.35); +} + +#syslog { + color: #ccc; + background-color: #1e1e1e; +} + +#iwsvg, +#iwsvg2, +#bwsvg { + overflow: hidden; + box-shadow: 0 0 .5rem 0 rgba(0,0,0,0.35); + background-color: #1e1e1e !important; +} + +.tabs { + background-color: #252526; +} + +.tabs>li:hover, +.tabs>li[class~="active"], +.cbi-tabmenu>li:hover, +.cbi-tabmenu>li[class~="cbi-tab"] { + border-bottom: .18751rem solid var(--dark-primary); + background-color: #3c3c3c; +} + +.tabs>li>a, +.cbi-tabmenu>li>a { + color: #ccc !important; +} + +.cbi-tabmenu>li>a:hover, +.cbi-tabmenu>li:hover>a, +.cbi-tabmenu>.cbi-tab>a, +.tabs>li>a:hover, +.tabs>li:hover>a, +.tabs>li[class~="active"]>a { + color: #fff !important; +} + +.cbi-tabmenu>li { + background: #2d2d2d; +} + +.cbi-tabmenu { + border-bottom: 0 solid #ddd !important; +} + +.cbi-tab-descr { + color: #ccc; +} + +.cbi-tabcontainer>.cbi-value:nth-of-type(2n), +.cbi-tabcontainer>.cbi-value:nth-of-type(2n)>textarea { + background-color: #252526; +} + +.cbi-value-title { + color: #ccc; +} + +select, +input { + color: #ccc; + background-color: transparent; + border: 1px solid #3c3c3c !important; + box-shadow: 0 3px 2px rgba(0,0,0,0.05); +} + +select:not([multiple="multiple"]):hover, +input:hover, +input:focus { + border-color: #483d8b !important; + border-color: var(--dark-primary) !important; + background-color: transparent; + outline: 0; + box-shadow: none; +} + +select { + background-color: #1e1e1e !important; +} + +#cbi-dropbear h2, +#cbi-dropbear .cbi-map-descr, +#cbi-dropbear .cbi-map-descr abbr, +#cbi-rc h2, +#cbi-rc .cbi-map-descr, +#cbi-distfeedconf h2, +#cbi-distfeedconf .cbi-map-descr, +#cbi-customfeedconf h2, +#cbi-customfeedconf .cbi-map-descr, +#cbi-download h2, +#cbi-filelist h2 { + color: #ccc !important; +} + +.cbi-value-field>ul>li .ifacebadge { + background-color: #3c3c3c; +} + +.cbi-section-descr { + color: #ccc; +} + +/*textarea for dark mode*/ +textarea { + border: 1px solid #3c3c3c !important; + background-color: #1e1e1e; + color: #ccc; +} + +.cbi-section-remove:nth-of-type(2n), +.cbi-section-node:nth-of-type(2n) { + background-color: #1e1e1e; +} + +.node-system-packages>.main table tr td:nth-last-child(1) { + color: #ccc; +} + +.node-system-packages>.main .cbi-value>pre { + background-color: #333; +} + +.cbi-section-node .cbi-value { + padding: 1rem 1rem .3rem 1rem; +} + +.ifacebox { + background-color: #1e1e1e; + border: 1px solid #1e1e1e; +} + +.ifacebox-head { + color: #666; +} + +.ifacebox-body { + background-color: #333; +} + +.zonebadge strong { + color: #333; +} + +.zonebadge>.ifacebadge { + background-color: #3c3c3c; +} + +/* Fix firewall zone: "unspecified -or- create: " background color (dark mode only) */ +div[onclick$="._fwzone_new').checked=true"] { + border: 1px solid #3c3c3c; + background-color: transparent !important; +} + +/* Improve the background color of "Any zone" and "Device" when ADD/EDIT Rules in Firewall > Traffic Rules (dark mode only) */ +label[for$=".src_any"], +label[for$=".dest_empty"], +label[for$=".dest_any"] { + background-color: #2888db !important; +} + +/* Fix/add background color of wireless signal strength badge for dark mode */ +td>.ifacebadge, +.td>.ifacebadge { + background-color: #3c3c3c; +} + +/* Improved loading process gif color (dark mode only) */ +img[src="/luci-static/resources/icons/loading.gif"] { + filter: invert(1); +} + +div.cbi-value var, +td.cbi-value-field var, +.td.cbi-value-field var { + color: #483d8b; + color: var(--dark_webkit-any-link); + text-shadow: 1px 1px 2px #000; +} + +#diag-rc-output>pre { + color: #ccc; + background-color: #1e1e1e; +} + +.node-services-vssr .block { + background-color: #1e1e1e !important; + box-shadow: 0 0 .5rem 0 rgba(0,0,0,0.35) !important; +} + +.node-services-vssr .block h4 { + color: #ccc !important; +} + +.node-services-vssr .status-bar { + color: #ccc; + background: #333333f0; + box-shadow: #00000094 10px 10px 30px 5px; +} + +.node-services-vssr .cbi-section-table-row { + color: #ccc; + background-color: #3c3c3c !important; + box-shadow: 0 0 5px 0 rgba(0,0,0,0.35); +} + +.node-services-vssr .cbi-section-table-row.fast { + background: #483d8b !important; + background: var(--dark-primary) !important; + color: #fff; +} + +.node-services-vssr .ssr-button { + color: #ccc; +} + +.node-services-vssr .incon:nth-child(2) { + border-right: #1e1e1e 1px solid; +} + +.main .main-right #maincontent .container p { + color: #ccc; +} + +#xhr_poll_status>.label.success { + color: #ccc !important; + background-color: darkolivegreen !important; +} + +/* Define the warning background-color breathe display animation (dark mode) */ +@keyframes warning-background-color-breathe-dark { + 0%{ + color: #fff; + background-color: darkorange; + } + 50%{ + color: #ccc; + background-color: #333333; + } + 100%{ + color: #fff; + background-color: darkorange; + } +} +.warning, +.warning * { + animation: warning-background-color-breathe-dark 1.5s ease-in-out infinite !important; +} + +.notice { + background-color: #483d8b !important; + background-color: var(--dark-primary) !important; +} + +/* Improved the aleart-message background color during device restart (dark mode only) */ +.errorbox, +.alert-message { + background-color: #333333; +} + +.cbi-input-find, +.cbi-input-save, +.cbi-button-add, +.cbi-button-save, +.cbi-button-find, +.cbi-input-reload, +.cbi-button-reload { + background-color: darkseagreen !important; + border-color: darkseagreen !important; +} + +.cbi-button-reset, +.cbi-input-remove { + color: #fff !important; + background-color: darkorange !important; + border-color: darkorange !important; +} + +.cbi-page-actions .cbi-button-apply, +.cbi-section-actions .cbi-button-edit, +.cbi-button-edit.important, +.cbi-button-apply.important, +.cbi-button-reload.important, +.cbi-button-action.important { + border: 1px #483d8b solid !important; + border: 1px var(--dark-primary) solid !important; +} + +fieldset[id^="cbi-apply-"] { + background-color: #333333; +} + +#detail-bubble>div { + border: 1px solid #ccc; + border-radius: 2px; + padding: 5px; + background: #252525; +} + +/* Define the error text border breathe display animation (dark mode) */ +@keyframes error-border-breathe-dark { + 0%{ + border-color: darkorange; + } + 50%{ + border-color: transparent; + } + 100%{ + border-color: darkorange; + } +} + +/* Add border for error text box, and border breathe display animation to make it more noticeable (dark mode) */ +.cbi-section-error>ul>li { + color: darkorange; + border: 2px solid darkorange ; + animation: error-border-breathe-dark 1.5s ease-in-out infinite; +} + +.cbi-input-invalid, +.cbi-value-error input { + color: darkorange; + border: 1px dashed darkorange !important; +} + +.node-services-vssr .block h4 span { + color: #ccc !important; +} + +/* luci-app-passwall */ +#cbi-passwall #add_link_div, +#cbi-passwall #set_node_div { + background: #333333f0 !important; + box-shadow: #00000094 10px 10px 30px 5px !important; +} + +/* luci-app-bypass */ +#cbi-bypass .status-bar { + color: #ccc; + background: #333333f0; + box-shadow: #00000094 10px 10px 30px 5px; +} + +/* luci-app-clash */ +#cbi-clash .cbi-section .pure-u-1-4 .pure-g, +#cbi-clash .cbi-section .siz .pure-g { + background-color: #1e1e1e !important; + box-shadow: 0 0 .5rem 0 rgba(0,0,0,0.35) !important; +} + +/* luci-app-openclash */ +#cbi-openclash #eye-icon, +#cbi-openclash img[title="刷新"] { + filter: invert(100%); +} +#cbi-openclash #cbi-openclash-config fieldset[control-id="ControlID-46"], +#cbi-openclash .CodeMirror-merge-copybuttons-right, +.CodeMirror-scroll { + background-color: #333333 !important; +} +#cbi-openclash .cbi-section .cbi-tabmenu li { + border-right: 1px solid #3c3c3c !important; +} +#cbi-openclash .CodeMirror-merge { + border: 1px solid transparent !important; +} +#cbi-openclash-config-clog .cbi-section { + border: 1px solid #3c3c3c !important; +} +#cbi-openclash .CodeMirror-gutters { + border-right: 1px solid #3c3c3c !important; + background-color: #1e1e1e !important; +} + +/* luci-app-dockerman */ +#cbi-dockerd .img-con img { + filter: invert(0.4); +} + +/* luci-app-istorex (interface config[NetworkPort]) */ +#cbi-nfs-mount .app-container_status-label_bg { + background: #333333; +} +#cbi-nfs-mount td svg { + filter: invert(0.3); +} +#actioner .actioner-dns { + background-color: #333333; +} +#actioner .actioner-dns_header, +#actioner .actioner-container_header { + border-bottom: 1px solid #cbcbcb !important; +} +#actioner .actioner-dns_footer { + border-top: 1px solid #cbcbcb !important; +} + +/* luci-app-istorex (Network Guide) */ +#app #main #page .title, +#app #main #page .desc { + color: #cccccc; + background-color: #333333; +} +#app #main #page .network-message li:not(span):not(a) { + color: #8d8d8d; +} +#app #main #page code { + background-color: #333333; +} + +/* luci-app-istorex (Quick Start) */ +#app #main #page .network-container_flow-container, +#app #main #page .app-container_status-container, +#app #main #page .nas-container .nas-container_card .app-container, +#app #main #page .app-container { + background-color: #333333; +} +#app #main #page .flow-data span, +#app #main #page .app-container_status-label_block span, +#app #main #page .app-container .item-label span:not(#app #main #page .app-container .progress-value span) { + color: #cccccc; +} +#app #main #page .app-container_status-info span, +#app #main #page .app-container_status-info span, +#app #main #page .app-container_title span { + color: #dddddd; +} +.app-container_body .app-container_status-label_bg { + background-color: #282828 !important; +} +#app #main #page .item-label_value .progress { + background-color: rgb(118, 118, 118); +} +#app #main #page .app-container_nas-menu button[class=""] { + background-color: #8b8b8b; +} +#app #main #page .app-container_nas-menu button[class="on"] { + background-color: #555555; +} +#app #main #page .app-container_title .DeviceBlock ul { + background-color: #cccccc; +} +#actioner div.action, +#actioner div.actioner-container { + background-color: #3c3c3c; +} +#actioner div.action .title { + color: #cccccc; +} +#actioner div.action .desc { + color: #cbcbcb; +} +#actioner div.action div.roots span, +#actioner div.action div.move span:not(span.tip), +#actioner div.action div.left span, +#actioner div.action div.input_row span, +#actioner div.label-item label span { + color: #cbcbcb; +} +#actioner div.action span.tooltip-trigger svg path { + fill: #cbcbcb; +} +#actioner div.actioner-dns_body div.label-item_value select { + height: 43px; +} +#actioner div.actioner-container_footer div.close { + color: #ffffff; +} +#app #main div.app-container div.app-container_title span a svg path, +#app #main #page span.disk_infoicon svg g { + fill: #8b8b8b; +} + +@supports (-webkit-backdrop-filter: none) or (backdrop-filter: none) { + .login-page .login-container .login-form { + -webkit-backdrop-filter: blur(var(--blur-radius-dark)); + backdrop-filter: blur(var(--blur-radius-dark)); + background-color: rgba(0, 0, 0, var(--blur-opacity-dark)); + } +} + +@media screen and (max-width:480px) { + .node-status-iptables>.main div>.cbi-map>form { + background-color: #1e1e1e; + box-shadow: 0 0 .5rem 0 rgba(0,0,0,0.35); + } +} \ No newline at end of file diff --git a/luci-theme-argon/htdocs/luci-static/argon/css/fonts.css b/luci-theme-argon/htdocs/luci-static/argon/css/fonts.css new file mode 100644 index 00000000..cc4e1a80 --- /dev/null +++ b/luci-theme-argon/htdocs/luci-static/argon/css/fonts.css @@ -0,0 +1,186 @@ +/** + * Argon is a clean HTML5 theme for LuCI. It is based on luci-theme-material and Argon Template + * + * luci-theme-argon + * Copyright 2020 Jerryk + * + * Have a bug? Please create an issue here on GitHub! + * https://github.com/jerrykuku/luci-theme-argon/issues + * + * luci-theme-bootstrap: + * Copyright 2008 Steven Barth + * Copyright 2008 Jo-Philipp Wich + * Copyright 2012 David Menting + * + * MUI: + * https://github.com/muicss/mui + * + * luci-theme-material: + * https://github.com/LuttyYang/luci-theme-material/ + * + * Argon Theme + * https://demos.creative-tim.com/argon-dashboard/index.html + * + * Login background + * https://unsplash.com/ + * + * Licensed to the public under the Apache License 2.0 + */ + + + @font-face { + font-family: 'Google Sans'; + src: url('data:application/font-woff2;charset=utf-8;base64,d09GMgABAAAAAFW8ABIAAAAA2DgAAFVQAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP0ZGVE0cGoI0G9x4HKUeBmAAhAIIgTwJnnURDAqB3UiBvQwLhQIAATYCJAOKAAQgBYRnB41NDIQAGz7EJ5hubiR/lNsGgFCW81d/0QXsVni3jdDeRWCO9bMDLTIPKCA+/y/Z//+fkJyM4UAPm1rm+7lslg6TcoycK1yhVF4Fd00lKYMnOBQOl+CKjFHEfIuq31ySSDU87HzeHbmNsgX6LmfjlEVKdIfIiz8bD8xUr+9MmpvlGb1NBxps4YKro8j/gJhCqGbPZIYkd4vYzcfT4a9PuRMK1fqG8BHfIPbCDjeuZ6suWAX5jxolVYEh44GfRhVJC1foEkk8ZPN8ThiPb2Zfje53BraN/ElOXvKI5mxmT3NJ7iJGEsIRQpAHr2BNUKtRatQcqkaVquqL1cT5Maf1erYl2ZYt2Y7NSexwE7dNZtIOdXbTBeauPmsJ8Aj0T4BwIkCe/3//nneufb+MkK7UgargKiNVKhgd+M71OfX3WU46s2sXGR/YVhOl6LTpR46u1rVA7ACCZBUAjp8o3Mb9lkK1dKPgAG3zf8E2llgYIAISdWTLHRx5CMgBCta0Z+Yi8y26//uuIl7Upl9vc3NFk6a+oqmuTstV4J34R2wRW6D7iC1iD4lt5DPMIndJQKjb7i/yLJQwkilFFrz0kxpam69aImwe0hqlvfiZvTRCyIsFK01LLM+5vft/iRJkBjXyID++8zyztHK0ApYyAN3XB5lsaKEsacguL5LNAiXRF8D/oLvjThiR0QEHbnKVpma4F8Ugg/DXnlLKlGXNsOzxP23mSrItA2l9zP8u3ycdwQYI5JSZecHdcFGlalI0R9D0KTqgok5+WAxd6f63u6eRj+q9CXdo69XN5KtJEAtaQtOFkr7K/9/rrE7t7tPTB4HLM8hMgI7y6cM5MBF33OIOaUVPiMtZzSxW79/3pP/ff/rSR+Cxvii5VFBBAocPsn2E7KmWhKtbklV1oMpTB9MhJwEdcCaUp1OIq0l5swghLpazXKawWK6Gf74//FfzZk+oL3saDF7HlHooeFOatUIB++qhUgkCJDmas3+bXh6TsM84QAmoZDsz6TTd5PoA8LOQmdmdDZQ+ALhvhD+oyYFTHHJazVNvizXT+8jAj7G0980AExtN61DFowRRiLv/PHayHp9a0B0WnsjDXSIiXQkllBBCF0oQEff/vSxnF7o5nXlFU5OJPj4V4GwYS234pLXfe5s1USMRFBQQBATU9LoBACfh4oM7vwQvu0sn4cpHYU92pYpIjb4EC92Zetc9xH33aYMe+I74EQ+MN17EJwZhakiSq1R7vY0w1WKrbbbbYaf95ZJbHnkF0TBpPIePCpt/djVsZWR5EC5ahdZT66M1dtMRTj/xncj3hKCBtuhttstvANajW3t2Bffxde26QMwp+b3LwYMGv3Cv+/d8PPnYnuXAMwDAy5E6ulMexR1DNflkFvod7PdoXGrqP3pUWEd+VHhn/szwKwL9hQYgcovi4ZGuvcHmW2mznTY77CzC0MDUDMVIYCHwwUCGZvi3Odz1CVetURG1FGMigUav2tHQlL29GxodFjmMA3S97S4TSQPTPWhmIMwNfHpKpDENIgOuXc+LviRYLaFSGPX7d2IikYGRiZmFDzt/AbxuhkYRSGQ0gMnu4ChAtXo9umo029STHgjT+J5xKDojxNjpNfUVjHgbLwg1ZkAT0CSEBtIidBgVUOXK+t0f0J8o/6BcQNy6w2CE+M3SE44BYUIxQxY8n2EAoodOHTbn3zAEShINLR2PMhUCRif/rCIXUqRPKYF3RF6odwIhpzF93wsQZIRdnzbYNRB9zKWRhKg0iXla1/N4SEAvWQ2NpEHfC1oJF+/YnojlTTEfq5iWEnCjwevU0gri4r9i88tF7WgwUiGkVD/tD1EiFDVB1dBDKWKiN886QDYU+0U24gIcIhHPl0SkJdLR0NMysDLetUGeYcyQOZ+t4wLkZhHKIhwvhkUNFrURcfzFoySgJWIkYaWvCpmyqeRSqkelPrUGVEpIepP14acftUGr3QhjoSqccavFTHNZzF8tFljM35KvsbLD5dZSWGcTle3NqrfHXir7qZxgcYbKnxyucLhBdIXgJpNHFzWJjuyJj+QkR35JnxMgN7dUexMQK/59ATlhgCIy6Gl7j+JtIjVUVoiotBQZvgUaDDljqIsFCJreUYsXU93H7f3BIWH4Xs7cgbtTCpfkRfNO5ahS61VRZ2WTynTcK82OpjwX2DLutqxe8kDLzbJ3tVpbETIjFt5i0c1bZHrtKlNcBAkQYIKCWwEI5zTjyAxXImpDrmCJxJUSg14yQFuawyhohzYjl28VKBVmmQhl8lbLX5TMBDbAksc8zlfiklGQMFEb2BoFGDVXQkOEM40sDBqGEZwLhimh4cDXipjs+t4RkoXziEweUaLttfbzL2iaFMiJPaoQYkeXjT+Zndk0QNdCj6yNkAQwiqp3sSrWQev9CDxmwWOCqwW6ZWG/l6Np7NnoO0bJO7eQPmf5D7VBAKvYlsBPBpVNoq2iXTFVn/SayBX5o8ejvmMNq9TEer1EBsyI61ulMz0eE2hGxm6aNkcLW+mLSt9Lxo5SUAagLYpaiuJV3dxiEHEAXh52/qC1m3I9PuNjakm/bgx14REhjDWacX3cjR4/AJipRwvxYCdJltYUP0iBgzzlB8vrVgMlDMNIMvA90+qCYEjCIDkhvDgUxT8gOcfUBmL6oWdA3wTMyiM3diwB5bjLAYiHADPuj89t2E0QHLshBatAAw68p7GCx/zrj1mAGMsFZTDuAmdOaEl+WGXNtOTQ8prKKNiJGqQ83ETJ0c4YyAgA4INZGWIZ6ofaTE0nL7CrNwkkrpJDueV+GJZSiizdVEw+GLupU7XzfR/51FIWeUgcTg8MMALKwXJuG1ru/NwUSocY65eyrkuSDHsWYIZp9sJxe7OdJVnYTHAugQPkRgShBKOFYISurN+E4YRTiCCIXJWiROPEUImlVoNKTaJaJLVpxNGKp5NAL5FBEqM6TKrQxq3EeJPQJq+cKabhTUeZMdwJL1WqtNtoKZid+DoNMT7Tqg0gjnmJhsDrbwEQIUEEf0l8ASSLAlAHgJddCigg9pjj4thYLg8DazG/8fEICo0hY9UA4AMAIBZAgCDK3uUptpRLOL2876ukphQyqqO/7JNOOcHfvHpxVKKdnIBzRK08X9MqiW5hJMfU4weBqjkwEGjFHgBE/egsgCABrcrtgdwClQ1/xPUAKOlzJkFMJ4DlHXK+T6IR8z5gFSEarS0EzX8gNM5PNJjoJgmai8eVRpjLar6loqVw/jhkSHs0UGwxaCO7UIPDPTU9LPS/RzUx42XW1PveqTa3s7HcbO5zZ3pCJozeQjP5QOu+OQDcCiOjE6m+F5zlxszn6onYZRjr6bARPii1VwI1E9ZhOLfeANB7bM+5IV9SYwulUhY+ETS+U4i0KzvtSKNtKImXiJzbXXy44wTXL6OFG1pjRl9nsEuR2u3XrBbOz8DUSiVPV95Apkmbwd5S0/ZXG2ebGG4OChhPecLXNYkrFPOBmSJvsywSji+xyDEZGMaAollBZ5HR8ZglBOjHZpDgOYGWfygwMZUy1O0mQEZxNLrw6VjXuS1A02MuG8a43W4jjKvvwzAk0m6hoZJrdkbuCzAqv7smhjUxEtA3w8Y571NNvZ9zn16mKq/vSQqUuAEjDPXox7GRlKo3oakoLz01Ga3nhAYX5uayOa8TuP6tBIJG2a+P7K6JL4gkGQOUichCyUbLwcjFyiPKxysgKKRUtKoUq0tUj6Q+jQa0GtIpodeIQSmjxkyaMGvKohkfzVn1Y7QMZy3aupVYbxPa5pW3xTYK29nsGPHWJ+lzyQGHGR0BH0ehY3wcp3YS7Qn0FOMZ9JzoBd5LgleUXlN5w+At0Tu89wQfKH2k8mk1+OwLxlcG3zC+X25A5FDwo2Ij8aXlS8fMwp9VCCeD2gLEc0kQKImbl0oym1Q+0qGMJ1qZ3EWi0qY+aB4U0bKWLjp9dKaY2Cxx8SkStlJLYtONUz96QwSrJFvCbdlob+3C62yeEq/Qp5KtthE5zZouOjpLQtqE07o7f4LRX4L8ff3Gbxv9C0H+43CBr4ucLgl2jd2tvzN74hPis690vvmOReRVuuagoC9bLbOXzX7HxWacpAc0P66DDGiNBuyYfg+YBJjZ/4OXLnH5Xqd1d2JA1rbvgxsFW6f4hDhcP0+4NSBgNA9UwBUqzHpLS5TudCMpe/3EymcWNERMAjqAFPacDiG7qEs0ggNa4J2NU4qNMezqqwUAsh7E9YCa9y75E/D1YTYZwb4xAHo/jt3UpjuXC1zHC9nAaRUvcBNDEYx975NNMzEa6WAMY0NwXsEBGjopxKrnAklrztkM76JkdGzy8+neLexww/SDoCUHsKUJIqp33q4tscdwNA4wo69nJhz7K8KJng4MNZaeQE0FqZNwNChaHN0q8uVAOCl4aSRDqYxaQm3odMOoQBmANwSrcgyP5IZqjClTJaRMtQX/E60LOBcxLg3rPhQRXgYwceG4SUJPSo+FkpJi0sRGpdi0OuCUPrJpSQjHbFeyDjEq+SZkSciRT9r80qVPlXr82/hYHhrFJSYlJaWJTh7BZ8ueLWW+CQn5jdqnHt+ry5G6EbqMY2Ah4xhMSJhv8KQWChLRA7MESirqx5AoEeakx104WaoyLbXRTYUBhjyRPNNf/vaPf/3nfxdcfMzsEpfcdoCOhiqlCjTodEbc0pY9KwkrbMzU+FhOITIvCAo/oCiggAMhckHhiNpo8RgJWIkESTiN8ZqNgrNwKG6GozcFNUIr5mL+4gJ00R1xFA0gVAykfrajeIiJkcH51hAsJMyP4WSio6Oih74JiYmNi0+RMEo5n1QhHiK06OjoODy28q4D2R9VQeIu3BoRgQZg4kZBUmsJnWkEczVdPHUGdayAszgDntZSljwRBxBmjRJFmeUq9F+PuaGuDeLJ+QPOj0xr0MLWjnEz5fmfxuLwuy8NAW69ZQMZ5IA7opCv+egju/aGuGOqKrqB5/9pvC5IP6VTh1bQ+pTyPt2g4ykVbbpC+TrWE3qfsUkMPOethkMpgyMaWw1rM0NcUbNKPFb6N9VSoBLF30x0LGIkSNXXUGNMNvuPI5zzk19hUUQTFgAS8XCE9bvanCZ5UUM7mhrfh6aH9nnRt0nfg/0c/Xr3O9/f0L+s/8L+1waoeM+AtgPGD1g54HD6rgF7F+0//5etA0O1jv7tWwfxWmf/la2D60W64A+YxiFOp4VqMdtGoC8dyl86nL71iGGA2rTgJkCNEgaBKbkPGqGKfNsDvu8jsvnfxJU/4BynJWnm/5fKorTVHueqdjoQ3TTPPjJ/fnopx+uEINHGCnBqYgkoSsFiJMlUrIm2yvU3wkTICQAAIR0C6dnBV5FFUe7YlhOTHpqdwC1KgnSFSrXWVV/DuXIYBShpyDhUENwVXCLESZWvREud9YYcoOeWXjpys7NueE5hakmWq4EyHeGRDbQSC3s+Yqafc2ShavDIVk8zyAr6WEpqzcEBnyyHUgxkQT9lnZg7LLB1Az5l2Kv3e8iEMj62lgmqHpDHNGtF/SgyoLFjaBjSYyY+oFhEjivOass10aWYoz8mTGQjw6MfstTEBUZAmd9DIohMdeKRuvsYWVN2u+CMJrxc2mNkj1PyTy6T7YgotWNwfxYONZGPTajaCwlhSU8saBUKClaA71kxmm0KdrAf2LFNMFKwA/+IA2c9ogd7lh/KeE38DdvrHuwZs7OYk6KxPFx6Ghwe/NkXdxFa+MNxqKrw4EciqkzpNicDmPNuJy67/JR+hgWsYmpuhKq9y1nH5bddsR7w7p+knReQnzYoQhgZEBAIRWKJVCZXKCFYp9FiFE6bDHqOJ1EmoZA/6rz3lEUSLU7EqPzQuG21I9kBo+V6+XfHVTdh3uCZ9Dc3ckZkeY7nFgovQm68t3a5XEWyPX6V9Rzk/yKSrpFSDWW7S73/yPFSJsdTh6cS0R6kvBNJZMGixEmWrVipMm111l1fg43wBiVHI6+XziKvOgu97CzwojPf8848z/IzfEQUce4Wet99UeBdvrd5PjXyNMcThu+GzCDhPvHwnn2ER/fsY0Q3oWHypdNFfcVPP+cTLJXvG/pNoZbJbFa5YNMaagQTs5KOR7GVdjub0pgD7aJ3sSyWb166NIFTDZnJtfxe/dBu8VwPM9R/5HZ+jIhXlt2jUqq+bA1BjVBptzYXRrGEiN4uae6ED9LulJzxN2+ndDkc8qhAAZWoQjWKKKEmUJ2I2Pw5P/1SHQEGCVJII4MsEMRQuQB63BJEF49TMYBcXqUA8pZfbTxMg8QAMpihKIbQhAYAzuvdlLV7URYcpZ41ljrZuweoH+KYAXgPAMBe/QFApjMraQr0OYAfKADwsv74BKhBRjNQG6o6mpD6dbqu1Y0ZRB4oD5bHyFbZITtlt5wgp1N6Uzb6O/2n+c9w6pzG6i4EarKliU69hDuMli2y/R7E/8F8+729tf3W03r8fLV/+f/5F6fvHL1zpAPtbU8729bS5lRY+O1iOVbO+/utc4Bee7Af/FwQsO4eAdxP9WFY7i/2ifwVP5G/7Ot/CRpTU2l0BpPF5nB5AF8gFIklUplcoVSpNVqd3mBMM4GQ2QJbbXaH04W40z1eX4YfDQRDmVnhSHaSJRpJW2DMhHETZsxdvGL5ytWr1qzbsH7jpi2bt27bsWvn7r17Dh44dBjq2u7Y1XqurEH39nKoWgz1AMf3A8Apg2Htoco2FIBTh9jD6HFzTnBtXVNzfUM2J7k8nRiAC//+h1FTR04aP2XqtMmzZsPcpYsWHD+sbFgP4PRFAJBX8L5DUxsD+XU7UN0KtBj3xJrfb8i6Q7ChAvw+WqzBIEtE1iNVckRyjs7kMUyMvBiuIaqpAOc2kckHipTIRMhMBPMVjWbJ2cr62J4hV8GOSTzSZMpH/z4/UmTJU6B4i9x5vXNmjx0zetTIEZXDhyVDBg8aONh1HrvRSgrOKMEIgm1d5mkc+q5tBLIj4azMUDCA+jO8nnQ34nI67DYrzCZv70+3t54lMQpTvp1vVysiYrSaOyYvgUyhdN4QtGmC7xrV6ZnsTiplJSt4cJstr/azMKVr2kopLiQg3a/U6XOnmxvKwjjoSe1AIazix8bhfRKUiotaLaV9Wmd0SH0ZQIOAJZkA7SGfjsBsbtzLiLtTi/SnAbRpy5jUrNjM62ZEDbuVgbu9t8RLJdQApVRcEBO/b/oRFwgzcgPjFrZJqnIcyOLtoH4Bz/nz/KIczJQI0vLkQxMqwHGWxWDP8PITMlRYkbVF+Zc9Zo+3S7USCW5ikvzQEX3yQ1dulheEMD90m58JKXU3Nj7IswwY6n2ECcY+s110kk7PpzNWLn0ZzRQ/4sn4tgLhuUUHEvBT9EIn1LEsKfk59TqRVb+OZpDaI7Lpu5B3D4QgMvGSiDApp6ttr/nN2lZtt1RFtyMey59N0T2CCBB+WSLYHmS0lykw+1c3LJdY7N4DyfCUZvypnaAUiWk/xKCreqg/UuTmlxj28PanfmrdvLyQaiWL1KpZpplPguwO4Jizkn8Ck8TsKNE3cFc4qaw69u4aKtYtJsNzyTZeeRjWM7RpjhPrbzgdJAyfkpyeUhGYbU257s664FZl6zk5HZFxJ51eJyith1oVsDzkWwXXIjEbkdvkUlxGJBkXYTK/QZTcVH7DlbjySVCXAa/x+HXOOKPy0zDFEyL4D80TubAeZgrPHjy5ub1eHG6UsuWkWqEsQqu+q1Y63eg/0B+OTQIYopBX08TqG37qD4fcKckqlD9ycndnoc2MncLXSHcayCxHJXknW8OeZtmZXXBLgC5eE3kO7x3kJsTTPDh989VbCxM09bKftDIMTPmbuatWEgVRtWaLwolV0nDXThefBxdGTBxPjlAXKz7XfRLJRUVZlOB2V/ybYi40cjY7xXfT26NY2jOKZlZCEtBuJY6xwUA0aU9ZxHvChbOChrrR20VCMZe0zlv19+0O3D7mScIR0gdSWJRYtrp+OY9skoJJ+ZQ/+IWkAQ0p5lQ25U2RJdVOfyLtQjITqSy4ezEWlI0ZPTZ6WYhVjY4b0OnYbRTIDsWDrJ2cVeky0OEoGYhI0cJLFhpZ9eFY2BTMDbk+dF2zYL7kJFS3KUrOWUV4qixPcVKw21O1AV0GcDvkSShwIJH1wiKCcJCu9aW3Reua/RzG9WUaYDu9JBo4g5iyMmNld3WHfESmjRUEk4931jQknjDiNIQ9DJeCOQn99zCSCsHddOQ0K0qpTmJ2vIyQAVYLOPYMolEgsLwtfzvKYUXHkY3XTwwwsqYbtmt3OAE6DdrrlYpAmBuJS9ePD3DgSezMb4oLKQFWl205gr+SULLlOIG6I5s/Wq3LbHkC3C+5kbXUS4RWGoU7VPKNxhCAdlY12CvhOksNJYIPcyRYwAOLbhCPMXZjU6VP2O5Hitv5o1j8kHic9JT3/O6RRflnsVkSjgFj7FrpThCao1XhgIPF++NrNmCl8eaLVIv8sjIVRkrRi9ViODWC6Qbnxpfln8A1fhAZVqaZ/V4jwzoHMzAfnbWw1623SzRt2afqhhbmuCSnWG3IHUIHe0KXDlPjin7P0WjbMujLtSips6hDJEVwTQCSZvKREQS0DohbkyL+mSDRyfEtBNMjoSrwmiHypHu7+RTriJsty1M/NIBX8nwfGSED5tNq7ZqlvG6zJletvLAkuidO5T6x1kisPX2MKS5aujoeUmQivxAkSPxEcPzNFjdDrjsCraI3KwDcEv0k3OZDdEU40baoRtolrLLteTbB3TTkZi0VR/a1043dYc57hNCeQHlBIfJl4lgD2rtV+oTfJgZmEHYksiG7syvTOvWXXOtfiQKpJARmY8vyGTRzSMEAjPAZ30RduCVXTIyktVb9Xbp3qw7CWmTvaGhtbPEN1BDgW4WaOCPCRd5mbKLgROQzDcyqXLMIHaVg9pSXpnuTKnbCm8OtyvkE0J6QR7Yfk8klgBe+5KIwEI5eGjjR1UrIdVVl3c0KtZeGJ9je+xYl4bkwEaaI0tAF3ZIVCP+QxxD2m//szXxuxy2ObwQs21OGtnlWaJEj7TQHs9p85Tg4MN8gl9z/QIFgSjj1LuVvm+gJ1XvXmvZrrW8mVr77VvjZn+ipB08TToy73DWeKvWWGzg35BM7lv8nVi1m2SY6vVD4lfRzwykl5+J87WPzpsJjCNyaneITCxwvyv/ttgrjhG28TxkEQ+nhPgt5R8AJfGRtuFrxKRvTkA5CX/THSMhhkPKi3VLe1Ad32y9z28pta6ynTvjP0zqL2hYBE4zx54oNOfTyF2pnB4ahj41SU+pesiE3g5Vsm0ZG5hPLA/gMfZEfzybh4HY1/4T4awwFThTlL12semo5gk3+Xyzc3zSmIlSwIRxqxRsnfTy+ENy3/hTu0BOGwyCrIYHyfDsVNOBPEPEipMI394MEiOAIrUsAANwCAJCLAe4IjI8B+A4EoG8F1MXA711BAOATrp1+7BQGgdVkISRIIZEVJRo1gadbT04U6UjCsbMm6jh2kdYdeGdsB1E2JAALhT5o4AFKcujkVq7PAhTHcm9LPYYOYEHEgdNRcwzvmalLETJhpyKktZdj2lcjbyFDJU0tuFpaBwatRPMOn8/uYRAwxhFY4OC9QHEfkfOABYTkF3cJu6H8ihyKZAlAWPKLwXUpLVPDeEaouC5LbRoMunQdBnGYYwwIAVi3I61GmobJVmOCJeN0JI2Gf3O7i9koFDbxgMPC0C3801Iz4LmQ0mSTnaQGIoHKucRVn072jURpOYmxpJuH0L6T2IrgJDZjYa6jQiRHxhigFDqH29B5D3PY1WHYCtK5rr/1c8sPPl/+XnDG42Z0O6mzevsw86KfniasB/RTcsAEgjQRZwr8QWrMSO4QB8psh0H3N7ylbf8wYUyGAZ0RBNApQLOQrHwwDw0CVAcdHGwhvoVjGyoZtqs9tzkgi8WkOuVMYV3nUzHTdZcxAsfpww8XTDVnhb95BUtrgtnKzJaVcP/8EFnZYm0bAylrku+nDkbo0dlML89Vl1bnfyVWSxsjj1et63r9dqPkBB57g7xmI4JK2ItCWTb4okXkWw5USq2xT9g1U1ROMjMm12HNcl11lf3MboygixK8892LfBsCsgHoMCChzl9mhnOwe+kifvBxZ7HN6NCpXORmrLft7ptxqciLyt3UWspDtxt29/SWRxonuB8d6zID1Smnl+5ptiSGyFZEwIzZVBaLor1sOlRjL9rmY2HyENCY1jDQMtI8VTdckng579JIjiAvuUgXO43l0niwSvExPyTDpVaxnK/K3Ubv40fouXQ3zyjVNYvLufBdzQ/cr77Pteo7cVlVnQCzixTbBkmwBUYjwReqbWwr2wJJ+iO1rrBUIsrZ86Szs24C6lv7lJ4cRhr6Xh2NEu8IYuRJvbZUoNK1Vol/c0rH9vOWQrtQ+jiGQxJ5wPCzZNIXthqjgl2AEPxX0vHCDetLMCeVt8nGjUkYQSU2F72Gs+E9kld76F+4YH0BimJ33hW3n4/5D40akU31+DXyolYujTDuxKRSiKRGnkOeLEdhgu07AEMcMuwhRQnUsEhTuBkTUVyW2kUSh7W7cH2eKnbpCCY8qFuN0gsNi3m+smXhpbNe8NgqqURh27zJnYOAIQQtrunc0hPVLaWeI6fiSvfgxydll5jS9XQDmR/Qq+Z8sBVGnUkQpGAl/x0dQIM+GeucHIjj6TWHQxQknQJBDGGgsMuD2jDDD77fCDDeb44SKWEBtUFG8WhQECVyBA5GxQxDyqJDZCY1eu2NwkEwkOFVpkXPE/yLsJmexsYiYBwBpxt8FdiEYau5PuWPPE7ctG1OZgxJBqOLWduLp9HOvlOyh5em9MO3Ifb215HR2bEhcP68+fSQAnrwpdGJ6hgD5zOcL3QMmoFKk2iMZBIGamapvlQ/nonsrEIx+4/bvnNb3g0WR95U6TSVCfCgX16JOgG6qjFIoQXqyv4aEGWdXjebLFoYdS9WJDYWBeBriJvYpkb+kLx4D0/0BPs4PYJ19NqE2bB0acXBcFBQtyd/irDL+2pGFjBtqfEAelJ7XDLPZBTsPYuOFPNUCDeqK6b4Ducy1L5SSUIRD6LkqJTXTDa+sNruXIoZMwuQWYVMQk9PgJEi4Fk0GdKLgWfxyYzfKB4nkNV6miudxjJKgmpZhqRDbj7BXws0nx58XjMzI8P2utodzdLaTPWM9PTxRd7oRalFVcjs+F6dgoCBQXVFQIAcWK/0ZDb2E8+cJVqZDZeNPlbrMrOrLNjf8zqnho+3aEvm1ph9XYYCAoRUe3iXt6a5vdSmEmYu8m3a0MjmmjG0vhicX7zxoo2RtR63UTTQ4KtL1ZNire6LQyQW0CJFASwIUN6GEGA/n/4qaWp4Ep+lPqqPuflWVVfBeuEMfzaPpc+4EIXzdE0rgnXdmFfMM7sEXkSrIK8Y5tRrVJuwyRjLHjF8/9xDNl9ljZqR18awJZ1Vw2VJmmwsZdWqIiBK1NMkXz9PPyo0KRu5OrizAJQIqKwLzLyMCAvNBu43lDCztJGs+mKwqA6jhfIiqInr0jkKyI3d5RzDc+JZ+uOxDca7cI/T0HPVvkvGuoLbG+k+U9H4C9GjbwabCKw4UWUo1AO4qYVPc6OMkaRW5xXZzpTV2s9+qXbuOGmcv/5QrYgPuzo4dhHsUiUs1NUp7tRiy/e1NBwf+Gzz3rTUjZDZWGzJnvv/5ektzSX/fwrZcxzNnXN+vWql5Dyh5nAxW/K/bc3VMm3tok6OFNCa+S+cOeGajtQ3Yam526vtaQk2CWK41vGnQ9k5KS33FQ/YsGEcX23+WHFZuqZutIwa1HKXYBWpvznx0/5uYaixF6yGn/OrwQo31djj+zIDfd4R3a6XzOQTVc1S5Qg1gUvGsYaP9Xggbr/mas9KYOW4gjtdIVwx+okzQs/xPamNofTk+nLLP0+n4GeeYHLUcNFCewILomw9zs0L7K/4vKyhSABuxPX4uEWVxVM0yl2u0O7jDLdme6MZrT0xV8TFVj9KtZExFhiP6R2gPWOmH+mlZvBzl7I6RhhtuxIg4YWz6moNF6uVkusElylrkn21rERGhx+y1xR1BWJx4zLT5gR4EOxB3DOWuYcWqGKKBK0ON8v6IUeJfQANVAK9OI/iyEtrpTjj3XzhD1t3taoE1pd6yeUNHIWOHIvb7t3q4lyJpYSl7WaPJO7CwugOa0+rj+dy1MUTGQFuz+QtFB89top/VGh+0zzkw3mDKyqmUxjVwHf/ix+BfnFdfU6nEE3tz0qwyw/42PxbA1c/enTDmnk1NOD7Nf9HEES3CA7t5AJ8pxfqf/v3vL18mzbdM8N7OyOb70d0zCRm4NT3AbGfMGIU9B3ODD4nB+4+epo+lP7xzRJeF3Tt1EOK/eFr54/NjnDCNIAvlZCMeMOIMiJCIRLdWwaID3AA4DRufCkEPI9m6Qr/ubF6rrrwUldXbhjcV1ndV54wljeKhpu//rVnA1cdyjbvC5mZg5Q5vtHoirTx0fRqmJRSBUnXGGv7L2zoOy6AA1v5iB/IRHmzDj2uZ9FRak0a4HVlJOc1JTduDAtygBoAN85d66npuobCaZNkJdnX1F4S3tzVN4dz96Ei7ZrUPQLf2MH3X6jo36f5uuy1622HPUTdm6QrfNX+Z33pbbbeeQxH5Hx2NwlMJB7YUZ6IfxUebXjUvJzkba+aFyNwBcf6q2taca6nC8zMn5enrr8s9TwzwMdM0evy+7oL67SzswRZUT16AOTf+e7/3p8x9bljJhK0g2gmzCQOivkdeYhMfyCbGbLoz46Blva4qZ0DLB3JZ5ykM9PTXR0DSqZ2ki46Uy5Oh9Mz9smc3n7cWj7nluW7BwThANyvKSfO7SRdtVn/+rcvkxbOhgGeO0M6FoWDlgGo+4GDPOVT6fsgPS/oGMrv7f7vXCHz9oESgBHDfJCwusgtANx8PuB2CwQCRMDfOvhu5DcZvv3IfOjwvNRNywXCZTzeVqFgG69sd8PqrQ0+GaS9+0OhbgloAfOtjSZzHWwEa+b0mLYwBeA7EJ5A5zX3tjEJbi3jPwZjxheNqQZkPTnz4uKQdbEevkSY7gMkeJ54setjSz9NmOD72zLuQ57gvbo6Fh75Pja2aYHlI+fXgnWtdBYnVDPiwUqmt9nabKpiruyrl+UqXuQo7qffYdDn9/v2wUclSHxyX8zlhGn4WUY/um4qGKgv1cN6bNM+k5MdcL3LfZcKB3zBDc4BVxUW2q72HJ9PQhsDSwu9Kk+Gjd/pdqMrw6ZWS4B9wP+a8FdkzSgv7dQUxRZ0ENDg9JlhTD1AuvkLR2EyzHWlzJCagyKdMU8uz5SVVVZfuAh5d+Dv4jJpNtffLvLfLqOMaaKU02llIIWtTZcr7QaZyKqWy9aeQyj44oBXlytUoHK53N6AoacEtDpdbqncyGqYbUsz3on8GvKE5vifI5hnLuJTXDbb6vvgIP2XblNBfi9oyvCD9C86lMELDfUmEy6JXIi2UK0tSUvTlZbrIMY1XLlJU6pRAoXLdg2CBJu/RLPksgK1odCgM5aWGw0sD8RkgRw2C4SYbLa5CbA5YH5bEF3xBijXeyDoLIy+hiuTayNqjSHAxvSTuHkKWTBHrNOCBUfBiwtLMGxPQKPWRSqapcmWQXqJxKyRyVnnAr1c5/LBaiV66fUZsFL9KHrtzhQKiGGu0UzgXCsKqtmUucTwmD/EyNtcwiShzsO1Kr9R8zlJaBKl+GwYvt/NGI/hGW6s7ugx+FiLzRA14+jPQGd5vX0XYf/XSxJoGlyfShfdU0o2vEUo9sKQRxcWSVC5UuFaN/gmnRuM0nYfoQkhyu3dVVK8o6zMv892l1RU7Cgp2lEWdjVYGQu/NdiYAnlIKoloNdLsgFTKAilTMaK0PqTnKVxKSBtCZ83yh0Kz/YE5Royah6zt2yxkP+9Pm02vRy+ZzG7X6ZrJlCldebiubOsZhemXfTQutycxH/O+ze2pKurqqSgTK4NKmQw5g/FCQa1GExkqVeNgNj3vRjLxjIm248UxC33Mm5SUv2YzD/8uU+LWtcrbVFYGxquXesZqsedH5vGN7lE219hgEAxrcI/OKr8/YHZ6EJ/edadqdVZwZSEjRoVVd257RsydNWYM3BFjuAcrLvfaP3I8nI9273JOgfzeTIESNbh1rQo2l5YSC6sXpU9WnjrCKQP0zjE299hgEAxvE6ctD6AvIbuN/YtCzkSQ0/FoaPkaeXoXKq+RoxdQuAZGyZHevx6D1kuNgQR3OoXWWKaFvdAf6GenojxPYYw+Wk8rxtRSicGKbbMwJR/9NaOvoezMFe1q7/S3TPtzB0abtF/wn+89gX7rhhsTMyfP+PHZJUuL1Rhq0lb0QqjJD1ZdGCvDrWmTu7m42LMwt6QkL3B5RjocY1GUGM1FkKgZPr3rq65IrsvT60mnjS2lo98a2GeJVCrxLHt5X2IuwcPNwTJvUwnGX5uAac5psd3EXVr5KDDKBKAjx/OrQMxdfue4EZC05Zt2sxIAdav/jvmVjml7ilZDRz/UMdKoFcwe/m+DZdzFFQJIYLCHgmvqNRhQUCOxpfmIl52E3KBbqgwUSA2GMF9h2u6mroG1GiWiF3JNMjD+cxalaChqgbOH8dSaZ22/el95/9eOxv6F6webhmecRs8HwxWBQKQieB49nWEY0Wzx4gf/nrOjb0ImJjHzQN+cPl3BIVG/54wavIN+smJwaOHgJ5ipnpwTXaEFff7EcMuYEL53j+eZxbvjMTtMRc8zv9YWnuJiTnALY3s4vo4s2MfD7Pit4ONIJzqEUTqKWue9kTmKOt77Bt+HSjwHd2A74F+jHtw1zsMDLAVzrmTPdUGHxCWf348xI29nDpp9A36Aze/Klg53YjdKQZ7QJfa2ZmUL3LEusjrdrOfa6GndD4E0rbSxIgfy2jH+oFQpcdh5PDswwhLLgmG1gPtdvLkfLiIrwji9F9DrvWFMcUSmsVRZjO2I29hWZbGkuhAhP6jR8IOIEOC7hIKNeRZeZz7pPq4RNrUhiKm90eLIqHGNcJEFDpGcj4gEQbUaDGvkKxAx30leXof48NdwVRZjmxsxtje/qhZNWNaE6Q1fRy94nZjGsEwjd2H1AohQEFKridG/JQDpDq7ektaG2HUdNXa7sxLUNLoGkWZyxOkuFrdQEram/ldr88w2k7t3Ml2G65K0dUcOkqMU8ax2Jp/3b0b8X/HUn1zBGGTMTlR45nVDhgah/OtWKNIDYb8aM6aJSANWQMZWN2Jsq4BATZZoAsbufdc+YWQ1n+vgA6hWB6AOQCBw5l1aIOD87WgydKHXe1swcJZUkZ1fkWVFNRaLScUGhUwnJxlNCoalSQRJEiGVkEQjcLLRn6jk+J3Xb4UH9jY0DiDvZsIojDhcoMzQhZ76/L0Cc/7XizxM+9W/BYPL0ASD1r+TDT+9TkwgKBWrfPLkLSG5NhQqj1j9GusKNfN+qp1HQdW2FSrmg1QHLwWlQk6xhGWySF4FoGuCjFpOGp/m4JDRpEe4ZivY7nR6FpgrzQsELo9AFNRqmXFaKPRG4H3yeM0Pr0sdLI20PJd6Wx6ijDjJkGfP+KTWtYj8ueTy3kKb40T9P1HDD68P8xZVCGmTIt1sxl06zCGhSctxla5hTirfIeaLICadElj2+BJiVQMyMEiTQqXqDDuVCgW5r1KSdx2yxzhinA6FUA6HGSr7835QVCPEy0QyZ6IzO5HOeO53Bp08MuPVy0TSElzesHwTKrObIBUP5NPtHAr60+vAWMJSWVLfn+Fli3qtmJd5+UdgSN8foZbZPUdOD46c1bNlVmDNj8CY+aPno/gTvbZ/yxt9ZPiRwl3/7O1VMOb06NMFsffI1x5GVrT1WjQworkZGkLPBkroyFQ7UCJHluEPtAdDju2cKVSYOoWz3REMOeNhPPM7sF2YQMTYTKLtwHcmHo6P6kMlFsxEsC/xzN75NlHfABfp613f2fqWRRW8Hz0r/VJ0wgk8xCJWpyTV7TQeK7xQXi5Z2aNH02m+wOvLqcPGpfSPe+8f+Gh9xAH2Q2H0Th4sr4QgeVUefPvO0v8KMu3FLnKK04ortVZ/d5A7JY78SGnEkW+J/auKU9Ugt/eR1BVh/VpZ4dg3SwggTybJish1nnw/CyHvWyNSplkEqS0TFctnRCZbmwZyZc8jyUFmxVYaNP1glgnMPBS9oc1ua9sQvdEOgfaN0RvWmOJptikbngRe0UEWiw6+YjD/FjBZv2/YDG9G/b8/ww9S86e8TsTwEx/n76O2w+vR9fD6jX59+nekA/EjSxHsV35Ia0SLAKV7xND4LDd5SD6iUiE6gdRlCBJCRDRg4gC2CUFZmCtMj0iMchSQgzMR8uo0rZBWdi+BcdyEL6HURAI8uv1l1NQVaXFbanPWJslcuhAx3/FrSlI48gWf8DM+4VFC/OOEGT0e4VOzzwnq/+PK9PoygwEsMFcaZ0h+sVhNiR3yi6wpIimJ9TTDT4Ms7V/chcyS5PrU91umxKUcoVCOpDBG9DcmjFiJc9IBkGepQDwsMIYbJTGpRSzN4KxUZkhhUYS4Up+mbyGIkeQCYr7laTmjR3VOiv4Em9bIhFYqh8Hb8eZBtLxNnexc0sGUhNOWaK2/l6S2n4ACWR2DjWpVtBiVKNbtxoP4pOEHT3FpNN5JH1jJa8ZdRTsUIpFCycktslJLcuwH7j543zJ42Z+17rXugncRL3Vlw8MdRBoL0BdLdLlGI1i/kp6yxp2RmYFEpfVWRRGSvq2wo18wtuDdhVFxLTGxrXH4K7tTI3JPTB93Boe9gJd7CleoVZWaTMx4rtGYe2n2P5kwn097/qQzHk5iRD2W9mFdY7h6diY5zX5w8Eu6OmCU0MHkQmpIG7rrpqiLhnDxHx7C9GzrGbmsMbt75SorkXeYx+viJdoFno5FMTGLohsSM9E5IKdnssfJpkeS7+664vf9lM5iG88UPo0rxpzcL+VPlk83+3tEez3KuF42JHd2/7ntM1bmB56WhyDdH+gVYOpO0VR1LhQwW2FHL6DjU2VywS6zh3rE2O8X4AtfafHDy5jqly8eOj6tWMJaczH43zUNOZHlWJxVkrtpQ0FJ2Ml0zHWA0qdoOFzbbNjFisxz/lsla3gtfr8ZREY4nOP8RXQv7UhYWn9b8m6ziUYk+py1S0NB2Djg7w8uTdtvVPFuos6DaBjTzDQWy03UmdPkYlgv1YI2A6YEY4jOz1WCuhyxLKAsDwGYdCjTZFAPLVGaWJTXJwQ5v9pOs45zK9pKG1qsN1mGymb8zJXpnZWmECHAKziNLXVwD6vHXm3+v3XEeIWvYNqSSZ/z0oW/Q6Hb5sBx7OdqxztDNeIR2/PSczfXLqu1hDw2+XEoscbAD3hIH2POwadInf+nH3qKq7WYGixWsK4qzSiEqQyw/w/uCOWyEHP6FqK1IBkWFwLLIBJkhLaXeg0dNRY74LHzuOkSCddtAwC+A5jp6QhAFO/wb5M3gEKvnvmd0C5419HbG8ODYn5uFlUanf7RBtvCqsNnRRWmn2dJU2/KPZL1k2iddM4gYgYBw09Oegb5AcVZAy7YfzwvnrYLvdUbwjSFQ4KOsKyxHXpsuPMK4IUT4B/oT3SQTNoOrCVzpk2Q1rbC6/jI9XA/OrwrWj8ntZnbDaFuYkNQa/Rhimy14IB35aDZL5xV3C81uNr077+xyebf7Ab/DBs9PHWwqN6pS/fx5WDdvvZlqsM84NC/fwSvJ/NwXNymuNjDsbFHYus/ZQimnRxIdcHMb4lJ5MH/9F/zlKCGc7LHQ6KO8cvZ+IZhYSw244eZGHXxhiGrVeSIOZZANBMGRZhlDuhibBOrV8bO/A8EBULQJBCYwPcCrFs8c4f0yybXi4RNaLNiUwfp/J2PTewW29V90NW9Q3ISYXbEOUoTqYyz58E+Ek4i1YPz4uzZlaM0DhaCf86CjgEpSIePiLyAv9MTE+nf4RdEpNOHgCsQ12oLezcbPATMeaozru5l++uecduIvdLWpqyhF3Egl3y0acHBg4cOLvwAY0sXiPNh4bYGrD56F7wL2wN8PsYdL685XF3tWVi1enVjjdvtT2/0jk9HJnq9YFiz1zaUL+0x8BxU05rNtvKnpFbW7SCOYh+rTh6rrSVGq9b6pijrm5rT9DlQDWSqg2DW418MKKs5PNj+ZOXEYmFTwf49JU08ww+vF5PcUCzDPwv2JqV4UAsR5dzCNVugFjsCNteC5nB1WeXRvFns9KBHbMvUPqi0ekK1C3NSySYax4KLOvhfc/ayQs7vkFIMOtKdTEyOjcoH6y1wi80OtzTAJr6NasPwyu9NnjqxSuBPY9NtfAFCaRwWG1zazuezbCCbTe61gm9wmVu4VvMFx+GkrlbIZmNhyOnYsmYbqwSqSNoEAta5mh2/6qiRuIisEeP0jpnD/LD+uKidOUiOyJEddL251xvCFGfLNObq2cP4oTFTXTrTgHZDY75JOrhWR4hDzFC+jn3qwHzj9yq1V6LCPbfMtfylx9+JBOkJON+KGX3dV382Es2O5gTf3F4dCVYYxFx/y7jgZ0L/88DhD5mE0pKSaFupLuOap8UwLr2a+fe5G2InthcKI3YXhJkTh6lxeEj1zm3QKg6kcW3Lulea/jSoVFCwaVESMZ1HdP6bmejMDqRjI5NH+iXjj5uJHBRyxfnuC5A86r/7nJNQ+fkV6U0Vb+pVsJuVUd5sW9eG/iZX6be01QqChs994RpcgHY7h+aiPJiaK6UjLMbW7di4Et7QfR3v2zORftuRi+Q2Cilf41M/PUejkdE70d3W5ASVOZvDmzD0gb0f4fOKk2KItRRDrRz6slcz/T1Ab5LyNd5MJGdESVJpvFf3xWLND1TsAC3KNWmng0N+HYsDEmVKKQ2TuA8l5f6SukP7l3KbZdCEhmY5LSgWexbSIpElB0t2E88rkdAIjxv9S8qNqm7WpOe7VVUmbOKs8eMt+XFx/yYmCrIPLLFIAIlNIyLLF+XlrdT+GVWB2sU79o2YnkTIS0p0ETkqetL7ePzbeCB5/JkuvhzUCAQPV8jkLqOCeG79FmD7n/oPYpXYYRo9CZM/MaEq4AAunsusICYHSaRAMnt0U+KRy6pFA9FFhBiZ1ayiq0/QiC3oVXUqqTh72LzUQNW46NQ6LMVp30k7ZE0mBpNfYu1RVlICo3Jp6pYBfojb0Pu+VMLRFYQWvMimFYutWlFcC3HFUYI0XS/HP/03Lu5DQuJ7PP6fhMR1IxMTZiYSZiQmjSCq/TXBqrVRmK86SaOf7O+WiE5bicnWZFIwmRgkEad7lr9o+SXjZxle6p0+pKO1sPC+Azty5MbkRVD7tym5b8V2ns4lTNr3flwGA4QEXMehbo3e4LGbXyAMhvs5k3HdzWAgNxg5M47Mlx6eZ/24hULZkkLeDu4h4z418D0/6gXj3VIKZSm5Zp6Q51lumYGzPq4QRqncx/uCiaO3t18erKe8qMGpr6yPLxeb7hvy3XmEt7ZpzrvAU26OizsUG3s4Ng7pGctL/JrbKE1qDv6b5L6L2T0W14N86X/pTMhIbMA25F2pu2b5bORb1c11+4XzvnkW1C94aLq8tNZdN9I5bqRDYFA4ReOEiz3QdOMdOQ00BZptqPiVEKpP6A+XB6ijl+glc1YPPlNmw+VoyQ9GxK4+xa2hOsrXBLtV5DuXBRfQRoMTSxqcVPbBdco42FOmzoTSU+jswVq8PViHLwbr8WGnBu/bQBuaoAE0SwNosi3umYbYEoppM01CO2kS2lqT0DaahLa0VRgoq6moXlNRla2KqWDraKSfqHmhHE8UBivwn8FKPDdYjecHy/BMpwr/sG346A3NRp9qNvseEBjoHftUGxqjnaJe7RSNs7100Be2D9Bnmo9+1nz0jebT3oqe6SstRC9pIXpfC9EbdgjQa3YEqvrvQlBG5eR0R3/4a+jnXRn1p8oH/7SGEf2L/gXzndY553B0TUJbSr5N68k4aPOX7hDlaIHugUT27Q8DvGZQ92GCT9Njan/kqru9+4PGawpN0JRERe6z1UCTqCZHQN8HunbjZu2m5e3mce2Whe0+S5X1TLttZbt9WZt21mO0/Yn2f4H9B9puCO1HA7cWrvaDdptAh3kgLoWby2HeWpDngv8u4LcDlK/gX9MGnab2h869k73c2benOk/1+nSc6fWs8TKDGWp+0btkibd9OydHTy4VYOwf0OK725+LDwhUK4/zhCf6DEpjxpRFJBeYUhI/OnVii73LL+aU2VZ/iK8l3/Oj2l+trP+B/4+hDvHckQC5phsFtCpvpWKAv+WOBViV8QisigLwqK29jvYDS5BzuirhrdUpm9lj41xHJW9bFc4OeB9BINuYTnpscqPuRNp9/42uzsbllIRjAVNv4AAshMwC3GprJfgV4B3HP+o+jIyi2SMDdNyQ2JZ3swMdIb7FfoTBqW6IbAO2GSA8v1IKA7BcW0pz8e2/RmNpW8oSX38gABc1pJh8Bt43gB5XFzjab+qmLxOArSlnAji8qBPxA2s7bsCB6gZG5QwFyh8m2Ips1gxLVGkd1AWQyY0sIeJD0jrX10bpBmlihcc6ZACTMhJGmsoInK1x++aqAULasCsG/plRNFgAOaRWNgdZnm2kecX061S/LazATiOgtapdHdQakLUgNeXe/Lbrolb55oluXpRfYvSTUcZc1dqhknPMWHHF4iPD0JZfb58OOpUpQ7VrloLqRm+na2zcVTZRY6pHulG9La6y+qh5HWe4qurnruo9SP4LTmpEaoCYierT20ptkADaiA2xxEAyw9Y4+dBGo0BmJSLI/LTdlpzYYSZQuzCZDZmd2WZShIlregqRJRsuLjL7s703c0fWfm6iPh1Z2/RZPKJGsULMzrzqe01aDTZ6uoH1kb4h66xLIcuSdSapr6aNBBFRuMhkbmxq7mUaXpZhThau1XP6TW2QqodLGbWfy23pNdoTftEytg2YSIw1syGiG3L2OF/kIEALhwEo6Z5TjDIYib60AwW8fOSIUtJEUqyESxQybNoORSvsFLC2d5HCt6SvimN+s+70sz7Px3/E83pPaLnqqjJFiUmMy/X1WSUrcw4mlqZp6YayWtqGtFWjOCvJLAv7tSQGGJ3+DkGEwEhYf4NZdHE+EfbhNKXjhBSr0L3D8iJL16RuKFLCj7Kjf9wQ7T0d4zqGHP4D18ApX/t0Wm6to+Uq3pOcOtYl45g+sQswUoYRZhEQ7n3pXa05TDDz0MKR/Xobq74UCK4GCIcc7PCosR6kFgXqDaaBrlHw1TiLpnTspz17zuAw8foJD02JBv+Gd/lQhgfLrk1ZDptdTWWdGuuwZx172AqYdEVSpZtBjbO49kHSRnmInp51sQO3KxwOIZgbczTsSozBxBgpZSokNxFJK/Y+tPBsJQrypnaMJgybuG+Ilw5hOAz8UfimMndZYGmoEy3S6/GcL1x0HqcZg3K9RldNS+zTHLshUdh4t22WrCenhiwpnEUf8IRSVNCSHdgKpbi13taIiMsotcqVdXFE0G9kb2ePIO24R7ba2N0SRivslmarpYcxhpaiwUBkNajD9LweZRjlSFoWQ3KTmfIhZpTcSamOynJXAktbU8JqltomN5V2Zw8PVvipPo/qJiY3adf9LZbodwJrDxTjRR6bOj6GhPpoCPDWNV2StrilegU6tfjo78hOpG07qKXV4eUBbcTKuwJT2VQTaUckmju+SYAQqBT5EWGlyNqDmkt/k1rL2lJRCxEVmH3oX8RhSeFpuAwuhQOAutxEfyG45KfdWfVYQlgDqVHCFdPLuNGwpIFogwQEu3e56bJsixAPqYNoiPYQObCzhREW4yYYcywi520YC78f2+NoqQy2NtgjW2iasLIDYLQaV3EESaP3TDYoCL6safNE12UG8A+FQ7PWYDwso6z8mPMOwBYY8Fd4CU6Dg2EOuDch4YgEbt6u0WYqs9XJVTisCXmHumA3CV0ZUvWZnXED9lq69OON463zLY1Y8I/GAdYnV+hbJriSoPUGQ4fif9N2qv1ZDlNhZnimC8Z6v4kgGobbki5V2FYEJRHLwtoVbc2521HVYhwaqCtslavHwevVuUs+U4Ur4JXknKYBUqbubqHVArPVwc2I8komZs3yZZJXEETQAqLukZJVD+WayaUtzJtMzQSFSuT2Ft0eYl9tlZCYDIleEXmCgvcoXLbxWL9Y1/RKqIKoeAkxVXwmJxw4Wcqnlh2rWAZM50x5VJhBYdSmmytLpsttJW+cei/GlyzivyZvT3hPwrcyEGzKjmE6o8rKuSnM32q5gZsLFROFDQYfVHjGuhm2qGQLdg4zzExMxYiraZ/mWNTVScfE5Qm3DQCa3bThdw4XI+mQUqKq2xCqBiPkskMiziIiqrWoXMeBlgoLOBBkhICmPFwDGNzeDaIwU25riH3c1kSZaCe/+RrtJP3z/c86xte3wiofO+/1p5Y6ouO+3uL9CjvgvfDkdHeJyCWmPAmbks9lb6uZn86L22ughHHJiLKyA/CodTTEMa5HppTt1sktn8XfgYHMJrVzNuPYSiiPzP2MyTD0lEUAkLvLgbTa2QAZ3Fe7B0TAg1UdIIOWYM1Rt06Di6HE2C0aKAwXdl/owjaGd8ML8ETCRTMtkSRLplgiGI1saZy1xbTdTVsvhaF05yKiUF+Vw3GeSdvWoyYifCZKQRRXiqWbzSWaLSPLmrXdL2KTHflZyjyI4O2d0Qu1BqDJBDyGiWzgCsDCYAIGbKaOEqbhSfIEE5EMkzdgwBL+2Ti78KKddmR7iDZGHBp6Bv5XBp9RYPAfuBOug9/At869gY/A2hgDxglD7BxbGjPpMM7ud87CGkMPIjDWYu7cjt3LYrnKskMHyzhtHo5qYA+Mu04ewIGwDkNn58AsqXeU90qtfF91fli5jCil2J08TLSkHSo7ejKWfxehcfhFj1U993DWb27l06MzajwS9gjISA7J11264T0LWRlOSbNcQfk5V25sLWSaJF8UAQi/3Np2TJbBBwyqT18vgO2Eaifqivq0UQJFV7EETFqgEU4YiWBjE6g10P6erEPgtQ46Yj+fAUlbFMaK/PG0QKx1k8KRxFoIg4YIUrzIc0I3Z/K+g9xE4+D9KI2EdjeqQVrRrkZpcWmxG+6SRhilK/pkOPAn3cv5JNc4sOWAU9n80NCRpzZBFIowrH4n7nJz3GU3F5MriXYigQMIrBPoE2gQyInMvf5tYmmYH9H60d4zOLbQjH27IU6MlZyPY10a92hLO0XzEeDukxHNiHot88P4gva7k0BXpDFgsSWqSK9lc8LTNa+burqWWd9hmDLbtKP3JVJ40Md6VhW+Bg/BD4/Qdey0pQOh04jlMNCK9ZMHjRgmXlC4oaSGdKlLUUUrH/CZImYANlx155UYInwR1lIsX0zxdoXT+m+kl1PtPxPZm5V6bW2Ffo2+rq4KIQwEC+QGA4Y4rh1ffGERRv6EwOGsuF8QTwGEywYVbuQVcD/gT3ga8Or+JA0STiBst0F0UodieAwU63squl1Tr2osvMuwpDDpVFO44JphYk4T8kJqkCfI87IRh2c3wk1jhXR2VaWKBnq4anMqt1dd1WJAq8YVP0yvo3rd476qyGDAdMtoO1mvnilDort2zxCoaevuo7eVCqxbiJno5aJYqqWgG1Ggtg15OaklsSYYs3AcCmPVFPMTlzWPIYlUv6K7laoKsnJhJOKle4b7Vxohl0Gf3LeLz9dwMuk4HMkbUtM4YqRt7DreZxPIllMF0m1f1XK7CZmt2qCWnWJ4/c5nW2h5VTXTwDQccMJjmK6oYUX3+kx1yLYBp26Z70M2q08HidXNewa58x6/APDHAWsD9m1yEg1Qz45Y/LnCt+AVOAS9N0sLeT10cckCDiTQ4E/O2mJl5g00dkFnF+x1yNdxSD908v6OpvpZWWfKdsE0y8KD5AkDziYmwqdoq/4OMzFDDw1YIFMstfAaqphQTGGTQp2eajK2X86Mx9DvqkHF8GSgamQ48NRLe+tkuZEL9G3nC2o2IgNonZYtc9U277feSR43n0z2XWO8U+GtcAocDDshfKVJkVcpUT7DgANkDHCNwevmZyuqGeiSpLQKharYjgXKa9eoeSAfmJDa03VSa+58gta/xycMPJVuI2v3zOmtF8zck1RSiAIXbVi9p4RRmJnIPhMTZT9uG1BFIreTEKey0LRyBj6GLJGDiu4ylxUpqre0sjOdyEBH3+mybseGAXFaLkgGYkj72lIwtWEoDY8R0XbWgorcTwgLdoD155tNiIBAyOVAnKNAThcEOp8gt1TcQGyq0PcaTdHuVYXwbI5sV5rk7Ta0+zMI92rvcEgvS3f3OKWqzxbbqjOX+FVPuaCvpt/0k1Cgvzbez3AdHA7fgc/DmXBwroYN0A7gG/DB5LNmfQT3wE1wlLkgqKEFdn8AS0f/sY9ZOJSVrtMnA/hikii3gK35+NZEkARYIpnlZ0Za2JfvwrjZg+Hs/SnDh83HAW+AE1VUkf2BdTk+z5y0cwyggJ/Bu2AfM2clTPVodBJNXtDPEX4VdvcF98gzZp+W+JtJccH2IbaMsaEtdqVONbSXE1KWsBG7hBkGk1enYMv4HKIGWIbhEzEU2mJn5RTxcvlcloqRuKtQkZA7CZDPDEUrRnyn/rpXK57qb/nahi++Ur3aU7PnK2r3VLzJhzcht/Cv+1phUeELywffn4XiJfaU5iy/bf62emV3sQXAXLdMdpPaLzC+D9pmOV/xK8TpDU683upXjiAT+anDd5F4Sg9WM+/+7YP57DdC1JRLtLOr/M2c4LIt1igMKdRiQ2hUUKGFBUKstFpqV1iFt8xXAC1+hYiHWcbVODF3Y1IEceCpzCtSahMqeGXprseFHTA5XjJOAR9r6CAWNAuzvRB5odPyQe1IuoUyTHA2v8OKc1oty5FluhPhoQ52qDtNpUgR+xrGPsGGM4EEEibNx90F14xASOBr7joSkM8TrnbGbdXuyiBKmkoaFnjNlr6M5DNN8Gp3IF51XmV2tit7se+cqB8UuGwwosopSqpYycp0dB7Ys9Uo1VKkkKKrC/FpaMi9B7yiYQ5caoxumk3bCNLhymw97HiOwSHt2LUgFtP+s7g8CpCw0dtrfoB0VC1TOZpPTrpR1dq4LJeZavVQiha0QHk4tBWy3OzH6bqsgWj6eIcI9mDef6Y9Qhs/X8kUQbu1tSdU5t5dUwOUMMM+ZkGwYm++uEiiO0KgdcfR0U0HHtLKeCgtT4Wf9W5d2vfMgSGf27LXcBk1nmI+duPtC2kJu+r2XhQigwyU4wXBwmG4B1TUWRHBNkzyYWSTIYJkeErZ+XSol3rjwvCDU/a60RGqxN9cfDxoTyoKYfXRzgqtmFybVftGJlERNTG5cMv6qb1y/5y7FHchFTHEw2ZCiSsT/h4j+vVAbwit5zbIE8mp6vEep0utUJdSUKAIGImhNEWp2+6Bt8kVE6cdDtcM97VUlndWKQ4i6V3m1IKi/tl1Rqg71J+e+XBnSVs4CB1fcNNA7oW8Babl9sXMc12GFRqTwshve8fgNaB5z9rzdGRRpxEmIilsdfMFkSUraHNFYSamRrHit6IhfPBBmYjZSyjOt1a136dSuYQeG9mDyeLZpXhKwkmEGKvYJxrKqRRXAzBWxe01waQyazIPEAp7MJo6Zdtu68qC3ThRCytbZVF0qJBm89kEgivbBlKcYcZmzFrJu1vR4hYSskgFrCSb9RkK0+JhyrEVMrHMN7CMMefXlyQqRdsCttbIMOKePYsRnGostTkePiDS5XhW7qBoRjGwlHH7V6y49f9rCA1tJ3H0WSU91Rq8NvCwRomM4aqsphv3dYgmTzTYOSS+QdDf8KSP9YkYTb5NmkyK/ZlIZ0gnPWLLjFOok/jfE7F3N8H1Ur5zVV3MGiyTDDHhJn76DicgYDutsb8dUjG9rTXvDoCbzQOscvc+TGGxyogayn7NlNOSWX7JnB76nzHU+KrUI//Gbnqj43hu8Z1QUIDStfwqa5OtL8mZpCsTuERhCFFU826a3V3P+q+ea3zY+tmAMeTgFprYlwzD7r9a8yuAF/vX+DqshRg+BffB5bDR7HX73H47d1k8p4Ea7AMmRtz4yAn3oqThUya8X/gKZUm4KwWfUXg/vAinwRHwT/gFfH5V28iNiaGbhmEbHDZOsuaBgJ/1fynvzuSujFcmIz5YwVizGXLJQtgIzbEGp95r7yEN9X/5FeC7v/U+qr+9nhN6m4536F5PCK+sStPzAxs3LrDhZBu221DZ8M6IL0ac2fCt6NPR7RHPsWHZBvuTTaSDrNuknuOm6YrF70TGh+RuMy8K4GaRRC+TRu/X0V1Oi9MCWmm/zubyzs4ppJxVrlSGrGvLrdZQYG95IBAiWsuJxJBwUrlQGDIuKjcaQzlby3NyptWMKq+pKf3saCm9gaKpcS79uuzREwDCqfP5kuO5ON1HrB/1pFHOF/g5p1vxRu+JbdwAeKR6v6kv9/4CqndOoP7J0Ow74haVrgj69/q+UjtpYquSoxwcXaLg6i3MTrFJ4/VnNmSDoIrg8VZs9vE4XzoMqdGiM1h4iZDmc1k3yFgi4UQbDTqiU49P4vKWuytOnfUk5ouwrreatZhUZYrrIeQRyCAPeqvD5/Yr9jHur2Otnorzs61rLU9yT5zwSobcKRXDUdaapSbxVj9it5UWy+uqPqmSuONRHF8d6wnMv1S5AfAqrUvPWU3qXScXmIfYKRnEXg03bw1e99RAv4Z85fV/oOvaVtF9G3BVicTX35V+vLnKmnL2ipZYBLhOAVweUxcNPO8YmHhmLxXv9yuLwHw/bem5Sg3uaiO9kkjWGy6nqFRJKp2AXBNSLoFVR23g2h2nqJM0fiWvFMGYVKZMsiDc1689sz3smSHba+aiILBc4uuGqI71ED+eVyLzvCLAovHuKK4caJAB3T6SoDjQmochdYN/GVSEonJK7eKFS2WAgOU1XomK8nw2KdDN4VKdWOh2HwdZr6GV3Gt/lS+iDCoB5gluMS/Kpek08NVIEkF/Xo8+k4R3z7kyQUKma53J/LMEwHjqDwDkAJ5u1O3cEXn7VAlfaojC2i8+zQQ1G0u0qdXHErYazDfv8Tkh6AtvG7zsxgHA5fv6NRfWPVE/PXiLgK1qMTkgtFKZuv9h7vWBvlKgz5P2brK+kU1krHwB2Nhe9XSQHiRPbkXoA2+fkLZ6KnfE0bWX4hLpweE5U8KIJH/rBqyJY9obxJz4o15D/IiZmImZ2IhZM3O4osaryaSKdCEldtrWbqIlZbmmkSCGrh2RKI0TIYTMqKEsyQDnsjmRRqQ+CSCt7Zp40k32g93ViIy1hylJB+Kfawd+PUPwbqC60Pbr8af0Rqb2ZpD35g3ZBWEQ4BZ2E6SjERqR5gOypWcoBIBo8yMzHanlsQcpre0hOCd7KD6BHpo+qT0MdXp6WbqsRklbH0W6DEAPMpnaQ4h29lBi/NFDc8faw7Cm5PVnuTJcmgrdDdBTJx101JssRpRoNV0uS4WKXLCrdn3z5UsTIVMS0jVeD6F6Kdx2enm3p74i21bFgXc85JxCMPR2Vb4rLYIRW7Yf6/Uv0qkHoY3W16rybRtcTdTPL+8FYeinso/sa6UnEJBBBVxNosLwo244EX5GEzfosx3u0zHF4vgyWsQqLhNVkgNuL51YleemjBAm6VjAssPzTUxEVFQsxLBy1IaJ2Y/06ysNdOAWGsSWrhht1LkOdaC/MU4BXAK5BQkWItRvwoSLEHmGXGyMWDXUVEttceIlSJSkTpt3ZIr8xDTpMmTKqkN7Mk++gpaOYe/Lt576GmioRCOlGmuiqWaaK9NCS61CYIVRRjtktifGmGyCRdZZGQrGu2akGaGRgUlhocoJt8LBYut99MEny21yzhmbtdbGVG39rp2zzvu77T2TT7X3f/t7+m7RwRvT3Asudpt/7qVxOuuki266KrdUhR66F+rfhvvora9+nulvoAEGGWKwvZYZZqjhKr3wyn6XbbXNFTddDY8KFGC7HXbb46SddjllrA0OO+JglKiCiVGjCH+pz4pRHff5lRoA67p3CeqmcoKketMwSrwG/L6d3mD88p8tVpvd4XS5PV6fnwkIYmYBs7Kxc3ByQbil8/DyyeCHCggKyZQlLCJbjlx58g1VoFCRYiVKlSk3TIVKVarV1DjwXTeJtn7zVlCiSTW5T23+WlsCmtoPppQyDAeVdxrmX7LD8Bgbnc/NxqxYjhE2uOO5nlMjrIOHuPuGw4fg/LK+/MyvEDqPBOvGjym7wl3awQcWX3/nMt0ooJAiigPalRsRQCBBgPWcKU+kT8yxRY9A66x06sakIFQJG6RcjCfPksmS0Vk5Xx9Wqubtt7xvVW3/r6C6kbId/4AKnJz9gfIxZ2qgfGxWhXJQRSwjItPBHslLFUgNiJbUkFVBS0ZIS3FIS4DTUiWnpS6RloAKqdtQHPxUcINxYFBR4HqvwlD1gMGhlf7jIPAAcMd9RlP9WyLE4u/FBy8MM393CIi2YUajMdsEekcj3HETHXbmiJ/YOesEw2D1mwtM5BLkdeGSWMq6AYYjeGBAC7yEEXZQepYY0HU4uGJnhZwZ6CYQEb6Lpfwgc7RgJwHNODsKl9gJvwzoDjlBwLih+4hbO2fuIkFZVOyE5Qo8hLlDQOBn5skiVX9BG7IM6/KGuB+N3oeNbQnNM/XXAE/UThEHBAX5PEdxBSINCDuhEk4MQ/5EEzfk+/zv5bmQHBH+Qxd2Cwk7yZlCCTkk6Kb43SRPQEZ5frKf120Tbz1T+oBuXuAfsodrI6dzu7m5aROEayS72H6yk705Dna+l53dzcZxrBwEYJZjYXEvM6uQDDE9IJNCNjHiXmmMbka6Y6DBo6fZyLpUOFpqLqChOmoqHBWlNqCkeBSUTrKcDEdGzgekZEeSQo6Y5AOi5F4Az0jmsB0Gnbx0NjEpQiPaXqkEFZlKcChJlCSndJpsYjdSAgLJ8csR1UmmVRmXz5/7evzi3vf8J/qjF2pZ7blneY2OhoeUDo9savdod7hGq8Ndu2oPaH+4Q9vDDVofJldiuG+37boVdos2hytUGm7akl2p1daS//gbunWnUGXvMnT7GPilsH0567s5pF039ORjExF/Dnz74wfcvengd5f5mcHqsZEo7R4EOMsJLbT2VOgkBuFedTIXSkF4BwQfos3IrF5yEu4bxCoDAAAA') format('woff2'), + url('data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAGw8ABIAAAAA2DgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAABsIAAAABwAAAAchAIKSUdERUYAAFhcAAAAiQAAATQq2xtHR1BPUwAAXgAAAA4eAAAueIspnAJHU1VCAABY6AAABRYAABKe0ti5NU9TLzIAAAIQAAAAVQAAAGBo/J16Y21hcAAABWQAAAGYAAACAvsSjndjdnQgAAAQjAAAAIIAAAC8FwsLm2ZwZ20AAAb8AAAICwAAD3VvxKKUZ2FzcAAAWFAAAAAMAAAADAAHABtnbHlmAAATlAAAP2QAAG7Ii71PBmhlYWQAAAGUAAAANgAAADYY+Sd1aGhlYQAAAcwAAAAhAAAAJA8wDDZobXR4AAACaAAAAvsAAAUAjaApAmxvY2EAABEQAAACggAAAoI4BhyQbWF4cAAAAfAAAAAgAAAAIAQ9AhduYW1lAABS+AAAATQAAAJnkYfHqXBvc3QAAFQsAAAEIQAABs0y50E9cHJlcAAADwgAAAGBAAACAM4gBt0AAQAAAAIAxddkoRtfDzz1AB8D6AAAAADVg7ZYAAAAANjaLOj+k/8DDNQDiAAAAAgAAgAAAAAAAHjaY2BkYGA+9u8cAwPPlX+T/wfzXGEAiiADRgcAtmQHfAAAAAABAAABQAC2AAoARAAEAAIAEAAvAJoAAAJBAOoAAwACeNpjYGHiYJzAwMrAwNTFFMHAwOANoRnjGEIYjYCi3KzMzKxMLEwsQDl2BiTg7u/vznCAgVdJlPnIv0cMDMwvGOUUGBjng+QY/zGdAVIKDEIA7CIMcgAAAHjabZPfS1NhGMe/73NWFqhDKye6Zup0Gdv8WW5NnahRVORqpmXpxaK6yAJD8CIrgkJZaJEXXUR1G5QkJPTrosD+gMK6KLwIJTQsRcrIi1zfc84mIg4+fN/z7Hmf9z3P9znSgEYkftNkFpWqHuVyDQ5xwKEFsF264MYIyhkPks3qMVziRQ3mGXtJ1fe4IXIDpaoHHkklNuYcppYTD0kjLnOt5+MPfGoeleJDNTWg/sKtdWGnPIBV2hGSb8x9Q3WRTQhpeo1XCGGBz+nIkosIqX+MR/j8jurj/7Vx3c9YGe+fxbx+BKUbqdow0qjpEmb9KhSqGu7nnakF6gOS1Tig+hHhWXnSyj15cFKdvL9TXYJdjnJdgSAmUIGJ2IRa5HoMQa2DuaWkif83I0Ccqpt9+owsdYH7ShkTJGkbkaSmkCIWbKAWKD9s+Mk7+JEjmShI9J7nOyUFhXIKDbynVc/hXUpUH6r43vnqC4rEiQKpZs/ZeyN2iz2sZ51tjHmxRdUhg+9yzzj7DM95DrsaxD7MwSYa9zrhl3GUaOuJn7VnUWz0fTX3YdXeIsnwwhX3Ig59sOpeYCE2RxXWy034sBrev47neAwvVqJ7Qc8kgEaj72ug3aXmmT6sBJNIInsxGZuiH4tyEN5lH1bDvhiq92Ml9EJa2FeqXsvSz/vO0L+b2K3uIKIGkKse0peo+XnIMdRo1znvX1GcgL54lrmMQ5xRvzoJFwlgKBZWzciWHmxVv+j7KOOj5rejz55e05jhNs7+NMKqk/cX5u9CBl5jh9BHbYwz9AL2dVbYLdOwawMmliFqL/lBnjDniInWST1AhslvBC1FrPmdPOPzI3MeeY4DM5wRN6klTZxVH1XHBRtn0lx3Iod5NubZmGdjXjbjNgMzz1hLlN9tFH3kHGkm9XFtjcfayQllRRnxqhIc55wWJVSuIFPtYX+jaCMtJEzySSReW69xnnSTjni8l1yNP58lueQ0sDRCPgGxVOpT8l7dXhpcIz6Y/BHu/5zu3X4AeNpjYGBgZoBgGQZGBhD4A+QxgvksDA+AtAmDApAlwsDLUMfwn9GQMZjpGNMtpjsKTAqcCtwKIgpSCnIKSgpqClYKLgolCmsUlRQnKk5WElIS/f8fqJsXqHsBUFcQii5hBQkFGbAuS0xd/7/+f/z/0P+J/wv//v/75u/rB8ceHHiw/8GOB1sfbHmw8cG6B3MeTH6Q8kD3/o77Xvc9752+dxLqcpIBIxsDXCsjE5BgQlcADBoWVjZ2Dk4ubh5ePn4BQSFhEVExcQlJKWkZWTl5BUUlZRVVNXUNTS1tHV09fQNDI2MTUzNzC0sraxtbO3sHRydnF1c3dw9PL28fXz//gMCg4JDQsPCIyKjomNi4+IREhrb2zu7JM+YtXrRk2dLlK1evWrN2/boNGzdv3bJtx/Y9u/fuYyhKSc28XLGwIPtWWRZDxyyGYgaG9HKw63JqGFbsakzOA7Fza68kNbVOP3zk9JkLF8+e28lwkOH6zavXgDKV5y8xtPQ093b1T5jYN3Uaw5Q5c2cfOnq8kIHhWBVQGgCq95OkeNqNV19v3MYRX1L3/07B2QhcA1TRJbYkAlDKWwvZNRJCpztZUmufpLNCynZDHu9kO01iJ21lp4lb1a1rY/veut9iab+c8hQ/5MPkU6i/2eWdZMENSizJnT87Mzs7M7sbbvznxb//9ewfT//+tyd/PfzLnx9/8/Wfvnr08OCPf/j9l188uP/5Z5/+7pN7d+/sj0fZME0+/u3tWzf34uij3RuDna3+9Wu/+fXmxvrVtd57P2s36otW3mx0RGfcWFpkeaOJbnNp0VKVjqpqpLoecBVuRe7mdtRddVw3doSrQlXyuvSmI5lNCTFEYBTGQsTmjtjc2ot4VyaaCMzgDcjQl2e0oqfsziBSvQDQKXhNwzPw6hny+pQsuGJ9KUc5m/OAD53c0p1y558xZhILNQyEK6IxePMaa7mDpINea9qz+Bok8kmbDfFmH4mJVfT2IsWT/fgquJntKd12JuwX4pHpJ4pnnKuKJ4b9SLrKSoRTwNsRPGaljnSFy+N4cvx6gbiFC1k2W8mF9XwrD63nO3vRUZsx/nwQvbQtu5OsxPnPQYuOOGOhxtqEJSQBnAC2aWFlXto1ze8chYwdampJIzScYRYaV5viLJZNbINrG0W+VhQyG5SSoYRT7hJwNYM7NNzvFdw1UNpE+ZbZFmOaaB54CSsTNsphLayHLXvexloQ6iUw34K3brFXLWvecnLI3NboiXWY10PnSEvaLjgPwUm4wxkOlhPbKUHQZyZ+42QGN/aiVy0G+foLjhV6lha7uX0tECdhvRVh9bq5dS1IENoEznldjrBW4U5EvImDmEd0ry4tUnTxSIwdEefvvisfdCFG5GnFTwJpgoxCS7QvIzDnvPVM9BLiQKKgrQOV7fJEDZMAXd7uyR7FQUrc7EJuz3m5VfKsD9gH8FSlpRpivKKaYmVG+ZB9aCgVolTFirIuGD93RZdfvCczMUTMhf3ojrMfp5CtQpGqklhx8hJbQYZctDCJbs6uBZjNJqLuetC/ibSk6XMpV3kelvw0SwledZHpsiCJ1dX41IgulypMswQc3VgzI/eA7IqUj+BXTBe+2hHo7u3RmMFeJFsjMRLwaRjKFNN2eBY7Ms60jzEeprGlxfJJPSrKkU1Z7mX7+Ew4GyZiaBCUj2dxd84i9sF1Gic2SJ3+W/ovN0R3BA5605GaQ4y5fBSbIGF9XSn+J5N1ioljTbVw2f7VFLIKCACaVHfeBO/OwB69Cbz2vokVVfIp1iJXfeKoT+NgxpKqwyGXvC0uC/rowWv0JqqMzmGWUjmqUOwBsQEEj4aIXgjsJXIacRhW8mea1OfBGyJRRK0BVNseTUcd9nkS8yQBFvniOlyV8ef7KQUXFdq+mU8f1R6/VO5gLKOUcVQVNX8/HQsX9VlRmhrvk40lWMd2IsUcKYVUFkz0emCGeF9V/HX6oT0IRDrGIpI+no712B7M1d4haU5XuDFYbE/7Eo5DfRjSJ5OIRnUb2Vb2zsnzkl+SqFO3UWJLfrabYCPgbd7jeqlTRDI5YZ2gGIIMY90jRozXzVefBfntqneC0e1+YJhrWios245Uf8pS1Q2dLwJl/2QZRJq8tY39pKQXipxX9tbh3hBR5dBoruxBVCyPHr9OQ53pgplhwOhCSxuhO7W3aew1Siu6tXSre6rmYaFVCTYYcpWmcxIE6MNoM2ZOm2smgD5U8YKiJ5IUQMkb6zmZDZBTwcTRIBX0OpPj7/rYgRNBbxyT+ppWRCO0aGkEk7sqRHybKwpNpjWprespnEY3dKtqm4lmplR+0/GF946Ov2PGc27xUMzQLJ8VWVnk3dhRd+NgZEZVigrOUVFRubMtfb64iWwQbhV1DNNHVnG1E2Db0HN7Zry6YaoDRaXVE6yHGCo67AJTTFy16MOQWuKqsgHOeuKlzayaWKZfXSzntlVFtadi1J5vodDLLBmZrRleZsvOFToMVfRC1/XaHlBpGkRlpxTrkPHVw6CIYvM9CGb0h5ST1akna0STM2JZi3toYsMvvgdB7a2jZO3/U1YrVlPVNY2qkV/7cVVzZoE2zHJt2EbyhqkTwPqZlFTa8tvvUIa2/HPAn4dpl2DkpcJK+OYbmNIn1TWN0SDSrUrmmGXzmiC0wfvahHYTxDasee0YLrSj42N2EEy5jRNgd8MzcV6Qi9EmOh8GMXo9ehOw9OgtMqlZZGnrTNUvxJs1rb9JFDNhtNGLmUSCcquFU2/JKUOjz9tw12XtTx+mApaXc6vqFwxlYrC9y1I2p/Wfyv8RjpxMHydZLM8i1GOsB9Z6/u2U2lnsvEYXqzw/+xOySIdGRzU7dH6hvalOAfA+1vfx90XN0ceJU47RKErF09iL5PvqtCTcD6Zjp37b1yldjD2DHUSPgSVPfU87ibLwL/suvQ65TmujGL8fFEfbx7S6T7S4JwHn93DO6lg4bWGjvEdbFSfumq+LnMSB516a6jqkLy4XcZbapvMwzvyiza0r7Iq5/ojiZoE9oORFV5xLMW4Sk+MfFmJTqmxs8ngHkvP2OZAkP4+rhXqq3VvQhMZhF6/4BRfN4CmS0/CR9S1bbu7ACXQHayw7DbrXTa9UL4IfI3MajyqlPhaPXHKF2hVf4bDQEYrzWyiJQK4txFJiO5WC7k67kfkSyVpcoJMBnWIKXmcBt7ITsLVA4ZZOjl8t0AVppu3rqbYvoY06cqpOZW/VRlFm3TSxhqbNz3/JhNFf8gul8pbcw43QVT8lxYUdAN9ZiLUEWPKCLPkvhv5kWgB42lWHy1IaQRhGewCReNdUkIvwNQIy0MQxxnjXGe+jJCpCJzRjdjxGWFrlRsu3YDu4Mq/Wm18p0NLvqzp1jkN/rRauLQ3PIjStNpS1jMYi4c9Xwm+xCCnqqAtCTXRwVSZUyxqXJRcXJcJ5qYNfJRs/zToqZgdnpsapSXCLhJOixnGBcFTQOCy0cLBA2F/g2MtrOHmCnSPsZgk7WRfb84StjMZmhrCRcbHOW1jjhFXexg+4WIHGdxCW04RvKcLSHKEsbBRNG/mcRs5Mxq+zScJ8Yh2ZBIHHCUi3kY4RUrOEuSghuRHf82Lb0X9eomezPfsSd46cKDU/8xk5zafkjJpS43xMDvGQHFMhNckn5CgfkcM8LA2byQk1osKKqU88IoM8ICMqoIKOM2T8Nx5YXVSehumq4kcuPd+49fO1Hp1q0w/f+kw2vUbXMO7Vzd0dS+1X/Ida4zHIXlR1A4GDaqMbCt4rJpgQgg0uBv5K49373eeb9qNvg/oQ77O32DM2WIGEAAAAeNo9jE0OgjAQhT+7ctljuGZtSIixBIEISjHRw3ghj8JhOIHltYJ5mcy8vzETezNhzQe7+2IhzNuEQ5ij/uN4oRc8rRDvjiGxUXPTPSa/EnPkvMmo15znwSt1n/Jarsq6f8tJb6T1lGrHfZd65qLEwFG/Tso00uPPQqlaTrcAQr8lpQAAAAAAHgAeACYALgBUAG4AwgEcAZIB4gHyAhACLgJYAngCmAKqAsYC2AMUAywDZAO8A+YELgR0BJAE/AVEBXIFpgW+BeAF+AY+BrwG+AdQB4gHtAfgCAIIWAiACJQIugjsCQQJMAlWCZIJyAoSClQKtArQCvwLGgtMC3QLkgu0C84L4Av6DBIMIgw0DMoNEg1MDZIN4A4cDoQOtg7sDzIPWA9sD7QP5BAgEGgQsBDaETwRchGiEbwR5hIIEiQSRhKAEpISzBMUExwTQhOEE+AUOBR8FJIVAhVEFdQWOBZEFloWYhbMFuYXHBdEF0wXVBduF3YXnBe2GBAYGBhSGF4Ybhh+GI4Y1BjsGQQZHBk0GU4ZpBniGloachqKGqIavBrUGuwbBBs8G3gbkBuoG8Ab2BvwHAocKhyGHJ4cthzOHOgdAB06HYwdpB28HdQd7B4GHiAexB8kHzwfVB9sH4Yfnh+2H84gHCB0IIwgpCC8INQg7CEGITwhkiGqIcIh2iH0IgwiViJwIoQi5CNSI6QkBCSIJJAkmCSgJLIkxCTmJQYlECUcJSglNiVQJWAldiWKJaAlqCYQJkYmXCZwJoImiiaSJqwm8Cc6J2wnpCf6KAwoRiiwKQgplCoIKngq+CtcK7AsLCyALM4tMC10LaguAi5YLmQuui8UL3Avpi+wL7ovxC/OL9gv4i/sMAQwDjAYMEwwYjCSMNYw/DE6MXgxkDH0MjQyPDJaMmIyajJyMnoygjKKMpIymjKqMswy1DLcMwozEjMaMyIzKjMyMzozQjNKM1IzWjNiM2ozoDOoM7AzuDPiM+o0XjRmNJw0rjTANNw1SjXiNew1/jYINhI2HDdkAAB42q19CXgb1bXwnBlJI2vfd2tfLEuyZK22ZVuK9yV24sQribMvzkBCIiBNCCn71o1XaF8XtrYPWlp4P+URoNDSlle29lHa/0FLKWlLKe2jO5QubBn/994ZybKdkP7/98fyWDNzl3PPOfcs955zQ9HUOoqCv9HPUAzFUrqHgOVoGUcDlUzGYqnWKOh9jN6nh7/x58AXO/n/pp85tZ8+59QXKfQPqLp/ravvaaqw+A71EGpbSukp1Qml3lBBDcfSqVZjLmNmApZwLpvPpC1mkywwNqlYIwuFnE70Cy+++Sb/zoshpyMUcjhDuDmaysCfQSvCqTkhoyXoWTKZ1mdQaxlzoIB+M2NjN4yN0c/87Gc/E+q40WUHfQ/lpDxUfzlioO0ezgx2vVTh5jQyhckOlB3kSgXYFXaF3Oo0VNRyXYWKpWNpQ3t7Mjm/ZX5en8nE0mnhmmotoI7Ib4Ylv2yA/AYK6BfQ5bOXqI6ZjysvaRx1fwz9XqLEd8fdo56PuUeBNn/M/OzARweeQP/Qn2effRZMH/0oGpF78RZ4ndFRAaoZIc5abmhlUpYwE7EwaIgZPflJtQZlrDmQa4FIwQ3WXKQFctluKCBMolsWPUZ/zZTFmtOA2ZDPZcMRM7zOrRsY/IB5rWY4xZyzOT7ZPjAwrRltSEZmt/O3tmYShZ8U0pltO5Qz0/Kt69zpoYZ3IbhlIL4uK52aUa5LeF3Jht+HZkegJWv9bzYX5gfb4qGM9SSFKNq0+Dpjor9BaSkjwm6SKlKZcqMxqWeTRS4X4XK5JOvRch5PkrVzrL6SNCK8xmKG9mRMjy8xYUwGYRSZNILdpIEAA1YgwAf8MrPJkqFWvO+GpXd3rEsk1rW0jJMPPJrj+wIdHbFYsRgDru5VrPpwTxI/TQpX/kH6U8FTHNxdakl2dydbSvza+tfd1ceEj+KLr9Oz9EnKT8Upc1lJS+OcycGZpHhMaChoHCErG5EF/BjafCFSBdpiZQVgrcaCVVZgEGVMbsjQkr5yZmD74OH+3g5wOBCMnRv0w85iKGV/o6f3l8lnY9nUxvTRuVRvb88FA6VDQfC3u+Oj8f5sZF0iFPLyTxxqeiIHWutEIr0+geYdmhvUZWRuyO8j00KYExkyGdD70uIRSDIqSo3eS9XkPZl7BSuGCEF51759w919s7N93dk/X3vtnyfjEy9VKi9NxFFdE6orEeuyQl0roQJmQzRzWROpN4xa2CzWmiRtoLoROAJXIbiMlOp+o47VodpkvhaSULBizrUWrFrEvJEAO7aWPmg9IBuUnm89yIx1jLKj8IW98nBvhP7AB+hIb1i+t3nvXixjuqk8vA6vUUo0TxQKkMo4qZSW40FjtsqgORoKoGkSyGVQ+xl4/cGBB9HnD/jyIK6fWbyReoQ6Smko5f0aFgxUKYNAshYI6QRhpIVM3tCIZZFG07NxI+O1YkGk95h24f7BCMdgTsA1mp94PD6zrxu6+O/A3ACRi0TuoT6UlOJ+qdKAJYqIcVHabRYlnaxexgEiHQXNhI6K+ykG1yOUZAInx386jkRvFpVoRbw4SeadB/GiSuvhWCvHSitaNZlgSGhbVs4ZOpdtgYBf5L43jvf2XrJhwyV9fccn2idbWibb2ycTicl23dZ/27Xr37YK14nhD46Pf3BYuBLYEugSRrJURqkeYCQVqQp3h6BjI4WMPvC/j8S/k5+ic9NrPnJqslb+ZwhOJ4bSaeP0DZxeWnGqqlAW8gXMRhgwGRvppgVwtYBwmXi8kAm6i9F8j2KsITvbWdqeP/B96OXXTz3RWeiON+Z9pZDH29+aPye77+CzEwLuIouvw+9Qfy1UpGx7Sg86PfeuDnQ6TwvLtagrHhvnkQp9Iz6Zj80TPGEezqQFOGKQy6RF0YMAEvGHZK6Ixp+eM6wb041lwz2RSG9TMVcYGcpli+pxw96Jzm2FfFOmp2tfSRcc6/B2lH3FYKDDt66UTXXkI778TGo6lxsxS8wzxc5teUE3IfzQPoRPBeJEZ1mjAbmUk8sbEGobCI70VW725QCJSjNmaj2SjxfxX4Py5tnZScmvbirDi3xh/U2/gjH+foJzhINTqE0fFSpb7GrObjf4WE4mAYlPXTGYOYOEYCA9T+RwHQZqw8aszFrzNd55ZcuQdlS3vq13arInWDZNx2EH/6pTkhsr7u7sOrdXF93Y5e4a3tCzZsrXGIa5iR9AomOhXN7XJYwR8SqFaGKigmiMWlOQU7k4lcqE2NWkrg6yyrH5gtFa3/UKtn3u3GKi+f6+e+hALrurVD63u6mvCX/68UfXs6+jsLsb1Mk3aFvH7u7OfeWJSG+0qReTKtobEXHza8K/+nIDQ3MI0TJhyiBeBF/OZ4YxKPGfh6/xJ6x038TMqZvRGBhS7100hkYqSuWoYjnyjyjIopCMcseS4EjCu0k4moSZJCSTmsYc16iuaAKcpo7V5ucPHYrNz9dGmaufnkvsVa/16r8/x3WWMk2Z3NbO4tZcJpIpdXHlXF9/Ntffn+vauLGra3KyS5efb++YsUts62L52XR6Nh9bZ5PYZzra5/NwW3c6XSym0938/YPthcHBQvvg6WgjCXISiQmTp0obkUdKUFVsSzAzhurUFYnzHyJZSueW+gidhghZBBJ5ajQRqMS/CdMCWQQSCfNBsBUlWK5T2gf1VkNFqtQh4YxFp6FOdNKnEaPVX7iq+p0/vCRZaapt8QvUt0jbDkr3oMOoNghtE9Ff3zizXA3sENvtX1IHdV20L9MMRO5TbfAg/AZZqPL7aJboykIuZJainwJcyv8Uwq93f238Wsm148KYu6hH4V14jNi0zrKOlXAsxXBaYk8xcopKbpmPYRrgWYl/uuCbfA/5fWzgyIAg94qoz0fEPiVin6FcKIc6LUKIfwn1e/k1uMuvdX9NsGXegceQLeOimpC9728yVHQNHNLMMWKXZwWpvFIGaqARlpnr3w23NgW6C+midty8e33n5kwh5nPP6EMC1oFJ97QEM8FUsb3Z1zHXOp0rjEXc+WDzCps+t/i/mBL9H1QHNUAVyn5NmDMNcK4ypzG5XCYNw0py0JHjOpQJkLMJjsWmeWzLfDI2b7Ai6zxJ5q5kGWsG/OEImkz+JQsMmQF6NI2wiKtj2DSyx5YZk7Du/r17T5x33n17xgZDHTrbcEtuLpOdyUR67ZJej7vZN33j7OxN09M3zQ62OQcm48PD2ezISHbDwn379t23gK6bLooGQpHsfLFjS9bXmOLfbYzPFWdvnJpC9W6ccpW8bw13dQ2PdHaOCGPXossNSNezyLJqKwca9qjgKhWMqMCkArkKVLRUjSwbpBWkFMPKKxSNB4/cEswTJSRU5iuIdyEDgYgPuR4MMqEY8GwD3fwQ/72hefjmNpfEtQ3bDE88AWagx8Z4nsiz9ajfPOpXjzggQmXLPokLwi7uw2HYF4ZwmNJHOL28Im9rgAaacnJCv6VDGVGYYcVp9K2QXT6o6VCzcenreoD81rZcIt9X3NnOvwEQLLgbc4GvfivY7vF2hL9OP5OeLWTHzRLDbLFjPguf8uVczpz/Vf6RYLvb3R74m6jT6K8TfkV2hMvCsRqOZSquhqodIakztpcTGAEGbV/Zvv0rC+uvbu2Kbi+NXzE2dsX4FZu6W2+a0e24e9++u3d0thdbW4avnpm5evjczmI/ogvGz40IPwpktaIeFUaOMmAsKOTVHo1VFRWDAtGcMdCv/8mBO2Zn7zjwk59c+slPXnol/cymL+zb94VNEzdeeeWNp36Mx4HahT+hdpVUtOxAM93Dwjz7UZZmWUop55SodUZEtoDpQ3XzHv+sh9v4hyDKvwDD/A76mYk/rv/jRH27DViKYwnCNggtNcjrpHi1JX2g1s4UauRv6/nviTheRDgOU7lyABkEMrfFTTe6ufZGkDSaGml5YyMbtnDhhoqA/SqQWzA/zJ+ZBliYFJBqxSKDlQWg+JVdu76ye92HE50Brmv0qnXrrhod2h5weCX8P2BW2tyy8w7djnsWFu7Z0Zbpak4IZEmEXOtS61y2nuPJc8Xx0hzBowdJTKWUaqC5hgYlGrBSXjUpBN/SmNH70LeAHo96Cg5OTfH/ggbN/xfkTmVhgH+EEtuj7iQ2t+oB1AgjF+3aDK40RYxuUs6B7IBnUTktth+0Uk5BV7QNov1gQc4QETGoOzwf7jpsWx/cVxycKmwv6WbW+Q5v6IW/8/rRcwtUtU/6XNSWhmoq2xRyjbxCX8PAAAOvMoC+MHIp4YQ0mueHKsLCA4InAxlzA5gDDGtGoEmgZz9Cm2vvnw7hQV0LRyX8s/wBCUxd+d9Vvvi5sPZSbpDSmCOkchFejBnEUVPQzlfQCK+eEMozBiIXzGUFq9JLga7oSQW8+IHr4B+EzUKAQT9WhJ5jr0pePTYpkfxu4HcSySRq6AF6FGH2qetO3Uevu45vr431QtSumjKWG+RqGWpWXW0WtwqZCCYSkBYXYK9EMjXLX4+uqL0nPwRfPZWlpz7E56o2C6NEfLrc92GqhFipDVYbkZC7a9u2u/buJdexy0dHLx8Trrpd9+zZc88u4ToxevXU1NWjwpUSZYIXjUGFbBM0yxRWTqFQURaMU9WyWbYkGfSBJUGoX/9G556urj2dt0y92dTl93c13UY/k9/e1bU9z5+Ei8KdPl9nmH9H9AsWnyNjNCLpbC9r6Qin8HAGeUXBVGhxmKin0CqbzMqGC5GCdYVhRo9ObNlbHXNPV7rn1u6ZnuloizDwtZeNOWO77t4rjHz6E9mR2AHPFYnLI+f3COOfvKY2/k5RZ4TKZq2LU+zXglZLqZWYRapaAjEqllyZekxowYg4NrAcHX8p7ulKrEvR39v1nYNTfwytidRQkp7uUDD8SxIIIsxc4O8KY8y8hfnIjWSUBOElRnWUIzGWizVUzI2cmanIgxDcrYEmDXxaAxdoYJ8GejWATBaNnCKKEtnfmfmaa7zk8CRhCYOC3MKWgAeqrs/ucf2EfnN39/TwxsTabW27urs3F5TrlIMdhfGe3uSmPYPntesSM92+8obejvQal845O56Zybb0eP2hzu5kc86q8+2c6t8SF+UHRiTR98ayQkoDR9MVmcA8eHoHkAOCsPSr78Jvnp6ij01MnLpaqFdC4x4nayjmslIjMTZwErpiFDgBzyDsVeirJo4of94+0jO1eXp6fqp0ZEI3eOlG+A7fPrN//ww8xXdtvExYo9AgePYRvaF5kK2pCyJpjNZMAU3MgGbLfciNeHgL/84MmoxvDw7SLJaGgPiAYm5HdU1YVmhMrArVNwn1xVktNIGuePWCGCcB/ZYrVBLt52Y/o5V8dMtjs5/WSfS3zaJ2/9LaSmvQlS6hqS5razv1DoHPgODbXZUbDSvlBjBEHDFGIoxA8uqeE5ITu1/9y67vSB7fBRU4h/8tWPkv8h+DGP8j0h62t/rE8eLG5NXxVptCMgj+svMhyYmdf5qCUbicfx7i/KX8A6huGNXVkLpI6jTIOOw+1hTskv+IZGoYrkB9Ps9/EK7hbXO0f2Lu1M8nBDm4eBXYGRtZZUdqGutoVlxlx2t12MNf/91LLvkuYxt4762B1etBUF0PyiB4T/50/KdENQEVWryK+lO1XYqTMJyk2q4VyVVk/QZCqNnv5hn5wHvnCe2q4LPwBOFF1f0sTVYMRbIFEKkCT/V+fe4KyeVzSK08+/LLeF1/sQlOLh4ga14McksQ1rAxASf54I0D6P0Oeox6s7r+KK6JZayBHfPZUfqZSwW55kf68yStodxoBt9dPiYLwT9CMBSChlA0RMtC3Ldl8B8yWJCBRAZ/lcEXZTAngwEZZGQglYFMZorEQBoDd4xzKyt2RWVaB8M60A2pQaEGk5ozsZUn/RD1g8IPfvaxBtjQsKOBljXAPxqgt+E7DXSwAeT4I6NKWwSpcOiP6E8MWTAZ/Af9Fdx14R322ecPVb12bNrUu0UWM0JtQFAwVcmR+cps6uL5lnXm9V3Nw+aymysvHJ6QWGYLmZG4bSAyMFhu1cXHWic2mdSe9v6QL9WS3b+Ff3Q4lB2Nj8R1po6W5qyAKzznsY1upkJUY9lgDnHqRk7NVqSKioyqmJWiGsD6LhwJEOZhM++j9eTzVsnElERine/oP79cPr8/gFfG44mxZHIsocuFEZWeG4zkBi4ZGz82MJaa7eiYTQlXgV+CCB4pol0j5v9GwQZnK43KVSuOq+w/bISfPNzTc3hk4yHbmHE0lxhPJscT+XHjWscFG3SDx8bGLhkYK3uTra2z7e2zrekWb2mc4AD36VyGA7aR0yoqqGPNchzU9Z6JYH6vEmbZ8hEZd8dmG7IsJiS2zR15Mvg4BieuGzg2juDIRQafO5UdDeeqKJhrb59LibBo0fhtlJfKlH3Xep/y0lIvaLycRsPaDJxNWbmuERoakZvaiDFD3NR5wSqorfxU6cP63LTonhhbaMxRL164puvQ8OiBIs2fx6THmndlhryV9TfR3r5s56QaATc2fHyk9/BalaZjfdPmQNcw9HvL8bESoY0LXRbo55Flkix7rIoKGMwcbZBVrscqcUhDyzWcQiu/VE7LAcE1n0YA4f2tGNE5GQEsq5nwcCNgQRS4eMuW+Egi5jV4Lb7UlVdOwX1jhdRQRLWRbUg2t4zx60T62GgLwomXSlFryi0ymUUWljFeGbeRgQcZuIABC7OHoRmvtuKUVSxNnAURLsU1I72MaUcUciyN5xhZiw2LerkLAqfx32WBlStOT1xkGtety6+bkdg3dfTsL5f393Rssksmrju/ZTSRGG1pWZtIrG15bbLoixc2T7ZHWvsuHh871tfaNMxbjl0OsZbpYud0Al2LMwlBz6LL24jfLMjq0qgsrI4QkqpYFAKniRuNwjzD01+PxQGCRh8ooall3pSf3zE10NbUG0GW63MDkez+c/iHoaO/J7U2yr8qzGs8vf8X/WPku2ipdNmvUVTUsspDUviiFKR/VcI9SrheCQeVoFUmkaHBKFnRgCHyaflKFYv4fDYYtDsCAUcz8lM2C1/twS08jftafGXRLfblQF5+wKHn1A5txSKrSCVK+LoSPqOEy3BPHmVJuVUpkePOBLmIXP30it7oSE6wmvSEGNWOLzbLbQqPa2q0Z6n/9/6TnZDKImF64NQjY2NUDbd/J7rcivQnq2ZkGLNqhWjECL5aASEX2YoR5N2Upl4/7+ln99wxiz2b7r9Kvsc/L/nb7K3VtqhPVP01qsIolvy1Ur2/hsoxKcSfIcpXNuqdIZWZU8k8HCWryNhKSCRqptq7WSCrdTVx68iMhXlr20aDc644OzfZ0R7uDkx1tOEr8KORbD6RyJ+7GRN9sBwfifEvQ/tQOTEa419ZwoEGyTPEX0qzTCuCYl7OX6djrwmJeXN28/apvmJ0TRD3Fc5V+2kZjfK/rMlLPN7lvhFb0Sr/yX2hXxzp7T0yOkquyYnW1olkckNr64akbuiS0dFLhoTrWHK2WJxNClfSb3GxiU6TcRE5rQlxskYOT3FhdJolOV0dndi9H6kuqzlArZjYxYklNdWB9JZkCsJ12gr4tVVFlQsP/AzMy7UVxkMT0hs1eKREdxoR2ysrSIOa6uAJFU4jagL0CnjgSQlWF/01/TExdaROdUgHwrmq9lh7qrkGj6A6RLrvotXIZkZ0l1MypUh3/WnobjXX0Vw7nQzYvU2h7hAi+YbmgmKzrnkwyv9KXIv4OhpjEzVczrI+q6/g2+uT/NgHBd8HfA/5mCYf+NR3q+Ejasir4SE1/Ksa1E0yrklZwfvWrMj8xM7RZ0Q7J3w6z6i2g73kF91+wLrWOJpI9eU7urvGc7OZ3n2WEf9McykeHxldm9/cphvr9LekI0FvRKPTDrXHe4MdWX9fxO0KKI3G0XxyMEz01uJbMEx/jLIjKuksdiPHypQaTimrNNiVwrZ6OoN31hFc4Zxe3M5F6slkRZ5OwYwAeTVnaJqbmzp+XGcMeuxaj01u0od7ITb2L/8yxv+u2WTRb2Rlwho5wtdfgBfmnoYxy7EhgYRQ1YogflS46kZ1E4dKsCJu2T7V0xbrDU2ROag7bzus4Z8Z7msZiYKXp0fCWdI+iy7vovZZ5FtIEXlZxZIvRTwgdtNt9OfmfjgNPL8HPoskNKnD0KiOBvtQSo20AdXTKJb5UJlqdSUE2NmjcPnM5XB0+s7pq5BO5vn9cBN/AG7kafgUv0+QeWp0+SlqU0nWWpRSkFWUiqW1lkjGWsiwyMZnA499dduVl+66/8GdV125E5h3H330Xf7U44/jNuTI1n8PtSEnfpKsIteIYykIfhIEXnpu8+foz27mn5j1ws/5q+HYqWbsh6DK/4nq1ftIiJiK1T5SCBLIuf8I/xzk+J3DsDA2zH96jMBvRT6SA/kyAeTLBJBxpec0AdGXsYS7AEnEHLYQsvkimIm9IqxBo78W/OTh2ajPF50dtZjDKT/6lwqbLZfMjdwbjQ/Eo/eOzA1k4/cm21QSVSF1bzwr+ljrF6+jbkV9Loud0AfWj40xtvcOCmU8CC5/FS6KM+g5Q6DmYwkQ4W09DCHZRbZgiDJmAcIYeMzhVp/f72tF8IxWYcwjYFIFBExbEgNTB6bQZ4j6A7wJl1BOvDMSk4JaCh6pVO00ck6JGtp3qaFVDQ+o4Q41fBLNbgp7LpUK3h0RFmZTrcFwRNhdD4hTWTDJM3gSw6725lBCb22ke/0Ft70tHoyTm0De8wejQaf1WSKd3tqX08d2NVEPIRmkRJJNeb9O2FBLrthOQwxjru3SNTesUUzCx2r7Zx8FM//7N4nMJroRx2n5Mee6GY9WUmFUNc4VI5/o+oCncESPbqxBi1WPJCb8Yr53oHt7Pr+9e6D3HOuYZyhU0I3yV4zm86N3jcqnphoGD/T2nj+IvslHCt61Ov7T8lTQm9mhhgX1jn7Bx0f23zeoNBUom5gWLhxVKDmFgjG7OLNUBCYmhJgI62++HNYUESSZwpEV/g+Wl1b8g7ft8docxju83Xwh/1+tGXr7AK11ODPznet3GMdVxVRhjc0uUTTIPnTY55Y8HI4ozz9/2LIhJdcNSuzx3lh2U36qzYuUXou/PcpqdepBZfOEh2l0CzZlHzVPe+gW5AfEqUjZ6DKrWXucs9vNrCKI4DezZjE0hoRdCSvjJUBEwquFiFDWgpVFxGKtLNk4i7ArzIK+znC4M11sGx5qK6aLoRC6OHsCQ+3FX5ZCoVIojK/hGzqKa3o6iun2WKw93dHR29PRkW43W+PtMxG8yyt+auswCURrO9VVDphYGoDmrKBTSmWcEflU0CAFOSB7WG5TVbRyCYnGI8F4JBaPCEfkxeBIPKQS0C+T8UCmBOgvwjUJk/j73Xff/cFHtn/EL/Fdv/2hY1/60pcmvzwwNQD+19rbX+N/jr5+Ga9p4nlP/5XsvaKZL6vNfLMw+8fG6L/yV03yu1DZ1KIN/kKfpDJUD9IgqjZpyS1Vce4w55YSMSDG51XNmpoejQg7/uHlq4xCzJWwahvEXEL2IZOA2fgv5T2F8cus6/RjbW3jY7Nz04nobGq+lJvOK8aVa5KBgruzZ+FQyMP/uWNNrMniHJtjQ4mW2eJ0Yucm5Dl3tWRKTtfMmuiwLbepeX0m0evzBjsdMWsoZfHNT8dGLB9NmdUGbd6e7XLRyg6RhzrpeVhLf5fsvbeXQ/o7pPAZKSD98a4UrpHCMSn8XgovSqEoHZXSUUQcqVVJJTOZpLhWUqlUVmykp+t36b1eNFy39QYf+uvxWOl5nxn/tXirf/G+ZAB08Gdxbb9AXVpeM5CGbBoCaTCnQZIGeSHNtcch7pUrh0Jxbq4AYwXoKEC0ANMh6AtBLgThEBRChRCb90x7aM/XFl8um1FpZApr261zVtqK62KrGO92z+NfIcpT/IfuY8QDml8dl7hiUtTWhGrTXdhR/i+uu7v6SU+l0acVX1tb+vrSriajR2k3ueNxd8jmC3aArruudAsqhT6tpMaagdZ0v8noUqsSXm/C68BrEFGEn/sQfjxUguotJ56I/ChCRyOgiIAswoVlP5bRDFkmkyXCCVruSXCep9XgEJbGKLwMkUSDE7dwayNcta7lhvqFLVoc2xfWJvavj/Qae1KRrH7IONefn8uOS0yjrS2lCFjz7q6utjDoQr2x/nGjUpfucLoDkUJsYwf/Tk8gMeAvhkCnbW0KhKnFRaTX8vA/8JrOT/2Ip3QM9SPqSTF2Yh/8Bj5ISSnVCbw6LsEzK9WKrQZ9AL7AfxLu7YO2Af73qA0xBk9HUzpUV7KMd5JUG9Vaboy1ccoCeAtczBvzshIPYC5QWkEu0l8II8DkR1Q/K72ZakQIcljwglt139d8JoKv3doYbzTTnek2R3yT2mTQpN6H3BBtdluDMnqKnpo6rlOrDEWEjy66AhvoE2hm2MtaFk1M+jMUllvnM8AgZZ/BNruRxIQgLUqf6MHz2AOPQIDEBjrxLoPWybFmHHyrpYRYCcP7RNNe2hUIoE8Rf1zhsMvV1OSCR/B9p9/fiZ8Wo42NUfwrxOsgov2W6H8tjl/TqjhZA9nVkGjJQjVSNulMdZUpI0hmFsH7xweFiEz4D34cYgO33jpw69AAoqkZtoCGfl5HQwOP+cQC0+Ah94pFzB8302MQJ36/s6x7iQI7FaUexlEyICdLzlsIVxszbOAH84Mj9DOXojaQb4rtfsQn74n2ZRNtQ23oKN2DOmWDhmtQYi4jGwo1RxCxG/6BYLxrbxf6gHd8bgyaMttKpW2Z9zYzG9/7d+K/gIS6Ga5C45ffJ1WSNe96AbimGgojqdo7qM7QohGUCBIHtbXc95oKPqT6rIo+qoIFFai8Cs2QScXNmhBpwGTS/UYG18o+JXtBxuyRHZbRkzLolUFOBkEZGGXgkHEOHcFzrCq+hLkdE+RXvTcX8OMYTbYK2TUZZVpq1ZlsNpNZEw/kLAZpONcR+2O40aI12w1Gh94038rko01tFKaDFbZQ99HPIDrICd3RXIZfiHNN95C4zKAVreGzTKPv7G5v310qkWuwHImUgyF8RU127luzZl+ncB1pGkwkBpuEK4GhHcmMd4nM+DGRGT/GMgM9Ty2+Td9BP6fzg9xO6QLUC6Cn0HsAOK/2/pll7xvwe2oRHq2+ZwDxmB8U4vvtYv3vkrEmkd5/nPB4lNI+GPVzUdHMXbk8JsbidyMXICPESxGVIKx/vyzav12bM96Qy+eZDqUjJHZKs860Z/2SQXzqQ63TufCaZoc7H2wvpXsToXQ1ggrBSuKFmKsQDpC1rGegSKMnlKWsoTU6tpGeofUUQPs0FctCLHua8p20Syyv17LBs5fvos1ieauB9aLyRlS+tLL8dbXy3bRFLG/2kvIBVL68svzltfIdqEE0E8o6htb5cQWGtqMaw7gGrpJFsxrX+RiziTJQblQrV/YxQY5ioP/bDLQw8EMGbmDgZSQPGanKzamAxDekk0L4zCHsDCE6+YQAqbq4PjYsKGwyN4xkc5L+2PwQ/19D80AZLJ2xWJfZOOFw6A0Oh+GDWxslrq1PPEF/QRuzxTo7Y7Zm7XGHAb8yOE79rRpYRRN//loSH2KiEmUHjunRqk0cK+HUrJqltPKKvhbhI1q02HAkKm4pyieHYdXjWK6H4IdL8T78W4d3wSuSxq+JgT8kpmtPmn9G8BUTi0YSI5Wn1pcLh6Vglu6W0jYpd6cNrrLBnA2KtlEb/a4N7Daw6Ww2ZTDGBZnKBwxgMoDSwBWVSCwl8Y4XcXHaahtg2PXSQpXN/SuFiuCRnSb0iv7wDVNaQa54l4kb95ZPTp4mICvfDz4icuqE0DrF3i9sXxmiRZF5S2KeCK82CXMBfiHwHqg0Sic9A9rlvL2yfCf8QSyvVStDZy/fBb8Wy5t1SsSqoF8+F4Tyl9fKd8CvBN6mQePFFWiwLuNtYT5Qd5I+4uIYOsQ+JDJGhvpgV8FE/aaufCcMiuVZKdOxqvzinxFMsrryXVAWy6vlDB5DQ90Y0FzDuwZ/Ya4gPoCTspaVVqdeaqMrUqecqBkxX+cMNj7ejvB7Bfv+fNHe3z81xViERxZv9e/IKXGP04cu95IYKCf2uDVOjgaHlXM4NBILDnHQyJd73NiO0K+OvCOGxf61a5fF3131zDPQMwB9dUF4bw68UeMd+kIit1pFuRWt0tar9rIzEJAuk1sk5ojgMS3K3c2inPP6mUYlknMsQPTM5TvpfWL5gI8JnL18F71DLB8NMl5UPoTKJ1eWv65WvpveKZaPpEn5HCqfWln+8lr5DnpbVe76s7gCQ8dYkXMEuQvIy+2Hl+FFxAuaE8oGKdMgpKGRYPACXjCwshG25/bbk5/7nPC58Oabk7fckiRXEjN/klHRbyBO8lExRF2zha40GRo5s4HBcZQOWQwZi4IgFPciKYvgPEewVBFtCNwRZbGCsCZOCUlHYMnQj41u+/LeTWtDHaHe0W137d00Fu4I8ZJcEtLFnrHL1sKey0ezLfz3i2voTTefs/fuXZFiqJi9edOee3Y1dYU7+Y9f1AR/cI1eM8m/NHr11MCFTbzZJfAGibUhtGgTaS0TecNkYVzaGbCql83JleU7iU7D5a1mJnj28l20SizfaGO8qLxdvUyuCOUvr5XvoBVVuWJpwhVo8EhWyxW6j/TRKcqJv1fnvRIZjzN4IbEGU11sm4ayI0oZVXZOpdJQtA1Z8uiPOA311fUjYa+iNguxJ7QU1jV1y+owt2NCnNuX31mKcgNq3eJbtBHpK7xiZQV7XMKp1KjbuNvE2RUVN1TiylqMqbA6L4nkqjHc9Xk6ZJ+strFeDUcGg93l7JyI9kcizs7+wUyxdzq9radza24u19exsEYuXS8Z7wh1B8fX5Fq7h7tPvUdLune0pWcKXEJiPmdN9842hEchXuVlhMc+gsccfEecZ/EWxmWboZMmgI1LtFpZPg8/FMsnE0z47OULxObE5XMpxofKt6LysyvL/6pWvh2+J5bPdJHyZVT+nJXlT9bKZ+Gp6rxvKeMKDF1ANXbW8w6pwzhrddrgmVqd7FKd7nobDdVhLkCskkI82k9dUp6KhbhY6usyQA7MizK4SwaDMsCxATQO42FLe0vQVwK6BG+UIFvqK9ElSRv42jhFDhw5btAHPofPYUr1cyllRaEGuRDaQyIqYoLZhAyT2LyweaX7oxivQwypM4TqWE8TeYFMGRkyCkn4hQxx8KoYnrWd0W7DkHXvmv6ddu+2rlpwRmxnZthXWT98sHHoGrqAQzS6Nqq/PxK3DDatCPCJ+IOZ7lwqmeupRW50D/UXL8PBG7G1pXfiI3GtuRrzg2NsjCTGpkB5ygZkkyHzTTTU2IpSW9OFsf83kwx5IvD7gxOnt8m6t+VOF6BTGl9tlE0oRir9q0J2sOwUYmQwPw+J8+WkyJ++AONCeinILuP/leXz8FuxfNDPhM5evgCviOWbQ0Tvhdll80Uof7JWPgsvV3k5kBP0Xpxdwf/IhqduIX38pziG9GqbbOdSH9gC+3ld+TyUlmyy4qryi/+D3vJ15QvQtmST+USbbKFmky2+jd7+FslJwSbrLbcorUHrpPUT1setkhNWuMYKB60wY4UBKyD6mqxgdSoqNllFr5SCVAz3ITE24hx5f/vNLtptNfttcpI+JHy1eKt/LyDhJUhvtCD8uumfkvgfZ1nrTXFsE8eyXhNUvMqVuX0CRyLNjvU7DpbHuv30awSvVHp6zy8lB41SfSpwmWOuvejaNbjb0dfXVzo0nBiJxYbjidFYbCSuG7iof/CCNX4L09ztbOuOeNRDjelEt7v81YWJ4wMT8fXp9LoEvq6PE91O9piw/JwQ5WfVB2iMmP2KGWiWLZOfQjwFptUGkRd+t2T3uUQ7buOZy+fhH0t2X/Ds5Qvw+mq7b3Zl+V/VyrfDG1W7r5WUz7Kngf9krXwW/nQ6u29nvSwvUCb4LbIxyJoeZXhIq+K0WqfUKe4grYhAQu5qfUrY38Rljhfxyt43qxl5H8bZXngpbG7gJ3XJXwyC72UEn4fYiM2Ur2wyG2TNHDISLbKKQlExsBVZLcYPc+6ZLESJxWoULEQL2Y9jLBlYbO09MtqdcxRcCfytnHXmXfydLvtTwXByQ+svJ1qzT/qa4J4DpdFLhuxRTzy8fw365oh5E4tDDijpk7PF/0S/0wX+MR1F1hFfh78QWs2KvPBjkXcsNtop2m11cmFl+TzxB3F5u5UOnb18oSo7weOgsV3oVC/JhVr5k7XyWfhp1S60NdPELvQxABfUyzayr0/62CzC9IOqz6yAELILVdIlmPCe0GITnSHxcGEcR6MNc6yb0yorYlTc8rge9p8I7OmcWhFIQyJ7cAyNENlDP/PjvqXQnr5fgFkIoqmG9tTGcLI2hiw8WR23shG8MjRuZJ7UjRvpVSyjbwFeiBeTLYsXG5zCcRR0Ne/idckkkrUOxI2lcjPSsQYtFzfAVgPIDGAwsI5mztFQsRg5i7yCI1XoCuuvJUPVkn1JNGNdPlSufnHnjAkpcx9Pwu38g9DM/xhG+O3Jj8+JySmXrV172ZhOSNEYXnMxWfw5Wh6uZqhcM0kyNIT59DrzFLIfglQWWf6xssNt49zBLGfq5EymIBvn1O2cGhEvqBQdL2JNZJZL6NNbSqvBDgmWkxAyNlTxec7tW2khDRz0eitD9YFkdG81olWIJestFnt762yjns7OnmXxZW8JUa5AddAbYYLE3x8rzwyxR9ifsIyVBfZ3AA8DHAMYAXgJ4LsAmwEGALkIRaDRyxcAvg7wWfgK0NcDXAowhtwr/BoaARSIU6CBoRal8G2kLnEARSYj7mnOL4WB483NSobsLRQyZPuHDXTsGd2zIS/PbaBnL7xQWiph/tlBt0MrwxJdfUF5g9UKMisorZyyQW/X0w1SPXdCCmUpSKTQ+aoUHpXCJ6RwrhQm8XIdfvoLKVwoPSF9XMqsk4JTCr+WAqrRJQWHFLQigCJMFeEf3vIQNrLml4vm+n2d2zrxgmZXzOhymowul5Fu74zFi+hZZ8FlMjldRmMjsT999CTsp39ImanHyh//jP5hPa0vW51DCj1YGiRRCV1qk8xK6C8pgVValRHlXqVEouSOSGBB8rSEZiXQIJHoZdqwli4VtDPaL2n/oZWw2oj2Wi1j1nIFZPo/aQZzQg8v6d/V01/Ww6x+QU8X9fCsHr6Me7tFj4ikh0v1sF+PRPA6PY0KO/XQoAe9Hpsywr+tVRQkD2XQXDtE9jS3kHl3CN0gJ6GCcRHB1rAQ90LixTIIK38O2BuVPmbAm7Z7Wt0N6FtvlJ7UagyhcMbu1ocKxbOfabT6vhuMtON054Gc5IPV80BQGWbgNGUY+XtvVcskkYzC+7saSnVCxuorGuGkJELWEgjWkiwwGVJrSk2tBlfIAXzIqXObNzlGGY8VK9X6NuT3sRohomF5RnsyZ27EKhi1QttGJW4rVs64FSJfk4s3U/dRR3Us9SxFnbqVPEsAD7NE5n6f7L18n/rSiufPkufPVp8v3gyzqI0I9ewif+pW0taXTgmxu+PUc5CEB2p7Zgi+fB3bfry3t6Wlp6flud6WZA/62kv2fhbfoa9G7fkpPY33aPTUa2QPB3GOcO4HlQcfvEZJUZt4kpAxkxWqp9Of/3watC+23H13SzVXPo90t1CWEcqSFS22+LnPpZ9+ehcq+OKLFCxuXHwbzqGfQ6TSPAi0rkJSbzA1ImCFf4f/zvEtLvqh4KkRBJ8TtkA72R9Tkj4akd21lf4GlaDGyulQQf6CnGblXBPra9P8RENrNZxbiyw15KzEtEUtzWpZLW1yciZphY5xtLq67CGEJZBQFzHeRcj4I+FGuSwOfsFHplQDENiMOYCPGUJ/yAI8vXVw8+gV8+ZtG2h6wzbzlitGIuOeJlfGPXbc9eqbDPPmq64PjvV02KPFAyMDbq3WPTByoGgx9WnVG8cHzDabeWB8o1fQi3L4HbxEcoXsyDPVmOwyNa2RyUkGGw6aiaXFA6oywhot3udFgjKDD+TK4WOxiDEw1n9/T/wTnWW63NlM033uPppupu9oanrklTvueOXi+Be/GL+YnOHyYbiFaaVk+PwEkZaBgjWgD3zzU498/dMD9AceeeSUqXrey/morFkoK0TvFAgcbORTA5/+epT+wynTI+S8oD/A68iPWzU/8f5zeoDwrJhnpaNx1tnKOS6u7/8cvfdTSWR3sNRR6s+UCUcCgVwjbZLMgF5KUw+DjaqaT6iNONLHo0yQCuDd8YCJczg5hyPAqjiWhA6KvnzNUiBxtkveer4+bXr+24cOffv8fzu8buqiiWvHx6+dGNoZbFXxf4WjspbMga/qzv/G+ehzaN369ddPTFy/viXYuvmgu2nwI5kLEBwbF19grmDISmzZcbUDMg6wOzi7HZnv3A0+8LFq7gakSpF2iSXnaxkrkuUBwEuABQhYeJHtim8dPPitQxs+0vaBNVt6D/X0HOo954jmZbiO3fXA4Sh6c+hbB9uyR7r7LujtvbBv88jnI8nDX1tYygeYpFWUjoqW7XjvRabk5J+QPS+jUzIwyeCHstdlmKZY0mdiiKbJFTHSMiFE2jCdNWv1jWsmkB03kUgzM5Lpfv7XAt860TykEWFNlIvSPWTScKyNY03VaNLa8DwgtdSycYiBY33hSF9vpW/TQauKvz06sz59jvvA+jlF3u/paQbdwNHhsSO9XLf7xvXDnYkhqNg9wQEcn2NZZGjEQMQf9pR1LotXxmlSnEbjxbkv3hrNhVjj/8tsl0ePOHbr+lp7RiXm4UTPhYODF61JDJslBz56ILkmFFoTaeptQp9TW7qbw23rR8MO/8DRoeGjg357jA9/6HqYig4nWoabm0cSieEown8zwtBtjHxlzGvzhRdijSTgz4Lw14TGc9p9/rOkErxw8eDgxUND5NrUF43iY2DwVdd/dGT0aF/f0dGRo/0L0eGWluGocBX6dKE5cy+yQSLIEy2WgwZkZhuVsoonyXnYitKj9NgiBU6qU1QiNpbT2tCEI5lEyaUNVbydUMuKW0ppIvHjJGz4/fLk6MvnbZKJm8LJK6+c2rJly9rXJBLrlo6+g+XywT5/nadCMuauTJBcKLhvLDUy+9O+pey5ZU4Lyc+i76Sfp2JUoewJgSHK+XF6ls3NGWwGmzwWdggZWlDNz8okM+Jg0mkh9f80eVqny9vSr8zdei02moj6TR6LD4/otRWJXMJXuTwpjkPM60I0kPwewVukRpEGS1k0EQOHDD5ZJdPLZdhKnOUimXg8E2Eai6NcUVlpDHAebSMyqCs6qQk7VwhqvOwUq53RUh3HaahSpczKwZ2NUsyjOBHjE5hSk69NLRvzltHf1vmZqxIda2QjpKtDxwoqrsqBRHSU/DvCSyfVX47mwdDBZTAd3RHOzVasSc7gtlrdBkbe2Zbwr6BoErkVq7BhPMvAV2QhvR+Zt4y+tjwB7SYRMatG+MLKvLR6fIhzEDmT56BxJqh25AcHMu3tMfBHOAPtJ0zrt/lt8kQ0eBquXca2wgkcZ+dcn77GCFSdKXgGPk5B19RraGD0hwIBkm92RpbmaYHE/Dp6Omi3B3FqmsjfbjK+NqqPGig3dff1GTQZBRcwZmSVaJLLRDNRe5uUg7aY3cM5tXawQ0Wlw8cEisOMrRqmpJYd975MvWLcWMzXxxDdaZXbFR7naysZun7wI73D4sBfEbLs4O3T8XIdHnASHtNWw4DAx19B488gCetLgKGVa3ZgRraGOYPVYJVnkkHP6fi3OuizcG99Gt/ZmLaa5HdGduU7arl/KxiVjIMZQuOIYrkaAEOE85JhuIRhREP21aP4Z+QqHsNZIT8zyKdSyyAleU7MUwjOHnwCbUHLepVcNqXzhuOcV1bxhr1hS6mnk+tpUDdZXJxNawHL0oxKxjK1QCFyAK0gRfGJD/88p61OnGJ25Awm0/sw2mtTl1yiMwYbkWeIk6qM6SDEzsJnq3KuMH0OIV3eROXKHgiEOTogq2isnIatBDQBDdvUaGA9nBabnoISr5FH0OHGFSr7jPLwYlFVW5AA3D450BatCsApQTefUebV5B3tJnmyIWQh29TuAKdxy3CenNvkNoW8Fm1tLyWZEfkHw1cvraSrqVCNIn1aTJXlP1OPayzG6nJ2765HqiC5qrJKhC1F5cseR8zCOWOyii/CxXwxnzSl59Qpq80QWAKxVC+gVoJJL5dTudPKpBrEYnLvciaBrtPl+gpSqH4QS7m/mA8OID7wYOyCo5FT0g5ZxeFgPSYta1nJAEkyOeuofwZ5IhD9jfOe/v7uO+aWkfs0MqMKB60i61uRsgV0Ro7WySo6HWtuQD5ZPRQEiOUwrO55WZdLc16Y7/SHif7MlBv9CqeM8yidsorTqW9ORLiE3soZtXrQQ0WOo/KRWIrVhi3M7nDujBN75USmwzlD04pZvDofciVtyFSNGatTFZ83gS6/JGcINCFp6sVHCNiIcRPg0FQwuA1ueZNllTitTVeCLTjDaQKw0m+DN7duJfCaPGZ/8oorpvi1yzy5Kqw1y7TOtRP28SQWHLNL/YqsA/0WDolnZrxFP07ySZupZNmJk0kdLHIevCFOqfTiBFMkb+0NzdhExWATrIuwS86YY7oKenrryqzTU4/Vg3+6HFRatsw5FXjkc4RHkGx0y5R+zolBVSoJj3gVlTo2EZAdW8Yly3Jiz+AKrMqTrZPvWHWtTppd5RAsl+cI5isRflNUa9mRauYMMmUIzRsEdkqZUjYkHI1WrlHTQBGtJfIGATe2Et6VOPZXNdoqkH8zefy43hh027VumydvMBl/sxrqekQjVZUJIIZfAhyqOQAkz1ivpAxSzqCsqBQ4P91e3cQST4tbmfwrbmQVp3oLQgqwdabgLhjxxhXP/2BkoGU0Ch6eHolk7KbOhxFvuhffggk4rEPSZHGR/wJZW8JR0V+FA+iZvP4ZaEm5hqVnqK6HPFPUnjlQuTZSV7mi3H70TIWefb72zAsfRM/UQjmS6/AG6uMAPq/5BMnFFfJpCmSNjgl//qtv3auDQLFAjsET2/CR/rV1fb2O2sXPdGK7OMdkGjYg3sU7xLqHxBSTM8b/121EXNcfDPanUgPB4EAqFo/HmuPxZpjOz7a2zuaFa3FDOr0B/xL4hbwDsr4nrtWKZ00fzIZ2tK2hj8RS6/gbKbEs6BBMNgSRzYxMDE5jq56ttOI8U/F8b3PAfq3Z6rXZArJOxUA8PRx0bP/8P+Bfr7X4TSaXx22PZ4opT96xvSi0Pw1e1H4Ir+WFZJxaw6nVIaeZc4bq1vIMdbE4dUFqtX5ZooT3j6g65VG7IxJyRoN2j8cSN7SruxK53paOsTxMp1utXo/Pbmtsc1nMjoQ1FC+2tLi92VwZr2kJa83kzGhrWVE7M7qh7vRzRN+CmG7TBQH2qXu+2tXaukayA+6Kv/WHtpErrr+eEnE2Azjuz43H5JZxVhWHHFikF3XuM4xJyCMxB1hxPIi+54+qu2QRJ84XarK32X/wGZXCb8gOBbsCMJNosToamxob0Rx6tG1aoexvC3b4BH2D8ekjZ9x5cKSx0cPZlZzdbmSN4kCqrER2PvKnZaej3UGr5bzMTIPe3+YLdQZcobDLFQ41wrS/w99YcP9r4HxZoN2LbopNLmdTk9PVJI57Hfl/JFbMCycI8+LWe966Fw7UJgZDYPUT3goi2ddeDhWC8EIQgkFoDnK5Zog0v9BMNzergimwpThbsxtwLgLW7STBDB/kSc5XEMZTvxsjbunUD8pSd/Dzse6wy2GwDbe2DtkMDtf6nMXrsdo8Xqs92mxzRJucMO3K+B0tOmXUnOrsTJmiKl2LI9P9istkanSZzc4v+WxWn9dm94o4H0c4f57gHFGc8XD348wJpVFp55QI3CQ5Fh1PmJVHC2qhHsSpWaUOY7wrEOzCFGgNhVyN4XAjHKriW8T/4xjlGPWCfMmR/0PhGzqaMkowHa5DQDUK558/wCooTqogmwlkFZ/M84zZd8NtR+Pfyd/CVybgVXyy/J0TQlvnorpO0pa5G99Po7bt5N6SxPe96H2BvgfdWy3V92Fyb4vi+3PQfYKUtydIe+g+QN47SHtb0H2cvHeS9f9N6L6F3LtaMOzpxduoX1IX16+fFjJs4Piu3SMXnySxUbdRPyPnTWvxTpewE7csMR6VvlzMEPPvXBisO1X67yeFMc4tvkO9SB1Ffer9+D6K2vwJdbGOBuc/MD3x+5+I52WrT+itYmZS5synZX8wVA3AEVPTTntadq0vWoL6cr2L722ow80EP7J3Trc/Mo/eJ8n7Xe34foaap9N0C7rfY8T3GxdvoUOMDt2zOXwfQPjcTfD5ogzf70D1c+R+dyfhFXS/kbS3NyzQO083wmvoXkPotZ/6A+2BNLr/GaH3B6h+2gwvovvP5PCcPY8yIb/pfeKYqPeJY4Lmfz6QicD+KO2Fx1DfXnJ/LdVGy+A36N63Ft9fSrUBT+49Q5hu5xF/s5o3qV7Km9RKtCJ8JG8SVuRNgv90iZMCvfZS+2gL0v80dSCF/28WH8Ivt+z/ZkmW7Wf6v1mSVXH//+v/ZbmaHAkQ6g6hz1Z4NMv3DcVibk887gGd8IqcHOBpbvaQh/fgoqVgsIQr8AeF/5flTzjzGf/yDfWvi9XHZNy7F210hD6Jxr0Pswx/gj60+LgYL+krm/RHpRCT4qT130sltmVp64cyy5mgPhaSf35lwvqqKEgK+B/R2xf30C/X7ytCxhrgf4QPPXwZH3oIixpU5vblZfDM/yZOUCVFUDv30nsWn0RlGijNiQYGEPXwchturRZuwt9bizc596KLpOUyHusP6bWLtzNOMtYbygvXWp+y0oetsNcKYSuYrUAL0SfX6Z/Wv6VnjuphQQ9RPTj0oNYju0HPKaXQ/lcpPCuFOzGajklpkxQel8KHcRwKFKVwN0Lbu1LmWilsxQVAgU8jx2fSLwtD2VJNmp+vpqKmWukzxKL8VYxFIWEnOBZlbVcsRp61CbEoJhfByU30wuIv6F9RJup35btYmczUJoEnJfCwBO6UwJwERiXwlgT+RwLflYBC4pA0Sxi5RKKQaKA4pYE+DfxaA1/UPKihr9XAYQ2YNSENjV7KTRpOaYKiSf8NHSR15+tu0DG8Dn6rg5M6+JbuBzr6Zh3oyirdUKcOtDqPjpbr9JQCijsVMK2AtAK8CrhfAXcqIKWAFxXwhAKuUsBWBcQVoFiKzxHQUhJOxxbOn00uoelQLWalGmCkJ2Kbrgat5OtiVm4XY1Z6omLISk8zvYBDVgodOGKlg8x//gRjXnycuVzHUhx/hPoaweGPGOniHuaqGu8l6/iTuepSXG9Rg8rczlyF6h3mL8D1UFv3MsrFJ8mzJ/iLxGc3MarFXzDXoWdP8RXSvoKKLzKq58n+Nt6tG6QWqOPU1dQnqTupBxA/ToQDQXZhnAuYuEBggT3+Ae748QW28EmuUFhgB+/kBgcX2OkHuOnpBdbp4JzOBTb5US6ZXGBLt3Kl0gK75d+5LVsW2IOXcwcPLuBN84VlUuqfvYjS7J/aZUeexcrTo70r7iVn27cNvt++smTFpq73LPdn2/eXX3ThhW+/WbfVCu/U37x8xj1j+v732eF+u69uw5bm6m/21u01v0/QAWN7761lO7313/94hj3qP55+Y/2u+k3i5de6HW3q/wDKYGr9eNqVkMFKw0AQhv9t04qIHhQEe9qDeGtMW3rqqebQS04p9CgGuqSBJVs2baE3H8GnEE+efASPPpR/krUS6cUsZL/Zmf+fYQBc4B0C9XePJ8cCZ3hz3MIJPh23cSPg2MOVeHDcwbmwjru4FK+sFN4po8dKVbLANV4ct9j3w3EbQ3w59nAneo476ImF4y5uxTNCGKyxh0WGFCtsIKkNMMCYNGPW8F1DMYp4QvikKV807/igKqpI8Vb02vG/ZCVCs97bLF1t5DAYjOXMmFQrGUWhL6day7hMFTJWhbI7taSg2XGOBDk94YTzJGdQ9kmxZU3CXohVutWJbWonjejHp/9XW/tO6qt07x91+51EHneoJpMH7aLaQsHtGKrKjfrcaYARU8oWmcnl0A+CEf4zZWO8b66qbSp42m1TV2wjVRQ9J8WOkzhle++9eB0n2SRbUzdbstma7bvesT22JxnPeMfjZLOUBdGrQEj8gWg/gOhViPIBiN5ER4IPvujwAXwi3nvjtbHESPeee95t58nPqID6/vkeh/E/H7ulQwUqUYVq+OBHDQKoRR3qEUQDGtGEZkzBVEzDdMzATMzCbMzBXMzDfCzAQizCYizBUizDcqzASqzCaqzBWqzDeoSwAWG0IIJWtKEdG9GBTnRhEzZjC7ZiG7ajGz3oRR/6MYAdGMRO7MJu7MEQ9mIY+7AfB3AQh4T+ERzBURzDcZzASZzCaZxBFGehsQIP4lpch1dwN37A9bgdt+AePIyHWImb8Q2uwV2sYjVuow834nV8Rz/uxSP4C3/ibzyAx/AO3sLjiCGOO5DAe9DxNt7FR3gfH+BD/IgkPsXH+ARPIIU/cCe+wGf4HGn8jF9xE0ZhYAwZmLBwH2ycQxYOcsjDxTgm8BPO4wImcRmuwOV4EffjIq7EVbgav+A3vIQv8SSewlf4Fl+zhgHW4mk8g+fxAt7As3gOb+IGPIpX8RpeZh3rcSuDbMDvbGQTmzmFUzmN0zmDMzmLszmHczmP87mAC7mIi7mES7mMy7mCK7mKq7mGa7mO6xniBobZwghb2cZ2bmQHO9nFTdzMLdzKbdzObvawl33s5wB3cJA7uYu7uYdD3Mth7uN+HuBBHuJhjvAIj/IYj/MET/IUT/MMozxLjTHGmaDOJFNM0+Aox2gyQ4s2s/68ZYTDPeEC9nvYGylgawHbC9glMRIORwp4ifd62NFWNZB3bL/mOPZEPhtQmLAnLJWOtLRXDY8MDVUNJWzXNxgy7ZTtHwzl8lndqXZCmun6dHXoS3lgemArqExGY8KS1cKiMeXTyhvKjyo/prypvCuq08IMYaPCxoSZlfLcEVOERZMicitdgW7UVTds7e1ruqA7diihW3bGsDTXdhptSy/j7kRZvtlNO3pZRVPSzjvlB8Z4+Yyccb5sRk4f162yE91Ipd2yIZZRLqRBKbXyGd2RNCh1lphUWWSNnsYib1AK/0OlvlKvVFfq9bSVuKes1Kx0FalfqXKTPilHgNThJms8AW7SrzZLlCtFXu4SeW+JCLzpokCNdZOBuJ3JaPJ1BHN6xojbpm1JFhCvxrATssWrUIFMusn6UqWbDAppMd3JGSk1P5fV4kpIXLfknrp43nF0Kz4pdyVs09SUPPmOZTbn6o5pWCkpdVIp9GfNfE5OEj+DCuoyedM1sqY3wRg3Erq6yLm8ZoqgNuXompgiW009Jzvq5YhL7UHxuo24Zlq2lFMrrlVQVpvT466h7uA9znBnIOVo47q4byygxfOuigq5SAF7Aq5hJlSmrtAVimvZYLFTsWK3ZIW6iMoUu1Vm0LZTpvev/BeWnuwcAAAAAAEAAgAHAAr//wAPeNpjYGRgYOABYhMgZmJgY2BkeADEDxkeAXmPgZCR4QnDbyD7D6MdAyOjPaM9kP2NQYRBB6jDhsGLIYIhjaGEoYlhAsM8hmUM6xi2MexjOMZwjuEawz2GZwzvgPpZgPqc4TTIDi6ICFM9TXjoNhJH50PpIihdCqUjobQL0BZGhhfAsGAAAPKGIUgAAAB42sVYW0ycRRT+zl5/FliW7XahK12WFWvFSpE2pjEN1kpJ2VIgCLUhhkih3NxuG7o21hjS8GBMY3w0aowPpumjDz4YTUwffDDqgw8+iDWxsUZbL6j1Xi8tfjP/D/x7I9y2ZpM585+Z+c4358ycmVkIAB9elhhcrW0dvYgMnZ5MYufo5NHH0ZkcTKcwBhf7YG4OBoXAASc1Hnj5vZoWH+ShB3tjiBVoV1qBGyVDg8k0dg2njh9Dy8jk4BBak+OjgziSTD1xDGPJ40NJpFidRPqE0jyVVuUZjRfSZYBluYXtttBLaL8UZdT7dZ8NuqzUJXRZoUvRZRDVaMb92ItTmMIzeB4v4FWcx+t4ExfwHj7CJ7iEK/gRf+CmeMQvYdpRI2dNBPHp7yrpl1nHlNPlPOtyuaZcs+5+9zueqCft+dAb8g54X/F+ZpQZLcawcdY4Z1wwMYy3LPmxJa+bsqTBkmOWfMOUPsOSE5b81JSlPZac//7X5FYWt2SDJZstOa2jJ+VmFKXCZcqA32wPRC25m54F/RtChJqY1m7Uvtuuy9NW3YH9qKOnQ2wNo4o+3cQRt6GGfq/AZkTJy4lhjDBCF3EUo4zN53gJbxOzDrU4iRQjN04ch1RKhKY3yw7G0clIbmV8dqMN3egnQgpPYhrP0WrciqaKoUPHuUZzLVbNtOTUtXhBXv8HIx+2oIlruBWdOIwjSHItn9HxuhUesvslVoDLrWNRgno0Yhf3cwcO4TFMIM2WaBE9YZ9/NK/9Yls2uB634T7sQQK9GGA+F92+vnbt86zJY7M41rxcUw3YiRZmmB48Sm1knWZmn08kx856WvBwXSxmC2F2XMsM7Lyrs7DXjurm1/wOFubylTO18wtn4K0WycX4mLvKPPeXh2PnEbJhrGy0kz5WK119LW3Zbi+4MG45Ixz0U8y6zeT2t+MGrL6Fe6m5ir75zOvs4/0LNyd7i+jTXY2r1yd8eAnO8/NTOcDsm8lhZsHjDr0ys/uwJl4JZPUOU5r7r3D//COrGdn5TLScsflRIlyni3l7ZTj5EWu4M+0n4Wox86NHma8y7x9rx89vKcZMb8+LIzixrrbyW43zHM08XSbxdJHs5mdQz5tM9jk+hWeLziGXjbnTgtb7pSrDtoM9Zli7IR5qc3dylUZxFth/HvyWsXs9+C6jZ3Hu9BpX4lInd0iz3CVR6islKBskJBslLFVSLZskIrUSk+1yjzTK7XKn1MtW2SH3SpPcLdtki6gXTZ0+W9Wbz09GlXm5Kp61mtEwOY6Q5Th5ndQ8L5KvyDWOD/P2/iLtTctr8q5c0neqRiTkAfq9h78Eusi6S9d6KDsoW/EI93Uf9Zf51izQRoRSG8LehX7CvPVV4XGcT4w7vIkrcA+/uqkd4AwmuPtOcSdM4xo5trP3T1p28X2qZCd+0PIgX6dKduB7LQ8wskruw+/0f5eOeyd+ZXkQv7DswM8sD/CN6yDmtyzb8Q3LfSv0xNer9MSVJTyh2q8u0a4YBhjB63qG7fhLz+FPPQcH10cZ/tGav7VGdD7bz1pCI/axRUT1CzLHdeMc3/3v63HRgowvszU7knaNi6s8zpzZtgSCkaFvyNEk6EtPjpeyNVczNIp1DF9yxofxMFH6NPJie2ZLIgPLo71i+uSQdcIb2sYXxF1859dwRjPMIIaUiE9KpUzKxS8VEtCZI2hlDtXrA9zATcxxIP0rTnGJm1nKof+tUTlWZRn5D/8+UWEAAHjazVp5jCRVGf+quqqP6mump6en59pjFnaXhV0u5Vx31w0iKIoHKqIQ5ZIIAiEYQ5TVJSauJGJc+cPgRNGYDYjAiJKQkbConWiitMgiaTFrtEJEsVEGsVH7j/L3fq+quvqcnhlCqF+qu45X7/i+733Xe2KIiCMXyZVinXPuBRfJ1BW33HSdbP7ETVddK6dc9/Gbr5ddYqGMeJ6ossNcG9deddP1ksSVqe7wG5cCfpMSk81G0byE10780fhfSnvnnjz+iydcs/2k7Z/cfuf2GkpXWVdONstJaHuXnCNXy+fkLvmePCA/xvmY/BLfFz1XSl4DNY6j/2Wck2Lj6yKeJfn7Ba9hJLy6kcGZxZnDfR7/I14dJYv4nfGek30o+XldWhKsdbf3rHrqf9vAtw1800CbE3g7ie9Mfj2OZwa/UPdVfIc3huHVjBieGfgOvxhHToroY0km0MtJmZGNskl2y1HDMnIov4GjvUP+hNZToGBdug7PRUvtT2od94v8rbeeB1foQ/CkErxBuXpXjVVyKwvK2OiRA1iSB0wZAQwZBUxwsYD3NwCG7Afi8iv5Na6fAGLyJBCTpwFT/gjY+Hf4TVzGANAXMEGLEspNAAZoUga/Jsk9VYvFWix+H2e7NupIoycjuC5AHi5D6/vZ7hMo+TTKmdbFiormI+bLKDtHSgSoySoPUiS4nvcWvAZQAxreQXBkEf91xRlcVQPa9qilEVC6F2d7le7kjH7e/65fTbKGI+xzo11SOvoxzIjqUSooaQzrrnZSe5j6erZRW80I9ciC+TGYXn7vh5SnoWlvYsareaFnRIozwuaMsDgjkjIFGDINxKA5ZiRu5KA1EvjibLxNyiznaI6zM8eZNsIaRznTpqB3xvGtqnec9RZZ7wTrnWS9BTkGMKBtN+P9NqAs24GknAKU5U1AWU4HTDkD2ChnAjE5C7DQi7PR451AHHr6HIzhXDlPMvIOIC3vAzLyfiALC3MRrj8I5OVmYIN8GlgvnwGy8llgRm6TL6EnB4CEfBkoy53yDfzeBZTlm/IttP5tIC7flXvQ1r1yP+p8CBiDZXgE14tARn4OlKUCZKhT1lGnrKNmykkNcOQoUKKWGTGSRlJmjJSRkg2GYziy3kgbaZQxyJ9Ac0+BWjOgvgENY5F7SrMb8hBkNwbtX5O93oLshxQri7df7hYzv0eVzNyYvQA17KUEHfY1xn3QKEdxPe8tQXvb0CsVPHXx7Hn817wjeFf1Dvnaui6v4UG5V5rmD+3aJmhFv+fpaLvhNcM5s4SzueYevNRh35Z06xFt6bKluvf73tpGz992rLgXLjnS0DqAI16K1sazGY7eDbWZS664ndow/HZofnWMSWukeofO0SOt96XDUqetaf2vRNe36CpOa6whrdv78Lz2KGgFK74/YftypcseUjqddAJ9+9vHaI3awoYjbwa1BaNucTlSquHb+QgdWlYnoGlvL6qnjl/qrKHTOkclrcuLWlr7zHxd+rBueHmIaoSgBX9+NLttau8aorIzjOfQ8lr5reKcE0pCI/Rij6iZGPgPnXX26kW3x9DtCUdG+TCluwYtvEi/b9F7hdqwAt2t/rWO9vvgzbM2t7+HMEj+elNE6yZ6mbX2Wd6lozrnBTwV2JKafo+yzRa//HlRb48Llu81uWJzph7tP7KWlwR6HcT1ocjo7EBCvX04F0hXaAdFu+E1ZosCnbpT2Sv/ztUlIyVe7ScPQ2vrgO5uoAE7dRhkZqlT1v1v6mvzyLvnBeWignmxoCjZkmxQ8zDoWvF5UPOt22Hy4SDuH/ZeVP4G5VhJcs076Ft5pa8XdV1ajhnxtEnfyi3K8G8j+r2+IjrU4YEVOQI3UtdRn19uQAfec3yY0XWtMXiqd08pX0xTknSphnRwI3IXiZ079IvLPvyirQ+UQu0XBPf8P8K+LnKORvugatcWteLfV9v0qtvlpR1t6wHntG9Jg7Zc9gK907XoFgfIdz3SQjSfUO/Hu3bZUD4rZHI+yEn4tH8Yz6vheGq+bN7HcvO4v4+RdZVx9SLuqt4BnxcLpEaFfaswSlwKZbrR2eNOm9XhndUDbq5k1g8fzwUapys7s6w0K1nsPcc0z3pFzD3jyWPkWEBHc6ZsAWKyFbDkOMBmfBeX4+UERFgqykvJDsCRE4G0nCQn47mK+zJyKpBl9JeRNwM5OQ3IMxIcYSQ4ykiwwEhwjJFgkZHguLwFKDGOsxjHmXK7fAXXdwAJ+ap8DdHlQSAmXwcSjPIyjPIyjPJGGeWNI4K6G7GXiuYsjMmWV/HmdIzzDDwd5YjLOHeg/R2IDHciGhbZg1EI2hfZjYjyrYA+VP/XMRupD/1/Qkg7wz/PRG9jaM9GhBrH6AWRnzpOxbkJ9EwTSVBuC6i9nTRWFE6DWmnQeBsoMsaM3xxocPwAbiUw2pPxfxauokcW5y5eZUBTfZyIvrewPhyFgDNC/ugxBFDXMR9x3G1B36NIhzgWkqJkZppjCCA4x3yU8HUJbw0+bx2K7yord4r/OwUunBz22LfE4Ev3kRyIrUSBGWMLNFa8vA0SMgX5uBstKHk4Q8zM1Sq2Tu1xfgA+bwu8HEJ7yE2VHV59/q9NlzR9y75EPVLx2wnwqG/hm0NlxOiJRf2x6Nz2Y83I71C9bMKiN3Wt4ZFfo7Oh4jmVDbYjUXFzWR20jIYEnvf+HPWGfE+s2B67Uts3aKOLeLcYWLf+9GwbvRPqeae79DDaPZIB7fI1+3vvg/jfm+9rlM7+dW5dQ52DZKm4Gvvo03Cp02ca3uZ2z+MW33VU0YvbKx97iMZrx6Mg+oLk1zmHXu625YG/1tdDcLX32R7ld+mlYJZqXVjTXt9y8hZKb1BnPcxjRXUdNSrnYbNb1/XufUSW7B6ytGl1OoSRlorvHHgBaqWq1MYtu31dTHmVvD5E77HWU15tnnaHTq609EowH1agk1XOoum9oH5Rs8rT29RLdqQ9e6DMN4ajZx/PsTF0P0VLET2FZdfEgkyL8uj78r1bZ2YGrd4Eubmof963n0ur1iFuz6xjazU016nF2/IHi5QI189sKI+9MuTYddsO+e1QR61aT608h9Q3VtgpbwMMORcw5e1ATM4DLDkfsLmGE5d3Ajm5AEjKuwBH3g2k5UIgI++R9+KtWufJc51nhOs8o/IBoMDVnjH5EFCUi4Fx+TBQkkuACfkIUJaPApNyKTDFtaBx+Q6QkHsAS+4FTPm+3I/rB4CkPCg/hO+t1nym5UdAjis/ea785OUn8hhqOAxMyuOAIT8FJuVnQJYrQpb8FTDkb4AtLwCG/B3ISR1IyouAI/8A0vJPICMvAUVZAnLyMpCUfwGOvAKk5d9ARhpAEfHJf1Dnf4Gi/A+wpQmoFe/z0ecU/PYMME1dMMs1u1n6uRNcm9vIVbnjEDfM4RsVZ21ihHUMPe1jGVttRlSzG3XsAaZlLzDJdTeDvBzl6pvmn0n+xci/UfIvS/6NgHsX4oniXIGcs8i5MXLOIudK5JxNzsXJuTI5lyDnkuRcipxzyLm0fAyYlk8Bc+TimNwKbOUegQ2M5jaTr6NcuTO4cqc5mgNHHwQ9FsDXHPk6Rb4WyFeLfLXI1zL56pCvo+SrQ74WfL6qlb5xqQJb5DeAXvUbl98CW+QpQK8AzsrvgDl5BtgqzwIzXAecgFyoXR6vgn8FcK+JsZtc17wU80WNagojeATjXESrp7LVnfimiQjFTF6uopF4Mf4cqLdJe7TyBjq6s5Kr9N9rgzJIr+N46u3WYrD/NIAqLnPQlUh+zV1ZTczacUWglYUN7Zr2oKrD1hhd/3stcsWRKKu6wi9rXN2rdVr/IH9H37LeyvEtU2NF51X9uwPd1rFv/sttq6Ua9ALlD/jrtzrT7/r9qtJX1li2xmiWcmXZd7W2wexklX0/EK4Mu+F7l1nchs52qj1C3TzAu30Rb2N+cF+7vTGdwe/hTdXbo4Uh5rTO97tvBE01OMO8nKTR0z+Ic96XikqQcWYGutLOBz6r+e9rkXXvK0ndhXbq+lJYZzbbXcYLM7lPxGIu0Yb1jXMXnPL/svQDDPxn6QvkYVnVLrsYfYIEfYIc7NQ61jEHW6us/gitvkGrP06La8gVQIF2V+/Ki8ktQJLWN07rW+ROuRitY5rWMUPr6NA6pmkdM7SOjhwBRmkjE7SRNm1knNYxh77s5q6iEncMJZhjzjOjnI/sGMozZ6zzxDbzxCP0YuL0YmLME6foy1jME8/Rf9lAz8Wh52LQc5mgzzJFn8WktzJLb8Wht1Kmt+LQW1lHb2WS3soovZX19FYK9FbG6K1k6K1k6a1spC0vc7dRglnqHLPUeeah88xD55mHHqHnYtFn2UCfxaHPMk2fZYY+yzR9ljR9lln6LA59Foc+y3r6LFl6K1l6K7PMX+bpPTjkxzj5USQnxsmJIj0Rg57ILD2RUdxtoSTFuRsyQ8nROyKVnMzJLnBnDyTjMsjFFZCHGyAHt4b7JKto4UnU/xQ4/DQ4+4zaNYlftY/pGtmH/zQ1wcIAXaNXaiN7S3wt2wg0cp9IROXTk9z7q3xgg/lnk7un9M4zJTsm5cWipNiUlDglxaGkJMjPJHmYiuwSi5E/CdI4RRqnuE6gsvOb5Fq5EfU+zjFug2Sq+ab37lT0On3gzVBTBvl/E5LX2hFnUb4t9jFG+bYo3xZXQ2z2Ok4pT7DvSfY9Fel7mjKdifTapLRZlDaL0mZR2hIcTdpf71ASkOFOsphcjt8dHEcJfYqF2X+TOwhbNDXCdQwrQgG9W63AnYRGZKWjdQZtnMaSZbZltPFPtWKylRg95mhNdtjWs8O39n+9JfMNAAAAAAABAAAAANWkJwgAAAAA1YO2WAAAAADY2izo') format('woff'); + font-weight: normal; + font-style: normal; +} + +/* Logo Font */ +@font-face { + font-family: 'TypoGraphica'; + src: url('../fonts/TypoGraphica.eot?#iefix') format('embedded-opentype'), url('../fonts/TypoGraphica.woff') format('woff'), url('../fonts/TypoGraphica.ttf') format('truetype'), url('../fonts/TypoGraphica.svg#TypoGraphica') format('svg'); + font-weight: normal; + font-style: normal; +} + +/* ICON Font */ + +@font-face { + font-family: 'argon'; + src: url('../fonts/argon.eot?u6kthm'); + src: url('../fonts/argon.eot?u6kthm#iefix') format('embedded-opentype'), + url('../fonts/argon.ttf?u6kthm') format('truetype'), + url('../fonts/argon.woff?u6kthm') format('woff'), + url('../fonts/argon.svg?u6kthm#argon') format('svg'); + font-weight: normal; + font-style: normal; + font-display: block; +} + +[class^="icon-"], +[class*=" icon-"] { + /* use !important to prevent issues with browser extensions that change fonts */ + font-family: 'argon' !important; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-expand_more:before { + content: "\e20b"; +} + +.icon-menu:before { + content: "\e20e"; +} + +.icon-favorite:before { + content: "\e291"; +} + +.icon-spinner:before { + content: "\e603"; +} + +.icon-delete:before { + content: "\e900"; +} + +.icon-edit:before { + content: "\e901"; +} + +.icon-use:before { + content: "\e902"; +} + +.icon-loading:before { + content: "\e903"; +} + +.icon-switch:before { + content: "\e904"; +} + +.icon-error:before { + content: "\e905"; +} + +.icon-dashboard:before { + content: "\e906"; +} + +.icon-logout:before { + content: "\e907"; +} + +.icon-Network:before { + content: "\e908"; +} + +.icon-services:before { + content: "\e909"; +} + +.icon-system:before { + content: "\e90a"; +} + +.icon-vpn:before { + content: "\e90b"; +} + +.icon-storage:before { + content: "\e90c"; +} + +.icon-statistics:before { + content: "\e90d"; +} + +.icon-hello-world:before { + content: "\e90e"; +} + +.icon-angle-right:before { + content: "\e90f"; +} + +.icon-password:before { + content: "\e910"; +} + +.icon-user:before { + content: "\e971"; +} + +.icon-question:before { + content: "\f059"; +} + +.icon-docker:before { + content: "\e911"; +} + +.icon-control:before { + content: "\e912"; +} + +.icon-statistics1:before { + content: "\e913"; +} + +.icon-asterisk:before { + content: "\e914"; +} + +.icon-app:before { + content: "\e915"; +} \ No newline at end of file diff --git a/luci-theme-argon/htdocs/luci-static/argon/css/pure-min.css b/luci-theme-argon/htdocs/luci-static/argon/css/pure-min.css new file mode 100644 index 00000000..e898cf2c --- /dev/null +++ b/luci-theme-argon/htdocs/luci-static/argon/css/pure-min.css @@ -0,0 +1,11 @@ +/*! +Pure v2.0.3 +Copyright 2013 Yahoo! +Licensed under the BSD License. +https://github.com/pure-css/pure/blob/master/LICENSE.md +*/ +/*! +normalize.css v | MIT License | git.io/normalize +Copyright (c) Nicolas Gallagher and Jonathan Neal +*/ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select{font-family:inherit;font-size:100%;line-height:1.15;margin:5px}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}html{font-family:sans-serif}.hidden,[hidden]{display:none!important}.pure-img{max-width:100%;height:auto}.pure-g{letter-spacing:-.31em;text-rendering:optimizespeed;font-family:FreeSans,Arimo,"Droid Sans",Helvetica,Arial,sans-serif;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-line-pack:start;align-content:flex-start}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){table .pure-g{display:block}}.opera-only :-o-prefocus,.pure-g{word-spacing:-.43em}.pure-u{display:inline-block;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-g [class*=pure-u]{font-family:sans-serif}.pure-u-1,.pure-u-1-1,.pure-u-1-12,.pure-u-1-2,.pure-u-1-24,.pure-u-1-3,.pure-u-1-4,.pure-u-1-5,.pure-u-1-6,.pure-u-1-8,.pure-u-10-24,.pure-u-11-12,.pure-u-11-24,.pure-u-12-24,.pure-u-13-24,.pure-u-14-24,.pure-u-15-24,.pure-u-16-24,.pure-u-17-24,.pure-u-18-24,.pure-u-19-24,.pure-u-2-24,.pure-u-2-3,.pure-u-2-5,.pure-u-20-24,.pure-u-21-24,.pure-u-22-24,.pure-u-23-24,.pure-u-24-24,.pure-u-3-24,.pure-u-3-4,.pure-u-3-5,.pure-u-3-8,.pure-u-4-24,.pure-u-4-5,.pure-u-5-12,.pure-u-5-24,.pure-u-5-5,.pure-u-5-6,.pure-u-5-8,.pure-u-6-24,.pure-u-7-12,.pure-u-7-24,.pure-u-7-8,.pure-u-8-24,.pure-u-9-24{display:inline-block;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-1-24{width:4.1667%}.pure-u-1-12,.pure-u-2-24{width:8.3333%}.pure-u-1-8,.pure-u-3-24{width:12.5%}.pure-u-1-6,.pure-u-4-24{width:16.6667%}.pure-u-1-5{width:20%}.pure-u-5-24{width:20.8333%}.pure-u-1-4,.pure-u-6-24{width:25%}.pure-u-7-24{width:29.1667%}.pure-u-1-3,.pure-u-8-24{width:33.3333%}.pure-u-3-8,.pure-u-9-24{width:37.5%}.pure-u-2-5{width:40%}.pure-u-10-24,.pure-u-5-12{width:41.6667%}.pure-u-11-24{width:45.8333%}.pure-u-1-2,.pure-u-12-24{width:50%}.pure-u-13-24{width:54.1667%}.pure-u-14-24,.pure-u-7-12{width:58.3333%}.pure-u-3-5{width:60%}.pure-u-15-24,.pure-u-5-8{width:62.5%}.pure-u-16-24,.pure-u-2-3{width:66.6667%}.pure-u-17-24{width:70.8333%}.pure-u-18-24,.pure-u-3-4{width:75%}.pure-u-19-24{width:79.1667%}.pure-u-4-5{width:80%}.pure-u-20-24,.pure-u-5-6{width:83.3333%}.pure-u-21-24,.pure-u-7-8{width:87.5%}.pure-u-11-12,.pure-u-22-24{width:91.6667%}.pure-u-23-24{width:95.8333%}.pure-u-1,.pure-u-1-1,.pure-u-24-24,.pure-u-5-5{width:100%}.pure-button{display:inline-block;line-height:normal;white-space:nowrap;vertical-align:middle;text-align:center;cursor:pointer;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-box-sizing:border-box;box-sizing:border-box}.pure-button::-moz-focus-inner{padding:0;border:0}.pure-button-group{letter-spacing:-.31em;text-rendering:optimizespeed}.opera-only :-o-prefocus,.pure-button-group{word-spacing:-.43em}.pure-button-group .pure-button{letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-button{font-family:inherit;font-size:100%;padding:.5em 1em;color:rgba(0,0,0,.8);border:none transparent;background-color:#e6e6e6;text-decoration:none;border-radius:2px}.pure-button-hover,.pure-button:focus,.pure-button:hover{background-image:-webkit-gradient(linear,left top,left bottom,from(transparent),color-stop(40%,rgba(0,0,0,.05)),to(rgba(0,0,0,.1)));background-image:linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1))}.pure-button:focus{outline:0}.pure-button-active,.pure-button:active{-webkit-box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 0 6px rgba(0,0,0,.2) inset;box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 0 6px rgba(0,0,0,.2) inset;border-color:#000}.pure-button-disabled,.pure-button-disabled:active,.pure-button-disabled:focus,.pure-button-disabled:hover,.pure-button[disabled]{border:none;background-image:none;opacity:.4;cursor:not-allowed;-webkit-box-shadow:none;box-shadow:none;pointer-events:none}.pure-button-hidden{display:none}.pure-button-primary,.pure-button-selected,a.pure-button-primary,a.pure-button-selected{background-color:#0078e7;color:#fff}.pure-button-group .pure-button{margin:0;border-radius:0;border-right:1px solid rgba(0,0,0,.2)}.pure-button-group .pure-button:first-child{border-top-left-radius:2px;border-bottom-left-radius:2px}.pure-button-group .pure-button:last-child{border-top-right-radius:2px;border-bottom-right-radius:2px;border-right:none}.pure-form input[type=color],.pure-form input[type=date],.pure-form input[type=datetime-local],.pure-form input[type=datetime],.pure-form input[type=email],.pure-form input[type=month],.pure-form input[type=number],.pure-form input[type=password],.pure-form input[type=search],.pure-form input[type=tel],.pure-form input[type=text],.pure-form input[type=time],.pure-form input[type=url],.pure-form input[type=week],.pure-form select,.pure-form textarea{padding:.5em .6em;display:inline-block;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 3px #ddd;box-shadow:inset 0 1px 3px #ddd;border-radius:4px;vertical-align:middle;-webkit-box-sizing:border-box;box-sizing:border-box}.pure-form input:not([type]){padding:.5em .6em;display:inline-block;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 3px #ddd;box-shadow:inset 0 1px 3px #ddd;border-radius:4px;-webkit-box-sizing:border-box;box-sizing:border-box}.pure-form input[type=color]{padding:.2em .5em}.pure-form input[type=color]:focus,.pure-form input[type=date]:focus,.pure-form input[type=datetime-local]:focus,.pure-form input[type=datetime]:focus,.pure-form input[type=email]:focus,.pure-form input[type=month]:focus,.pure-form input[type=number]:focus,.pure-form input[type=password]:focus,.pure-form input[type=search]:focus,.pure-form input[type=tel]:focus,.pure-form input[type=text]:focus,.pure-form input[type=time]:focus,.pure-form input[type=url]:focus,.pure-form input[type=week]:focus,.pure-form select:focus,.pure-form textarea:focus{outline:0;border-color:#129fea}.pure-form input:not([type]):focus{outline:0;border-color:#129fea}.pure-form input[type=checkbox]:focus,.pure-form input[type=file]:focus,.pure-form input[type=radio]:focus{outline:thin solid #129fea;outline:1px auto #129fea}.pure-form .pure-checkbox,.pure-form .pure-radio{margin:.5em 0;display:block}.pure-form input[type=color][disabled],.pure-form input[type=date][disabled],.pure-form input[type=datetime-local][disabled],.pure-form input[type=datetime][disabled],.pure-form input[type=email][disabled],.pure-form input[type=month][disabled],.pure-form input[type=number][disabled],.pure-form input[type=password][disabled],.pure-form input[type=search][disabled],.pure-form input[type=tel][disabled],.pure-form input[type=text][disabled],.pure-form input[type=time][disabled],.pure-form input[type=url][disabled],.pure-form input[type=week][disabled],.pure-form select[disabled],.pure-form textarea[disabled]{cursor:not-allowed;background-color:#eaeded;color:#cad2d3}.pure-form input:not([type])[disabled]{cursor:not-allowed;background-color:#eaeded;color:#cad2d3}.pure-form input[readonly],.pure-form select[readonly],.pure-form textarea[readonly]{background-color:#eee;color:#777;border-color:#ccc}.pure-form input:focus:invalid,.pure-form select:focus:invalid,.pure-form textarea:focus:invalid{color:#b94a48;border-color:#e9322d}.pure-form input[type=checkbox]:focus:invalid:focus,.pure-form input[type=file]:focus:invalid:focus,.pure-form input[type=radio]:focus:invalid:focus{outline-color:#e9322d}.pure-form select{height:2.25em;border:1px solid #ccc;background-color:#fff}.pure-form select[multiple]{height:auto}.pure-form label{margin:.5em 0 .2em}.pure-form fieldset{margin:0;padding:.35em 0 .75em;border:0}.pure-form legend{display:block;width:100%;padding:.3em 0;margin-bottom:.3em;color:#333;border-bottom:1px solid #e5e5e5}.pure-form-stacked input[type=color],.pure-form-stacked input[type=date],.pure-form-stacked input[type=datetime-local],.pure-form-stacked input[type=datetime],.pure-form-stacked input[type=email],.pure-form-stacked input[type=file],.pure-form-stacked input[type=month],.pure-form-stacked input[type=number],.pure-form-stacked input[type=password],.pure-form-stacked input[type=search],.pure-form-stacked input[type=tel],.pure-form-stacked input[type=text],.pure-form-stacked input[type=time],.pure-form-stacked input[type=url],.pure-form-stacked input[type=week],.pure-form-stacked label,.pure-form-stacked select,.pure-form-stacked textarea{display:block;margin:.25em 0}.pure-form-stacked input:not([type]){display:block;margin:.25em 0}.pure-form-aligned input,.pure-form-aligned select,.pure-form-aligned textarea,.pure-form-message-inline{display:inline-block;vertical-align:middle}.pure-form-aligned textarea{vertical-align:top}.pure-form-aligned .pure-control-group{margin-bottom:.5em}.pure-form-aligned .pure-control-group label{text-align:right;display:inline-block;vertical-align:middle;width:10em;margin:0 1em 0 0}.pure-form-aligned .pure-controls{margin:1.5em 0 0 11em}.pure-form .pure-input-rounded,.pure-form input.pure-input-rounded{border-radius:2em;padding:.5em 1em}.pure-form .pure-group fieldset{margin-bottom:10px}.pure-form .pure-group input,.pure-form .pure-group textarea{display:block;padding:10px;margin:0 0 -1px;border-radius:0;position:relative;top:-1px}.pure-form .pure-group input:focus,.pure-form .pure-group textarea:focus{z-index:3}.pure-form .pure-group input:first-child,.pure-form .pure-group textarea:first-child{top:1px;border-radius:4px 4px 0 0;margin:0}.pure-form .pure-group input:first-child:last-child,.pure-form .pure-group textarea:first-child:last-child{top:1px;border-radius:4px;margin:0}.pure-form .pure-group input:last-child,.pure-form .pure-group textarea:last-child{top:-2px;border-radius:0 0 4px 4px;margin:0}.pure-form .pure-group button{margin:.35em 0}.pure-form .pure-input-1{width:100%}.pure-form .pure-input-3-4{width:75%}.pure-form .pure-input-2-3{width:66%}.pure-form .pure-input-1-2{width:50%}.pure-form .pure-input-1-3{width:33%}.pure-form .pure-input-1-4{width:25%}.pure-form-message-inline{display:inline-block;padding-left:.3em;color:#666;vertical-align:middle;font-size:.875em}.pure-form-message{display:block;color:#666;font-size:.875em}@media only screen and (max-width :480px){.pure-form button[type=submit]{margin:.7em 0 0}.pure-form input:not([type]),.pure-form input[type=color],.pure-form input[type=date],.pure-form input[type=datetime-local],.pure-form input[type=datetime],.pure-form input[type=email],.pure-form input[type=month],.pure-form input[type=number],.pure-form input[type=password],.pure-form input[type=search],.pure-form input[type=tel],.pure-form input[type=text],.pure-form input[type=time],.pure-form input[type=url],.pure-form input[type=week],.pure-form label{margin-bottom:.3em;display:block}.pure-group input:not([type]),.pure-group input[type=color],.pure-group input[type=date],.pure-group input[type=datetime-local],.pure-group input[type=datetime],.pure-group input[type=email],.pure-group input[type=month],.pure-group input[type=number],.pure-group input[type=password],.pure-group input[type=search],.pure-group input[type=tel],.pure-group input[type=text],.pure-group input[type=time],.pure-group input[type=url],.pure-group input[type=week]{margin-bottom:0}.pure-form-aligned .pure-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.pure-form-aligned .pure-controls{margin:1.5em 0 0 0}.pure-form-message,.pure-form-message-inline{display:block;font-size:.75em;padding:.2em 0 .8em}}.pure-menu{-webkit-box-sizing:border-box;box-sizing:border-box}.pure-menu-fixed{position:fixed;left:0;top:0;z-index:3}.pure-menu-item,.pure-menu-list{position:relative}.pure-menu-list{list-style:none;margin:0;padding:0}.pure-menu-item{padding:0;margin:0;height:100%}.pure-menu-heading,.pure-menu-link{display:block;text-decoration:none;white-space:nowrap}.pure-menu-horizontal{width:100%;white-space:nowrap}.pure-menu-horizontal .pure-menu-list{display:inline-block}.pure-menu-horizontal .pure-menu-heading,.pure-menu-horizontal .pure-menu-item,.pure-menu-horizontal .pure-menu-separator{display:inline-block;vertical-align:middle}.pure-menu-item .pure-menu-item{display:block}.pure-menu-children{display:none;position:absolute;left:100%;top:0;margin:0;padding:0;z-index:3}.pure-menu-horizontal .pure-menu-children{left:0;top:auto;width:inherit}.pure-menu-active>.pure-menu-children,.pure-menu-allow-hover:hover>.pure-menu-children{display:block;position:absolute}.pure-menu-has-children>.pure-menu-link:after{padding-left:.5em;content:"\25B8";font-size:small}.pure-menu-horizontal .pure-menu-has-children>.pure-menu-link:after{content:"\25BE"}.pure-menu-scrollable{overflow-y:scroll;overflow-x:hidden}.pure-menu-scrollable .pure-menu-list{display:block}.pure-menu-horizontal.pure-menu-scrollable .pure-menu-list{display:inline-block}.pure-menu-horizontal.pure-menu-scrollable{white-space:nowrap;overflow-y:hidden;overflow-x:auto;padding:.5em 0}.pure-menu-horizontal .pure-menu-children .pure-menu-separator,.pure-menu-separator{background-color:#ccc;height:1px;margin:.3em 0}.pure-menu-horizontal .pure-menu-separator{width:1px;height:1.3em;margin:0 .3em}.pure-menu-horizontal .pure-menu-children .pure-menu-separator{display:block;width:auto}.pure-menu-heading{text-transform:uppercase;color:#565d64}.pure-menu-link{color:#777}.pure-menu-children{background-color:#fff}.pure-menu-disabled,.pure-menu-heading,.pure-menu-link{padding:.5em 1em}.pure-menu-disabled{opacity:.5}.pure-menu-disabled .pure-menu-link:hover{background-color:transparent}.pure-menu-active>.pure-menu-link,.pure-menu-link:focus,.pure-menu-link:hover{background-color:#eee}.pure-menu-selected>.pure-menu-link,.pure-menu-selected>.pure-menu-link:visited{color:#000}.pure-table{border-collapse:collapse;border-spacing:0;empty-cells:show;border:1px solid #cbcbcb}.pure-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.pure-table td,.pure-table th{border-left:1px solid #cbcbcb;border-width:0 0 0 1px;font-size:inherit;margin:0;overflow:visible;padding:.5em 1em}.pure-table thead{background-color:#e0e0e0;color:#000;text-align:left;vertical-align:bottom}.pure-table td{background-color:transparent}.pure-table-odd td{background-color:#f2f2f2}.pure-table-striped tr:nth-child(2n-1) td{background-color:#f2f2f2}.pure-table-bordered td{border-bottom:1px solid #cbcbcb}.pure-table-bordered tbody>tr:last-child>td{border-bottom-width:0}.pure-table-horizontal td,.pure-table-horizontal th{border-width:0 0 1px 0;border-bottom:1px solid #cbcbcb}.pure-table-horizontal tbody>tr:last-child>td{border-bottom-width:0} \ No newline at end of file diff --git a/luci-theme-argon/htdocs/luci-static/argon/favicon.ico b/luci-theme-argon/htdocs/luci-static/argon/favicon.ico new file mode 100644 index 00000000..79c8f860 Binary files /dev/null and b/luci-theme-argon/htdocs/luci-static/argon/favicon.ico differ diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.eot b/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.eot new file mode 100644 index 00000000..efce636a Binary files /dev/null and b/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.eot differ diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.svg b/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.svg new file mode 100644 index 00000000..c555b759 --- /dev/null +++ b/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.svg @@ -0,0 +1,1191 @@ + + + + +Created by FontForge 20090622 at Tue Jul 23 03:29:07 2019 + By deploy user +TypoGraphica ©Sharkshock Productions 2015. All Rights Reserved + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.ttf b/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.ttf new file mode 100644 index 00000000..e11f89a0 Binary files /dev/null and b/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.ttf differ diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.woff b/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.woff new file mode 100644 index 00000000..fef38ca0 Binary files /dev/null and b/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.woff differ diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.eot b/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.eot new file mode 100644 index 00000000..e28f6db5 Binary files /dev/null and b/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.eot differ diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.svg b/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.svg new file mode 100644 index 00000000..1e12b5f6 --- /dev/null +++ b/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.svg @@ -0,0 +1,38 @@ + + + +Generated by IcoMoon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.ttf b/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.ttf new file mode 100644 index 00000000..3d062dcf Binary files /dev/null and b/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.ttf differ diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.woff b/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.woff new file mode 100644 index 00000000..ef1e9c2c Binary files /dev/null and b/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.woff differ diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/android-icon-192x192.png b/luci-theme-argon/htdocs/luci-static/argon/icon/android-icon-192x192.png new file mode 100644 index 00000000..7bfe4e5f Binary files /dev/null and b/luci-theme-argon/htdocs/luci-static/argon/icon/android-icon-192x192.png differ diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-144x144.png b/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-144x144.png new file mode 100644 index 00000000..8d523df8 Binary files /dev/null and b/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-144x144.png differ diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-60x60.png b/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-60x60.png new file mode 100644 index 00000000..4c80656d Binary files /dev/null and b/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-60x60.png differ diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-72x72.png b/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-72x72.png new file mode 100644 index 00000000..07753022 Binary files /dev/null and b/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-72x72.png differ diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/browserconfig.xml b/luci-theme-argon/htdocs/luci-static/argon/icon/browserconfig.xml new file mode 100644 index 00000000..c5541482 --- /dev/null +++ b/luci-theme-argon/htdocs/luci-static/argon/icon/browserconfig.xml @@ -0,0 +1,2 @@ + +#ffffff \ No newline at end of file diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-16x16.png b/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-16x16.png new file mode 100644 index 00000000..88bf3297 Binary files /dev/null and b/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-16x16.png differ diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-32x32.png b/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-32x32.png new file mode 100644 index 00000000..d524df3e Binary files /dev/null and b/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-32x32.png differ diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-96x96.png b/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-96x96.png new file mode 100644 index 00000000..6c8e8874 Binary files /dev/null and b/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-96x96.png differ diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/manifest.json b/luci-theme-argon/htdocs/luci-static/argon/icon/manifest.json new file mode 100644 index 00000000..2817bc81 --- /dev/null +++ b/luci-theme-argon/htdocs/luci-static/argon/icon/manifest.json @@ -0,0 +1,41 @@ +{ + "name": "Openwrt", + "icons": [ + { + "src": "\/android-icon-36x36.png", + "sizes": "36x36", + "type": "image\/png", + "density": "0.75" + }, + { + "src": "\/android-icon-48x48.png", + "sizes": "48x48", + "type": "image\/png", + "density": "1.0" + }, + { + "src": "\/android-icon-72x72.png", + "sizes": "72x72", + "type": "image\/png", + "density": "1.5" + }, + { + "src": "\/android-icon-96x96.png", + "sizes": "96x96", + "type": "image\/png", + "density": "2.0" + }, + { + "src": "\/android-icon-144x144.png", + "sizes": "144x144", + "type": "image\/png", + "density": "3.0" + }, + { + "src": "\/android-icon-192x192.png", + "sizes": "192x192", + "type": "image\/png", + "density": "4.0" + } + ] +} \ No newline at end of file diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/ms-icon-144x144.png b/luci-theme-argon/htdocs/luci-static/argon/icon/ms-icon-144x144.png new file mode 100644 index 00000000..8d523df8 Binary files /dev/null and b/luci-theme-argon/htdocs/luci-static/argon/icon/ms-icon-144x144.png differ diff --git a/luci-theme-argon/htdocs/luci-static/argon/img/add.webp b/luci-theme-argon/htdocs/luci-static/argon/img/add.webp new file mode 100644 index 00000000..7271dd3e Binary files /dev/null and b/luci-theme-argon/htdocs/luci-static/argon/img/add.webp differ diff --git a/luci-theme-argon/htdocs/luci-static/argon/img/argon.svg b/luci-theme-argon/htdocs/luci-static/argon/img/argon.svg new file mode 100644 index 00000000..0c8aea07 --- /dev/null +++ b/luci-theme-argon/htdocs/luci-static/argon/img/argon.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/luci-theme-argon/htdocs/luci-static/argon/img/bg1.jpg b/luci-theme-argon/htdocs/luci-static/argon/img/bg1.jpg new file mode 100644 index 00000000..26a52a53 Binary files /dev/null and b/luci-theme-argon/htdocs/luci-static/argon/img/bg1.jpg differ diff --git a/luci-theme-argon/htdocs/luci-static/argon/img/blank.png b/luci-theme-argon/htdocs/luci-static/argon/img/blank.png new file mode 100644 index 00000000..9f4100e6 Binary files /dev/null and b/luci-theme-argon/htdocs/luci-static/argon/img/blank.png differ diff --git a/luci-theme-argon/htdocs/luci-static/argon/img/edit.webp b/luci-theme-argon/htdocs/luci-static/argon/img/edit.webp new file mode 100644 index 00000000..264840a3 Binary files /dev/null and b/luci-theme-argon/htdocs/luci-static/argon/img/edit.webp differ diff --git a/luci-theme-argon/htdocs/luci-static/argon/img/fieldadd.webp b/luci-theme-argon/htdocs/luci-static/argon/img/fieldadd.webp new file mode 100644 index 00000000..a4619e24 Binary files /dev/null and b/luci-theme-argon/htdocs/luci-static/argon/img/fieldadd.webp differ diff --git a/luci-theme-argon/htdocs/luci-static/argon/img/file.webp b/luci-theme-argon/htdocs/luci-static/argon/img/file.webp new file mode 100644 index 00000000..6597e6ce Binary files /dev/null and b/luci-theme-argon/htdocs/luci-static/argon/img/file.webp differ diff --git a/luci-theme-argon/htdocs/luci-static/argon/img/find.webp b/luci-theme-argon/htdocs/luci-static/argon/img/find.webp new file mode 100644 index 00000000..0b8fae85 Binary files /dev/null and b/luci-theme-argon/htdocs/luci-static/argon/img/find.webp differ diff --git a/luci-theme-argon/htdocs/luci-static/argon/img/folder.webp b/luci-theme-argon/htdocs/luci-static/argon/img/folder.webp new file mode 100644 index 00000000..eef1fb10 Binary files /dev/null and b/luci-theme-argon/htdocs/luci-static/argon/img/folder.webp differ diff --git a/luci-theme-argon/htdocs/luci-static/argon/img/link.webp b/luci-theme-argon/htdocs/luci-static/argon/img/link.webp new file mode 100644 index 00000000..51dc404e Binary files /dev/null and b/luci-theme-argon/htdocs/luci-static/argon/img/link.webp differ diff --git a/luci-theme-argon/htdocs/luci-static/argon/img/reload.webp b/luci-theme-argon/htdocs/luci-static/argon/img/reload.webp new file mode 100644 index 00000000..f9a15668 Binary files /dev/null and b/luci-theme-argon/htdocs/luci-static/argon/img/reload.webp differ diff --git a/luci-theme-argon/htdocs/luci-static/argon/img/remove.webp b/luci-theme-argon/htdocs/luci-static/argon/img/remove.webp new file mode 100644 index 00000000..02e49860 Binary files /dev/null and b/luci-theme-argon/htdocs/luci-static/argon/img/remove.webp differ diff --git a/luci-theme-argon/htdocs/luci-static/argon/img/trafficbar.png b/luci-theme-argon/htdocs/luci-static/argon/img/trafficbar.png new file mode 100644 index 00000000..c9a99ce0 Binary files /dev/null and b/luci-theme-argon/htdocs/luci-static/argon/img/trafficbar.png differ diff --git a/luci-theme-argon/htdocs/luci-static/argon/img/volume_high.svg b/luci-theme-argon/htdocs/luci-static/argon/img/volume_high.svg new file mode 100644 index 00000000..f01ad5c7 --- /dev/null +++ b/luci-theme-argon/htdocs/luci-static/argon/img/volume_high.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/luci-theme-argon/htdocs/luci-static/argon/img/volume_off.svg b/luci-theme-argon/htdocs/luci-static/argon/img/volume_off.svg new file mode 100644 index 00000000..0598d584 --- /dev/null +++ b/luci-theme-argon/htdocs/luci-static/argon/img/volume_off.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/luci-theme-argon/htdocs/luci-static/argon/js/color_calc-argon.js b/luci-theme-argon/htdocs/luci-static/argon/js/color_calc-argon.js new file mode 100644 index 00000000..bf7d7948 --- /dev/null +++ b/luci-theme-argon/htdocs/luci-static/argon/js/color_calc-argon.js @@ -0,0 +1,72 @@ +/* + * The background color of the [Light Mode] subtabs follow the custom primary color and reduce its transparency + * Author: SpeedPartner + */ + +/* + * Get hex for the [Light mode] Primary Color ,then reduce it to 25% transparency and convert it to RGBA value + */ + const hexColor_primary_light = getComputedStyle(document.documentElement).getPropertyValue('--primary').replace(/\s/, ""); + const hexToRgba_primary_light = (hex) => { + const r = parseInt(hex.substring(1, 3), 16); + const g = parseInt(hex.substring(3, 5), 16); + const b = parseInt(hex.substring(5, 7), 16); + const a = 0.15 + return [r, g, b].map(x => x.toFixed()).concat(a); + }; + const rgbaColor_primary_light = hexToRgba_primary_light(hexColor_primary_light); + console.log(rgbaColor_primary_light); + +/* + * Constitute a css color variable named light-subtabs-background + */ + document.documentElement.style.setProperty('--light-subtabs-background', `rgba(`+rgbaColor_primary_light+`)`); + + +/* + * Improved link font color that follows custom [Dark mode] Primary Color + * Author: SpeedPartner + */ + +/* + * Get hex for the [Dark mode] Primary Color ,then reduce it to 70% transparency and convert it to RGB value + */ + const hexColor_primary = getComputedStyle(document.documentElement).getPropertyValue('--dark-primary').replace(/\s/, ""); + const hexToRgb_primary = (hex) => { + const r = parseInt(hex.substring(1, 3), 16); + const g = parseInt(hex.substring(3, 5), 16); + const b = parseInt(hex.substring(5, 7), 16); + const a = 0.7 + return [r*a, g*a, b*a].map(x => x.toFixed(2)); + }; + const rgbColor_primary = hexToRgb_primary(hexColor_primary); + //console.log(rgbColor_primary); + +/* + * Constitute overlay color #cccccc, then reduce it to 30% transparency and convert it to RGB value + */ + const hexColor_overlay = "#cccccc"; + const hexToRgb_overlay = (hex) => { + const r = parseInt(hex.substring(1, 3), 16); + const g = parseInt(hex.substring(3, 5), 16); + const b = parseInt(hex.substring(5, 7), 16); + const a = 0.3 + return [r*a, g*a, b*a].map(x => x.toFixed(2)); + }; + const rgbColor_overlay = hexToRgb_overlay(hexColor_overlay); + //console.log(rgbColor_overlay); + +/* + * Overlay the RGB value of two colors + */ + const New_Color = [ + Math.round(Number(rgbColor_primary[0]) + Number(rgbColor_overlay[0])), + Math.round(Number(rgbColor_primary[1]) + Number(rgbColor_overlay[1])), + Math.round(Number(rgbColor_primary[2]) + Number(rgbColor_overlay[2])) + ]; + //console.log(New_Color); + +/* + * Constitute a css color variable named dark_webkit-any-link + */ + document.documentElement.style.setProperty('--dark_webkit-any-link', `rgb(`+New_Color+`)`); diff --git a/luci-theme-argon/htdocs/luci-static/argon/js/jquery.min.js b/luci-theme-argon/htdocs/luci-static/argon/js/jquery.min.js new file mode 100644 index 00000000..d467083b --- /dev/null +++ b/luci-theme-argon/htdocs/luci-static/argon/js/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0 + * + * Have a bug? Please create an issue here on GitHub! + * https://github.com/jerrykuku/luci-theme-argon/issues + * + * luci-theme-bootstrap: + * Copyright 2008 Steven Barth + * Copyright 2008 Jo-Philipp Wich + * Copyright 2012 David Menting + * + * MUI: + * https://github.com/muicss/mui + * + * luci-theme-material: + * https://github.com/LuttyYang/luci-theme-material/ + * + * Argon Theme + * https://demos.creative-tim.com/argon-dashboard/index.html + * + * Login background + * https://unsplash.com/ + * + * Licensed to the public under the Apache License 2.0 + */ + + var lastNode = undefined; + var mainNodeName = undefined; + + var nodeUrl = ""; + (function (node) { + if (node[0] == "admin") { + luciLocation = [node[1], node[2]]; + } else { + luciLocation = node; + } + + for (var i in luciLocation) { + nodeUrl += luciLocation[i]; + if (i != luciLocation.length - 1) { + nodeUrl += "/"; + } + } + })(luciLocation); + + /** + * get the current node by Burl (primary) + * @returns {boolean} success? + */ + function getCurrentNodeByUrl() { + var ret = false; + const urlReg = new RegExp(nodeUrl + "$") + if (!$('body').hasClass('logged-in')) { + luciLocation = ["Main", "Login"]; + return true; + } + $(".main > .main-left > .nav > .slide > .active").next(".slide-menu").stop(true).slideUp("fast"); + $(".main > .main-left > .nav > .slide > .menu").removeClass("active"); + $(".main > .main-left > .nav > .slide > .menu").each(function () { + var ulNode = $(this); + + ulNode.next().find("a").each(function () { + var that = $(this); + var href = that.attr("href"); + + if (urlReg.test(href)) { + ulNode.click(); + ulNode.next(".slide-menu").stop(true, true); + lastNode = that.parent(); + lastNode.addClass("active"); + ret = true; + return true; + } + }); + }); + return ret; + } + + /** + * menu click + */ + $(".main > .main-left > .nav > .slide > .menu").click(function () { + var ul = $(this).next(".slide-menu"); + var menu = $(this); + if (!menu.hasClass("exit")) { + $(".main > .main-left > .nav > .slide > .active").next(".slide-menu").stop(true).slideUp("fast"); + $(".main > .main-left > .nav > .slide > .menu").removeClass("active"); + if (!ul.is(":visible")) { + menu.addClass("active"); + ul.addClass("active"); + ul.stop(true).slideDown("fast"); + } else { + ul.stop(true).slideUp("fast", function () { + menu.removeClass("active"); + ul.removeClass("active"); + }); + } + + return false; + } + + }); + + /** + * hook menu click and add the hash + */ + $(".main > .main-left > .nav > .slide > .slide-menu > li > a").click(function () { + if (lastNode != undefined) + lastNode.removeClass("active"); + $(this).parent().addClass("active"); + $(".main > .loading").fadeIn("fast"); + return true; + }); + + /** + * fix menu click + */ + $(".main > .main-left > .nav > .slide > .slide-menu > li").click(function () { + if (lastNode != undefined) + lastNode.removeClass("active"); + $(this).addClass("active"); + $(".main > .loading").fadeIn("fast"); + window.location = $($(this).find("a")[0]).attr("href"); + return false; + }); + + /** + * fix submenu click + */ + $("#maincontent > .container > .tabs > li").click(function () { + $(".main > .loading").fadeIn("fast"); + window.location = $($(this).find("a")[0]).attr("href"); + return false; + }); + + /** + * get current node and open it + */ + if (getCurrentNodeByUrl()) { + mainNodeName = "node-" + luciLocation[0] + "-" + luciLocation[1]; + mainNodeName = mainNodeName.replace(/[ \t\n\r\/]+/g, "_").toLowerCase(); + $("body").addClass(mainNodeName); + } + + if (mainNodeName != undefined) { + console.log(mainNodeName); + switch (mainNodeName) { + case "node-status-system_log": + case "node-status-kernel_log": + $("#syslog").focus(function () { + $("#syslog").blur(); + $(".main-right").focus(); + $(".main-right").blur(); + }); + break; + case "node-status-firewall": + var button = $(".node-status-firewall > .main fieldset li > a"); + button.addClass("cbi-button cbi-button-reset a-to-btn"); + break; + case "node-system-reboot": + var button = $(".node-system-reboot > .main > .main-right p > a"); + button.addClass("cbi-button cbi-input-reset a-to-btn"); + break; + } + } diff --git a/luci-theme-argon/htdocs/luci-static/argon/js/sidebar-argon.js b/luci-theme-argon/htdocs/luci-static/argon/js/sidebar-argon.js new file mode 100644 index 00000000..fdf5a99c --- /dev/null +++ b/luci-theme-argon/htdocs/luci-static/argon/js/sidebar-argon.js @@ -0,0 +1,64 @@ +/** + * Argon is a clean HTML5 theme for LuCI. It is based on luci-theme-material and Argon Template + * + * luci-theme-argon + * Copyright 2023 Jerrykuku + * + * Have a bug? Please create an issue here on GitHub! + * https://github.com/jerrykuku/luci-theme-argon/issues + * + * luci-theme-bootstrap: + * Copyright 2008 Steven Barth + * Copyright 2008 Jo-Philipp Wich + * Copyright 2012 David Menting + * + * MUI: + * https://github.com/muicss/mui + * + * luci-theme-material: + * https://github.com/LuttyYang/luci-theme-material/ + * + * Argon Theme + * https://demos.creative-tim.com/argon-dashboard/index.html + * + * Login background + * https://unsplash.com/ + * + * Licensed to the public under the Apache License 2.0 + */ + + /** + * Sidebar expand + */ + var showSide = false; + $(".showSide").click(function () { + if (showSide) { + $(".darkMask").stop(true).fadeOut("fast"); + $(".main-left").width(0); + $(".main-right").css("overflow-y", "auto"); + showSide = false; + } else { + $(".darkMask").stop(true).fadeIn("fast"); + $(".main-left").width("15rem"); + $(".main-right").css("overflow-y", "hidden"); + showSide = true; + } + }); + + $(".darkMask").click(function () { + if (showSide) { + showSide = false; + $(".darkMask").stop(true).fadeOut("fast"); + $(".main-left").width(0); + $(".main-right").css("overflow-y", "auto"); + } + }); + + $(window).resize(function () { + if ($(window).width() > 921) { + $(".main-left").css("width", ""); + $(".darkMask").stop(true); + $(".darkMask").css("display", "none"); + showSide = false; + } + }); diff --git a/luci-theme-argon/htdocs/luci-static/argon/js/styles-argon.js b/luci-theme-argon/htdocs/luci-static/argon/js/styles-argon.js new file mode 100644 index 00000000..2e40a94c --- /dev/null +++ b/luci-theme-argon/htdocs/luci-static/argon/js/styles-argon.js @@ -0,0 +1,103 @@ +/** + * Argon is a clean HTML5 theme for LuCI. It is based on luci-theme-material and Argon Template + * + * luci-theme-argon + * Copyright 2023 Jerrykuku + * + * Have a bug? Please create an issue here on GitHub! + * https://github.com/jerrykuku/luci-theme-argon/issues + * + * luci-theme-bootstrap: + * Copyright 2008 Steven Barth + * Copyright 2008 Jo-Philipp Wich + * Copyright 2012 David Menting + * + * MUI: + * https://github.com/muicss/mui + * + * luci-theme-material: + * https://github.com/LuttyYang/luci-theme-material/ + * + * Argon Theme + * https://demos.creative-tim.com/argon-dashboard/index.html + * + * Login background + * https://unsplash.com/ + * + * Licensed to the public under the Apache License 2.0 + */ + +/* + * Font generate by Icomoon + */ +(function ($) { + $(".main > .loading").fadeOut(); + + /** + * trim text, Remove spaces, wrap + * @param text + * @returns {string} + */ + function trimText(text) { + return text.replace(/[ \t\n\r]+/g, " "); + } + +// define what element should be observed by the observer +// and what types of mutations trigger the callback + const observer = new MutationObserver(() => { + console.log("callback that runs when observer is triggered"); + }); + if ($("#cbi-dhcp-lan-ignore").length > 0) { + observer.observe(document.getElementById("cbi-dhcp-lan-ignore"), { + subtree: true, + attributes: true + }); + } + + $(".cbi-button-up").val(""); + $(".cbi-button-down").val(""); + + /** + * hook other "A Label" and add hash to it. + */ + $("#maincontent > .container").find("a").each(function () { + var that = $(this); + var onclick = that.attr("onclick"); + if (onclick == undefined || onclick == "") { + that.click(function () { + var href = that.attr("href"); + if (href.indexOf("#") == -1) { + $(".main > .loading").fadeIn("fast"); + return true; + } + }); + } + }); + + /** + * fix legend position + */ + $("legend").each(function () { + var that = $(this); + that.after("" + that.text() + ""); + }); + + $(".cbi-section-table-titles, .cbi-section-table-descr, .cbi-section-descr").each(function () { + var that = $(this); + if (that.text().trim() == "") { + that.css("padding", "0px"); + } + }); + + $(".node-main-login > .main .cbi-value.cbi-value-last .cbi-input-text").focus(function () { + //$(".node-main-login > .main > .main-right > .login-bg").addClass("blur"); + }); + $(".node-main-login > .main .cbi-value.cbi-value-last .cbi-input-text").blur(function () { + //$(".node-main-login > .main > .main-right > .login-bg").removeClass("blur"); + }); + + $(".main-right").focus(); + $(".main-right").blur(); + $("input").attr("size", "0"); + +})(jQuery); diff --git a/luci-theme-argon/htdocs/luci-static/argon/less/cascade.less b/luci-theme-argon/htdocs/luci-static/argon/less/cascade.less new file mode 100644 index 00000000..2de44e54 --- /dev/null +++ b/luci-theme-argon/htdocs/luci-static/argon/less/cascade.less @@ -0,0 +1,4133 @@ +/** + * Argon is a clean HTML5 theme for LuCI. It is based on luci-theme-material and Argon Template + * + * luci-theme-argon + * Copyright 2020 Jerryk + * + * Have a bug? Please create an issue here on GitHub! + * https://github.com/jerrykuku/luci-theme-argon/issues + * + * luci-theme-bootstrap: + * Copyright 2008 Steven Barth + * Copyright 2008 Jo-Philipp Wich + * Copyright 2012 David Menting + * + * MUI: + * https://github.com/muicss/mui + * + * luci-theme-material: + * https://github.com/LuttyYang/luci-theme-material/ + * + * Argon Theme + * https://demos.creative-tim.com/argon-dashboard/index.html + * + * Login background + * https://unsplash.com/ + * + * Licensed to the public under the Apache License 2.0 + */ + +/* + * Font generate by Icomoon + */ + +/* + * Common Styles + */ + +@import url("fonts.css?v=3"); +@import url("pure-min.css?v=1"); + +:root { + /** general **/ + --primary: #5e72e4; + --dark-primary: #483d8b; + --background-color: #f4f5f7; + --font-color: #525f7f; + /** login form **/ + --login-form-background-color: #ffffff; + --login-form-bg-color: rgba(244, 245, 247, 0.8); + --blur-radius: 10px; + --blur-opacity: 0.5; + + --white: #fff; + --darker: black; + --default: #525461; + + --warning: #fb6340; + --footer-color: #aaa; + --menubar-background: #fff; + --menubar-scrollbar-thumb: #eee; + --menubar-text-color: #4c4c4c; + --blue: #5e72e4; + --indigo: #5603ad; + --purple: #8965e0; + --pink: #f3a4b5; + --red: #f5365c; + --orange: #fb6340; + --yellow: #ffd600; + --green: #2dce89; + --teal: #11cdef; + --cyan: #2bffc6; + --white: #fff; + --gray: #8898aa; + --gray-dark: #32325d; + --light: #ced4da; + --lighter: #e9ecef; + --secondary: #f7fafc; + --success: #2dce89; + --info: #11cdef; + --danger: #f5365c; + --light: #adb5bd; + --dark: #212529; + --neutral: #fff; + --login-form-bg-color: rgba(244, 245, 247, 0.8); + + --blur-radius: 10px; + --blur-opacity: 0.5; + --blur-radius-dark: 10px; + --blur-opacity-dark: 0.5; + --font-family-sans-serif: "Google Sans", "Microsoft Yahei", "WenQuanYi Micro Hei", "sans-serif", "Helvetica Neue", "Helvetica", "Hiragino Sans GB"; + --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace; + --font-family-normal: Open Sans, PingFangSC-Regular, Microsoft Yahei, WenQuanYi Micro Hei, "Helvetica Neue", Helvetica, Hiragino Sans GB, sans-serif; +} + +[data-theme="dark"] { + --primary: #483d8b; + --dark-primary: #483d8b; + --background-color: #1e1e1e; + --font-color: #cccccc; + --white: #fff; + --darker: black; + --default: #525461; + + --warning: #fb6340; + --footer-color: #aaa; + --menubar-background: #fff; + --menubar-scrollbar-thumb: #f6f9fc; + --menubar-text-color: #4c4c4c; + --blue: #5e72e4; + --indigo: #5603ad; + --purple: #8965e0; + --pink: #f3a4b5; + --red: #f5365c; + --orange: #fb6340; + --yellow: #ffd600; + --green: #2dce89; + --teal: #11cdef; + --cyan: #2bffc6; + --white: #fff; + --gray: #8898aa; + --gray-dark: #32325d; + --light: #ced4da; + --lighter: #e9ecef; + --secondary: #f7fafc; + --success: #2dce89; + --info: #11cdef; + --danger: #f5365c; + --light: #adb5bd; + --dark: #212529; + --neutral: #fff; + --login-form-bg-color: rgba(244, 245, 247, 0.8); + + --blur-radius: 10px; + --blur-opacity: 0.5; + --blur-radius-dark: 10px; + --blur-opacity-dark: 0.5; + --font-family-sans-serif: "Google Sans", "Microsoft Yahei", "WenQuanYi Micro Hei", "sans-serif", "Helvetica Neue", "Helvetica", "Hiragino Sans GB"; + --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace; + --font-family-normal: Open Sans, PingFangSC-Regular, Microsoft Yahei, WenQuanYi Micro Hei, "Helvetica Neue", Helvetica, Hiragino Sans GB, sans-serif; +} + +html, +body { + margin: 0px; + padding: 0px; + height: 100%; + font-size: 16px; + font-family: "Google Sans", "Microsoft Yahei", "WenQuanYi Micro Hei", "sans-serif", "Helvetica Neue", "Helvetica", "Hiragino Sans GB"; + font-family: var(--font-family-sans-serif); +} + +html { + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +body { + font-size: 0.875rem; + background-color: #f4f5f7; + background-color: var(--background-color); + color: #525f7f; + color: var(--font-color); + +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; + -webkit-tap-highlight-color: transparent; + +} + +::selection { + background-color: #5e72e4; + background-color: var(--primary); + color: #ffffff; + color: var(--white); +} + +::-webkit-scrollbar { + width: 10px; + height: 10px; +} + +::-webkit-scrollbar, +::-webkit-scrollbar-corner { + background: transparent; +} + +::-webkit-scrollbar-thumb { + background: #9e9e9e; +} + +::-webkit-scrollbar-thumb:hover { + background: #757575; +} + +::-webkit-scrollbar-thumb:active { + background: #424242; +} + +a:link, +a:visited, +a:active { + color: var(--primary); + text-decoration: none; +} + +a:-webkit-any-link:not(li a, .main-left a, .brand, .pull-right a, .alert-message a, .login-container footer a, .cbi-button) { + color: -webkit-link; + cursor: pointer; + color: var(--primary); + text-shadow: 1px 1px 2px #ccc; +} + +a:hover { + text-decoration: underline; +} + +li { + list-style-type: none; +} + +@-webkit-keyframes sparkle { + from { + background-position: 0 0; + } + + to { + background-position: 0 -64px; + } +} + +@-moz-keyframes sparkle { + from { + background-position: 0 0; + } + + to { + background-position: 0 -64px; + } +} + +@-o-keyframes sparkle { + from { + background-position: 0 0; + } + + to { + background-position: 0 -64px; + } +} + +@keyframes sparkle { + from { + background-position: 0 0; + } + + to { + background-position: 0 -64px; + } +} + +/*********************** +* +* Login Page +* +***************************/ + +.login-page { + height: 100%; + + .video { + position: absolute; + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + background-color: #000; + background-color: var(--darker); + overflow: hidden; + + video { + width: 100%; + height: 100%; + object-fit: cover; + } + } + + .volume-control { + position: fixed; + right: 1rem; + top: 1rem; + width: 1.5rem; + height: 1.5rem; + z-index: 5000; + cursor: pointer; + background-size: contain; + background-image: url(../img/volume_high.svg); + + &.mute { + background-image: url(../img/volume_off.svg); + } + } + + .main-bg { + position: fixed; + width: 100%; + height: 100%; + left: 0; + top: 0; + background-image: url(../img/blank.png); + background-repeat: no-repeat; + background-position: center; + background-size: cover; + transition: all 0.5s; + } + + .login-container { + height: 100%; + margin-left: 4.5rem; + position: absolute; + top: 0px; + display: flex; + flex-direction: column; + -webkit-box-pack: center; + justify-content: center; + align-items: flex-start; + min-height: 100%; + z-index: 2; + width: 420px; + box-shadow: rgba(0, 0, 0, 0.75) 0px 0px 35px -5px; + margin-left: 5%; + background: transparent; + + .login-form { + display: flex; + flex-direction: column; + -webkit-box-align: center; + align-items: center; + position: absolute; + top: 0px; + width: 100%; + min-height: 100%; + max-width: 420px; + background-color: #fff; + background-color: var(--white); + overflow:hidden; + + .brand { + display: flex; + -webkit-box-align: center; + align-items: center; + margin: 50px auto 15px auto; + color: #525461; + color: var(--default); + + .icon { + width: 50px; + height: auto; + } + + &:hover { + text-decoration: none; + } + } + + .brand-text { + font-size: 1.8rem; + font-weight: 700; + letter-spacing: 1px; + margin-bottom: 85px; + font-family: "TypoGraphica"; + width: 420px; + padding: 0 0.5rem 0.1rem 0.5rem; + text-align: center; + word-break: break-word; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + } + + .form-login { + width: 420px; + padding: 20px 50px; + box-sizing: border-box; + + .errorbox { + text-align: center; + color: #fb6340; + color: var(--warning); + } + + .input-group { + margin-bottom: 1.25rem; + position: relative; + + &::before { + font-family: 'argon' !important; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + color: #525461; + color: var(--default); + font-size: 1.5rem; + position: absolute; + z-index: 100; + left: 10px; + top: 10px; + } + + .border { + position: absolute; + width: 100%; + height: 1px; + bottom: 0; + border-bottom: 1px #5e72e4 solid; + border-bottom: 1px var(--primary) solid; + transform: scaleX(0); + transition: transform 0.3s; + } + + input { + font-size: 1rem; + line-height: 1.5em; + display: block; + width: 100%; + padding: .5rem .75rem 0.5rem 3rem; + margin: 0.825rem 0; + box-sizing: border-box; + transition: all .3s cubic-bezier(.68, -.55, .265, 1.55); + color: #525461; + color: var(--default); + border: 0; + border-radius: 0; + border-bottom: 1px solid #fff; + border-bottom: 1px solid var(--white); + background-color: transparent; + background-clip: padding-box; + box-shadow: 0 3px 2px rgba(233, 236, 239, .05); + outline: none; + + &:focus+.border { + transform: scaleX(1); + } + } + + .cbi-input-password { + margin-bottom: 2rem; + position: relative; + } + } + + .user-icon::before { + content: "\e971"; + } + + .pass-icon::before { + content: "\e910"; + + } + } + + .cbi-button-apply { + width: 100% !important; + box-shadow: rgba(0, 0, 0, 0.1) 0px 0px 50px 0px; + font-weight: 600; + font-size: 15px; + color: #fff; + color: var(--white); + text-align: center; + width: 100%; + cursor: pointer; + min-height: 50px; + background-color: #5e72e4 !important; + background-color: var(--primary) !important; + border-radius: 6px; + outline: none; + border-width: initial; + border-style: none; + border-color: initial; + border-image: initial; + padding: 10px 0px; + margin: 30px 0px 100px; + transition: all 0.3s !important; + letter-spacing: 0.8rem; + + &:hover, + :focus { + opacity: 0.9; + } + } + } + + footer { + box-sizing: border-box; + width: 100%; + text-align: center; + line-height: 1.6rem; + display: flex; + justify-content: space-evenly; + margin-top: auto; + padding: 0px 0px 30px; + z-index: 10; + color: #525461; + color: var(--default); + position: absolute; + bottom: 0; + + .ftc { + position: absolute; + bottom: 30px; + width: 100%; + } + + .luci-link { + display: block; + } + } + + footer { + color: var(--default); + + a { + color: var(--default); + } + } + } +} + +.pull-right { + float: right; +} + +.pull-left { + float: left; +} + +@supports (-webkit-backdrop-filter: none) or (backdrop-filter: none) { + .login-page .login-container .login-form { + -webkit-backdrop-filter: blur(var(--blur-radius)); + backdrop-filter: blur(var(--blur-radius)); + background-color: rgba(244, 245, 247, var(--blur-opacity)); + + } +} + + + +/*********************** +* +* Header +* +***************************/ + + +header { + width: 100%; + padding: 0 0 0 0; + position: relative; + + .container { + margin-top: rem; + padding: 0.5rem 1rem 0 1rem; + + .pull-right>* { + position: relative; + top: 0.45rem; + cursor: pointer; + } + } + + &::after { + content: ""; + position: absolute; + height: 2rem; + width: 100%; + background-color: #5e72e4 !important; + background-color: var(--primary) !important; + } + + &.bg-primary { + background-color: #5e72e4 !important; + background-color: var(--primary) !important; + } + + .fill { + padding: 0.8rem 0; + border-bottom: 0px solid rgba(255, 255, 255, .08) !important; + + .container { + height: 2rem; + padding: 0 1.25rem; + + .brand { + font-size: 1.5rem; + color: #fff; + color: var(--white); + font-family: "TypoGraphica"; + text-decoration: none; + padding-left: 1rem; + cursor: default; + vertical-align: text-bottom; + display: none; + } + } + } +} + + + + + +/*********************** +* +* Footer +* +***************************/ + +footer { + + text-align: right; + padding: 1rem; + font-size: 0.8rem; + + a { + text-decoration: none; + } +} + + + +/*********************** +* +* Main +* +***************************/ + +@keyframes anim-rotate { + 0% { + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + } + + 100% { + -webkit-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg) + } +} + +.main { + top: 0rem; + bottom: 0rem; + position: relative; + height: 100%; + width: 100%; + height: calc(100% - 4rem); + + .main-left { + float: left; + width: 15%; + width: calc(0% + 15rem); + height: 100%; + background-color: #fff !important; + background-color: var(--menubar-background) !important; + box-shadow: rgba(0, 0, 0, 0.75) 0px 0px 15px -5px; + overflow-x: auto; + position: fixed; + z-index: 100; + transition: width 0.2s ease-in-out; + overflow-y: scroll; + + &::-webkit-scrollbar { + width: 5px; + height: 1px; + } + + &::-webkit-scrollbar-thumb { + background-color: #f6f9fc; + background-color: var(--menubar-scrollbar-thumb); + + } + + &::-webkit-scrollbar-track { + background-color: transparent; + } + + .sidenav-header { + padding: 1.5rem; + text-align: center; + + .brand { + font-size: 1.8rem; + color: #5e72e4; + color: var(--primary); + font-family: "TypoGraphica", sans-serif; + text-decoration: none; + padding-left: 0; + cursor: default; + vertical-align: text-bottom; + white-space: nowrap; + } + } + + .nav { + margin-top: 0.5rem; + + li { + padding: 0rem; + cursor: pointer; + + a { + color: #525f7f; + color: var(--default); + display: block; + } + + &:nth-last-child(1) { + font-size: 1.2rem; + + .menu:after { + content: ""; + } + } + + &.slide { + padding: 0; + + ul { + display: none; + + li { + a { + position: relative; + + margin: 0.1rem 1rem 0.1rem 3rem; + padding: 0.5rem 0rem 0.5rem 0; + text-decoration: none; + white-space: nowrap; + color: #4c4c4c; + color: var(--menubar-text-color); + transition: all 0.2s; + font-size: 0.875rem; + + &::after { + content: ""; + position: absolute; + width: 00%; + height: 2px; + left: 0; + bottom: 0; + background-color: #5e72e4; + background-color: var(--primary); + transition: all 0.2s; + } + + &:hover { + &::after { + color: #000; + color: var(--darker); + width: 100%; + } + } + } + } + } + + .menu { + display: block; + margin: 0.1rem .5rem 0.1rem .5rem; + padding: .675rem 0 .675rem 2.5rem; + border-radius: .375rem; + text-decoration: none; + cursor: default; + font-size: 1rem; + transition: all 0.2s; + position: relative; + + &::before { + font-family: 'argon' !important; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + position: absolute; + left: 0.8rem; + content: "\e915"; + color: #5e72e4; + color: var(--primary); + } + + &::after { + position: absolute; + right: 0.5rem; + top: 0.8rem; + font-family: 'argon' !important; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + content: '\e90f'; + transition: all .15s ease; + color: #ced4da; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + transition: all 0.3s; + } + + &:hover, + &.active { + cursor: pointer; + color: #fff; + background: #5e72e4; + background: var(--primary); + box-shadow: 0 0 1px #ccc; + + a { + color: #000; + + &::after { + color: #000; + width: 100%; + } + } + + &::before { + color: #fff !important; + } + + &::after { + color: #fff; + + } + } + + &.active { + &::after { + + transform: rotate(90deg); + } + } + + } + + .menu[data-title=Status]:before { + content: "\e906"; + color: #5e72e4; + color: var(--primary); + } + + .menu[data-title=System]:before { + content: "\e90a"; + color: #fb6340; + } + + .menu[data-title=Services]:before { + content: "\e909"; + color: #11cdef; + } + + .menu[data-title=NAS]:before { + content: "\e90c"; + color: #f3a4b5; + } + + .menu[data-title=VPN]:before { + content: "\e90b"; + color: #aaad03; + } + + .menu[data-title=Network]:before { + content: "\e908"; + color: #8965e0; + } + + .menu[data-title=Bandwidth_Monitor]:before { + content: "\e90d"; + color: #2dce89; + } + + .menu[data-title=Docker]:before { + content: "\e911"; + color: #6699ff; + } + + .menu[data-title=Statistics]:before { + content: "\e913"; + color: #5603ad; + } + + .menu[data-title=Control]:before { + content: "\e912"; + color: #5e72e4; + color: var(--primary); + } + + .menu[data-title=Asterisk]:before { + content: "\e914"; + color: #fb6340; + } + + .menu[data-title=Logout]:before { + content: "\e907"; + color: #adb5bd; + } + + .slide-menu { + li { + a { + position: relative; + + margin: 0.1rem 1rem 0.1rem 3rem; + padding: 0.5rem 0rem 0.5rem 0; + text-decoration: none; + white-space: nowrap; + color: rgba(0, 0, 0, .6); + transition: all 0.2s; + font-size: 0.875rem; + + &::after { + content: ""; + position: absolute; + width: 00%; + height: 2px; + left: 0; + bottom: 0; + background-color: #5e72e4; + background-color: var(--primary); + transition: all 0.2s; + box-shadow: 0 0 1px #ccc; + } + + &:hover::after { + color: #000; + width: 100%; + } + } + } + + .active { + a { + color: #000; + + &::after { + color: #000; + width: 100%; + } + } + } + } + + &:last-child>.menu::after { + content: ""; + } + } + } + } + } + + .main-right { + width: 85%; + width: calc(100% - 15rem); + float: right; + height: auto; + transition: width 0.3s ease-in-out; + + #maincontent { + + position: relative; + z-index: 50; + + .container { + margin: 0 1.25rem 1rem 1.25rem; + + p { + color: #32325d; + line-height: 1.5em; + } + } + + .container>div:nth-child(1).alert-message.warning>a { + font: inherit; + overflow: visible; + text-transform: none; + display: inline-block; + margin-bottom: 0; + font-weight: 400; + text-align: center; + white-space: nowrap; + vertical-align: middle; + touch-action: manipulation; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-image: none; + min-width: 6rem; + padding: 0.5rem 1rem; + font-size: 0.9rem; + line-height: 1.42857143; + color: #fff; + background-color: #5bc0de; + border-color: #46b8da; + margin-top: 2rem; + text-decoration: inherit; + } + } + } + + .loading { + position: fixed; + width: 100%; + height: 100%; + z-index: 2000; + display: flex; + align-items: center; + justify-content: center; + background-color: #f8f9fe; + top: 0; + + span { + display: block; + text-align: center; + margin-top: 2rem; + color: #5e72e4; + color: var(--primary); + font-size: 2rem; + + .loading-img { + animation: anim-rotate 2s infinite linear; + margin-right: 0.4rem; + display: inline-block; + + &::before { + content: "\e603"; + } + } + + } + } +} + + +/* button style */ + +.cbi-button { + -webkit-appearance: none; + text-transform: uppercase; + height: auto; + font-size: 0.875rem; + color: rgba(0, 0, 0, 0.87); + background-color: #F0F0F0; + transition: all 0.2s ease-in-out; + display: inline-block; + padding: 0.75rem 0.8rem; + border: none; + border-radius: 0.2rem; + cursor: pointer; + -ms-touch-action: manipulation; + touch-action: manipulation; + background-image: none; + text-align: center; + vertical-align: middle; + white-space: nowrap; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + font-size: .875rem; + width: auto !important; + line-height: 1em; +} + +.cbi-button:hover, +.cbi-button:focus, +.cbi-button:active { + outline: 0; + text-decoration: none; +} + +.cbi-button:hover, +.cbi-button:focus { + box-shadow: 0 0px 2px rgba(0, 0, 0, 0.12), 0 2px 2px rgba(0, 0, 0, 0.2); +} + +.cbi-button:active { + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.19), 0 5px 5px rgba(0, 0, 0, 0.23); +} + +.cbi-button:disabled { + cursor: not-allowed; + pointer-events: none; + opacity: 0.60; + box-shadow: none; +} + +.cbi-button-check { + margin-top: 0.25rem !important; +} + +form.inline+form.inline, +.cbi-button+.cbi-button { + margin-left: 0rem; +} + +.cbi-button-reset, +.cbi-input-remove { + + color: #fff !important; + background-color: #f0ad4e !important; + border-color: #eea236 !important; +} + +.cbi-input-find, +.cbi-input-save, +.cbi-button-add, +.cbi-button-save, +.cbi-button-find, +.cbi-input-reload, +.cbi-button-reload { + + color: #fff !important; + background-color: #337ab7 !important; + border-color: #2e6da4 !important; +} + +.cbi-value-field .cbi-input-apply, +.cbi-button-apply, +.cbi-button-edit { + + color: #fff !important; + background-color: #5e72e4 !important; + background-color: var(--primary) !important; + border-color: #5e72e4 !important; + border-color: var(--primary) !important; +} + +.node-services-vssr .ssr-button { + margin-left: 0.3rem; + +} + +.cbi-section-remove>.cbi-button, +.cbi-button-remove { + color: #fff !important; + background-color: #fb6340 !important; + border-color: #fb6340 !important; +} + +.cbi-value-field .cbi-button-add, +.cbi-value-field .cbi-button-remove, +.cbi-value-field .cbi-button-neutral { + + min-width: 2.5rem !important; +} + +/* Replace LuCI's default file and folder type icons */ +img[src="/luci-static/resources/cbi/reload.gif"] { + content: url("/luci-static/argon/img/reload.webp"); +} +img[src="/luci-static/resources/cbi/file.gif"] { + content: url("/luci-static/argon/img/file.webp"); +} +img[src="/luci-static/resources/cbi/add.gif"] { + content: url("/luci-static/argon/img/add.webp"); +} +img[src="/luci-static/resources/cbi/remove.gif"] { + content: url("/luci-static/argon/img/remove.webp"); +} +img[src="/luci-static/resources/cbi/edit.gif"] { + content: url("/luci-static/argon/img/edit.webp"); +} +img[src="/luci-static/resources/cbi/fieldadd.gif"] { + content: url("/luci-static/argon/img/fieldadd.webp"); +} +img[src="/luci-static/resources/cbi/link.gif"] { + content: url("/luci-static/argon/img/link.webp"); +} +img[src="/luci-static/resources/cbi/find.gif"] { + content: url("/luci-static/argon/img/find.webp"); +} +img[src="/luci-static/resources/cbi/folder.gif"] { + content: url("/luci-static/argon/img/folder.webp"); +} + +/* input */ +.cbi-value input[type="password"], +.cbi-value input[type="text"] { + min-width: 15rem; +} + +/* select */ +.cbi-value-field .cbi-dropdown { + min-width: 15rem; +} + +select { + min-width: 20rem; + appearance: none; + -webkit-appearance: none; + background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNTY1MzQ4MDM3OTIyIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjI1ODMiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCI+PGRlZnM+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4qIHsgdGV4dC1zaGFkb3c6IHRyYW5zcGFyZW50IDBweCAwcHggMHB4LCByZ2JhKDAsIDAsIDAsIDAuNSkgMHB4IDBweCAwcHggIWltcG9ydGFudDsgfQo8L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMjAuNDggMjQ1Ljc2aDk4My4wNEw1MTIgNzc4LjI0eiIgcC1pZD0iMjU4NCIgZmlsbD0iIzcwNzA3MCI+PC9wYXRoPjwvc3ZnPg==') !important; + background-position: 96%; + background-size: 8px; + background-repeat: no-repeat; + +} + +.th[data-type="button"], +.td[data-type="button"], +.th[data-type="fvalue"], +.td[data-type="fvalue"] { + flex: 1 1 2em; + text-align: center; +} + +/*textarea*/ +textarea { + border: 1px solid #dee2e6 !important; + outline: none; + min-height: 14rem !important; + padding: 0.8rem !important; + background-color: #fff; + font-family: var(--font-family-monospace) !important; + font-size: inherit; + color: black; + border-radius: 0.375rem !important; + vertical-align: middle; +} + +.cbi-value .cbi-value-field textarea { + margin: 0.25rem; +} + +/* change */ +.uci-change-list { + font-family: monospace; +} + +.uci-change-list ins, +.uci-change-legend-label ins { + text-decoration: none; + border: 1px solid #00FF00; + background-color: #CCFFCC; + display: block; + padding: 2px; +} + +.uci-change-list del, +.uci-change-legend-label del { + text-decoration: none; + border: 1px solid #FF0000; + background-color: #FFCCCC; + display: block; + font-style: normal; + padding: 2px; +} + +.uci-change-list var, +.uci-change-legend-label var { + text-decoration: none; + border: 1px solid #CCCCCC; + background-color: #EEEEEE; + display: block; + font-style: normal; + padding: 2px; + +} + +.uci-change-list var ins, +.uci-change-list var del { + border: none; + white-space: pre; + font-style: normal; + padding: 0px; +} + +.uci-change-list ins strong { + display: inline; +} + +.uci-change-legend { + padding: 5px; +} + +.uci-change-legend-label { + display: flex; + align-items: center; + width: auto; + float: left; + margin-right: 2rem; +} + +.uci-change-legend-label>ins, +.uci-change-legend-label>del, +.uci-change-legend-label>var { + float: left; + margin-right: 4px; + width: 10px; + height: 10px; + display: block; +} + +.uci-change-legend-label var ins, +.uci-change-legend-label var del { + line-height: 0; + border: none; +} + +.uci-change-list var, +.uci-change-list del, +.uci-change-list ins { + padding: 0.5rem; +} + +/* other fix */ +input[type="checkbox"] { + appearance: none !important; + -webkit-appearance: none !important; + border: 1px solid #dee2e6; + + width: 17px !important; + height: 17px !important; + padding: 0; + cursor: pointer; + transition: all 0.2s; + + margin: 0.5rem 0.25rem 0.7rem 0.25rem; + vertical-align: middle; +} + +input[type="checkbox"]:checked { + background-image: url('data:image/svg+xml,%3csvg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'0 0 8 8\'%3e%3cpath fill=\'%23fff\' d=\'M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z\'/%3e%3c/svg%3e') !important; + background-color: #5e72e4; + background-color: var(--primary); + background-size: 70%; + background-repeat: no-repeat; + background-position: center; +} + +ul li .cbi-input-checkbox { + margin: 0.5rem 0.25rem 0.7rem 0.25rem !important; + vertical-align: middle !important; +} + +.cbi-input-radio { + appearance: none !important; + -webkit-appearance: none !important; + border: 1px solid #dee2e6; + + width: 16px !important; + height: 16px !important; + padding: 0; + border-radius: 50%; + cursor: pointer; + transition: all 0.2s; + margin: 0.25rem 0; +} + +.cbi-input-radio:checked { + background-image: url('data:image/svg+xml,%3csvg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'-4 -4 8 8\'%3e%3ccircle r=\'3\' fill=\'%23fff\'/%3e%3c/svg%3e') !important; + background-color: #5e72e4; + background-color: var(--primary); + background-size: 70%; + background-repeat: no-repeat; + background-position: center; +} + + +.toggle { + position: relative; + display: block; + width: 40px; + height: 20px; + cursor: pointer; + -webkit-tap-highlight-color: transparent; + transform: translate3d(0, 0, 0); + margin: 1em 0; +} + +.toggle:before { + content: ""; + position: relative; + top: 3px; + left: 3px; + width: 34px; + height: 14px; + display: block; + background: #9A9999; + border-radius: 8px; + transition: background 0.2s ease; +} + +.toggle span { + position: absolute; + top: 0; + left: 0; + width: 20px; + height: 20px; + display: block; + background: white; + border-radius: 10px; + box-shadow: 0 3px 8px rgba(154, 153, 153, 0.5); + transition: all 0.2s ease; +} + +.toggle span:before { + content: ""; + position: absolute; + display: block; + margin: -18px; + width: 56px; + height: 56px; + background: rgba(79, 46, 220, 0.5); + border-radius: 50%; + transform: scale(0); + opacity: 1; + pointer-events: none; +} + +.cbi-input-checkbox:checked+.toggle:before { + background: #947ADA; +} + +.cbi-input-checkbox:checked+.toggle span { + background: #4F2EDC; + transform: translateX(20px); + transition: all 0.2s cubic-bezier(0.8, 0.4, 0.3, 1.25), background 0.15s ease; + box-shadow: 0 3px 8px rgba(79, 46, 220, 0.2); +} + +.cbi-input-checkbox:checked+.toggle span:before { + transform: scale(1); + opacity: 0; + transition: all 0.4s ease; +} + + +.cbi-value-field .cbi-input-checkbox, +.cbi-value-field .cbi-input-radio { + margin-top: 0.5rem; + height: 1rem; +} + +.td .cbi-input-checkbox, +.td .cbi-input-radio { + margin-top: 0; +} + +.cbi-value-field>input+.cbi-value-description { + padding: 0; +} + +.cbi-value-field>ul>li { + display: flex; +} + +.cbi-value-field>ul>li>label { + margin-top: 0rem; +} + +.cbi-value-field>ul>li .ifacebadge { + background-color: #eee; + margin-left: 0.4rem; + margin-top: -0.5rem; +} + +.cbi-section-table-row>.cbi-value-field .cbi-dropdown { + min-width: 7rem; +} + +.cbi-section-create { + margin: 0; + padding-left: 0.5rem; + align-items: center; + +} + +.cbi-section-create>* { + margin: 0.25rem; +} + +.cbi-section-remove { + padding: 0.5rem; +} + +div.cbi-value var, +td.cbi-value-field var, +.td.cbi-value-field var { + font-style: italic; + color: var(--primary); + text-shadow: 1px 1px 2px #ccc; +} + +small { + font-size: 90%; + white-space: normal; + line-height: 1.42857143; +} + +.cbi-button-up, +.cbi-button-down { + display: inline-block; + min-width: 0; + padding: 0.2rem 0.6rem; + font-size: 1.2rem; + color: #5e72e4 !important; + color: var(--primary) !important; +} + +.cbi-optionals { + padding: 1rem 1rem 0 1rem; + border-top: 1px solid #CCC; +} + +.cbi-dropdown-container { + position: relative; +} + +.cbi-tooltip-container { + cursor: help; +} + +.cbi-tooltip { + position: absolute; + z-index: 1000; + left: -1000px; + opacity: 0; + transition: opacity .25s ease-out; + pointer-events: none; + box-shadow: 0 0 2px #444; +} + +.cbi-tooltip-container:hover .cbi-tooltip { + left: auto; + opacity: 1; + transition: opacity .25s ease-in; +} + +.cbi-map-descr+fieldset { + margin-top: 1rem; +} + +.cbi-section>legend { + display: none !important; +} + +/* Define the error text border breathe display animation */ +@keyframes error-border-breathe { + 0%{ + border-color: #fb6340; + } + 50%{ + border-color: transparent; + } + 100%{ + border-color: #fb6340; + } +} + +/* Center display error text box */ +.cbi-section-error > ul{ + text-align: center; +} + +/* Add border for error text box, and border breathe display animation to make it more noticeable */ +.cbi-section-error > ul > li { + font-weight: 600; + max-width: 60%; + color: #fb6340; + line-height: 1rem; + display: inline-block; + border: 2px solid #fb6340; + border-radius: 0.3rem; + animation: error-border-breathe 1.5s ease-in-out infinite; + padding-left: 4px; + padding-right: 4px; + padding-top: 2px; + padding-bottom: 2px; +} + +.cbi-input-invalid, +.cbi-value-error input { + color: #fb6340; + border: 1px dashed #fb6340; +} + + +fieldset>fieldset { + margin: 0; + padding: 0; + border: none; + box-shadow: none; +} + + +.zonebadge .cbi-tooltip { + padding: .25rem; + background: inherit; + margin: -1.5rem 0 0 -.5rem; +} + +.zonebadge-empty { + background: repeating-linear-gradient(45deg, rgba(204, 204, 204, 0.5), rgba(204, 204, 204, 0.5) 5px, rgba(255, 255, 255, 0.5) 5px, rgba(255, 255, 255, 0.5) 10px); + color: #404040; +} + +.zone-forwards { + display: flex; + min-width: 10rem; +} + +.zone-forwards>* { + flex: 1 1 45%; +} + +.zone-forwards>span { + flex-basis: 10%; + text-align: center; + padding: 0 .25rem; +} + +.zone-forwards .zone-src, +.zone-forwards .zone-dest { + display: flex; + flex-direction: column; +} + +#diag-rc-output>pre { + background-color: #fff; + display: block; + padding: 8.5px; + margin: 0 0 18px; + line-height: 1.5rem; + white-space: pre-wrap; + word-wrap: break-word; + font-size: 1.4rem; + color: #404040; +} + +input[name="ping"], +input[name="traceroute"], +input[name="nslookup"] { + width: 80%; +} + + +/* fix progress bar */ +#swaptotal>div, +#swapfree>div, +#memfree>div, +#membuff>div, +#conns>div, +#memtotal>div { + width: 100% !important; + height: 1.6rem !important; + line-height: 1.6rem; + border-radius: .25rem; + overflow: hidden; +} + +#swaptotal>div>div, +#swapfree>div>div, +#memfree>div>div, +#membuff>div>div, +#conns>div>div, +#memtotal>div>div { + height: 100% !important; + background-color: #5e72e4 !important; + background-color: var(--primary) !important; + background-image: url(../img/trafficbar.png); + background-position: left top; + animation: sparkle 1000ms linear infinite; +} + +#swaptotal>div>div>div>small, +#swapfree>div>div>div>small, +#memfree>div>div>div>small, +#membuff>div>div>div>small, +#conns>div>div>div>small, +#memtotal>div>div>div>small { + text-shadow: 1px 1px 2px #ccc; +} + +/* fix multiple table */ + +table table, +.table .table { + border: none; +} + +.cbi-value-field table, +.cbi-value-field .table { + border: none; +} + +td>table>tbody>tr>td, +.td>.table>.tbody>.tr>.td { + border: none; +} + +.cbi-value-field>table>tbody>tr>td, +.cbi-value-field>.table>.tbody>.tr>.td { + border: none; +} + +/* button style */ + + + +.cbi-page-actions .cbi-button-apply, +.cbi-section-actions .cbi-button-edit, +.cbi-button-edit.important, +.cbi-button-apply.important, +.cbi-button-reload.important, +.cbi-button-action.important { + color: #fff; + background-color: #337ab7; +} + +.cbi-page-actions .cbi-button-save, +.cbi-button-add.important, +.cbi-button-save.important, +.cbi-button-positive.important { + color: #fff; + background-color: #5bc0de; +} + +.cbi-button-remove.important, +.cbi-button-reset.important, +.cbi-button-negative.important { + color: #fff; + background-color: #d9534f; +} + + + +.cbi-button-find, +.cbi-button-link, +.cbi-button-neutral { + color: #fff !important; + border: 1px solid #f0ad4e !important; + background-color: #f0ad4e !important; +} + +.cbi-button-edit, +.cbi-button-apply, +.cbi-button-reload, +.cbi-button-action { + color: #2e6da4; + border: 1px solid #2e6da4; + background-color: transparent; +} + +.cbi-page-actions .cbi-button-apply+.cbi-button-save, +.cbi-button-add, +.cbi-button-save, +.cbi-button-positive { + color: #46b8da; + border: 1px solid #46b8da; + background-color: transparent; +} + +.cbi-section-remove>.cbi-button, +.cbi-button-remove, +.cbi-button-reset, +.cbi-button-negative { + color: #fff !important; + border: 1px solid #d43f3a !important; + background-color: #fb6340 !important; +} + +.cbi-page-actions .cbi-button-link:first-child { + float: left; +} + +.a-to-btn { + text-decoration: none; +} + +/* file selector button */ +::file-selector-button { + color: #fff; + border-radius: .25rem; + border: 1px solid #2e6da4; + padding: .4rem .5rem; + background-color: #337ab7; + box-sizing: border-box; + cursor: pointer; + transition: all 0.2s ease-in-out; +} +::file-selector-button:hover, +::file-selector-button:focus, +::file-selector-button:active { + outline: 0; + text-decoration: none; +} +::file-selector-button:hover, +::file-selector-button:focus { + box-shadow: 0 0px 2px rgba(0, 0, 0, 0.12), 0 2px 2px rgba(0, 0, 0, 0.2); +} +::file-selector-button:active { + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.19), 0 5px 5px rgba(0, 0, 0, 0.23); +} + +/* table */ + + +.cbi-section-table .cbi-section-table-titles .cbi-section-table-cell { + width: auto !important; + background-color: #e9ecef; + background-color: var(--lighter); +} + +.td.cbi-section-actions { + text-align: right; + vertical-align: middle; +} + +.td.cbi-section-actions>* { + display: flex; +} + +.td.cbi-section-actions>*>*, +.td.cbi-section-actions>*>form>* { + flex: 1 1 4em; + margin: 0 1px; +} + +.td.cbi-section-actions>*>form { + display: inline-flex; + margin: 0; +} + +/* desc */ + + + + + + +/* luci */ + +.hidden { + display: none +} + +.left, +.left::before { + text-align: left !important; +} + +.right, +.right::before { + text-align: right !important; +} + +.center, +.center::before { + text-align: center !important; +} + +.top { + align-self: flex-start !important; + vertical-align: top !important; +} + +.bottom { + align-self: flex-end !important; + vertical-align: bottom !important; +} + +.inline { + display: inline; +} + +.cbi-page-actions { + border-top: 0px solid #eee; + padding-top: 0rem; + text-align: right; +} + + + + + +#xhr_poll_status { + cursor: pointer; + display: inline-block; + +} + +#xhr_poll_status>.label.success { + background-color: #fff !important; + color: #32325d !important; +} + +.label { + padding: 0.3rem 0.8rem; + font-size: 0.8rem; + font-weight: bold; + color: #ffffff !important; + text-transform: uppercase; + white-space: nowrap; + background-color: #bfbfbf; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + text-shadow: none; + text-decoration: none; +} + +.notice { + background-color: #5BC0DE; +} + +.showSide { + display: none; + color: #fff; + font-size: 1.4rem; +} + +.darkMask { + width: 100%; + height: 100%; + position: fixed; + background-color: rgba(0, 0, 0, 0.56); + z-index: 99; + left: 0; + top: 0; + display: none; +} + + +#cbi-firewall-redirect table *, +#cbi-network-switch_vlan table *, +#cbi-firewall-zone table * { + font-size: small; +} + +#cbi-firewall-redirect table input[type="text"], +#cbi-network-switch_vlan table input[type="text"], +#cbi-firewall-zone table input[type="text"] { + width: 5rem; +} + +#cbi-firewall-redirect table select, +#cbi-network-switch_vlan table select, +#cbi-firewall-zone table select { + min-width: 3.5rem; +} + +#cbi-network-switch_vlan .th, +#cbi-network-switch_vlan .td { + flex-basis: 12%; +} + +/* Fix background color of table-titles */ +.cbi-section-node>.cbi-section-table>tbody>.cbi-section-table-titles th { + background-color: var(--lighter); + border: none; +} + +/* Fix background color of table-descr */ +.cbi-section-node>.cbi-section-table>tbody>.cbi-section-table-descr th { + border: none; +} + +/* Fix background color not change when the H tag is in the table rowstyle-1 */ +.cbi-section-node>.cbi-section-table>tbody>.cbi-rowstyle-1 th { + background-color: #fff; + border-top: 1px solid #ddd; + border-bottom: none; +} + +/* Fix background color not change when the H tag is in the table rowstyle-2 */ +.cbi-section-node>.cbi-section-table>tbody>.cbi-rowstyle-2 th { + background-color: #f9f9f9; + border-top: 1px solid #ddd; + border-bottom: none; +} + +/* Change the color of the H label in the table to make it more visible */ +th h1, td h1, +th h2, td h2, +th h3, td h3, +th h4, td h4, +th h5, td h5, +th h6, td h6 { + background: var(--lighter); +} + +/* language fix */ +body.lang_pl.node-main-login .cbi-value-title { + width: 12rem; +} + +/* applyreboot fix */ + +#applyreboot-container { + margin: 2rem; +} + +#applyreboot-section { + margin: 2rem; + line-height: 300%; +} + + + +.table { + display: table; + position: relative; + color: #525f7f; + border-collapse: collapse; +} + +.tr { + display: table-row; + border-bottom: 1px solid rgba(0, 0, 0, .05); +} + +.thead { + display: table-header-group; +} + +.tbody { + display: table-row-group; +} + +.tfoot { + display: table-footer-group; +} + +.td, +.th { + vertical-align: middle; + text-align: center; + display: table-cell; + padding: 1rem; + white-space: nowrap; +} + + + +.th { + font-weight: bold; +} + +.tr.placeholder { + height: 4em; +} + +.tr.placeholder>.td { + position: absolute; + left: 0; + right: 0; + bottom: 0; + text-align: center; + background: inherit; +} + +.table[width="33%"], +.th[width="33%"], +.td[width="33%"] { + width: 33%; + padding-left: 1.5rem; + padding-right: 1.5rem +} + +.table[width="100%"], +.th[width="100%"], +.td[width="100%"] { + width: 100%; +} + +.table-titles .th { + padding: 0.75rem 1rem; + color: #8898aa; + background-color: #f6f9fc; +} + +.col-1 { + flex: 1 1 30px !important; + -webkit-flex: 1 1 30px !important; +} + +.col-2 { + flex: 2 2 60px !important; + -webkit-flex: 2 2 60px !important; +} + +.col-3 { + flex: 3 3 90px !important; + -webkit-flex: 3 3 90px !important; +} + +.col-4 { + flex: 4 4 120px !important; + -webkit-flex: 4 4 120px !important; +} + +.col-5 { + flex: 5 5 150px !important; + -webkit-flex: 5 5 150px !important; +} + +.col-6 { + flex: 6 6 180px !important; + -webkit-flex: 6 6 180px !important; +} + +.col-7 { + flex: 7 7 210px !important; + -webkit-flex: 7 7 210px !important; +} + +.col-8 { + flex: 8 8 240px !important; + -webkit-flex: 8 8 240px !important; +} + +.col-9 { + flex: 9 9 270px !important; + -webkit-flex: 9 9 270px !important; +} + +.col-10 { + flex: 10 10 300px !important; + -webkit-flex: 10 10 300px !important; + white-space: inherit; +} + + + +.cbi-rowstyle-2 .cbi-button-up, +.cbi-rowstyle-2 .cbi-button-down { + background-color: var(--lighter); + +} + +.cbi-button-up, +.cbi-button-down, +.cbi-value-helpicon, +.showSide, +.main>.loading>span { + font-family: 'argon' !important; + font-style: normal !important; + font-weight: normal !important; + font-variant: normal !important; + text-transform: none !important; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.cbi-button-up { + transform: rotate(180deg); +} + + +select { + padding: 0.36rem 0.8rem; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; +} + +select, +input { + font-size: .875rem; + transition: all .15s ease-in-out; + line-height: 1.5; + + padding: .625rem .75rem; + color: #8898aa; + border: 1px solid #dee2e6; + border-radius: .25rem; + background-color: #fff; + background-clip: padding-box; + box-shadow: 0 3px 2px rgba(233, 236, 239, .05); + outline: none; + transition: box-shadow .15s ease; + margin: 0.25rem; +} + +select:not([multiple="multiple"]):hover, +input:hover, +input:focus { + border-color: #5e72e4; + border-color: var(--primary); + outline: 0; + background-color: #fff; + box-shadow: 0 3px 9px rgba(50, 50, 9, 0), 3px 4px 8px rgba(94, 114, 228, .1); +} + + + +select[multiple="multiple"] { + height: auto; +} + +code { + color: #0099CC; +} + +abbr { + color: #005470; + text-decoration: underline; + cursor: help; +} + + +hr { + margin: 1rem 0; + border-color: #EEE; + opacity: 0.1; +} + + + + + +.kpi { + font-size: 0.875rem; +} + + +fieldset[id^="cbi-apply-"] { + position: fixed; + z-index: 200; + width: 20rem; + margin-left: -10rem; + margin-top: -5rem; + height: 10rem; + left: 50%; + top: 50%; + padding: 1rem; + box-sizing: border-box; + font-size: 1.2rem; + text-align: center; + box-shadow: rgba(0, 0, 0, 0.75) 0px 0px 15px -5px; + transition: all 0.3s; +} + +[id^="cbi-apply-"]>.panel-title { + border-bottom: none; + +} + +[id^="cbi-apply-"]>[id^="cbi-apply-"] { + position: initial; + width: auto; + height: auto; + font-size: 0.875rem; + margin-left: 0rem; + margin-top: .8rem; + display: block; +} + +.cbi-section>h3:first-child, +.panel-title { + font-size: 1.125rem; + width: 100%; + display: block; + margin: 0; + padding: 0.8755rem 1.5rem; + border-bottom: 1px solid #ddd; + letter-spacing: 0.1rem; + color: #32325d; + font-weight: normal; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +table { + border-spacing: 0; + border-collapse: collapse; +} + +table, +.table { + width: 100%; +} + +table>tbody>tr>td, +table>tbody>tr>th, +table>tfoot>tr>td, +table>tfoot>tr>th, +table>thead>tr>td, +table>thead>tr>th, +.table>.tbody>.tr>.td, +.table>.tbody>.tr>.th, +.table>.tfoot>.tr>.td, +.table>.tfoot>.tr>.th, +.table>.thead>.tr>.td, +.table>.thead>.tr>.th { + padding: .5rem; + border-top: 1px solid #ddd; + +} + +.cbi-section-table-cell { + white-space: nowrap; + align-self: flex-end; + flex: 1 1 auto; +} + +.cbi-section-table { + font-size: 0.875rem; + border: none; + margin: 0 !important; +} + +.status-bar { + font-size: 0.875rem; +} + +.cbi-section-table-row:last-child { + margin-bottom: 0; +} + +.cbi-section-table-row>.cbi-value-field .cbi-dropdown, +.cbi-section-table-row>.cbi-value-field .cbi-input-select, +.cbi-section-table-row>.cbi-value-field .cbi-input-text, +.cbi-section-table-row>.cbi-value-field .cbi-input-password{ + width:100% +} + +.cbi-section-table-row>.cbi-value-field .cbi-input-text, +.cbi-section-table-row>.cbi-value-field .cbi-input-password{ + min-width:100px +} + +#lease6_status_table > tbody > .cbi-section-table-row.cbi-rowstyle-1 div, +#lease6_status_table > tbody > .cbi-section-table-row.cbi-rowstyle-2 div{ + min-width:100%; +} + +.cbi-section-table-row>.cbi-value-field [data-dynlist]>input, +.cbi-section-table-row>.cbi-value-field input.cbi-input-password { + width: calc(100% - 1.5rem); +} + +div>table>tbody>tr:nth-of-type(2n), +div>.table>.tbody>.tr:nth-of-type(2n) { + background-color: #f9f9f9; +} + +div>table>tbody>tr:nth-of-type(2n), +div>.table>.tbody>.tr:nth-of-type(2n) { + background-color: #f9f9f9; +} + +.danger { + background-color: #f5365c !important; + background-color: var(--danger) !important; + color: #fff !important; +} + +/* Define the warning background-color breathe display animation */ +@keyframes warning-background-color-breathe { + 0%{ + color: #fff; + background-color: #fb6340; + } + 50%{ + color: #32325d; + background-color: #fff; + } + 100%{ + color: #fff; + background-color: #fb6340; + } +} +.warning, +.warning * { + background-color: #fb6340; + background-color: var(--warning); + color: #fff; + animation: warning-background-color-breathe 1.5s ease-in-out infinite !important; +} + +.notice { + background-color: #5e72e4 !important; + background-color: var(--primary) !important; + color: #fff !important; +} + +.success { + background-color: #2dce89 !important; + background-color: var(--success) !important; + color: #fff !important; +} + +.errorbox, +.alert-message { + margin: 0 0 0 0; + padding: 1rem 2rem; + border: 0; + font-weight: normal; + font-style: normal; + line-height: 1.5em; + font-family: inherit; + min-width: inherit; + overflow: auto; + border-radius: 0.3rem; + background-color: #FFF; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12); +} + +.errorbox { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236; +} +.alert-message.warning{ + margin-bottom: 1rem; +} +.error { + color: red; +} + + + +h1 { + font-size: 2rem; + padding-bottom: 10px; + border-bottom: 1px solid #eee; +} + + + +h2 { + margin: 0 0 1rem 0; + font-size: 1.25rem; + letter-spacing: 0.1rem; + padding: 1rem 1.5rem; + color: #32325d; + border-radius: .375rem; + background: #fff; + box-shadow: 0 4px 8px rgba(0, 0, 0, .03); +} + + +#cbi-dropbear h2, +#cbi-dropbear .cbi-map-descr, +#cbi-dropbear .cbi-map-descr abbr, +#cbi-rc h2, +#cbi-rc .cbi-map-descr, +#cbi-distfeedconf h2, +#cbi-distfeedconf .cbi-map-descr, +#cbi-customfeedconf h2, +#cbi-customfeedconf .cbi-map-descr, +#cbi-download h2, +#cbi-filelist h2 { + color: #32325d !important; +} + + +h3 { + font-size: 1.15rem; + width: 100%; + display: block; + margin: 1rem 0; + letter-spacing: 0.1rem; + color: #32325d; + font-weight: bold; + letter-spacing: 0.1rem; + padding: 1rem 1.5rem; + border-radius: 0.375rem; + background: var(--lighter); + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.03); +} + + + +fieldset { + margin: 1.25rem 0 0 0; + padding: 0; + font-weight: normal; + font-style: normal; + line-height: 1; + font-family: inherit; + + min-width: inherit; + overflow-x: auto; + overflow-y: hidden; + + border: 1px solid rgba(0, 0, 0, .05); + border-radius: .375rem; + background-color: #fff; + box-shadow: 0 0 2rem 0 rgba(136, 152, 170, .15); + + -webkit-overflow-scrolling: touch; +} + + + +fieldset>legend { + display: none !important; +} + +fieldset>fieldset { + margin: 0; + padding: 0; + border: none; + box-shadow: none; +} + +fieldset.cbi-section p { + padding: 1em; +} + +.panel-title { + width: 100%; + display: block; + margin-bottom: 0; + padding: 0.8755rem 1.5rem; + background-color: #fff; + border-bottom: 1px solid #ddd; + margin-bottom: 0rem; + letter-spacing: 0.1rem; + color: #32325d; + font-weight: 600; + position: sticky; + left: 0; +} + +table { + border-spacing: 0; + border-collapse: collapse; + width: 100%; +} + +table>tbody>tr>td, +table>tfoot>tr>td, +table>thead>tr>td { + font-size: .875rem; + color: #525f7f; + line-height: 1.4em; + vertical-align: middle !important; + padding: 0.8rem 1.5rem; + border-top: 1px solid #ddd; + +} + +table>tbody>tr>th, +table>tfoot>tr>th, +table>thead>tr>th { + + padding-right: 1.5rem; + padding-left: 1.5rem; + color: #8898aa; + background-color: #f6f9fc; + font-size: .65rem; + padding-top: .75rem; + padding-bottom: .75rem; + letter-spacing: 1px; + border-bottom: 1px solid #e9ecef; +} + +table>tbody>tr:first-child>td, +table>tfoot>tr:first-child>td, +table>thead>tr:first-child>td { + border-top: 0px; +} + +.cbi-section-table-cell { + text-align: center; +} + +.cbi-section-table-row { + text-align: center; +} + +fieldset>table>tbody>tr:nth-of-type(2n) { + background-color: #f9f9f9; +} + + + + + +/* fix multiple table */ + +table table { + border: none; +} + +.cbi-value-field table { + border: none; +} + +td>table>tbody>tr>td { + border: none; +} + +.cbi-value-field>table>tbody>tr>td { + border: none; +} + + + + + + +/* table */ + +.tabs { + margin: 0 0 1rem 0; + padding: 0 1rem; + background-color: #FFFFFF; + border-radius: 0.375rem; + box-shadow: 0 4px 8px rgba(0, 0, 0, .03); + white-space: nowrap; + overflow-x: auto; + + &::-webkit-scrollbar { + width: 5px; + height: 5px; + } + + &::-webkit-scrollbar-thumb { + background-color: #9e9e9e; + } + + &::-webkit-scrollbar-thumb:hover { + background-color: #757575; + } + + &::-webkit-scrollbar-thumb:active { + background-color: #424242; + } + + &::-webkit-scrollbar-track { + background-color: transparent; + } + + li[class~="active"], + li:hover { + cursor: pointer; + border-bottom: 0.18751rem solid #5e72e4; + border-bottom: 0.18751rem solid var(--primary); + color: #5e72e4; + color: var(--primary); + background-color: var(--light-subtabs-background); + margin-bottom: 0; + border-radius: 0; + + a { + color: #5e72e4; + color: var(--primary); + } + } + + li { + font-size: 0.875rem; + display: inline-block; + padding: 0.875rem 0rem; + border-bottom: 0.18751rem solid rgba(0, 0, 0, 0); + + a { + text-decoration: none; + color: #404040; + padding: 0.5rem 0.8rem; + } + + &:hover { + border-bottom: 0.18751rem solid #5e72e4; + border-bottom: 0.18751rem solid var(--primary); + } + } +} + +.cbi-section::-webkit-scrollbar, +.cbi-section > *::-webkit-scrollbar, +textarea::-webkit-scrollbar, +div::-webkit-scrollbar { + width: 5px; + height: 5px; +} + +.cbi-tabmenu { + color: white; + padding: 0.5rem 0.5rem 0 0.5rem; + white-space: nowrap; + overflow-x: auto; + border-bottom: 1px solid #ddd !important; + + &::-webkit-scrollbar { + width: 1px; + height: 5px; + } + + &::-webkit-scrollbar-thumb { + background-color: #9e9e9e; + } + + &::-webkit-scrollbar-thumb:hover { + background-color: #757575; + } + + &::-webkit-scrollbar-thumb:active { + background-color: t#424242; + } + + &::-webkit-scrollbar-track { + background-color: transparent; + } + + li { + background: #e3e3e3; + display: inline-block; + font-size: 0.875rem; + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; + padding: 0.5rem 0rem; + border-bottom: 0.18751rem solid rgba(0, 0, 0, 0); + + a { + text-decoration: none; + color: #404040; + padding: 0.5rem 0.8rem; + } + + &:hover { + cursor: pointer; + border-bottom: 0.18751rem solid #5e72e4; + border-bottom: 0.18751rem solid var(--primary); + color: #5e72e4; + color: var(--primary); + background-color: var(--light-subtabs-background); + margin-bottom: 0; + + a { + color: #525f7f; + } + } + } + + li[class~="cbi-tab"] { + border-bottom: 0.18751rem solid #5e72e4; + border-bottom: 0.18751rem solid var(--primary); + color: var(--primary); + background-color: var(--light-subtabs-background); + margin-bottom: 0; + + a { + color: #5e72e4; + color: var(--primary); + } + } +} + +.cbi-tab-descr { + margin: 1rem 1.5rem; + color: #32325d; + font-size: small; + line-height: 1.5em; +} + +.cbi-dropdown { + display: inline-flex; + cursor: pointer; + position: relative; + padding: 0; + height: auto; +} + +.cbi-dropdown:focus { + outline: 2px solid #4b6e9b; +} + +.cbi-dropdown>ul { + margin: 0 !important; + padding: 0; + list-style: none; + overflow-x: hidden; + overflow-y: auto; + display: flex; + width: 100%; +} + +.cbi-dropdown>ul.preview { + display: none; +} + +.cbi-dropdown>.open { + border: 0px outset #eee; + flex-basis: 15px; + background: #fff; +} + +.cbi-dropdown>.open, +.cbi-dropdown>.more { + flex-grow: 0; + flex-shrink: 0; + display: flex; + flex-direction: column; + justify-content: center; + text-align: center; + line-height: 2em; + padding: 0 .25em; +} + +.cbi-dropdown>.more, +.cbi-dropdown>ul>li[placeholder] { + color: #777; + font-weight: bold; + text-shadow: 1px 1px 0px #fff; + display: none; +} + +.cbi-dropdown>ul>li { + display: none; + padding: .25em; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + flex-shrink: 1; + flex-grow: 1; + align-items: center; + align-self: center; + min-height: 20px; +} + +.cbi-dropdown>ul>li .hide-open { + display: initial; +} + +.cbi-dropdown>ul>li .hide-close { + display: none; +} + +.cbi-dropdown>ul>li[display]:not([display="0"]) { + border-left: 1px solid #ccc; +} + +.cbi-dropdown[empty]>ul { + max-width: 1px; +} + +.cbi-dropdown>ul>li>form { + display: none; + margin: 0; + padding: 0; + pointer-events: none; +} + +.cbi-dropdown>ul>li img { + vertical-align: middle; + margin-right: .25em; +} + +.cbi-dropdown>ul>li>form>input[type="checkbox"] { + margin: 0; + height: auto; +} + +.cbi-dropdown>ul>li input[type="text"] { + height: 20px; +} + +.cbi-dropdown[open] { + position: relative; + border-color: #5e72e4; + border-color: var(--primary); +} + +.cbi-dropdown[open]>ul.dropdown { + display: block; + background: #fff; + border-color: #5e72e4; + border-color: var(--primary); + position: absolute; + z-index: 1000; + max-width: none; + min-width: 100%; + width: auto; + box-shadow: 0 1px 3px rgba(50, 50, 93, .15), 0 1px 0 rgba(0, 0, 0, .05); +} + +.cbi-dropdown>ul>li[display], +.cbi-dropdown[open]>ul.preview, +.cbi-dropdown[open]>ul.dropdown>li, +.cbi-dropdown[multiple]>ul>li>label, +.cbi-dropdown[multiple][open]>ul.dropdown>li, +.cbi-dropdown[multiple][more]>.more, +.cbi-dropdown[multiple][empty]>.more { + flex-grow: 1; + display: flex; + align-items: center; +} + +.cbi-dropdown[empty]>ul>li, +.cbi-dropdown[optional][open]>ul.dropdown>li[placeholder], +.cbi-dropdown[multiple][open]>ul.dropdown>li>form { + display: block; +} + +.cbi-dropdown[open]>ul.dropdown>li .hide-open { + display: none; +} + +.cbi-dropdown[open]>ul.dropdown>li .hide-close { + display: initial; +} + +.cbi-dropdown[open]>ul.dropdown>li { + border-bottom: 1px solid #ccc; +} + +.cbi-dropdown[open]>ul.dropdown>li[selected] { + background: #b0d0f0; +} + +.cbi-dropdown[open]>ul.dropdown>li.focus { + background: linear-gradient(90deg, #a3c2e8 0%, #84aad9 100%); +} + +.cbi-dropdown[open]>ul.dropdown>li:last-child { + margin-bottom: 0; + border-bottom: none; +} + +.cbi-dropdown[disabled] { + pointer-events: none; + opacity: .6; +} + +.cbi-dropdown .zonebadge { + width: 100%; +} + +.cbi-dropdown[open] .zonebadge { + width: 100%; +} + +.cbi-dropdown { + font-size: .875rem; + transition: all .15s ease-in-out; + line-height: 1.5; + height: calc(2.75rem + 2px); + padding: 0m; + color: #8898aa; + border: 1px solid #dee2e6; + border-radius: .25rem; + background-color: #fff; + background-clip: padding-box; + box-shadow: 0 3px 2px rgba(233, 236, 239, .05); + margin: 0.25rem; +} + +.cbi-value-field .cbi-dropdown { + min-width: 20rem; +} + +.cbi-value-field .cbi-dropdown .zonebadge>.ifacebadge { + padding: 0rem 1rem; + margin: 0rem 0.3rem; + border: 1px solid #6C6C6C; +} + + + +select[multiple="multiple"] { + height: auto; +} + +.cbi-dropdown>ul { + margin: 0 !important; + padding: 0; + list-style: none; + overflow-x: hidden; + overflow-y: hidden; + display: flex; + width: 100%; +} + + + +.cbi-section>legend { + display: none !important; +} + + + + + +.cbi-section-remove:nth-of-type(2n), +.cbi-section-node:nth-of-type(2n) { + background-color: #f9f9f9; +} + +.cbi-section-node-tabbed { + padding: 0; + margin-top: 0; + +} + +.cbi-section-node { + background: #fff; + border: 0; + border-radius: .375rem; + margin-bottom: 0px; + box-shadow: 0 0 0rem 0 rgba(136, 152, 170, .15); + overflow-x: auto; + overflow-y: hidden; + padding: 0rem 0; +} + +#cbi-network-lan.cbi-section-node { + overflow-x: visible; + overflow-y: visible; +} + + + +.cbi-section-node .cbi-value { + padding: 0.5rem 1rem 0.5rem 1rem !important; +} + + +.cbi-tabcontainer>.cbi-value:nth-of-type(2n), +.cbi-tabcontainer>.cbi-value:nth-of-type(2n)>textarea { + background-color: #f9f9f9; +} + +.cbi-value-field, +.cbi-value-description { + display: table-cell; + line-height: 1.6; + font-size: 0.875rem; +} + +/* Fix text position of the luci-app-filebrowser running state */ +#cbi-filebrowser>.cbi-section>.cbi-section>.cbi-value>.cbi-value-field, +/* Fix text position of the luci-apps running state of the [Control] type */ +form>.cbi-map>.cbi-section>.cbi-section-node>.cbi-value>.cbi-value-field font { + word-wrap: break-word; + font-size: 0.875rem; + line-height: 1.6; + padding: 0.7rem; + padding-left: 0; + text-align: right; + display: table-cell; +} + + +.cbi-value-helpicon>img { + display: none; +} + +.cbi-value-helpicon:before { + content: "\f059"; +} + +.cbi-value-description { + color: #8d8d8d; + opacity: 0.8; + font-size: small; + padding: 0.5rem; +} + +.cbi-value-title { + word-wrap: break-word; + font-size: 0.875rem; + line-height: 1.6; + color: #525f7f; + padding: .7rem; + padding-left: 0; + width: 23rem; + text-align: right; + display: table-cell; +} + +.cbi-value { + padding: 0.3rem 1rem; + display: inline-block; + width: 100%; +} + +.cbi-section-table-descr>.cbi-section-table-cell, +.cbi-section-table-titles>.cbi-section-table-cell { + border: none; +} + +.cbi-rowstyle-1 { + background-color: #fff; +} + +.cbi-rowstyle-2 { + background-color: #fefefe; +} + + + +.cbi-section-table .cbi-section-table-titles .cbi-section-table-cell { + width: auto !important; +} + +/* desc */ +.cbi-section-descr { + padding: 1rem 1.5rem; + font-size: 0.7rem; + font-weight: 600; + line-height: 1.5em; + color: #525f7f; +} + +.cbi-map-descr { + margin: 0rem 1.5rem 1rem 1.5rem; + color: #32325d; + font-size: small; + line-height: 1.5em; +} + + + + +/* input */ +.cbi-value input[type="password"], +.cbi-value input[type="text"] { + min-width: 20rem; +} + +input[type="checkbox"] { + height: auto; +} + +/* select */ + + +.cbi-value-field .ifacebadge { + display: inline-flex; + border-bottom: 0px solid #CCCCCC; + padding: 0.5rem 1rem; + + box-shadow: none; +} + +td>.ifacebadge { + background-color: #F0F0F0; + font-size: 0.9rem; +} + +.ifacebadge>img { + float: right; + margin: 0 0.3rem; +} + +#syslog { + width: 100%; + min-height: 15rem; + padding: 1rem; + line-height: 1.4em; + color: #1e1e1e; + border-radius: 0; + background-color: #fff; + border: none; + outline: none; +} + + +.ifacebadge { + display: inline-flex; + border-bottom: 0px solid #CCCCCC; + padding: 0.5rem 1rem; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + background: #fff; +} + +td>.ifacebadge, +.td>.ifacebadge { + background-color: #e9ecef; + font-size: 0.9rem; + border-radius: 0.2rem; +} + +.ifacebadge>em, +.ifacebadge>img { + display: inline-block; + margin: 0 0.3rem; + align-self: center; +} + + + +.ifacebadge span { + line-height: 1.6em; +} + +.network-status-table { + display: flex; + flex-wrap: wrap; +} + +.network-status-table .ifacebox { + margin: 1rem; + flex-grow: 1; +} + +.network-status-table .ifacebox-body { + display: flex; + flex-direction: column; + height: 100%; +} + +.network-status-table .ifacebox-body>span { + flex: 10 10 auto; + height: 100%; + line-height: 1.7em; + padding-left: 2rem; + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.network-status-table .ifacebox-body>div { + display: flex; + flex-wrap: wrap; +} + +.network-status-table .ifacebox-body .ifacebadge { + flex: 1 1 auto; + margin: 0; + padding: .5em; + min-width: 220px; + background-color: #fff; + align-items: center; +} + +.ifacebox { + + border: 1px solid #ccc; + border-radius: 0.375rem; + background-color: #f9f9f9; + display: inline-flex; + flex-direction: column; + line-height: 1.2em; + min-width: 100px; + overflow: hidden; +} + +.ifacebox-head { + padding: 1rem; + background: #eee; +} + +.ifacebox-head.active { + background: #5e72e4; + background: var(--primary); + color: #fff; +} + +.ifacebox-body { + padding: 0.5em; +} + +.cbi-image-button { + margin-left: 0.5rem; +} + +#iwsvg, +#iwsvg2, +#bwsvg { + border: none !important; + border-radius: 0.375rem; + box-shadow: 0 0 2rem 0 rgba(136, 152, 170, .15); + overflow: hidden; +} + + + +.cbi-image-button { + margin-left: 0.5rem; +} + +.zonebadge { + padding: 0.2rem 0.5rem; + display: inline-block; + cursor: pointer; +} + +.zonebadge>.ifacebadge { + padding: 0.2rem 1rem; + margin: 0.3rem; + border: 1px solid #6C6C6C; +} + +.zonebadge>input[type="text"] { + padding: 0.16rem 1rem; + min-width: 10rem; + margin-top: 0.3rem; +} + +.cbi-value-field .cbi-input-checkbox { + margin: 0.5rem 0.25rem 0.7rem 0.25rem; + vertical-align: middle; + height: 1rem; + line-height: 1.6; +} + +.cbi-input-checkbox { + margin: 0.5rem 0.25rem 0.7rem 0.25rem; + vertical-align: middle; +} + +.cbi-value-field .cbi-input-radio { + margin: 0rem 0.25rem; +} + +.cbi-input-radio { + margin: 0rem 0.25rem; +} + +.cbi-value-field>input+.cbi-value-description { + padding: 0; +} + +.cbi-value-field>ul>li { + display: flex; + align-items: center; + font-size: 0.875rem; +} + + + +.cbi-value-field>ul>li .ifacebadge { + font-size: 0.875rem; + background-color: #eee; + display: flex; + align-items: center; + margin-left: 0rem; + margin-top: 0rem; +} + +.cbi-section-table-row>.cbi-value-field .cbi-input-select { + min-width: 7rem; +} + +.cbi-section-create>.cbi-button-add { + margin: 0.75rem 0.75rem 0.75rem 0.25rem; +} + +.cbi-section-remove { + padding: 0.5rem; +} + + +.cbi-optionals { + padding: 1rem 1rem 0 1rem; + border-top: 1px solid #CCC; +} + + +input[name="ping"], +input[name="traceroute"], +input[name="nslookup"] { + width: 80%; +} + + + +.label { + padding: 0.3rem 0.8rem; + font-size: 0.8rem; + font-weight: bold; + color: #fff !important; + text-transform: uppercase; + white-space: nowrap; + background-color: #32325d; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + text-shadow: none; + text-decoration: none; +} + + + + + + + +/* fix status overview */ + +.node-status-overview>.main fieldset:nth-child(4) td:nth-child(2) { + white-space: normal; +} + +.node-status-overview>.main #wan4_i, +.node-status-overview>.main #wan6_i { + min-width: 80px !important; +} + +/* fix status processes */ + +.node-status-processes>.main table tr td:nth-child(3) { + white-space: normal; +} + + +/* fix system reboot */ + +.node-system-reboot>.main>.main-right p, +.node-system-reboot>.main>.main-right h3 { + padding-left: 2rem; + color: #fff; +} + +/* fix Services Network Shares*/ +.node-services-samba>.main .cbi-tabcontainer:nth-child(3) .cbi-value-title { + margin-bottom: 1rem; + width: auto; +} + +.node-services-samba>.main .cbi-tabcontainer:nth-child(3) .cbi-value-field { + display: list-item; +} + +.node-services-samba>.main .cbi-tabcontainer:nth-child(3) .cbi-value-description { + padding-top: 1rem; +} + +/* fix System Software*/ +.node-system-packages>.main table tr td:nth-child(1) { + width: auto !important; +} + +.node-system-packages>.main table tr td:nth-last-child(1) { + white-space: normal; + font-size: small; + color: #404040; +} + +.node-system-packages>.main .cbi-tabmenu>li>a, +.tabs>li>a { + padding: 0.5rem 0.8rem; +} + +.node-system-packages>.main .cbi-value>pre { + background-color: #eee; + padding: 0.5rem; + overflow: auto; +} + +.node-system-packages>.main .cbi-page-actions { + padding: 1rem 0; +} + +.node-system-packages>.main .cbi-section-node:first-child .cbi-value-last { + line-height: 1.8em; + + div[style="margin:3px 0; width:300px; height:10px; border:1px solid #000000; background-color:#80C080"] { + border: 1px solid #999999 !important; + width: 100% !important; + background-color: #fff !important; + height: 1.4rem !important; + border-radius: 0.25rem; + margin: 0.5rem 0; + overflow: hidden; + + div { + border-right: 0 !important; + background-color: #5e72e4 !important; + background-color: var(--primary) !important; + height: 100% !important; + background-image: url(../img/trafficbar.png); + background-position: left top; + animation: sparkle 1000ms linear infinite; + } + } + +} + +.node-system-leds .cbi-section em { + display: block; +} + +.cbi-tabmenu+.cbi-section { + margin-top: 0; +} + +.cbi-section { + background: #fff; + border: 0; + border-radius: .375rem; + box-shadow: 0 0 2rem 0 rgba(136, 152, 170, .15); + overflow-x: auto; + overflow-y: hidden; + + em { + font-size: 0.7rem; + font-weight: 600; + color: var(--primary); + text-shadow: 1px 1px 2px #ccc; + text-align: center; + } + + h4 { + font-size: 0.7rem; + font-weight: 600; + color: #525f7f; + } + + +} + + + + + +#content_syslog { + border-radius: .375rem; + box-shadow: 0 0 2rem 0 rgba(136, 152, 170, .15); + overflow: hidden; +} + +.node-system-packages .cbi-section-node .cbi-value { + padding: 0.5rem 1rem; + font-size: 0.875rem; +} + +.node-system-packages br { + display: none; +} + +/* fix network firewall*/ +.node-network-firewall>.main .cbi-section-table-row>.cbi-value-field .cbi-input-select { + min-width: 4rem; +} + +.node-network-firewall .cbi-section-table { + width: 100% !important; +} + +.node-status-iptables fieldset, +.node-system-packages fieldset, +.node-system-flashops fieldset { + margin-top: 0; +} + +.node-system-flashops fieldset > ul { + padding: 1rem; +} + +.node-system-flashops fieldset + .cbi-page-actions { + margin-top: 1rem; +} + +.node-status-iptables .cbi-tabmenu, +.node-system-packages .cbi-tabmenu, +.node-system-flashops .cbi-tabmenu { + border: none; +} + +.node-system-flashops form.inline+form.inline { + margin-left: 0; +} + +.Changes .cbi-section { + font-size: 0.875rem; + padding: 1rem; +} + +.node-network-diagnostics { + font-size: 0.875rem; + + #diag-rc-output { + display: block; + padding: 1rem; + + pre { + font-size: 0.875rem; + } + + } + + .cbi-section div { + padding: 0 1.5rem; + } + +} + + +.node-network-diagnostics input { + margin: 0.25rem !important; +} + +.node-network-wireless .cbi-button-add{ + margin-left: 0; +} + + + +/* fix nlbw/display*/ +#detail-bubble.in { + z-index: 500; +} + +.node-nlbw-display .cbi-section ul { + padding: 0.875rem 1.5rem; +} + +.node-nlbw-backup form { + margin-left: 1.5rem; +} + +.node-nas-usb_printer em { + display: block; +} + +/* luci-app-passwall */ +#cbi-passwall #add_link_div, +#cbi-passwall #set_node_div { + background: #fffffff0; +} +#cbi-passwall .cbi-section-table tbody ._now_use { + background: #5e72e473 !important; +} + +/* luci-app-commands */ +.commandbox h3 { + overflow: hidden; + text-overflow: ellipsis; +} +.commandbox code { + word-break: break-word; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; +} +div.commandbox { + height: 16em; +} + +/* luci-app-ssr-plus */ +#cbi-shadowsocksr .cbi-map-descr h3 { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +/* luci-app-mwan3 */ +.node-status-mwan .cbi-tabmenu { + padding: 3rem 0.5rem 0 0.5rem; +} + +/* luci-app-openclash */ +.node-services-openclash .cbi-tabmenu { + font-size: 0; +} +.node-services-openclash .cbi-tabmenu > li { + margin-right: 4px; +} +.node-services-openclash .cbi-tabmenu > li:last-child { + margin-right: 0; +} + +/* luci-app-ddnsto */ +.node-services-ddnsto .cbi-section-node .cbi-value div { + display: table-cell; + line-height: 1.6; + font-size: 0.875rem; +} + +/* luci-app-dockerman */ +#cbi-dockerd > .cbi-section > br, +#cbi-docker > .cbi-section > br { + display: none; +} + +/* luci-app-diskman */ +#cbi-diskman > .cbi-section > br { + display: none; +} + +/* luci-app-istorex (Quick Start) */ +#app #main #page .app-container_body .btn-f, +#app #main #page .app-container_body .btn-r { + -webkit-user-select: none; /* Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+/Edge */ + user-select: none; /* Standard */ + width: 30px; +} + +/* luci-app-ttyd */ +.TTYD.node-system-terminal .main { + height: 100%!important; +} +.TTYD.node-system-terminal .main .main-right, +.TTYD.node-system-terminal .main .main-right #maincontent, +.TTYD.node-system-terminal .main .main-right #maincontent .container .cbi-map { + height: 100%!important; + display: flex!important; + flex-direction: column!important; +} +.TTYD.node-system-terminal .main .main-right #maincontent, +.TTYD.node-system-terminal .main .main-right #maincontent .container, +.TTYD.node-system-terminal .main .main-right #maincontent .container .cbi-map #terminal { + flex: 1!important; +} + +@media screen and (max-width: 1600px) { + + .main { + .main-left { + width: calc(0% + 13rem); + } + + .main-right { + width: calc(100% - 13rem); + } + } + + + .cbi-button:not(.cbi-button-up, .cbi-button-down) { + /*padding: 0.3rem 1.5rem;*/ + font-size: 0.8rem; + } + + header>.container>.pull-right>* { + top: 0.35rem; + } + + .label { + padding: 0.2rem 0.6rem; + } + + .cbi-value-title { + width: 15rem; + padding-right: 0.6rem; + } + + fieldset { + padding: 0; + } + + .node-status-iptables>.main fieldset li>a { + padding: 0.3rem 0.6rem; + } + + +} + + +@media screen and (max-width: 1280px) { + + header>.container { + margin-top: 0.25rem; + } + + .main { + .main-left { + width: calc(0% + 13rem); + } + + .main-right { + width: calc(100% - 13rem); + } + } + + + + .cbi-tabmenu>li>a, + .tabs>li>a { + padding: 0.2rem 0.5rem; + } + + .panel-title { + font-size: 1.1rem; + padding-bottom: 1rem; + } + + table { + font-size: 0.7rem !important; + width: 100% !important; + } + + .main>.main-left>.nav>li, + .main>.main-left>.nav>li a, + .main>.main-left>.nav>.slide>.menu { + font-size: 0.9rem; + } + + .main>.main-left>.nav>.slide>.slide-menu>li>a { + font-size: 0.7rem; + } +} + +@media screen and (max-width: 992px) { + .main { + .main-left { + width: 0; + position: fixed; + z-index: 100; + } + + .main-right { + width: 100%; + } + } + + .showSide { + padding: 0.1rem; + position: relative; + display: inline-block; + + &:hover { + text-decoration: none; + } + } + + .showSide:before { + content: "\e20e"; + font-size: 1.7rem; + } + + header>.fill>.container>.brand { + display: inline-block; + } + + .node-network-diagnostics>.main .cbi-map fieldset>div * { + width: 100% !important; + } + + .node-network-diagnostics>.main .cbi-map fieldset>div input[type="text"] { + margin: 3rem 0 0 0 !important; + } + + .node-network-diagnostics>.main .cbi-map fieldset>div:nth-child(4) input[type="text"] { + margin: 0 !important; + } + + .node-network-diagnostics>.main .cbi-map fieldset>div select, + .node-network-diagnostics>.main .cbi-map fieldset>div input[type="button"] { + margin: 1rem 0 0 0 !important; + } + + .node-network-diagnostics>.main .cbi-map fieldset>div { + width: 100% !important; + } + + #diag-rc-output>pre { + font-size: 1rem; + } + + +} + +@media screen and (max-width: 500px) { +.login-page { + .login-container { + margin-left: 0rem !important; + width: 500px; + + .login-form { + max-width: 500px; + } + } +} + +@media screen and (max-width: 480px) { + body { + font-size: 0.8rem; + } + + .pull-right { + float: right; + margin-top: 0rem !important; + } + + .login-page .login-container { + margin-left: 0rem !important; + width: 100%; + + .login-form { + + .form-login { + .input-group { + &::before { + color: #525461; + } + + input { + color: #525461; + border-bottom: white 1px solid; + border-bottom: var(--white) 1px solid; + border-radius: 0; + } + + } + } + } + + } + + + + fieldset { + padding: 0; + margin: 1rem 0 0 0; + } + + .toggle { + margin: 0; + } + + h2 { + font-size: 1.125rem; + } + + .panel-title { + font-size: 1rem; + padding-bottom: 1rem; + } + + #maincontent>.container { + margin: 0 1rem 1.5rem 1rem; + } + + .main>.main-left>.nav>.slide>.menu { + font-size: 1rem; + } + + .main>.main-left>.nav>.slide>.slide-menu>li>a { + font-size: 0.9rem; + } + + + .main>.main-left>.nav>.slide>.menu:after { + top: 0.9rem; + } + + + #ethinfo td { + padding: 0.75rem 0.2rem !important; + + } + + .cbi-value-title { + width: 100%; + min-width: 0rem !important; + display: block; + margin-top: 0.5rem; + margin-bottom: 0.5rem; + text-align: left; + padding: 0 0.25rem; + } + + .cbi-value input[type="password"], + .cbi-value input[type="text"] { + min-width: 15rem; + } + + select, + input { + width: 100% !important; + min-width: auto; + margin: 0.25rem 0; + } + + input { + box-sizing: border-box; + } + + .cbi-value>.cbi-value-field>div>input { + width: calc(100% - 1.5rem) !important; + } + + .cbi-value>.cbi-value-field { + display: inline-block; + width: 100%; + position: relative; + } + + .cbi-page-actions>div>input { + display: none; + } + + + ::-webkit-scrollbar { + width: 0px !important; + height: 0px !important; + } + + + .tabs>li>a { + font-size: 0.9rem; + } + + select, + input { + font-size: 0.9rem; + } + + .mobile-hide { + display: none !important; + } + + + + .node-status-realtime { + + table>tbody>tr>td, + table>tfoot>tr>td, + table>thead>tr>td { + font-size: .8125rem; + color: #525f7f; + line-height: 1.4em; + vertical-align: middle !important; + padding: 0.8rem 0rem; + border-top: 1px solid #ddd; + width: auto; + text-align: center; + } + } + + + .node-system-packages>.main .cbi-value.cbi-value-last>div { + width: 100% !important; + } + + .node-system-packages .cbi-section-node .cbi-value { + padding: 0.3rem 1rem; + } + + .node-system-packages>.main .cbi-value .cbi-value-field input { + width: 100%; + } + + .node-system-leds .cbi-section em { + display: block; + } + + .node-status-iptables>.main div>.cbi-map>form { + position: static !important; + margin: 0 0 2rem 0; + padding: 2rem; + border: 0; + font-weight: normal; + font-style: normal; + line-height: 1; + font-family: inherit; + min-width: inherit; + overflow-x: auto; + overflow-y: hidden; + border-radius: 0.375rem; + background-color: #FFF; + box-shadow: 0 0 2rem 0 rgba(136, 152, 170, .15); + -webkit-overflow-scrolling: touch; + } + + .node-status-iptables>.main div>.cbi-map>form input[type="submit"] { + width: 100% !important; + margin: 0; + } + + .node-status-iptables>.main div>.cbi-map>form input[type="submit"]+input[type="submit"] { + margin-top: 1rem; + } + + .cbi-value input[type="text"]:has(+ img) { + width: 10rem !important; + } + + .cbi-button-add { + margin-left: 0.5rem; + } + + .node-network-network { + .cbi-section-table { + + tr, + td { + display: block; + } + + td { + width: 100% !important; + text-align: center !important; + padding: 0.8rem 1.5rem !important; + } + + .cbi-section-table-titles { + display: flex; + + .cbi-section-table-cell { + flex: 1 !important; + } + } + } + } + + .node-services-vssr { + .status-info { + font-size: 0.75rem; + } + + .icon-con { + margin-top: 0.4rem; + + img { + width: 2.3rem !important; + height: auto; + } + } + } +} diff --git a/luci-theme-argon/htdocs/luci-static/argon/less/dark.less b/luci-theme-argon/htdocs/luci-static/argon/less/dark.less new file mode 100644 index 00000000..997fe795 --- /dev/null +++ b/luci-theme-argon/htdocs/luci-static/argon/less/dark.less @@ -0,0 +1,908 @@ +/** + * Argon is a clean HTML5 theme for LuCI. It is based on luci-theme-material and Argon Template + * + * luci-theme-argon + * Copyright 2020 Jerryk + * + * Have a bug? Please create an issue here on GitHub! + * https://github.com/jerrykuku/luci-theme-argon/issues + * + * luci-theme-bootstrap: + * Copyright 2008 Steven Barth + * Copyright 2008 Jo-Philipp Wich + * Copyright 2012 David Menting + * + * MUI: + * https://github.com/muicss/mui + * + * luci-theme-material: + * https://github.com/LuttyYang/luci-theme-material/ + * + * Argon Theme + * https://demos.creative-tim.com/argon-dashboard/index.html + * + * Login background + * https://unsplash.com/ + * + * Licensed to the public under the Apache License 2.0 + */ + +body { + background: #1e1e1e; + color: #cccccc; +} + +.login-page .login-container { + + .login-form { + background-color: #1e1e1e; + + .brand { + color: #adb5bd; + } + + .form-login { + .input-group { + &::before { + color: #adb5bd; + } + + .border { + border-bottom: 1px var(--dark-primary) solid; + } + + input { + background-color: transparent !important; + color: #adb5bd; + border-bottom: #adb5bd 1px solid !important; + border-radius: 0; + border-top: none !important; + border-left: none !important; + border-right: none !important; + box-shadow: none; + + &:focus { + border-top: none !important; + border-left: none !important; + border-right: none !important; + } + } + } + + .cbi-button-apply { + background-color: #483d8b !important; + background-color: var(--dark-primary) !important; + &:hover, + &:focus { + opacity: 0.9; + } + } + } + + + } + + footer { + color: #adb5bd; + a { + color: #adb5bd; + } + } + +} + +header::after { + background-color: #1e1e1e !important; +} + + +.main { + .main-left { + + background-color: #333333 !important; + box-shadow: 0 0 0.5rem 0 rgba(0, 0, 0, .15); + + .sidenav-header .brand { + color: #ccc; + } + + .nav { + .slide { + .slide-menu { + + .active { + a { + color: #fff !important; + + &::after { + background-color: var(--dark-primary) !important; + } + } + } + + li { + a { + color: #cccccc; + + &:hover { + background: none !important; + } + + &::after { + background-color: var(--dark-primary) !important; + box-shadow: 0 0 1px #000 !important; + } + + } + } + } + + .menu { + &:hover, + &.active { + background-color: #483d8b !important; + background-color: var(--dark-primary) !important; + color: #fff !important; + box-shadow: 0 0 1px #000 !important; + } + } + + .menu[data-title=Status]:before, + .menu[data-title=Control]:before { + color: var(--dark-primary) !important; + } + } + + li { + a { + color: #cccccc !important; + } + + a:hover { + background-color: #483d8b !important; + background-color: var(--dark-primary) !important; + color: #fff !important; + + + } + } + } + + + &::-webkit-scrollbar-thumb { + background-color: #252526 !important; + } + + } + + .main-right { + background-color: #1e1e1e; + } +} + +h2 { + color: #ccc; + background: #333333; +} + +h3 { + color: #ccc; + border-bottom: 0; + background: #333333; +} + +a:link, +a:visited, +a:active { + color: var(--dark_webkit-any-link); +} + +a:-webkit-any-link:not(li a, .main-left a, .brand, .pull-right a, .alert-message a, .login-container footer a, .cbi-button) { + color: var(--dark_webkit-any-link) !important; + text-shadow: 1px 1px 2px #000 !important; +} + +input:-webkit-autofill { + background-color: #3c3c3c !important; +} + +input[type="checkbox"]:checked { + background-color: #483d8b !important; + background-color: var(--dark-primary) !important; +} + +.cbi-input-radio:checked { + background-color: #483d8b !important; + background-color: var(--dark-primary) !important; +} + +.cbi-value-field .cbi-input-apply, +.cbi-button-apply, +.cbi-button-edit { + color: #fff !important; + background-color: #483d8b !important; + background-color: var(--dark-primary) !important; + border-color: #483d8b !important; + border-color: var(--dark-primary) !important; +} + +.cbi-section em { + color: var(--dark_webkit-any-link); + text-shadow: 1px 1px 2px #000; +} + +header.bg-primary { + background-color: #1e1e1e !important; +} + + + +.cbi-map-descr { + color: #ccc; +} + +.cbi-section { + background: none; + box-shadow: 0 0 0.5rem 0 rgba(0, 0, 0, .35) +} + +.panel-title { + color: #ccc; + background-color: #333333; + border-bottom: 0px; +} + +table>tbody>tr>td, +table>tfoot>tr>td, +table>thead>tr>td { + color: #ccc; +} + +fieldset>table>tbody>tr:nth-of-type(2n) { + background-color: #252526; +} + +table>tbody>tr>td, +table>tfoot>tr>td, +table>thead>tr>td { + border-top: 1px solid #252526; +} + +#swaptotal>div>div, +#swapfree>div>div, +#memfree>div>div, +#membuff>div>div, +#conns>div>div, +#memtotal>div>div { + background-color: #483d8b !important; + background-color: var(--dark-primary) !important; +} + +#swaptotal>div>div>div>small, +#swapfree>div>div>div>small, +#memfree>div>div>div>small, +#membuff>div>div>div>small, +#conns>div>div>div>small, +#memtotal>div>div>div>small { + color: #ccc !important; + text-shadow: 1px 1px 2px #000 !important; +} + +.node-system-packages>.main .cbi-section-node:first-child .cbi-value-last { + line-height: 1.8em; + + div[style="margin:3px 0; width:300px; height:10px; border:1px solid #000000; background-color:#80C080"] { + border: 1px solid #999999 !important; + background-color: transparent !important; + + div { + background-color: #32325d !important; + background-color: var(--dark-primary) !important; + } + } + +} + + +table>tbody>tr>th, +table>tfoot>tr>th, +table>thead>tr>th { + background-color: #252526; + border-top: none; + border-bottom: black 1px solid !important; +} + +.cbi-rowstyle-2 { + background-color: #2c2c2c !important; +} + +.cbi-rowstyle-1 { + background-color: #252526; +} + +.cbi-section>h3:first-child, +.panel-title { + color: #ccc; + border-bottom: 0; +} + +.cbi-section-table .cbi-section-table-titles .cbi-section-table-cell { + background-color: #1e1e1f; +} + +.cbi-button { + color: #ccc; + background-color: #2c2c2c; +} + +.cbi-rowstyle-2 .cbi-button-up, +.cbi-rowstyle-2 .cbi-button-down { + background-color: #252526 !important; +} + +.cbi-section-node { + background: none; + border-radius: 0 0 .375rem .375rem; + padding: 0rem; +} + +abbr { + color: #8898aa; +} + +div>table>tbody>tr:nth-of-type(2n), +div>.table>.tbody>.tr:nth-of-type(2n) { + background-color: #252526; +} + +/* file selector button */ +::file-selector-button { + border: 1px solid darkseagreen !important; + background-color: darkseagreen !important; +} + +/* Fix background color of table-titles */ +.cbi-section-node>.cbi-section-table>tbody>.cbi-section-table-titles th { + background-color: #1e1e1e; + border: none !important; +} + +/* Fix background color of table-descr */ +.cbi-section-node>.cbi-section-table>tbody>.cbi-section-table-descr th { + background-color: #333333; + border: none !important; +} + +/* Fix background color not change when the H tag is in the table rowstyle-1 */ +.cbi-section-node>.cbi-section-table>tbody>.cbi-rowstyle-1 th { + background-color: #252526; + border-top: 1px solid #252526; + border-bottom: none !important; +} + +/* Fix background color not change when the H tag is in the table rowstyle-2 */ +.cbi-section-node>.cbi-section-table>tbody>.cbi-rowstyle-2 th { + background-color: #2c2c2c; + border-top: 1px solid #252526; + border-bottom: none !important; +} + +/* Change the color of the H label in the table to make it more visible */ +th h1, td h1, +th h2, td h2, +th h3, td h3, +th h4, td h4, +th h5, td h5, +th h6, td h6 { + background: var(--gray-dark); +} + +/* Improved the background color of each itemes in "UNSAVED CHANGES" (dark mode only) */ +.uci-change-list del, +.uci-change-legend-label del { + background-color: #fb74008c; +} +.uci-change-list var, +.uci-change-legend-label var { + background-color: #333333; +} +.uci-change-list ins, +.uci-change-legend-label ins { + background-color: #00ff0a45 !important; +} + +#content_syslog { + box-shadow: 0 0 0.5rem 0 rgba(0, 0, 0, .35) +} + +#syslog { + color: #ccc; + background-color: #1e1e1e; +} + +#iwsvg, +#iwsvg2, +#bwsvg { + overflow: hidden; + box-shadow: 0 0 0.5rem 0 rgba(0, 0, 0, .35); + background-color: #1e1e1e !important; +} + +.tabs { + background-color: #252526; +} + +.tabs>li:hover, +.tabs>li[class~="active"], +.cbi-tabmenu>li:hover, +.cbi-tabmenu>li[class~="cbi-tab"] { + border-bottom: .18751rem solid var(--dark-primary); + background-color: #3c3c3c; +} + +.tabs>li>a, +.cbi-tabmenu>li>a { + color: #ccc !important; +} + +.cbi-tabmenu>li>a:hover, +.cbi-tabmenu>li:hover>a, +.cbi-tabmenu>.cbi-tab>a, +.tabs>li>a:hover, +.tabs>li:hover>a, +.tabs>li[class~="active"]>a { + color: #fff !important; +} + +.cbi-tabmenu>li { + background: #2d2d2d; +} + +.cbi-tabmenu { + border-bottom: 0px solid #ddd !important; +} + +.cbi-tab-descr { + color: #ccc; +} + +.cbi-tabcontainer>.cbi-value:nth-of-type(2n), +.cbi-tabcontainer>.cbi-value:nth-of-type(2n)>textarea { + background-color: #252526; +} + +.cbi-value-title { + color: #ccc; +} + +select, +input { + color: #ccc; + background-color: transparent; + border: 1px solid #3c3c3c !important; + box-shadow: 0 3px 2px rgba(0, 0, 0, .05); +} + +select:not([multiple="multiple"]):hover, +input:hover, +input:focus { + border-color: #483d8b !important; + border-color: var(--dark-primary) !important; + background-color: transparent; + outline: 0; + box-shadow: none; +} + +select { + background-color: #1e1e1e !important; +} + +#cbi-dropbear h2, +#cbi-dropbear .cbi-map-descr, +#cbi-dropbear .cbi-map-descr abbr, +#cbi-rc h2, +#cbi-rc .cbi-map-descr, +#cbi-distfeedconf h2, +#cbi-distfeedconf .cbi-map-descr, +#cbi-customfeedconf h2, +#cbi-customfeedconf .cbi-map-descr, +#cbi-download h2, +#cbi-filelist h2 { + color: #ccc !important; +} + +.cbi-value-field>ul>li .ifacebadge { + background-color: #3c3c3c; +} + +.cbi-section-descr { + color: #ccc; +} + +/*textarea for dark mode*/ +textarea { + border: 1px solid #3c3c3c !important; + background-color: #1e1e1e; + color: #ccc; +} + +.cbi-section-remove:nth-of-type(2n), +.cbi-section-node:nth-of-type(2n) { + background-color: #1e1e1e; +} + +.node-system-packages>.main table tr td:nth-last-child(1) { + color: #ccc; +} +.node-system-packages > .main .cbi-value > pre { + background-color: #333; +} + +.cbi-section-node .cbi-value { + padding: 1rem 1rem 0.3rem 1rem; +} + +.ifacebox { + background-color: #1e1e1e; + border: 1px solid #1e1e1e; +} + +.ifacebox-head { + color: #666; +} + +.ifacebox-body { + background-color: #333; +} + +.zonebadge strong { + color: #333; +} + +.zonebadge>.ifacebadge { + background-color: #3c3c3c; +} + +/* Fix firewall zone: "unspecified -or- create: " background color (dark mode only) */ +div[onclick$="._fwzone_new').checked=true"] { + border: 1px solid #3c3c3c; + background-color: transparent !important; +} + +/* Improve the background color of "Any zone" and "Device" when ADD/EDIT Rules in Firewall > Traffic Rules (dark mode only) */ +label[for$=".src_any"], +label[for$=".dest_empty"], +label[for$=".dest_any"] { + background-color: #2888db !important; +} + +/* Fix/add background color of wireless signal strength badge for dark mode */ +td>.ifacebadge, +.td>.ifacebadge { + background-color: #3c3c3c; +} + +/* Improved loading process gif color (dark mode only) */ +img[src="/luci-static/resources/icons/loading.gif"] { + filter: invert(1); +} + +div.cbi-value var, +td.cbi-value-field var, +.td.cbi-value-field var { + color: #483d8b; + color: var(--dark_webkit-any-link); + text-shadow: 1px 1px 2px #000; +} + +#diag-rc-output>pre { + color: #ccc; + background-color: #1e1e1e; +} + +.node-services-vssr .block { + background-color: #1e1e1e !important; + box-shadow: 0 0 .5rem 0 rgba(0,0,0,0.35) !important; +} + +.node-services-vssr .block h4 { + color: #ccc !important; +} + +.node-services-vssr .status-bar { + color: #ccc; + background: #333333f0; + box-shadow: #00000094 10px 10px 30px 5px; +} + +.node-services-vssr .cbi-section-table-row { + color: #ccc; + background-color: #3c3c3c !important; + box-shadow: 0 0 5px 0 rgba(0, 0, 0, .35) +} + +.node-services-vssr .cbi-section-table-row.fast { + background: #483d8b !important; + background: var(--dark-primary) !important; + color: #fff; +} + +.node-services-vssr .ssr-button { + color: #ccc; + +} + +.node-services-vssr .incon:nth-child(2) { + border-right: #1e1e1e 1px solid; +} + +.main .main-right #maincontent .container p { + color: #ccc; +} + +#xhr_poll_status>.label.success { + color: #ccc !important; + + background-color: darkolivegreen !important; +} + +/* Define the warning background-color breathe display animation (dark mode) */ +@keyframes warning-background-color-breathe-dark { + 0%{ + color: #fff; + background-color: darkorange; + } + 50%{ + color: #ccc; + background-color: #333333; + } + 100%{ + color: #fff; + background-color: darkorange; + } +} +.warning, +.warning * { + animation: warning-background-color-breathe-dark 1.5s ease-in-out infinite !important; +} + +.notice { + background-color: #483d8b !important; + background-color: var(--dark-primary) !important; +} + +/* Improved the aleart-message background color during device restart (dark mode only) */ +.errorbox, +.alert-message { + background-color: #333333; +} + +.cbi-input-find, +.cbi-input-save, +.cbi-button-add, +.cbi-button-save, +.cbi-button-find, +.cbi-input-reload, +.cbi-button-reload { + background-color: darkseagreen !important; + border-color: darkseagreen !important; +} + +.cbi-button-reset, +.cbi-input-remove { + color: #fff !important; + background-color: darkorange !important; + border-color: darkorange !important; +} + +.cbi-page-actions .cbi-button-apply, +.cbi-section-actions .cbi-button-edit, +.cbi-button-edit.important, +.cbi-button-apply.important, +.cbi-button-reload.important, +.cbi-button-action.important { + border: 1px #483d8b solid !important; + border: 1px var(--dark-primary) solid !important; +} + + + +fieldset[id^="cbi-apply-"] { + background-color: #333333; +} + +#detail-bubble>div { + border: 1px solid #ccc; + border-radius: 2px; + padding: 5px; + background: #252525; +} + +/* Define the error text border breathe display animation (dark mode) */ +@keyframes error-border-breathe-dark { + 0%{ + border-color: darkorange; + } + 50%{ + border-color: transparent; + } + 100%{ + border-color: darkorange; + } +} + +/* Add border for error text box, and border breathe display animation to make it more noticeable (dark mode) */ +.cbi-section-error>ul>li { + color: darkorange; + border: 2px solid darkorange ; + animation: error-border-breathe-dark 1.5s ease-in-out infinite; +} + +.cbi-input-invalid, +.cbi-value-error input { + color: darkorange; + border: 1px dashed darkorange !important; +} + +.node-services-vssr .block h4 span{ + color: #ccc !important; +} + +/* luci-app-passwall */ +#cbi-passwall #add_link_div, +#cbi-passwall #set_node_div { + background: #333333f0 !important; + box-shadow: #00000094 10px 10px 30px 5px !important; +} + +/* luci-app-bypass */ +#cbi-bypass .status-bar { + color: #ccc; + background: #333333f0; + box-shadow: #00000094 10px 10px 30px 5px; +} + +/* luci-app-clash */ +#cbi-clash .cbi-section .pure-u-1-4 .pure-g, +#cbi-clash .cbi-section .siz .pure-g { + background-color: #1e1e1e !important; + box-shadow: 0 0 .5rem 0 rgba(0,0,0,0.35) !important; +} + +/* luci-app-openclash */ +#cbi-openclash #eye-icon, +#cbi-openclash img[title="刷新"] { + filter: invert(100%); +} +#cbi-openclash #cbi-openclash-config fieldset[control-id="ControlID-46"], +#cbi-openclash .CodeMirror-merge-copybuttons-right, +.CodeMirror-scroll { + background-color: #333333 !important; +} +#cbi-openclash .cbi-section .cbi-tabmenu li { + border-right: 1px solid #3c3c3c !important; +} +#cbi-openclash .CodeMirror-merge { + border: 1px solid transparent !important; +} +#cbi-openclash-config-clog .cbi-section { + border: 1px solid #3c3c3c !important; +} +#cbi-openclash .CodeMirror-gutters { + border-right: 1px solid #3c3c3c !important; + background-color: #1e1e1e !important; +} + +/* luci-app-dockerman */ +#cbi-dockerd .img-con img { + filter: invert(0.4); +} + +/* luci-app-istorex (interface config[NetworkPort]) */ +#cbi-nfs-mount .app-container_status-label_bg { + background: #333333; +} +#cbi-nfs-mount td svg { + filter: invert(0.3); +} +#actioner .actioner-dns { + background-color: #333333; +} +#actioner .actioner-dns_header, +#actioner .actioner-container_header { + border-bottom: 1px solid #cbcbcb !important; +} +#actioner .actioner-dns_footer { + border-top: 1px solid #cbcbcb !important; +} + +/* luci-app-istorex (Network Guide) */ +#app #main #page .title, +#app #main #page .desc { + color: #cccccc; + background-color: #333333; +} +#app #main #page .network-message li:not(span):not(a) { + color: #8d8d8d; +} +#app #main #page code { + background-color: #333333; +} + +/* luci-app-istorex (Quick Start) */ +#app #main #page .network-container_flow-container, +#app #main #page .app-container_status-container, +#app #main #page .nas-container .nas-container_card .app-container, +#app #main #page .app-container { + background-color: #333333; +} +#app #main #page .flow-data span, +#app #main #page .app-container_status-label_block span, +#app #main #page .app-container .item-label span:not(#app #main #page .app-container .progress-value span) { + color: #cccccc; +} +#app #main #page .app-container_status-info span, +#app #main #page .app-container_status-info span, +#app #main #page .app-container_title span { + color: #dddddd; +} +.app-container_body .app-container_status-label_bg { + background-color: #282828 !important; +} +#app #main #page .item-label_value .progress { + background-color: rgb(118, 118, 118); +} +#app #main #page .app-container_nas-menu button[class=""] { + background-color: #8b8b8b; +} +#app #main #page .app-container_nas-menu button[class="on"] { + background-color: #555555; +} +#app #main #page .app-container_title .DeviceBlock ul { + background-color: #cccccc; +} +#actioner div.action, +#actioner div.actioner-container { + background-color: #3c3c3c; +} +#actioner div.action .title { + color: #cccccc; +} +#actioner div.action .desc { + color: #cbcbcb; +} +#actioner div.action div.roots span, +#actioner div.action div.move span:not(span.tip), +#actioner div.action div.left span, +#actioner div.action div.input_row span, +#actioner div.label-item label span { + color: #cbcbcb; +} +#actioner div.action span.tooltip-trigger svg path { + fill: #cbcbcb; +} +#actioner div.actioner-dns_body div.label-item_value select { + height: 43px; +} +#actioner div.actioner-container_footer div.close { + color: #ffffff; +} +#app #main div.app-container div.app-container_title span a svg path, +#app #main #page span.disk_infoicon svg g { + fill: #8b8b8b; +} + +@supports (-webkit-backdrop-filter: none) or (backdrop-filter: none) { + .login-page .login-container .login-form { + -webkit-backdrop-filter: blur(var(--blur-radius-dark)); + backdrop-filter: blur(var(--blur-radius-dark)); + background-color: rgba(0, 0, 0, var(--blur-opacity-dark)); + } +} + +@media screen and (max-width: 480px) { + .node-status-iptables>.main div>.cbi-map>form { + background-color: #1e1e1e; + box-shadow: 0 0 0.5rem 0 rgba(0, 0, 0, .35); + } +} \ No newline at end of file diff --git a/luci-theme-argon/luasrc/view/themes/argon/footer.htm b/luci-theme-argon/luasrc/view/themes/argon/footer.htm new file mode 100644 index 00000000..f56186db --- /dev/null +++ b/luci-theme-argon/luasrc/view/themes/argon/footer.htm @@ -0,0 +1,79 @@ +<%# + Argon is a clean HTML5 theme for LuCI. It is based on luci-theme-material Argon Template + + luci-theme-argon + Copyright 2020 Jerrykuku + + Have a bug? Please create an issue here on GitHub! + https://github.com/jerrykuku/luci-theme-argon/issues + + luci-theme-bootstrap: + Copyright 2008 Steven Barth + Copyright 2008-2016 Jo-Philipp Wich + Copyright 2012 David Menting + + MUI: + https://github.com/muicss/mui + + luci-theme-material: + https://github.com/LuttyYang/luci-theme-material/ + + Argon Theme + https://demos.creative-tim.com/argon-dashboard/index.html + + Login background + https://unsplash.com/ + + Font generate by Icomoon + https://icomoon.io/ + + Licensed to the public under the Apache License 2.0 +-%> + +<% + local ver = require "luci.version" + local disp = require "luci.dispatcher" + local request = disp.context.path + local category = request[1] + local tree = disp.node() + local categories = disp.node_childs(tree) +%> +
  • + + + + + + + + diff --git a/luci-theme-argon/luasrc/view/themes/argon/header.htm b/luci-theme-argon/luasrc/view/themes/argon/header.htm new file mode 100644 index 00000000..3786aee8 --- /dev/null +++ b/luci-theme-argon/luasrc/view/themes/argon/header.htm @@ -0,0 +1,331 @@ +<%# + Argon is a clean HTML5 theme for LuCI. It is based on luci-theme-bootstrap and MUI and Argon Template + + luci-theme-argon + Copyright 2020 Jerryk + + Have a bug? Please create an issue here on GitHub! + https://github.com/jerrykuku/luci-theme-argon/issues + + luci-theme-bootstrap: + Copyright 2008 Steven Barth + Copyright 2008-2016 Jo-Philipp Wich + Copyright 2012 David Menting + + MUI: + https://github.com/muicss/mui + + Argon Theme + https://demos.creative-tim.com/argon-dashboard/index.html + + Licensed to the public under the Apache License 2.0 +-%> + +<% + local sys = require "luci.sys" + local util = require "luci.util" + local http = require "luci.http" + local disp = require "luci.dispatcher" + local fs = require "nixio.fs" + local nutil = require "nixio.util" + local uci = require 'luci.model.uci'.cursor() + + local boardinfo = util.ubus("system", "board") + + local request = disp.context.path + local request2 = disp.context.request + + local category = request[1] + local cattree = category and disp.node(category) + + local leaf = request2[#request2] + + local tree = disp.node() + local node = disp.context.dispatched + + local categories = disp.node_childs(tree) + + local c = tree + local i, r + + -- tag all nodes leading to this page + for i, r in ipairs(request) do + if c.nodes and c.nodes[r] then + c = c.nodes[r] + c._menu_selected = true + end + end + + -- send as HTML5 + http.prepare_content("text/html") + + local function nodeurl(prefix, name, query) + local u = url(prefix, name) + if query then + u = u .. http.build_querystring(query) + end + return pcdata(u) + end + + local function render_tabmenu(prefix, node, level) + if not level then + level = 1 + end + + local childs = disp.node_childs(node) + if #childs > 0 then + if level > 2 then + write('
      ') + end + + local selected_node + local selected_name + local i, v + + for i, v in ipairs(childs) do + local nnode = node.nodes[v] + if nnode._menu_selected then + selected_node = nnode + selected_name = v + end + + if level > 2 then + write('
    • %s
    • ' %{ + v, (nnode._menu_selected or (node.leaf and v == leaf)) and 'active' or '', + nodeurl(prefix, v, nnode.query), + striptags(translate(nnode.title)) + }) + end + end + + if level > 2 then + write('
    ') + end + + if selected_node then + render_tabmenu(prefix .. "/" .. selected_name, selected_node, level + 1) + end + end + end + + local function render_submenu(prefix, node) + local childs = disp.node_childs(node) + if #childs > 0 then + write('
      ') + + for i, r in ipairs(childs) do + local nnode = node.nodes[r] + local title = pcdata(striptags(translate(nnode.title))) + + write('
    • %s
    • ' %{ + title, + nodeurl(prefix, r, nnode.query), + title + }) + end + + write('
    ') + end + end + + local function render_topmenu() + local childs = disp.node_childs(cattree) + if #childs > 0 then + write('') + end + end + + local function render_changes() + -- calculate the number of unsaved changes + if tree.nodes[category] and tree.nodes[category].ucidata then + local ucichanges = 0 + for i, j in pairs(require("luci.model.uci").cursor():changes()) do + for k, l in pairs(j) do + for m, n in pairs(l) do + ucichanges = ucichanges + 1; + end + end + end + + if ucichanges > 0 then + write('%s: %d' %{ + url(category, 'uci/changes'), + http.urlencode(http.formvalue('redir') or table.concat(disp.context.request, "/")), + translate('Unsaved Changes'), + ucichanges + }) + end + end + end + + math.randomseed(os.time()) + + -- Custom settings + local mode = 'normal' + local dark_css = fs.readfile('/www/luci-static/argon/css/dark.css') + local bar_color = '#5e72e4' + local primary, dark_primary, blur_radius, blur_radius_dark, blur_opacity + if fs.access('/etc/config/argon') then + primary = uci:get_first('argon', 'global', 'primary') + dark_primary = uci:get_first('argon', 'global', 'dark_primary') + blur_radius = uci:get_first('argon', 'global', 'blur') + blur_radius_dark = uci:get_first('argon', 'global', 'blur_dark') + blur_opacity = uci:get_first('argon', 'global', 'transparency') + blur_opacity_dark = uci:get_first('argon', 'global', 'transparency_dark') + mode = uci:get_first('argon', 'global', 'mode') + bar_color = mode == 'dark' and dark_primary or primary + end + + +-%> + + + + + + + <%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> + - LuCI + + + + + + + + + + + + - LuCI"> + - LuCI"> + + + + + + + + + + + + + + + <% if node and node.css then %> + + <% end -%> + <% if css then %> + + <% end -%> + + + + + + + + +
    +
    + + <% render_topmenu() %> +
    +
    +
    +
    +
    + + <%=boardinfo.hostname or "?"%> +
    + <% render_changes() %> + +
    +
    +
    +
    +
    +
    +
    + <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%> +
    +

    <%:No password set!%>

    +

    <%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%> +

    + +
    + <%- end -%> + + + + <% if category then render_tabmenu(category, cattree) end %> + + + + + + diff --git a/luci-theme-argon/luasrc/view/themes/argon/header_login.htm b/luci-theme-argon/luasrc/view/themes/argon/header_login.htm new file mode 100644 index 00000000..43db26a4 --- /dev/null +++ b/luci-theme-argon/luasrc/view/themes/argon/header_login.htm @@ -0,0 +1,136 @@ +<%# + Argon is a clean HTML5 theme for LuCI. It is based on luci-theme-bootstrap and MUI and Argon Template + + luci-theme-argon + Copyright 2020 Jerrykuku + + Have a bug? Please create an issue here on GitHub! + https://github.com/jerrykuku/luci-theme-argon/issues + + luci-theme-bootstrap: + Copyright 2008 Steven Barth + Copyright 2008-2016 Jo-Philipp Wich + Copyright 2012 David Menting + + MUI: + https://github.com/muicss/mui + + Argon Theme + https://demos.creative-tim.com/argon-dashboard/index.html + + Licensed to the public under the Apache License 2.0 +-%> + +<% + local sys = require "luci.sys" + local util = require "luci.util" + local http = require "luci.http" + local disp = require "luci.dispatcher" + + local fs = require "nixio.fs" + local nutil = require "nixio.util" + local uci = require 'luci.model.uci'.cursor() + local boardinfo = util.ubus("system", "board") + + local request = disp.context.path + local request2 = disp.context.request + + local category = request[1] + local cattree = category and disp.node(category) + + local leaf = request2[#request2] + + local tree = disp.node() + local node = disp.context.dispatched + + local categories = disp.node_childs(tree) + + local c = tree + local i, r + + math.randomseed(tonumber(tostring(os.time()):reverse():sub(1, 9))) + + -- Custom settings + local mode = 'normal' + local dark_css = fs.readfile('/www/luci-static/argon/css/dark.css') + local bar_color = '#5e72e4' + local primary, dark_primary, blur_radius, blur_radius_dark, blur_opacity + if fs.access('/etc/config/argon') then + primary = uci:get_first('argon', 'global', 'primary') + dark_primary = uci:get_first('argon', 'global', 'dark_primary') + blur_radius = uci:get_first('argon', 'global', 'blur') + blur_radius_dark = uci:get_first('argon', 'global', 'blur_dark') + blur_opacity = uci:get_first('argon', 'global', 'transparency') + blur_opacity_dark = uci:get_first('argon', 'global', 'transparency_dark') + mode = uci:get_first('argon', 'global', 'mode') + bar_color = mode == 'dark' and dark_primary or primary + end +-%> + + + + + + + <%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI + + + + + + + + + + + + - LuCI"> + - LuCI"> + + + + + + + + + + + + + + + <% if node and node.css then %> + + <% end -%> + <% if css then %> + + <% end -%> + + + + + + + + \ No newline at end of file diff --git a/luci-theme-argon/luasrc/view/themes/argon/out_header_login.htm b/luci-theme-argon/luasrc/view/themes/argon/out_header_login.htm new file mode 100644 index 00000000..062d17fa --- /dev/null +++ b/luci-theme-argon/luasrc/view/themes/argon/out_header_login.htm @@ -0,0 +1,12 @@ +<%# + Copyright 2008 Steven Barth + Copyright 2008-2019 Jo-Philipp Wich + Licensed to the public under the Apache License 2.0. +-%> + +<% + if not luci.dispatcher.context.template_header_sent then + include("themes/" .. theme .. "/header_login") + luci.dispatcher.context.template_header_sent = true + end +%> diff --git a/luci-theme-argon/luasrc/view/themes/argon/sysauth.htm b/luci-theme-argon/luasrc/view/themes/argon/sysauth.htm new file mode 100644 index 00000000..1cd8ef12 --- /dev/null +++ b/luci-theme-argon/luasrc/view/themes/argon/sysauth.htm @@ -0,0 +1,186 @@ +<%# + Argon is a clean HTML5 theme for LuCI. It is based on luci-theme-bootstrap and MUI and Argon Template + + luci-theme-argon + Copyright 2021 Jerryk + + Have a bug? Please create an issue here on GitHub! + https://github.com/jerrykuku/luci-theme-argon/issues + + luci-theme-bootstrap: + Copyright 2008 Steven Barth + Copyright 2008-2016 Jo-Philipp Wich + Copyright 2012 David Menting + + MUI: + https://github.com/muicss/mui + + Argon Theme + https://demos.creative-tim.com/argon-dashboard/index.html + + Licensed to the public under the Apache License 2.0 +-%> + +<%+header_login%> +<% + local util = require "luci.util" + local fs = require "nixio.fs" + local nutil = require "nixio.util" + local json = require "luci.jsonc" + local sys = require "luci.sys" + local uci = require 'luci.model.uci'.cursor() + + -- Fetch Local Background Media + + local function glob(...) + local iter, code, msg = fs.glob(...) + if iter then + return nutil.consume(iter) + else + return nil, code, msg + end + end + + + local imageTypes = " jpg png gif webp " + local videoTypes = " mp4 webm " + local allTypes = imageTypes .. videoTypes + local function fetchMedia(path, themeDir) + local backgroundTable = {} + local backgroundCount = 0 + for i, f in ipairs(glob(path)) do + attr = fs.stat(f) + if attr then + local ext = fs.basename(f):match(".+%.(%w+)$") + if ext ~= nil then + ext = ext:lower() + end + if ext ~= nil and string.match(allTypes, " "..ext.." ") ~= nil then + local bg = {} + bg.type = ext + bg.url = themeDir .. fs.basename(f) + table.insert(backgroundTable, bg) + backgroundCount = backgroundCount + 1 + end + end + end + return backgroundTable, backgroundCount + end + local function selectBackground(themeDir) + local bgUrl = media .. "/img/bg1.jpg" + local backgroundType = "Image" + local mimeType = "" + + if fs.access("/etc/config/argon") then + local online_wallpaper = uci:get_first('argon', 'global', 'online_wallpaper') or (uci:get_first('argon', 'global', 'bing_background') == '1' and 'bing') + if (online_wallpaper and online_wallpaper ~= "none") then + local picurl = sys.exec("/usr/libexec/argon/online_wallpaper") + if (picurl and picurl ~= '') then + return picurl, "Image", "" + end + end + end + + local backgroundTable, backgroundCount = fetchMedia("/www" .. themeDir .. "*", themeDir) + if ( backgroundCount > 0 ) then + local currentBg = backgroundTable[math.random(1, backgroundCount)] + bgUrl = currentBg.url + if (string.match(videoTypes, " "..currentBg.type.." ") ~= nil) then + backgroundType = "Video" + mimeType = "video/" .. currentBg.type + end + end + + return bgUrl, backgroundType, mimeType + end + + local boardinfo = util.ubus("system", "board") + local themeDir = media .. "/background/" + local bgUrl, backgroundType, mimeType = selectBackground(themeDir) +%> + +