Full Code of 281677160/openwrt-package for AI

Lede 167db4d3b8b8 cached
3035 files
42.1 MB
11.2M tokens
29484 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (45,168K chars total). Download the full file to get everything.
Repository: 281677160/openwrt-package
Branch: Lede
Commit: 167db4d3b8b8
Files: 3035
Total size: 42.1 MB

Directory structure:
gitextract_p4lu5drf/

├── LICENSE
├── README.md
├── luci-app-adguardhome/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── AdGuardHome.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── AdGuardHome/
│   │   │           ├── base.lua
│   │   │           ├── log.lua
│   │   │           └── manual.lua
│   │   └── view/
│   │       └── AdGuardHome/
│   │           ├── AdGuardHome_check.htm
│   │           ├── AdGuardHome_chpass.htm
│   │           ├── AdGuardHome_status.htm
│   │           ├── log.htm
│   │           └── yamleditor.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── AdGuardHome.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   ├── AdGuardHome
│       │   │   └── AdGuardHome.yaml
│       │   ├── init.d/
│       │   │   └── AdGuardHome
│       │   └── uci-defaults/
│       │       └── 40_luci-AdGuardHome
│       ├── usr/
│       │   └── share/
│       │       ├── AdGuardHome/
│       │       │   ├── AdGuardHome_template.yaml
│       │       │   ├── addhost.sh
│       │       │   ├── firewall.start
│       │       │   ├── getsyslog.sh
│       │       │   ├── gfw2adg.sh
│       │       │   ├── links.txt
│       │       │   ├── tailto.sh
│       │       │   ├── update_core.sh
│       │       │   ├── waitnet.sh
│       │       │   └── watchconfig.sh
│       │       └── rpcd/
│       │           └── acl.d/
│       │               └── luci-app-adguardhome.json
│       └── www/
│           └── luci-static/
│               └── resources/
│                   └── codemirror/
│                       ├── addon/
│                       │   └── fold/
│                       │       ├── foldcode.js
│                       │       ├── foldgutter.css
│                       │       ├── foldgutter.js
│                       │       └── indent-fold.js
│                       ├── lib/
│                       │   ├── codemirror.css
│                       │   └── codemirror.js
│                       ├── mode/
│                       │   └── yaml/
│                       │       └── yaml.js
│                       └── theme/
│                           └── dracula.css
├── luci-app-amlogic/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── amlogic.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── amlogic/
│   │   │           ├── amlogic_armcpu.lua
│   │   │           ├── amlogic_backup.lua
│   │   │           ├── amlogic_backuplist.lua
│   │   │           ├── amlogic_check.lua
│   │   │           ├── amlogic_config.lua
│   │   │           ├── amlogic_info.lua
│   │   │           ├── amlogic_install.lua
│   │   │           ├── amlogic_log.lua
│   │   │           ├── amlogic_poweroff.lua
│   │   │           └── amlogic_upload.lua
│   │   └── view/
│   │       └── amlogic/
│   │           ├── other_button.htm
│   │           ├── other_check.htm
│   │           ├── other_dvalue.htm
│   │           ├── other_info.htm
│   │           ├── other_install.htm
│   │           ├── other_kvm.htm
│   │           ├── other_log.htm
│   │           ├── other_poweroff.htm
│   │           ├── other_rescue.htm
│   │           ├── other_snapshot.htm
│   │           ├── other_upfiles.htm
│   │           └── other_upload.htm
│   ├── po/
│   │   ├── ru/
│   │   │   └── amlogic.po
│   │   └── zh_Hans/
│   │       └── amlogic.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── amlogic
│       │   ├── init.d/
│       │   │   └── amlogic
│       │   └── uci-defaults/
│       │       └── luci-amlogic
│       └── usr/
│           ├── sbin/
│           │   ├── fixcpufreq.pl
│           │   ├── openwrt-backup
│           │   ├── openwrt-ddbr
│           │   ├── openwrt-install-amlogic
│           │   ├── openwrt-kernel
│           │   ├── openwrt-update-allwinner
│           │   ├── openwrt-update-amlogic
│           │   ├── openwrt-update-kvm
│           │   └── openwrt-update-rockchip
│           └── share/
│               ├── amlogic/
│               │   ├── amlogic_check_firmware.sh
│               │   ├── amlogic_check_kernel.sh
│               │   └── amlogic_check_plugin.sh
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-amlogic.json
├── luci-app-autoipsetadder/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── autoipsetadder.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── autoipsetadder.lua
│   │   └── view/
│   │       └── autoipsetadder/
│   │           ├── check.htm
│   │           └── status.htm
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── autoipsetadder
│       │   ├── init.d/
│       │   │   └── autoipsetadder
│       │   └── uci-defaults/
│       │       └── 40_luci-autoipsetadder
│       └── usr/
│           └── bin/
│               └── autoipsetadder/
│                   ├── autoaddlist.sh
│                   ├── debugip.sh
│                   ├── tailto.sh
│                   └── testip.sh
├── luci-app-beardropper/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── beardropper.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── beardropper/
│   │   │           ├── log.lua
│   │   │           └── setting.lua
│   │   └── view/
│   │       └── beardropper/
│   │           └── beardropper_status.htm
│   ├── po/
│   │   ├── zh_Hans/
│   │   │   └── beardropper.po
│   │   └── zh_Hant/
│   │       └── beardropper.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── beardropper
│       │   ├── init.d/
│       │   │   └── beardropper
│       │   └── uci-defaults/
│       │       └── luci-beardropper
│       └── usr/
│           ├── sbin/
│           │   └── beardropper
│           └── share/
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-beardropper.json
├── luci-app-cloudflarespeedtest/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── cloudflarespeedtest.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── cloudflarespeedtest/
│   │   │           ├── cloudflarespeedtest.lua
│   │   │           └── logread.lua
│   │   └── view/
│   │       └── cloudflarespeedtest/
│   │           ├── actions.htm
│   │           └── logread.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── cloudflarespeedtest.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── cloudflarespeedtest
│       │   └── init.d/
│       │       └── cloudflarespeedtest
│       └── usr/
│           ├── bin/
│           │   └── cloudflarespeedtest/
│           │       ├── aliddns.sh
│           │       └── cloudflarespeedtest.sh
│           └── share/
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-cloudflarespeedtest.json
├── luci-app-control-timewol/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── timewol.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── timewol.lua
│   │   └── view/
│   │       └── timewol/
│   │           ├── index.htm
│   │           └── timewol.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── timewol.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── luci-app-control-timewol
│       │   ├── init.d/
│       │   │   └── luci-app-control-timewol
│       │   └── uci-defaults/
│       │       └── luci-app-control-timewol
│       └── usr/
│           └── share/
│               ├── rpcd/
│               │   └── acl.d/
│               │       └── luci-app-control-timewol.json
│               └── ucitrack/
│                   └── luci-app-control-timewol.json
├── luci-app-control-webrestriction/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── webrestriction.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── webrestriction.lua
│   │   └── view/
│   │       └── webrestriction/
│   │           ├── index.htm
│   │           └── webrestriction.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── webrestriction.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── luci-app-control-webrestriction
│       │   ├── init.d/
│       │   │   └── luci-app-control-webrestriction
│       │   └── uci-defaults/
│       │       └── luci-app-control-webrestriction
│       └── usr/
│           └── share/
│               ├── rpcd/
│               │   └── acl.d/
│               │       └── luci-app-control-webrestriction.json
│               └── ucitrack/
│                   └── luci-app-control-webrestriction.json
├── luci-app-control-weburl/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── weburl.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── weburl.lua
│   │   └── view/
│   │       └── weburl/
│   │           ├── index.htm
│   │           └── weburl.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── weburl.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── luci-app-control-weburl
│       │   ├── init.d/
│       │   │   └── luci-app-control-weburl
│       │   └── uci-defaults/
│       │       └── luci-app-control-weburl
│       └── usr/
│           └── share/
│               ├── rpcd/
│               │   └── acl.d/
│               │       └── luci-app-control-weburl.json
│               └── ucitrack/
│                   └── luci-app-control-weburl.json
├── luci-app-cpulimit/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── cpulimit.lua
│   │   └── model/
│   │       └── cbi/
│   │           └── cpulimit.lua
│   ├── po/
│   │   └── zh_Hans/
│   │       └── cpulimit.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── cpulimit
│       │   ├── init.d/
│       │   │   └── cpulimit
│       │   └── uci-defaults/
│       │       └── luci-cpulimit
│       └── usr/
│           ├── bin/
│           │   └── cpulimit.sh
│           └── share/
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-cpulimit.json
├── luci-app-ddns-go/
│   ├── ddns-go/
│   │   ├── Makefile
│   │   └── files/
│   │       ├── ddns-go.conf
│   │       └── ddns-go.init
│   └── luci-app-ddns-go/
│       ├── Makefile
│       ├── htdocs/
│       │   └── luci-static/
│       │       └── resources/
│       │           └── view/
│       │               └── ddns-go/
│       │                   ├── config.js
│       │                   ├── ddns-go.js
│       │                   └── log.js
│       ├── po/
│       │   ├── templates/
│       │   │   └── ddns-go.pot
│       │   └── zh_Hans/
│       │       └── ddns-go.po
│       └── root/
│           ├── etc/
│           │   └── uci-defaults/
│           │       └── 99-luci-ddns-go
│           └── usr/
│               ├── libexec/
│               │   └── ddns-go-call
│               └── share/
│                   ├── luci/
│                   │   └── menu.d/
│                   │       └── luci-app-ddns-go.json
│                   └── rpcd/
│                       ├── acl.d/
│                       │   └── luci-app-ddns-go.json
│                       └── ucode/
│                           └── luci.ddns-go
├── luci-app-ddnsto/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── ddnsto.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── ddnsto.lua
│   │   └── view/
│   │       └── ddnsto/
│   │           └── main.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── ddnsto.po
│   └── root/
│       ├── etc/
│       │   └── uci-defaults/
│       │       └── 50_luci-ddnsto
│       └── www/
│           └── luci-static/
│               └── ddnsto/
│                   └── index.js
├── luci-app-eqosplus/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── eqosplus.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── eqosplus.lua
│   │   └── view/
│   │       └── eqosplus/
│   │           ├── eqosplus.htm
│   │           └── index.htm
│   ├── po/
│   │   ├── templates/
│   │   │   └── eqosplus.pot
│   │   └── zh_Hans/
│   │       └── eqosplus.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── eqosplus
│       │   ├── hotplug.d/
│       │   │   └── iface/
│       │   │       └── 10-eqosplus
│       │   ├── init.d/
│       │   │   └── eqosplus
│       │   └── uci-defaults/
│       │       └── luci-eqosplus
│       └── usr/
│           ├── bin/
│           │   ├── eqosplus
│           │   └── eqosplusctrl
│           └── share/
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-eqosplus.json
├── luci-app-fastnet/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── fastnet.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── fastnet.lua
│   │   └── view/
│   │       └── fastnet/
│   │           └── status.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── fastnet.po
│   └── root/
│       └── etc/
│           └── uci-defaults/
│               └── 50_luci-fastnet
├── luci-app-fileassistant/
│   ├── Makefile
│   ├── htdocs/
│   │   └── luci-static/
│   │       └── resources/
│   │           └── fileassistant/
│   │               ├── fb.css
│   │               └── fb.js
│   └── luasrc/
│       ├── controller/
│       │   └── fileassistant.lua
│       └── view/
│           └── fileassistant.htm
├── luci-app-filebrowser/
│   ├── Makefile
│   ├── htdocs/
│   │   └── luci-static/
│   │       └── resources/
│   │           └── view/
│   │               └── filebrowser.js
│   ├── po/
│   │   ├── templates/
│   │   │   └── filebrowser.pot
│   │   └── zh_Hans/
│   │       └── filebrowser.po
│   └── root/
│       └── usr/
│           └── share/
│               ├── luci/
│               │   └── menu.d/
│               │       └── luci-app-filebrowser.json
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-filebrowser.json
├── luci-app-floatip/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── floatip.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── floatip.lua
│   │   └── view/
│   │       └── floatip_status.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── floatip.po
│   └── root/
│       └── etc/
│           └── uci-defaults/
│               └── 50_luci-floatip
├── luci-app-gost/
│   ├── Makefile
│   ├── htdocs/
│   │   └── luci-static/
│   │       └── resources/
│   │           └── view/
│   │               └── gost.js
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── gost.lua
│   │   └── model/
│   │       └── cbi/
│   │           └── gost.lua
│   ├── po/
│   │   ├── templates/
│   │   │   └── gost.pot
│   │   └── zh_Hans/
│   │       └── gost.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── gost
│       │   └── init.d/
│       │       └── gost
│       └── usr/
│           └── share/
│               ├── luci/
│               │   └── menu.d/
│               │       └── luci-app-gost.json
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-gost.json
├── luci-app-homeproxy/
│   ├── Makefile
│   ├── README
│   ├── htdocs/
│   │   └── luci-static/
│   │       └── resources/
│   │           ├── homeproxy.js
│   │           └── view/
│   │               └── homeproxy/
│   │                   ├── client.js
│   │                   ├── node.js
│   │                   ├── server.js
│   │                   └── status.js
│   ├── po/
│   │   ├── templates/
│   │   │   └── homeproxy.pot
│   │   └── zh_Hans/
│   │       └── homeproxy.po
│   └── root/
│       ├── etc/
│       │   ├── capabilities/
│       │   │   └── homeproxy.json
│       │   ├── config/
│       │   │   └── homeproxy
│       │   ├── homeproxy/
│       │   │   ├── resources/
│       │   │   │   ├── china_ip4.txt
│       │   │   │   ├── china_ip4.ver
│       │   │   │   ├── china_ip6.txt
│       │   │   │   ├── china_ip6.ver
│       │   │   │   ├── china_list.txt
│       │   │   │   ├── china_list.ver
│       │   │   │   ├── gfw_list.txt
│       │   │   │   └── gfw_list.ver
│       │   │   └── scripts/
│       │   │       ├── clean_log.sh
│       │   │       ├── firewall_post.ut
│       │   │       ├── firewall_pre.uc
│       │   │       ├── generate_client.uc
│       │   │       ├── generate_server.uc
│       │   │       ├── homeproxy.uc
│       │   │       ├── migrate_config.uc
│       │   │       ├── update_crond.sh
│       │   │       ├── update_resources.sh
│       │   │       └── update_subscriptions.uc
│       │   ├── init.d/
│       │   │   └── homeproxy
│       │   └── uci-defaults/
│       │       ├── luci-homeproxy
│       │       └── luci-homeproxy-migration
│       └── usr/
│           └── share/
│               ├── luci/
│               │   └── menu.d/
│               │       └── luci-app-homeproxy.json
│               └── rpcd/
│                   ├── acl.d/
│                   │   └── luci-app-homeproxy.json
│                   └── ucode/
│                       └── luci.homeproxy
├── luci-app-ikoolproxy/
│   ├── Makefile
│   ├── change.log
│   ├── development.doc
│   ├── koolproxy/
│   │   ├── Makefile
│   │   └── files/
│   │       ├── aarch64
│   │       ├── arm
│   │       ├── i386
│   │       ├── mips
│   │       ├── mipsel
│   │       └── x86_64
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── koolproxy.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── koolproxy/
│   │   │           ├── add_rule.lua
│   │   │           ├── basic.lua
│   │   │           ├── black_list.lua
│   │   │           ├── cert.lua
│   │   │           ├── control.lua
│   │   │           ├── custom_rule.lua
│   │   │           ├── ip_black_list.lua
│   │   │           ├── ip_white_list.lua
│   │   │           ├── rss_rule.lua
│   │   │           ├── tips.lua
│   │   │           ├── update_log.lua
│   │   │           └── white_list.lua
│   │   └── view/
│   │       └── koolproxy/
│   │           ├── cadvalue.htm
│   │           ├── caupload.htm
│   │           ├── koolproxy_status.htm
│   │           └── tips.htm
│   └── root/
│       ├── etc/
│       │   ├── adblocklist/
│       │   │   ├── adblock
│       │   │   ├── adblockip
│       │   │   ├── adbypass
│       │   │   └── adbypassip
│       │   ├── config/
│       │   │   └── koolproxy
│       │   ├── init.d/
│       │   │   └── koolproxy
│       │   └── uci-defaults/
│       │       └── luci-koolproxy
│       ├── lib/
│       │   └── upgrade/
│       │       └── keep.d/
│       │           └── koolproxy
│       └── usr/
│           ├── sbin/
│           │   └── adblockplus
│           └── share/
│               ├── koolproxy/
│               │   ├── adblock.conf
│               │   ├── camanagement
│               │   ├── data/
│               │   │   ├── gen_ca.sh
│               │   │   ├── openssl.cnf
│               │   │   ├── rules/
│               │   │   │   └── user.txt
│               │   │   ├── source.list
│               │   │   └── user.txt
│               │   ├── dnsmasq.adblock
│               │   ├── koolproxy_ipset.conf
│               │   └── kpupdate
│               ├── rpcd/
│               │   └── acl.d/
│               │       └── luci-app-ikoolproxy.json
│               └── ucitrack/
│                   └── luci-app-ikoolproxy.json
├── luci-app-iperf3-server/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── iperf3-server.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── iperf3-server.lua
│   │   └── view/
│   │       └── iperf3-server/
│   │           └── iperf3-server_status.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── iperf3-server.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── iperf3-server
│       │   ├── init.d/
│       │   │   └── iperf3-server
│       │   └── uci-defaults/
│       │       └── iperf3-server
│       └── usr/
│           └── share/
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-iperf3-server.json
├── luci-app-istoreenhance/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── istoreenhance.lua
│   │   ├── model/
│   │   │   ├── cbi/
│   │   │   │   └── istoreenhance.lua
│   │   │   └── istoreenhance.lua
│   │   └── view/
│   │       └── istoreenhance_status.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── istoreenhance.po
│   └── root/
│       └── etc/
│           └── uci-defaults/
│               └── 50_luci-istoreenhance
├── luci-app-istorex/
│   ├── Makefile
│   ├── htdocs/
│   │   └── luci-static/
│   │       └── istorex/
│   │           ├── chunk.167c223d.js
│   │           ├── chunk.18e0c91d.js
│   │           ├── chunk.211ffb47.js
│   │           ├── chunk.2147605f.js
│   │           ├── chunk.25dae49f.js
│   │           ├── chunk.403244cc.js
│   │           ├── chunk.41b74402.js
│   │           ├── chunk.42bb6629.js
│   │           ├── chunk.4d4bc89c.js
│   │           ├── chunk.4f4af73e.js
│   │           ├── chunk.5e41a3f0.js
│   │           ├── chunk.6d3585bb.js
│   │           ├── chunk.6f7d3090.js
│   │           ├── chunk.7deee291.js
│   │           ├── chunk.83d679c2.js
│   │           ├── chunk.8bf617a1.js
│   │           ├── chunk.8f1ff823.js
│   │           ├── chunk.a1bcc52b.js
│   │           ├── chunk.b7ccb4ed.js
│   │           ├── chunk.d9ea7f57.js
│   │           ├── chunk.de33ea3e.js
│   │           ├── chunk.ead1f974.js
│   │           ├── chunk.f2b02e0d.js
│   │           ├── chunk.fb51d2b2.js
│   │           ├── chunk.fdf02bc2.js
│   │           ├── chunk.ff94f9f2.js
│   │           ├── chunk.ffd7724b.js
│   │           ├── index.js
│   │           └── style.css
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── istorex.lua
│   │   └── view/
│   │       └── istorex/
│   │           ├── index.htm
│   │           ├── main.htm
│   │           └── main_dev.htm
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── istorex
│       │   └── uci-defaults/
│       │       └── 50_luci-istorex
│       └── usr/
│           └── share/
│               └── luci/
│                   └── menu.d/
│                       └── luci-app-istorex.json
├── luci-app-kai/
│   ├── Makefile
│   └── luasrc/
│       ├── controller/
│       │   └── kai.lua
│       ├── model/
│       │   ├── cbi/
│       │   │   └── kai.lua
│       │   └── kai.lua
│       └── view/
│           └── kai/
│               └── kai_status.htm
├── luci-app-linkease/
│   ├── Makefile
│   ├── htdocs/
│   │   └── luci-static/
│   │       └── linkeasefile/
│   │           ├── chunk.22632dc4.js
│   │           ├── chunk.324cab41.js
│   │           ├── chunk.4a114b4a.js
│   │           ├── chunk.4ea0593d.js
│   │           ├── chunk.6424c2fc.js
│   │           ├── chunk.7191676b.js
│   │           ├── chunk.a0a5dece.js
│   │           ├── chunk.a6a47e72.js
│   │           ├── chunk.c69499bb.js
│   │           ├── chunk.d52f0fe8.js
│   │           ├── chunk.dc0a1b58.js
│   │           ├── index.js
│   │           └── style.css
│   ├── luasrc/
│   │   ├── controller/
│   │   │   ├── linkease.lua
│   │   │   └── linkease_backend.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── linkease.lua
│   │   └── view/
│   │       ├── admin_status/
│   │       │   └── index/
│   │       │       └── linkease.htm
│   │       ├── linkease/
│   │       │   └── file.htm
│   │       └── linkease_status.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── linkease.po
│   └── root/
│       └── etc/
│           └── uci-defaults/
│               └── 50_luci-linkease
├── luci-app-lucky/
│   ├── luci-app-lucky/
│   │   ├── Makefile
│   │   ├── htdocs/
│   │   │   └── luci-static/
│   │   │       └── resources/
│   │   │           └── view/
│   │   │               └── lucky/
│   │   │                   ├── config.js
│   │   │                   └── lucky.js
│   │   ├── po/
│   │   │   └── zh_Hans/
│   │   │       └── lucky.po
│   │   └── root/
│   │       ├── etc/
│   │       │   └── uci-defaults/
│   │       │       └── luci-app-lucky
│   │       └── usr/
│   │           └── share/
│   │               ├── luci/
│   │               │   └── menu.d/
│   │               │       └── luci-app-lucky.json
│   │               └── rpcd/
│   │                   ├── acl.d/
│   │                   │   └── luci-app-lucky.json
│   │                   └── ucode/
│   │                       └── luci.lucky
│   └── lucky/
│       ├── Makefile
│       └── files/
│           ├── lucky.config
│           └── lucky.init
├── luci-app-mentohust/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── mentohust.lua
│   │   └── model/
│   │       └── cbi/
│   │           └── mentohust/
│   │               ├── general.lua
│   │               └── log.lua
│   ├── po/
│   │   └── zh_Hans/
│   │       └── mentohust.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── mentohust
│       │   ├── init.d/
│       │   │   └── mentohust
│       │   └── uci-defaults/
│       │       └── luci-mentohust
│       └── usr/
│           └── share/
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-mentohust.json
├── luci-app-msd_lite/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── msd_lite.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── msd_lite.lua
│   │   └── view/
│   │       └── msd_lite/
│   │           └── msd_lite_status.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── msd_lite.po
│   └── root/
│       └── etc/
│           └── uci-defaults/
│               └── 40_luci-msd_lite
├── luci-app-natter/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── natter.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── natter/
│   │   │           ├── base.lua
│   │   │           ├── log.lua
│   │   │           └── ports.lua
│   │   └── view/
│   │       └── natter/
│   │           └── natter_log.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── natter.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── natter
│       │   ├── init.d/
│       │   │   └── natter
│       │   └── uci-defaults/
│       │       └── luci-natter
│       └── usr/
│           └── share/
│               └── luci-app-natter/
│                   ├── log.sh
│                   └── natcheck.sh
├── luci-app-natter2/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── natter2.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── natter2/
│   │   │           ├── base.lua
│   │   │           ├── instances.lua
│   │   │           └── log.lua
│   │   └── view/
│   │       └── natter2/
│   │           └── natter_log.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── natter2.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── natter2
│       │   ├── init.d/
│       │   │   └── natter2
│       │   └── uci-defaults/
│       │       └── luci-natter2
│       └── usr/
│           └── share/
│               └── luci-app-natter2/
│                   ├── log.sh
│                   ├── nat-check.sh
│                   ├── notify-base.sh
│                   └── notify-example.sh
├── luci-app-nginx-manager/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── nginx-manager.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── nginx-manager.lua
│   │   └── view/
│   │       └── nginx-manager/
│   │           └── index.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── nginx-manager.po
│   └── root/
│       ├── etc/
│       │   ├── nginx/
│       │   │   └── conf.d/
│       │   │       └── templates
│       │   └── uci-defaults/
│       │       └── luci-app-nginx-manager
│       └── usr/
│           └── share/
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-nginx-manager.json
├── luci-app-nginx-pingos/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── pingos.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── pingos.lua
│   │   └── view/
│   │       └── pingos/
│   │           └── status.htm
│   ├── modules/
│   │   ├── nginx-client-module/
│   │   │   ├── COPYRIGHT
│   │   │   ├── config
│   │   │   ├── ngx_client.c
│   │   │   ├── ngx_client.h
│   │   │   ├── ngx_http_client.c
│   │   │   ├── ngx_http_client.h
│   │   │   └── t/
│   │   │       ├── config
│   │   │       ├── nginx.conf
│   │   │       ├── ngx_client_stat_module.c
│   │   │       ├── ngx_client_test_module.c
│   │   │       ├── ngx_http_client_test_module.c
│   │   │       └── tcpserver.go
│   │   ├── nginx-multiport-module/
│   │   │   ├── COPYRIGHT
│   │   │   ├── config
│   │   │   ├── ngx_event_multiport_module.c
│   │   │   ├── ngx_http_broadcast_module.c
│   │   │   ├── ngx_http_inner_proxy_module.c
│   │   │   ├── ngx_multiport.h
│   │   │   ├── ngx_multiport_misc.c
│   │   │   ├── ngx_process_slot_module.c
│   │   │   ├── ngx_stream_zone_module.c
│   │   │   ├── ngx_stream_zone_module.h
│   │   │   └── t/
│   │   │       ├── config
│   │   │       ├── nginx.conf
│   │   │       ├── ngx_multiport_test_module.c
│   │   │       ├── ngx_stream_zone_test_module.c
│   │   │       └── ngx_test_macro.h
│   │   ├── nginx-rtmp-module/
│   │   │   ├── AUTHORS
│   │   │   ├── config
│   │   │   ├── dash/
│   │   │   │   ├── ngx_rtmp_dash_module.c
│   │   │   │   ├── ngx_rtmp_mp4.c
│   │   │   │   └── ngx_rtmp_mp4.h
│   │   │   ├── hls/
│   │   │   │   ├── ngx_rtmp_hls_module.c
│   │   │   │   ├── ngx_rtmp_mpegts.c
│   │   │   │   └── ngx_rtmp_mpegts.h
│   │   │   ├── http/
│   │   │   │   ├── ngx_http_flv_live_module.c
│   │   │   │   ├── ngx_http_set_header.c
│   │   │   │   └── ngx_http_set_header.h
│   │   │   ├── mpegts/
│   │   │   │   ├── ngx_hls_http_module.c
│   │   │   │   ├── ngx_hls_live_module.c
│   │   │   │   ├── ngx_hls_live_module.h
│   │   │   │   ├── ngx_mpegts_gop_module.c
│   │   │   │   ├── ngx_mpegts_gop_module.h
│   │   │   │   ├── ngx_mpegts_http_module.c
│   │   │   │   ├── ngx_mpegts_live_module.c
│   │   │   │   └── ngx_mpegts_live_module.h
│   │   │   ├── ngx_live.c
│   │   │   ├── ngx_live.h
│   │   │   ├── ngx_live_record.c
│   │   │   ├── ngx_live_record.h
│   │   │   ├── ngx_live_relay.c
│   │   │   ├── ngx_live_relay.h
│   │   │   ├── ngx_live_relay_httpflv.c
│   │   │   ├── ngx_live_relay_inner.c
│   │   │   ├── ngx_live_relay_rtmp.c
│   │   │   ├── ngx_live_relay_simple.c
│   │   │   ├── ngx_live_relay_static.c
│   │   │   ├── ngx_netcall.c
│   │   │   ├── ngx_netcall.h
│   │   │   ├── ngx_rtmp.c
│   │   │   ├── ngx_rtmp.h
│   │   │   ├── ngx_rtmp_access_module.c
│   │   │   ├── ngx_rtmp_amf.c
│   │   │   ├── ngx_rtmp_amf.h
│   │   │   ├── ngx_rtmp_bandwidth.c
│   │   │   ├── ngx_rtmp_bandwidth.h
│   │   │   ├── ngx_rtmp_bitop.c
│   │   │   ├── ngx_rtmp_bitop.h
│   │   │   ├── ngx_rtmp_cmd_module.c
│   │   │   ├── ngx_rtmp_cmd_module.h
│   │   │   ├── ngx_rtmp_codec_module.c
│   │   │   ├── ngx_rtmp_codec_module.h
│   │   │   ├── ngx_rtmp_control_module.c
│   │   │   ├── ngx_rtmp_core_module.c
│   │   │   ├── ngx_rtmp_dynamic.c
│   │   │   ├── ngx_rtmp_dynamic.h
│   │   │   ├── ngx_rtmp_eval.c
│   │   │   ├── ngx_rtmp_eval.h
│   │   │   ├── ngx_rtmp_exec_module.c
│   │   │   ├── ngx_rtmp_gop_module.c
│   │   │   ├── ngx_rtmp_handler.c
│   │   │   ├── ngx_rtmp_handshake.c
│   │   │   ├── ngx_rtmp_init.c
│   │   │   ├── ngx_rtmp_limit_module.c
│   │   │   ├── ngx_rtmp_live_module.c
│   │   │   ├── ngx_rtmp_live_module.h
│   │   │   ├── ngx_rtmp_log_module.c
│   │   │   ├── ngx_rtmp_monitor_module.c
│   │   │   ├── ngx_rtmp_monitor_module.h
│   │   │   ├── ngx_rtmp_notify_module.c
│   │   │   ├── ngx_rtmp_notify_module.h
│   │   │   ├── ngx_rtmp_proxy_protocol.c
│   │   │   ├── ngx_rtmp_proxy_protocol.h
│   │   │   ├── ngx_rtmp_receive.c
│   │   │   ├── ngx_rtmp_record_module.c
│   │   │   ├── ngx_rtmp_record_module.h
│   │   │   ├── ngx_rtmp_send.c
│   │   │   ├── ngx_rtmp_shared_module.c
│   │   │   ├── ngx_rtmp_stat_module.c
│   │   │   ├── ngx_rtmp_streams.h
│   │   │   ├── ngx_rtmp_sys_stat_module.c
│   │   │   ├── ngx_rtmp_variables.c
│   │   │   ├── ngx_rtmp_variables.h
│   │   │   └── ngx_rtmp_version.h
│   │   ├── nginx-toolkit-module/
│   │   │   ├── COPYRIGHT
│   │   │   ├── config
│   │   │   ├── ngx_dynamic_conf.c
│   │   │   ├── ngx_dynamic_conf.h
│   │   │   ├── ngx_dynamic_resolver.c
│   │   │   ├── ngx_dynamic_resolver.h
│   │   │   ├── ngx_event_resolver.c
│   │   │   ├── ngx_event_resolver.h
│   │   │   ├── ngx_event_timer_module.c
│   │   │   ├── ngx_event_timer_module.h
│   │   │   ├── ngx_http_dynamic.c
│   │   │   ├── ngx_http_dynamic.h
│   │   │   ├── ngx_http_trace_module.c
│   │   │   ├── ngx_map.c
│   │   │   ├── ngx_map.h
│   │   │   ├── ngx_poold.c
│   │   │   ├── ngx_poold.h
│   │   │   ├── ngx_rbuf.c
│   │   │   ├── ngx_rbuf.h
│   │   │   ├── ngx_timerd.c
│   │   │   ├── ngx_timerd.h
│   │   │   ├── ngx_toolkit_misc.c
│   │   │   ├── ngx_toolkit_misc.h
│   │   │   └── t/
│   │   │       ├── config
│   │   │       ├── dns_install.sh
│   │   │       ├── md5testfile
│   │   │       ├── named.conf
│   │   │       ├── nginx.conf
│   │   │       ├── nginx_dynamic.conf
│   │   │       ├── ngx_dynamic_conf_test_module.c
│   │   │       ├── ngx_dynamic_resolver_test_module.c
│   │   │       ├── ngx_event_resolver_test_module.c
│   │   │       ├── ngx_event_timer_test_module.c
│   │   │       ├── ngx_http_dynamic_test_module.c
│   │   │       ├── ngx_map_test_module.c
│   │   │       ├── ngx_poold_test_module.c
│   │   │       ├── ngx_rbuf_test_module.c
│   │   │       ├── ngx_test_macro.h
│   │   │       ├── ngx_timerd_test_module.c
│   │   │       ├── ngx_toolkit_misc_test_module.c
│   │   │       ├── test.com.zone
│   │   │       └── test1.com.zone
│   │   └── nginx-ts-module/
│   │       ├── README.rst
│   │       ├── config
│   │       └── src/
│   │           ├── ngx_http_ts_module.c
│   │           ├── ngx_stream_ts_module.c
│   │           ├── ngx_ts_aac.c
│   │           ├── ngx_ts_aac.h
│   │           ├── ngx_ts_avc.c
│   │           ├── ngx_ts_avc.h
│   │           ├── ngx_ts_dash.c
│   │           ├── ngx_ts_dash.h
│   │           ├── ngx_ts_dash_mp4.c
│   │           ├── ngx_ts_hls.c
│   │           ├── ngx_ts_hls.h
│   │           ├── ngx_ts_stream.c
│   │           └── ngx_ts_stream.h
│   ├── patches/
│   │   ├── 101-feature_test_fix.patch
│   │   ├── 102-sizeof_test_fix.patch
│   │   ├── 103-sys_nerr.patch
│   │   ├── 104-endianness_fix.patch
│   │   ├── 200-config.patch
│   │   └── 201-ignore-invalid-options.patch
│   ├── po/
│   │   └── zh_Hans/
│   │       └── pingos.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── pingos
│       │   ├── init.d/
│       │   │   └── pingos
│       │   ├── pingos.template
│       │   └── uci-defaults/
│       │       └── luci-app-nginx-pingos
│       ├── resource/
│       │   ├── conf-template/
│       │   │   └── nginx.conf
│       │   ├── crossdomain.xml
│       │   └── stat.xsl
│       └── usr/
│           └── share/
│               ├── rpcd/
│               │   └── acl.d/
│               │       └── luci-app-nginx-pingos.json
│               └── ucitrack/
│                   └── luci-app-nginx-pingos.json
├── luci-app-nikki/
│   ├── feed.sh
│   ├── install.sh
│   ├── luci-app-nikki/
│   │   ├── Makefile
│   │   ├── htdocs/
│   │   │   └── luci-static/
│   │   │       └── resources/
│   │   │           ├── tools/
│   │   │           │   └── nikki.js
│   │   │           └── view/
│   │   │               └── nikki/
│   │   │                   ├── app.js
│   │   │                   ├── editor.js
│   │   │                   ├── log.js
│   │   │                   ├── mixin.js
│   │   │                   ├── profile.js
│   │   │                   └── proxy.js
│   │   ├── po/
│   │   │   ├── ru/
│   │   │   │   └── nikki.po
│   │   │   ├── templates/
│   │   │   │   └── nikki.pot
│   │   │   ├── zh_Hans/
│   │   │   │   └── nikki.po
│   │   │   └── zh_Hant/
│   │   │       └── nikki.po
│   │   └── root/
│   │       └── usr/
│   │           └── share/
│   │               ├── luci/
│   │               │   └── menu.d/
│   │               │       └── luci-app-nikki.json
│   │               └── rpcd/
│   │                   ├── acl.d/
│   │                   │   └── luci-app-nikki.json
│   │                   └── ucode/
│   │                       └── luci.nikki
│   ├── mihomo-alpha/
│   │   └── Makefile
│   ├── mihomo-meta/
│   │   └── Makefile
│   ├── nikki/
│   │   ├── Makefile
│   │   └── files/
│   │       ├── mixin.yaml
│   │       ├── nftables/
│   │       │   ├── geoip6_cn.nft
│   │       │   └── geoip_cn.nft
│   │       ├── nikki.conf
│   │       ├── nikki.init
│   │       ├── nikki.upgrade
│   │       ├── scripts/
│   │       │   ├── debug.sh
│   │       │   ├── firewall_include.sh
│   │       │   └── include.sh
│   │       ├── uci-defaults/
│   │       │   ├── firewall.sh
│   │       │   ├── init.sh
│   │       │   └── migrate.sh
│   │       └── ucode/
│   │           ├── hijack.ut
│   │           ├── include.uc
│   │           └── mixin.uc
│   └── uninstall.sh
├── luci-app-npc/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── npc.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── npc.lua
│   │   └── view/
│   │       └── npc/
│   │           └── npc_status.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── npc.po
│   └── root/
│       └── etc/
│           ├── config/
│           │   └── npc
│           ├── init.d/
│           │   └── npc
│           └── uci-defaults/
│               └── luci-npc
├── luci-app-oled/
│   ├── linux/
│   │   ├── ssd1306.cfg
│   │   └── ssd1306.service
│   └── luci-app-oled/
│       ├── Makefile
│       ├── luasrc/
│       │   ├── controller/
│       │   │   └── oled.lua
│       │   ├── model/
│       │   │   └── cbi/
│       │   │       └── oled/
│       │   │           └── setting.lua
│       │   └── view/
│       │       └── oled/
│       │           └── status.htm
│       ├── po/
│       │   ├── zh_Hans/
│       │   │   └── oled.po
│       │   └── zh_Hant/
│       │       └── oled.po
│       ├── root/
│       │   ├── etc/
│       │   │   ├── config/
│       │   │   │   └── oled
│       │   │   ├── init.d/
│       │   │   │   └── oled
│       │   │   └── uci-defaults/
│       │   │       └── oled
│       │   └── usr/
│       │       └── share/
│       │           └── rpcd/
│       │               └── acl.d/
│       │                   └── luci-app-oled.json
│       └── src/
│           ├── Example_Code/
│           │   ├── .clang-format
│           │   ├── example_app.c
│           │   ├── example_app.h
│           │   └── main.c
│           ├── I2C_Library/
│           │   ├── .clang-format
│           │   ├── I2C.c
│           │   └── I2C.h
│           ├── Makefile
│           └── SSD1306_OLED_Library/
│               ├── .clang-format
│               ├── SSD1306_OLED.c
│               ├── SSD1306_OLED.h
│               └── gfxfont.h
├── luci-app-onliner/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── onliner.lua
│   │   └── view/
│   │       └── onliner/
│   │           ├── display.htm
│   │           └── onliner.htm
│   └── root/
│       └── usr/
│           └── share/
│               └── onliner/
│                   └── setnlbw.sh
├── luci-app-oscam/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── oscam.lua
│   │   └── model/
│   │       └── cbi/
│   │           └── oscam.lua
│   ├── po/
│   │   └── zh_Hans/
│   │       └── oscam.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── oscam
│       │   └── uci-defaults/
│       │       └── luci-oscam
│       └── usr/
│           └── share/
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-oscam.json
├── luci-app-partexp/
│   ├── Makefile
│   ├── htdocs/
│   │   └── luci-static/
│   │       └── resources/
│   │           └── view/
│   │               ├── partexp/
│   │               │   ├── manual.js
│   │               │   └── partexp.js
│   │               └── partexp.js
│   ├── po/
│   │   ├── templates/
│   │   │   └── partexp.po
│   │   └── zh_Hans/
│   │       └── partexp.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── partexp
│       │   └── uci-defaults/
│       │       └── zzz_luci-app-partexp
│       └── usr/
│           ├── bin/
│           │   └── partexp
│           ├── libexec/
│           │   └── rpcd/
│           │       └── partexp
│           └── share/
│               ├── luci/
│               │   └── menu.d/
│               │       └── luci-app-partexp.json
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-partexp.json
├── luci-app-passwall/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── passwall.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── passwall/
│   │   │           ├── client/
│   │   │           │   ├── acl.lua
│   │   │           │   ├── acl_config.lua
│   │   │           │   ├── app_update.lua
│   │   │           │   ├── global.lua
│   │   │           │   ├── haproxy.lua
│   │   │           │   ├── include/
│   │   │           │   │   └── shunt_options.lua
│   │   │           │   ├── log.lua
│   │   │           │   ├── node_config.lua
│   │   │           │   ├── node_list.lua
│   │   │           │   ├── node_subscribe.lua
│   │   │           │   ├── node_subscribe_config.lua
│   │   │           │   ├── other.lua
│   │   │           │   ├── rule.lua
│   │   │           │   ├── rule_list.lua
│   │   │           │   ├── shunt_rules.lua
│   │   │           │   ├── socks_config.lua
│   │   │           │   └── type/
│   │   │           │       ├── hysteria2.lua
│   │   │           │       ├── naive.lua
│   │   │           │       ├── ray.lua
│   │   │           │       ├── sing-box.lua
│   │   │           │       ├── ss-rust.lua
│   │   │           │       ├── ss.lua
│   │   │           │       └── ssr.lua
│   │   │           └── server/
│   │   │               ├── index.lua
│   │   │               ├── type/
│   │   │               │   ├── hysteria2.lua
│   │   │               │   ├── ray.lua
│   │   │               │   ├── sing-box.lua
│   │   │               │   ├── socks.lua
│   │   │               │   ├── ss-rust.lua
│   │   │               │   ├── ss.lua
│   │   │               │   └── ssr.lua
│   │   │               └── user.lua
│   │   ├── passwall/
│   │   │   ├── api.lua
│   │   │   ├── com.lua
│   │   │   ├── server_app.lua
│   │   │   ├── util_hysteria2.lua
│   │   │   ├── util_naiveproxy.lua
│   │   │   ├── util_shadowsocks.lua
│   │   │   ├── util_sing-box.lua
│   │   │   └── util_xray.lua
│   │   └── view/
│   │       └── passwall/
│   │           ├── acl/
│   │           │   └── view_chinadns_log.htm
│   │           ├── app_update/
│   │           │   └── app_version.htm
│   │           ├── cbi/
│   │           │   ├── hidevalue.htm
│   │           │   ├── nodes_dynamiclist.htm
│   │           │   ├── nodes_dynamiclist_com.htm
│   │           │   ├── nodes_listvalue.htm
│   │           │   ├── nodes_listvalue_com.htm
│   │           │   ├── nodes_multivalue.htm
│   │           │   ├── nodes_multivalue_com.htm
│   │           │   ├── nodes_value.htm
│   │           │   ├── nodes_value_com.htm
│   │           │   └── optimize_cbi_ui.htm
│   │           ├── global/
│   │           │   ├── backup.htm
│   │           │   ├── faq.htm
│   │           │   ├── footer.htm
│   │           │   ├── proxy.htm
│   │           │   └── status.htm
│   │           ├── haproxy/
│   │           │   ├── js.htm
│   │           │   └── status.htm
│   │           ├── include/
│   │           │   └── shunt_options.htm
│   │           ├── log/
│   │           │   └── log.htm
│   │           ├── node_config/
│   │           │   ├── footer.htm
│   │           │   ├── header.htm
│   │           │   └── link_share_man.htm
│   │           ├── node_list/
│   │           │   ├── link_add_node.htm
│   │           │   └── node_list.htm
│   │           ├── node_subscribe/
│   │           │   └── js.htm
│   │           ├── rule/
│   │           │   └── rule_version.htm
│   │           ├── rule_list/
│   │           │   ├── geoview.htm
│   │           │   └── js.htm
│   │           ├── server/
│   │           │   ├── log.htm
│   │           │   └── users_list_status.htm
│   │           └── socks_auto_switch/
│   │               └── btn.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── passwall.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── passwall_server
│       │   ├── hotplug.d/
│       │   │   └── iface/
│       │   │       └── 98-passwall
│       │   ├── init.d/
│       │   │   ├── passwall
│       │   │   └── passwall_server
│       │   └── uci-defaults/
│       │       └── luci-passwall
│       └── usr/
│           └── share/
│               ├── passwall/
│               │   ├── 0_default_config
│               │   ├── app.sh
│               │   ├── clash_subconverter.lua
│               │   ├── haproxy.lua
│               │   ├── haproxy_check.sh
│               │   ├── helper_chinadns_add.lua
│               │   ├── helper_dnsmasq.lua
│               │   ├── helper_smartdns.sh
│               │   ├── helper_smartdns_add.lua
│               │   ├── iptables.sh
│               │   ├── lease2hosts.sh
│               │   ├── monitor.sh
│               │   ├── nftables.sh
│               │   ├── rule_update.lua
│               │   ├── rules/
│               │   │   ├── block_host
│               │   │   ├── block_ip
│               │   │   ├── chnlist
│               │   │   ├── chnroute
│               │   │   ├── chnroute6
│               │   │   ├── direct_host
│               │   │   ├── direct_ip
│               │   │   ├── domains_excluded
│               │   │   ├── gfwlist
│               │   │   ├── lanlist_ipv4
│               │   │   ├── lanlist_ipv6
│               │   │   ├── proxy_host
│               │   │   └── proxy_ip
│               │   ├── socks_auto_switch.sh
│               │   ├── subscribe.lua
│               │   ├── tasks.sh
│               │   ├── test.sh
│               │   └── utils.sh
│               ├── rpcd/
│               │   └── acl.d/
│               │       └── luci-app-passwall.json
│               └── ucitrack/
│                   ├── luci-app-passwall-server.json
│                   └── luci-app-passwall.json
├── luci-app-passwall2/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── passwall2.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── passwall2/
│   │   │           ├── client/
│   │   │           │   ├── acl.lua
│   │   │           │   ├── acl_config.lua
│   │   │           │   ├── app_update.lua
│   │   │           │   ├── geoview.lua
│   │   │           │   ├── global.lua
│   │   │           │   ├── haproxy.lua
│   │   │           │   ├── include/
│   │   │           │   │   └── shunt_options.lua
│   │   │           │   ├── log.lua
│   │   │           │   ├── node_config.lua
│   │   │           │   ├── node_list.lua
│   │   │           │   ├── node_subscribe.lua
│   │   │           │   ├── node_subscribe_config.lua
│   │   │           │   ├── other.lua
│   │   │           │   ├── rule.lua
│   │   │           │   ├── shunt_rules.lua
│   │   │           │   ├── socks_config.lua
│   │   │           │   └── type/
│   │   │           │       ├── hysteria2.lua
│   │   │           │       ├── naive.lua
│   │   │           │       ├── ray.lua
│   │   │           │       ├── sing-box.lua
│   │   │           │       ├── ss-rust.lua
│   │   │           │       ├── ss.lua
│   │   │           │       ├── ssr.lua
│   │   │           │       └── tuic.lua
│   │   │           └── server/
│   │   │               ├── index.lua
│   │   │               ├── type/
│   │   │               │   ├── hysteria2.lua
│   │   │               │   ├── ray.lua
│   │   │               │   ├── sing-box.lua
│   │   │               │   ├── ss-rust.lua
│   │   │               │   ├── ss.lua
│   │   │               │   └── ssr.lua
│   │   │               └── user.lua
│   │   ├── passwall2/
│   │   │   ├── api.lua
│   │   │   ├── com.lua
│   │   │   ├── server_app.lua
│   │   │   ├── util_hysteria2.lua
│   │   │   ├── util_naiveproxy.lua
│   │   │   ├── util_shadowsocks.lua
│   │   │   ├── util_sing-box.lua
│   │   │   ├── util_tuic.lua
│   │   │   └── util_xray.lua
│   │   └── view/
│   │       └── passwall2/
│   │           ├── app_update/
│   │           │   └── app_version.htm
│   │           ├── cbi/
│   │           │   ├── hidevalue.htm
│   │           │   ├── nodes_dynamiclist.htm
│   │           │   ├── nodes_dynamiclist_com.htm
│   │           │   ├── nodes_listvalue.htm
│   │           │   ├── nodes_listvalue_com.htm
│   │           │   ├── nodes_multivalue.htm
│   │           │   ├── nodes_multivalue_com.htm
│   │           │   ├── nodes_value.htm
│   │           │   ├── nodes_value_com.htm
│   │           │   └── optimize_cbi_ui.htm
│   │           ├── global/
│   │           │   ├── backup.htm
│   │           │   ├── faq.htm
│   │           │   ├── footer.htm
│   │           │   └── status.htm
│   │           ├── haproxy/
│   │           │   ├── js.htm
│   │           │   └── status.htm
│   │           ├── include/
│   │           │   └── shunt_options.htm
│   │           ├── log/
│   │           │   └── log.htm
│   │           ├── node_config/
│   │           │   ├── footer.htm
│   │           │   ├── header.htm
│   │           │   └── link_share_man.htm
│   │           ├── node_list/
│   │           │   ├── link_add_node.htm
│   │           │   └── node_list.htm
│   │           ├── node_subscribe/
│   │           │   └── js.htm
│   │           ├── rule/
│   │           │   ├── geoview.htm
│   │           │   └── rule_version.htm
│   │           ├── server/
│   │           │   ├── log.htm
│   │           │   └── users_list_status.htm
│   │           └── socks_auto_switch/
│   │               └── btn.htm
│   ├── po/
│   │   ├── fa/
│   │   │   └── passwall2.po
│   │   ├── ru/
│   │   │   └── passwall2.po
│   │   ├── zh-tw/
│   │   │   └── passwall2.po
│   │   └── zh_Hans/
│   │       └── passwall2.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── passwall2_server
│       │   ├── hotplug.d/
│       │   │   └── iface/
│       │   │       └── 98-passwall2
│       │   ├── init.d/
│       │   │   ├── passwall2
│       │   │   └── passwall2_server
│       │   └── uci-defaults/
│       │       └── luci-passwall2
│       └── usr/
│           └── share/
│               ├── passwall2/
│               │   ├── 0_default_config
│               │   ├── app.sh
│               │   ├── domains_excluded
│               │   ├── haproxy.lua
│               │   ├── haproxy_check.sh
│               │   ├── helper_dnsmasq.lua
│               │   ├── i18n.lua
│               │   ├── iptables.sh
│               │   ├── lease2hosts.sh
│               │   ├── monitor.sh
│               │   ├── nftables.sh
│               │   ├── rule_update.lua
│               │   ├── socks_auto_switch.sh
│               │   ├── subscribe.lua
│               │   ├── tasks.sh
│               │   ├── test.sh
│               │   └── utils.sh
│               ├── rpcd/
│               │   └── acl.d/
│               │       └── luci-app-passwall2.json
│               └── ucitrack/
│                   ├── luci-app-passwall2-server.json
│                   └── luci-app-passwall2.json
├── luci-app-poweroffdevice/
│   └── luci-app-poweroffdevice/
│       ├── Makefile
│       ├── htdocs/
│       │   └── luci-static/
│       │       └── resources/
│       │           └── view/
│       │               └── system/
│       │                   └── poweroffdevice.js
│       ├── po/
│       │   └── zh_Hans/
│       │       └── poweroffdevice.po
│       └── root/
│           └── usr/
│               └── share/
│                   ├── luci/
│                   │   └── menu.d/
│                   │       └── luci-app-poweroffdevice.json
│                   └── rpcd/
│                       └── acl.d/
│                           └── luci-app-poweroffdevice.json
├── luci-app-pppoe-server/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── pppoe-server.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── pppoe-server/
│   │   │           ├── online.lua
│   │   │           ├── settings.lua
│   │   │           └── users.lua
│   │   └── view/
│   │       └── pppoe-server/
│   │           ├── index.htm
│   │           └── status.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── pppoe-server.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── luci-app-pppoe-server
│       │   ├── init.d/
│       │   │   └── luci-app-pppoe-server
│       │   └── uci-defaults/
│       │       └── luci-app-pppoe-server
│       └── usr/
│           └── share/
│               ├── luci-app-pppoe-server/
│               │   ├── ip-down
│               │   └── ip-up
│               ├── rpcd/
│               │   └── acl.d/
│               │       └── luci-app-pppoe-server.json
│               └── ucitrack/
│                   └── luci-app-pppoe-server.json
├── luci-app-pushbot/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── pushbot.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── pushbot/
│   │   │           ├── advanced.lua
│   │   │           ├── client.lua
│   │   │           ├── log.lua
│   │   │           └── setting.lua
│   │   └── view/
│   │       └── pushbot/
│   │           ├── pushbot_log.htm
│   │           └── pushbot_status.htm
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── pushbot
│       │   ├── init.d/
│       │   │   └── pushbot
│       │   └── uci-defaults/
│       │       └── luci-pushbot
│       └── usr/
│           ├── bin/
│           │   └── pushbot/
│           │       ├── api/
│           │       │   ├── bark.json
│           │       │   ├── dingding.json
│           │       │   ├── diy.json
│           │       │   ├── ent_wechat.json
│           │       │   ├── feishu.json
│           │       │   ├── ip_blacklist
│           │       │   ├── ipv4.list
│           │       │   ├── ipv6.list
│           │       │   ├── pushdeer.json
│           │       │   └── pushplus.json
│           │       └── pushbot
│           └── share/
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-pushbot.json
├── luci-app-qfirehose/
│   ├── Makefile
│   ├── htdocs/
│   │   └── luci-static/
│   │       └── resources/
│   │           └── view/
│   │               └── qfirehose.js
│   ├── po/
│   │   └── zh_Hans/
│   │       └── qfirehose.po
│   ├── qfirehose/
│   │   └── Makefile
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── qfirehose
│       │   └── init.d/
│       │       └── qfirehose
│       └── usr/
│           ├── sbin/
│           │   ├── qfirehose-modem-info
│           │   ├── qfirehose-start
│           │   └── qfirehose-status
│           └── share/
│               ├── luci/
│               │   └── menu.d/
│               │       └── luci-app-qfirehose.json
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-qfirehose.json
├── luci-app-qmodem/
│   ├── application/
│   │   ├── ndisc6/
│   │   │   ├── Makefile
│   │   │   └── patches/
│   │   │       ├── 100-favor_bsd.patch
│   │   │       └── 110-strverscmp.patch
│   │   ├── qfirehose/
│   │   │   ├── Makefile
│   │   │   └── src/
│   │   │       ├── .clang-format
│   │   │       ├── Android.mk
│   │   │       ├── CMakeLists.txt
│   │   │       ├── Makefile
│   │   │       ├── NOTICE
│   │   │       ├── ReleaseNote.txt
│   │   │       ├── android/
│   │   │       │   ├── arm64-v8a/
│   │   │       │   │   └── QFirehose
│   │   │       │   └── armeabi-v7a/
│   │   │       │       └── QFirehose
│   │   │       ├── firehose_protocol.c
│   │   │       ├── hostdl_packet.h
│   │   │       ├── log/
│   │   │       │   ├── MCU_local.log.txt
│   │   │       │   ├── MCU_remote.log.txt
│   │   │       │   ├── Ubuntu_remote.log.txt
│   │   │       │   └── pcie_mhi.log.txt
│   │   │       ├── md5.c
│   │   │       ├── md5.h
│   │   │       ├── qfirehose.c
│   │   │       ├── sahara.c
│   │   │       ├── sahara.h
│   │   │       ├── stream_download_protocol.c
│   │   │       ├── usb2tcp.c
│   │   │       ├── usb_linux.c
│   │   │       └── usb_linux.h
│   │   ├── qmodem/
│   │   │   ├── Makefile
│   │   │   └── files/
│   │   │       ├── etc/
│   │   │       │   ├── config/
│   │   │       │   │   └── qmodem
│   │   │       │   ├── hotplug.d/
│   │   │       │   │   ├── iface/
│   │   │       │   │   │   └── 80-wwan-led
│   │   │       │   │   ├── net/
│   │   │       │   │   │   └── 20-modem-net
│   │   │       │   │   └── usb/
│   │   │       │   │       └── 20-modem-usb
│   │   │       │   ├── init.d/
│   │   │       │   │   ├── qmodem_init
│   │   │       │   │   ├── qmodem_led
│   │   │       │   │   ├── qmodem_network
│   │   │       │   │   ├── qmodem_reboot
│   │   │       │   │   └── qmodem_usage_stats
│   │   │       │   └── uci-defaults/
│   │   │       │       ├── 99-add-5g-handler
│   │   │       │       └── luci-app-qmodem
│   │   │       └── usr/
│   │   │           ├── lib/
│   │   │           │   └── lua/
│   │   │           │       └── luci/
│   │   │           │           └── view/
│   │   │           │               └── admin_status/
│   │   │           │                   └── index/
│   │   │           │                       └── modem_overview.htm
│   │   │           ├── libexec/
│   │   │           │   └── rpcd/
│   │   │           │       ├── modem_ctrl
│   │   │           │       └── qmodem
│   │   │           └── share/
│   │   │               ├── qmodem/
│   │   │               │   ├── at_commands_en.json
│   │   │               │   ├── at_commands_zh.json
│   │   │               │   ├── generic.sh
│   │   │               │   ├── led_scripts/
│   │   │               │   │   ├── c2000_max.sh
│   │   │               │   │   └── m60k63.sh
│   │   │               │   ├── modem_ctrl.sh
│   │   │               │   ├── modem_dial.sh
│   │   │               │   ├── modem_hook.sh
│   │   │               │   ├── modem_port_rule.json
│   │   │               │   ├── modem_scan.sh
│   │   │               │   ├── modem_support.json
│   │   │               │   ├── modem_util.sh
│   │   │               │   ├── usage_stats.sh
│   │   │               │   └── vendor/
│   │   │               │       ├── dynamic_load.json
│   │   │               │       ├── fibocom.sh
│   │   │               │       ├── foxconn.sh
│   │   │               │       ├── gosuncn.sh
│   │   │               │       ├── huawei.sh
│   │   │               │       ├── meig.sh
│   │   │               │       ├── neoway.sh
│   │   │               │       ├── quectel.sh
│   │   │               │       ├── sierra.sh
│   │   │               │       ├── simcom.sh
│   │   │               │       └── telit.sh
│   │   │               └── rpcd/
│   │   │                   └── acl.d/
│   │   │                       ├── luci-app-qmodem.json
│   │   │                       └── qmodem.json
│   │   ├── qmodem_monitor/
│   │   │   ├── Makefile
│   │   │   └── files/
│   │   │       ├── etc/
│   │   │       │   └── init.d/
│   │   │       │       └── qmodem_monitor
│   │   │       └── usr/
│   │   │           └── share/
│   │   │               └── qmodem/
│   │   │                   └── modem_monitor.sh
│   │   ├── quectel_CM_5G_M/
│   │   │   ├── Makefile
│   │   │   ├── files/
│   │   │   │   ├── apns.json
│   │   │   │   ├── dhcp
│   │   │   │   ├── rmnet.script
│   │   │   │   ├── rmnet.sh
│   │   │   │   ├── rmnet6.script
│   │   │   │   ├── rmnet6.sh
│   │   │   │   └── rmnet_init.sh
│   │   │   └── src/
│   │   │       ├── CMakeLists.txt
│   │   │       ├── GobiNetCM.c
│   │   │       ├── Makefile
│   │   │       ├── Makefile.am
│   │   │       ├── NOTICE
│   │   │       ├── QCQCTL.h
│   │   │       ├── QCQMI.h
│   │   │       ├── QCQMUX.c
│   │   │       ├── QCQMUX.h
│   │   │       ├── QMIThread.c
│   │   │       ├── QMIThread.h
│   │   │       ├── QmiWwanCM.c
│   │   │       ├── ReleaseNote.txt
│   │   │       ├── at_tok.c
│   │   │       ├── at_tok.h
│   │   │       ├── atc.c
│   │   │       ├── atchannel.c
│   │   │       ├── atchannel.h
│   │   │       ├── configure.ac
│   │   │       ├── default.script
│   │   │       ├── default.script_ip
│   │   │       ├── device.c
│   │   │       ├── ethtool-copy.h
│   │   │       ├── log/
│   │   │       │   ├── cdc_mbim.txt
│   │   │       │   ├── cdc_mbim_vlan.txt
│   │   │       │   ├── ecm_ncm_rndis.txt
│   │   │       │   ├── gobinet.txt
│   │   │       │   ├── gobinet_bridge.txt
│   │   │       │   ├── gobinet_qmap=1.txt
│   │   │       │   ├── gobinet_qmap=1_bridge.txt
│   │   │       │   ├── gobinet_qmap=4.txt
│   │   │       │   ├── gobinet_qmap=4_bridge.txt
│   │   │       │   ├── pcie_mhi_mbim.txt
│   │   │       │   ├── pcie_mhi_mbim_qmap=4.txt
│   │   │       │   ├── pcie_mhi_qmap=1.txt
│   │   │       │   ├── pcie_mhi_qmap=1_bridge.txt
│   │   │       │   ├── pcie_mhi_qmap=4.txt
│   │   │       │   ├── pcie_mhi_qmap=4_bridge.txt
│   │   │       │   ├── qmi_wwan_q.txt
│   │   │       │   ├── qmi_wwan_q_bridge.txt
│   │   │       │   ├── qmi_wwan_q_qmap=1.txt
│   │   │       │   ├── qmi_wwan_q_qmap=1_bridge.txt
│   │   │       │   ├── qmi_wwan_q_qmap=4.txt
│   │   │       │   ├── qmi_wwan_q_qmap=4_bridge.txt
│   │   │       │   ├── qmi_wwan_qmap=4.txt
│   │   │       │   └── usage_of_argument/
│   │   │       │       ├── 6.txt
│   │   │       │       └── m.txt
│   │   │       ├── main.c
│   │   │       ├── mbim-cm.c
│   │   │       ├── qendian.h
│   │   │       ├── qlist.h
│   │   │       ├── qmap_bridge_mode.c
│   │   │       ├── qrtr.c
│   │   │       ├── qrtr.h
│   │   │       ├── quectel-atc-proxy.c
│   │   │       ├── quectel-mbim-proxy.c
│   │   │       ├── quectel-qmi-proxy.c
│   │   │       ├── quectel-qrtr-proxy.c
│   │   │       ├── rmnetctl.c
│   │   │       ├── udhcpc.c
│   │   │       ├── udhcpc_netlink.c
│   │   │       ├── udhcpc_script.c
│   │   │       ├── util.c
│   │   │       └── util.h
│   │   ├── sms-tool_q/
│   │   │   ├── Makefile
│   │   │   ├── patches/
│   │   │   │   ├── 0001-send_raw_pdu.patch
│   │   │   │   └── 0002-add_timeout_option.patch
│   │   │   └── src/
│   │   │       ├── LICENSE-2.0.txt
│   │   │       ├── Makefile
│   │   │       ├── pdu_lib/
│   │   │       │   ├── Makefile
│   │   │       │   ├── pdu.c
│   │   │       │   ├── pdu.h
│   │   │       │   ├── pdu_decoder.c
│   │   │       │   └── ucs2_to_utf8.c
│   │   │       └── sms_main.c
│   │   ├── sms_forwarder/
│   │   │   ├── Makefile
│   │   │   ├── files/
│   │   │   │   ├── etc/
│   │   │   │   │   ├── config/
│   │   │   │   │   │   └── sms_daemon
│   │   │   │   │   └── init.d/
│   │   │   │   │       └── sms_forwarder
│   │   │   │   └── usr/
│   │   │   │       └── bin/
│   │   │   │           ├── sms_forward_custom_example.sh
│   │   │   │           ├── sms_forward_feishu.sh
│   │   │   │           ├── sms_forward_pushdeer.sh
│   │   │   │           ├── sms_forward_serverchan.sh
│   │   │   │           ├── sms_forward_tgbot.sh
│   │   │   │           └── sms_forward_webhook.sh
│   │   │   └── src/
│   │   │       ├── Makefile
│   │   │       ├── Makefile.local
│   │   │       ├── main.c
│   │   │       └── sms_forwarder.h
│   │   ├── sms_forwarder_next/
│   │   │   ├── Makefile
│   │   │   └── files/
│   │   │       ├── scripts/
│   │   │       │   ├── sms_forward_custom_example.sh
│   │   │       │   ├── sms_forward_feishu.sh
│   │   │       │   ├── sms_forward_pushdeer.sh
│   │   │       │   ├── sms_forward_serverchan.sh
│   │   │       │   ├── sms_forward_tgbot.sh
│   │   │       │   └── sms_forward_webhook.sh
│   │   │       ├── sms_forwarder.example
│   │   │       ├── sms_forwarder.init
│   │   │       └── sms_forwarder_next
│   │   ├── tom_modem/
│   │   │   ├── Makefile
│   │   │   └── src/
│   │   │       ├── Makefile
│   │   │       ├── extlib/
│   │   │       │   ├── pdu.c
│   │   │       │   ├── pdu.h
│   │   │       │   ├── pdu_decoder.c
│   │   │       │   └── ucs2_to_utf8.c
│   │   │       ├── main.c
│   │   │       ├── main.h
│   │   │       ├── modem_types.h
│   │   │       ├── operations.c
│   │   │       ├── operations.h
│   │   │       ├── transport.c
│   │   │       ├── transport.h
│   │   │       ├── ttydevice.c
│   │   │       ├── ttydevice.h
│   │   │       ├── ubus_client.c
│   │   │       ├── ubus_client.h
│   │   │       ├── utils.c
│   │   │       └── utils.h
│   │   └── ubus_at_daemon/
│   │       ├── Makefile
│   │       ├── files/
│   │       │   └── etc/
│   │       │       ├── config/
│   │       │       │   └── ubus-at-daemon
│   │       │       └── init.d/
│   │       │           └── ubus-at-daemon
│   │       └── src/
│   │           ├── Makefile
│   │           ├── at_handler.c
│   │           ├── config_loader.c
│   │           ├── const.h
│   │           ├── event_callback.c
│   │           ├── main.c
│   │           ├── port_manager.c
│   │           └── ubus_at_daemon.h
│   ├── driver/
│   │   ├── fibocom_QMI_WWAN/
│   │   │   ├── Makefile
│   │   │   └── src/
│   │   │       ├── Makefile
│   │   │       └── qmi_wwan_f.c
│   │   ├── quectel_MHI/
│   │   │   ├── Makefile
│   │   │   ├── files/
│   │   │   │   └── pcie_mhi
│   │   │   └── src/
│   │   │       ├── Makefile
│   │   │       ├── README
│   │   │       ├── ReleaseNote.txt
│   │   │       ├── controllers/
│   │   │       │   ├── Kconfig
│   │   │       │   ├── Makefile
│   │   │       │   ├── mhi_arch_qti.c
│   │   │       │   ├── mhi_qcom.c
│   │   │       │   ├── mhi_qcom.h
│   │   │       │   ├── mhi_qti.c
│   │   │       │   └── mhi_qti.h
│   │   │       ├── core/
│   │   │       │   ├── Makefile
│   │   │       │   ├── mhi.h
│   │   │       │   ├── mhi_boot.c
│   │   │       │   ├── mhi_dtr.c
│   │   │       │   ├── mhi_init.c
│   │   │       │   ├── mhi_internal.h
│   │   │       │   ├── mhi_main.c
│   │   │       │   ├── mhi_pm.c
│   │   │       │   ├── mhi_sdx20.h
│   │   │       │   └── sdx20_mhi.h
│   │   │       ├── devices/
│   │   │       │   ├── Kconfig
│   │   │       │   ├── Makefile
│   │   │       │   ├── mhi_netdev.c
│   │   │       │   ├── mhi_netdev_quectel.c
│   │   │       │   ├── mhi_satellite.c
│   │   │       │   └── mhi_uci.c
│   │   │       └── log/
│   │   │           ├── AT_OVER_PCIE.txt
│   │   │           ├── MBIM_OVER_PCIE.txt
│   │   │           ├── QMI_OVER_PCIE.txt
│   │   │           └── QXDM_OVER_PCIE.txt
│   │   ├── quectel_QMI_WWAN/
│   │   │   ├── Makefile
│   │   │   └── src/
│   │   │       ├── Makefile
│   │   │       ├── ReleaseNote.txt
│   │   │       ├── qmi_wwan_q.c
│   │   │       └── rmnet_nss.c
│   │   └── simcom_QMI_WWAN/
│   │       ├── Makefile
│   │       └── src/
│   │           ├── Makefile
│   │           └── qmi_wwan_s.c
│   ├── luci/
│   │   ├── luci-app-qmodem/
│   │   │   ├── Makefile
│   │   │   ├── htdocs/
│   │   │   │   └── luci-static/
│   │   │   │       └── resources/
│   │   │   │           └── view/
│   │   │   │               └── status/
│   │   │   │                   └── include/
│   │   │   │                       └── 11_modem.js
│   │   │   ├── luasrc/
│   │   │   │   ├── controller/
│   │   │   │   │   └── qmodem.lua
│   │   │   │   ├── model/
│   │   │   │   │   └── cbi/
│   │   │   │   │       └── qmodem/
│   │   │   │   │           ├── dial_config.lua
│   │   │   │   │           ├── dial_overview.lua
│   │   │   │   │           ├── modem_cfg.lua
│   │   │   │   │           ├── modem_config.lua
│   │   │   │   │           ├── settings.lua
│   │   │   │   │           └── slot_config.lua
│   │   │   │   └── view/
│   │   │   │       └── qmodem/
│   │   │   │           ├── dial_overview.htm
│   │   │   │           ├── modem_config_add.htm
│   │   │   │           ├── modem_debug.htm
│   │   │   │           └── modem_info.htm
│   │   │   └── po/
│   │   │       ├── ru/
│   │   │       │   └── modem.po
│   │   │       ├── template/
│   │   │       │   └── qmodem.po
│   │   │       └── zh_Hans/
│   │   │           └── qmodem.po
│   │   ├── luci-app-qmodem-hc/
│   │   │   ├── Makefile
│   │   │   ├── luasrc/
│   │   │   │   ├── controller/
│   │   │   │   │   └── qmodem_hc.lua
│   │   │   │   ├── model/
│   │   │   │   │   └── cbi/
│   │   │   │   │       └── qmodem_hc/
│   │   │   │   │           └── modem_sim.lua
│   │   │   │   └── view/
│   │   │   │       └── qmodem_hc/
│   │   │   │           └── modem_sim.htm
│   │   │   ├── po/
│   │   │   │   └── zh_Hans/
│   │   │   │       └── modem_hc.po
│   │   │   └── root/
│   │   │       ├── etc/
│   │   │       │   ├── config/
│   │   │       │   │   └── qmodem_hc_sim
│   │   │       │   ├── init.d/
│   │   │       │   │   └── qmodem_hc_sim
│   │   │       │   └── uci-defaults/
│   │   │       │       └── luci-app-qmodem-hc
│   │   │       └── usr/
│   │   │           └── share/
│   │   │               └── qmodem/
│   │   │                   └── modem_sim.sh
│   │   ├── luci-app-qmodem-monitor/
│   │   │   ├── Makefile
│   │   │   ├── htdocs/
│   │   │   │   └── luci-static/
│   │   │   │       └── resources/
│   │   │   │           └── view/
│   │   │   │               └── qmodem/
│   │   │   │                   └── monitor.js
│   │   │   ├── po/
│   │   │   │   ├── templates/
│   │   │   │   │   └── qmodem-monitor.pot
│   │   │   │   └── zh_Hans/
│   │   │   │       └── qmodem-monitor.po
│   │   │   └── root/
│   │   │       └── usr/
│   │   │           └── share/
│   │   │               ├── luci/
│   │   │               │   └── menu.d/
│   │   │               │       └── luci-app-qmodem-monitor.json
│   │   │               └── rpcd/
│   │   │                   └── acl.d/
│   │   │                       └── luci-app-qmodem-monitor.json
│   │   ├── luci-app-qmodem-mwan/
│   │   │   ├── Makefile
│   │   │   ├── luasrc/
│   │   │   │   ├── controller/
│   │   │   │   │   └── qmodem_mwan.lua
│   │   │   │   └── model/
│   │   │   │       └── cbi/
│   │   │   │           └── qmodem/
│   │   │   │               └── mwan_config.lua
│   │   │   ├── po/
│   │   │   │   └── zh_Hans/
│   │   │   │       └── modem_mwan.po
│   │   │   └── root/
│   │   │       ├── etc/
│   │   │       │   ├── config/
│   │   │       │   │   └── qmodem_mwan
│   │   │       │   ├── init.d/
│   │   │       │   │   └── qmodem_mwan
│   │   │       │   ├── uci-defaults/
│   │   │       │   │   ├── 99-setup-mwan
│   │   │       │   │   └── luci-app-modem-mwan
│   │   │       │   └── udhcpc.user.d/
│   │   │       │       └── 01-reload-mwan3.dhcpscript
│   │   │       └── usr/
│   │   │           └── share/
│   │   │               └── qmodem/
│   │   │                   └── modem_mwan.sh
│   │   ├── luci-app-qmodem-next/
│   │   │   ├── Makefile
│   │   │   ├── htdocs/
│   │   │   │   └── luci-static/
│   │   │   │       └── resources/
│   │   │   │           ├── qmodem/
│   │   │   │           │   ├── modem_cfg.js
│   │   │   │           │   ├── qmodem-next.css
│   │   │   │           │   ├── qmodem.js
│   │   │   │           │   ├── sms-pdu.js
│   │   │   │           │   └── sms.js
│   │   │   │           └── view/
│   │   │   │               ├── qmodem/
│   │   │   │               │   ├── config_advanced.js
│   │   │   │               │   ├── debug.js
│   │   │   │               │   ├── network_config.js
│   │   │   │               │   ├── overview.js
│   │   │   │               │   ├── settings.js
│   │   │   │               │   ├── sim_switch.js
│   │   │   │               │   ├── sms.js
│   │   │   │               │   ├── sms_conversation.js
│   │   │   │               │   ├── sms_forward.js
│   │   │   │               │   └── sms_sim.js
│   │   │   │               └── status/
│   │   │   │                   └── include/
│   │   │   │                       └── 11_modem.js
│   │   │   ├── po/
│   │   │   │   ├── template/
│   │   │   │   │   └── qmodem-next.po
│   │   │   │   └── zh_Hans/
│   │   │   │       └── luci-app-qmodem-next.po
│   │   │   └── root/
│   │   │       ├── lib/
│   │   │       │   └── upgrade/
│   │   │       │       └── keep.d/
│   │   │       │           └── qmodme-next
│   │   │       └── usr/
│   │   │           └── share/
│   │   │               ├── luci/
│   │   │               │   └── menu.d/
│   │   │               │       └── luci-app-qmodem-next.json
│   │   │               └── rpcd/
│   │   │                   ├── acl.d/
│   │   │                   │   └── luci-app-qmodem-next.json
│   │   │                   └── ucode/
│   │   │                       └── qmodem_sms
│   │   ├── luci-app-qmodem-sms/
│   │   │   ├── Makefile
│   │   │   ├── luasrc/
│   │   │   │   ├── controller/
│   │   │   │   │   └── qmodem_sms.lua
│   │   │   │   ├── model/
│   │   │   │   │   └── cbi/
│   │   │   │   │       └── qmodem_sms/
│   │   │   │   │           ├── sms_forward.lua
│   │   │   │   │           └── sms_forward_extedit.lua
│   │   │   │   └── view/
│   │   │   │       └── modem_sms/
│   │   │   │           └── modem_sms.htm
│   │   │   └── po/
│   │   │       └── zh_Hans/
│   │   │           └── modem_sms.po
│   │   ├── luci-app-qmodem-ttl/
│   │   │   ├── Makefile
│   │   │   ├── luasrc/
│   │   │   │   ├── controller/
│   │   │   │   │   └── qmodem_ttl.lua
│   │   │   │   └── model/
│   │   │   │       └── cbi/
│   │   │   │           └── qmodem/
│   │   │   │               └── modem_ttl.lua
│   │   │   ├── po/
│   │   │   │   ├── templates/
│   │   │   │   │   └── qmodem-ttl.pot
│   │   │   │   └── zh_Hans/
│   │   │   │       └── qmodem-ttl.po
│   │   │   └── root/
│   │   │       └── etc/
│   │   │           ├── config/
│   │   │           │   └── qmodem_ttl
│   │   │           ├── init.d/
│   │   │           │   └── qmodem_ttl
│   │   │           └── uci-defaults/
│   │   │               └── add-fw-include
│   │   └── luci-app-qmodem-ttlfw4/
│   │       ├── Makefile
│   │       ├── htdocs/
│   │       │   └── luci-static/
│   │       │       └── resources/
│   │       │           └── view/
│   │       │               └── qmodem/
│   │       │                   └── ttl.js
│   │       ├── po/
│   │       │   ├── templates/
│   │       │   │   └── qmodem-ttlfw4.pot
│   │       │   └── zh_Hans/
│   │       │       └── qmodem-ttlfw4.po
│   │       └── root/
│   │           ├── etc/
│   │           │   ├── config/
│   │           │   │   └── qmodem_ttl
│   │           │   └── init.d/
│   │           │       └── qmodem_ttl
│   │           └── usr/
│   │               └── share/
│   │                   ├── luci/
│   │                   │   └── menu.d/
│   │                   │       └── luci-app-qmodem-ttlfw4.json
│   │                   └── rpcd/
│   │                       └── acl.d/
│   │                           └── luci-app-qmodem-ttlfw4.json
│   ├── scripts/
│   │   ├── auto_translate_i18n.py
│   │   ├── extract_i18n_strings.py
│   │   ├── ubus_benchmark.py
│   │   └── update_support_list.py
│   └── version.mk
├── luci-app-quickstart/
│   ├── Makefile
│   ├── htdocs/
│   │   └── luci-static/
│   │       └── quickstart/
│   │           ├── i18n/
│   │           │   ├── en.json
│   │           │   └── zh_Hans.json
│   │           ├── index.js
│   │           ├── style.css
│   │           └── vendor.js
│   ├── luasrc/
│   │   ├── controller/
│   │   │   ├── istore_backend.lua
│   │   │   └── quickstart.lua
│   │   └── view/
│   │       └── quickstart/
│   │           ├── home.htm
│   │           └── main.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── quickstart.po
│   └── root/
│       ├── etc/
│       │   └── uci-defaults/
│       │       └── 50_luci-quickstart
│       └── usr/
│           ├── libexec/
│           │   └── quickstart/
│           │       └── auto_setup.sh
│           └── share/
│               └── luci/
│                   └── menu.d/
│                       └── luci-app-quickstart.json
├── luci-app-shutdown/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── shutdown.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── shutdown.lua
│   │   └── view/
│   │       └── shutdown/
│   │           └── actions.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── shutdown.po
│   └── root/
│       └── usr/
│           └── share/
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-shutdown.json
├── luci-app-ssr-mudb-server/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── ssr_mudb_server.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── ssr_mudb_server/
│   │   │           └── index.lua
│   │   └── view/
│   │       └── ssr_mudb_server/
│   │           ├── status.htm
│   │           ├── user.htm
│   │           └── users.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── ssr_mudb_server.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   ├── ssr_mudb_server
│       │   │   └── ssr_mudb_server.json
│       │   ├── init.d/
│       │   │   └── ssr_mudb_server
│       │   └── uci-defaults/
│       │       └── luci-app-ssr-mudb-server
│       └── usr/
│           └── share/
│               ├── rpcd/
│               │   └── acl.d/
│               │       └── luci-app-ssr-mudb-server.json
│               ├── ssr_mudb_server/
│               │   ├── .travis.yml
│               │   ├── CHANGES
│               │   ├── Dockerfile
│               │   ├── MANIFEST.in
│               │   ├── apiconfig.py
│               │   ├── asyncmgr.py
│               │   ├── clear_traffic_all_users.sh
│               │   ├── config.json
│               │   ├── configloader.py
│               │   ├── db_transfer.py
│               │   ├── firewall.lua
│               │   ├── importloader.py
│               │   ├── initcfg.bat
│               │   ├── initcfg.sh
│               │   ├── initmudbjson.sh
│               │   ├── logrun.sh
│               │   ├── mudb.json
│               │   ├── mujson_mgr.py
│               │   ├── mysql.json
│               │   ├── run.sh
│               │   ├── server.py
│               │   ├── server_pool.py
│               │   ├── setup.py
│               │   ├── setup_cymysql.sh
│               │   ├── shadowsocks/
│               │   │   ├── __init__.py
│               │   │   ├── asyncdns.py
│               │   │   ├── common.py
│               │   │   ├── crypto/
│               │   │   │   ├── __init__.py
│               │   │   │   ├── ctypes_libsodium.py
│               │   │   │   ├── ctypes_openssl.py
│               │   │   │   ├── openssl.py
│               │   │   │   ├── rc4_md5.py
│               │   │   │   ├── sodium.py
│               │   │   │   ├── table.py
│               │   │   │   └── util.py
│               │   │   ├── daemon.py
│               │   │   ├── encrypt.py
│               │   │   ├── eventloop.py
│               │   │   ├── local.py
│               │   │   ├── logrun.sh
│               │   │   ├── lru_cache.py
│               │   │   ├── manager.py
│               │   │   ├── obfs.py
│               │   │   ├── obfsplugin/
│               │   │   │   ├── __init__.py
│               │   │   │   ├── auth.py
│               │   │   │   ├── auth_chain.py
│               │   │   │   ├── http_simple.py
│               │   │   │   ├── obfs_tls.py
│               │   │   │   ├── plain.py
│               │   │   │   └── verify.py
│               │   │   ├── ordereddict.py
│               │   │   ├── run.sh
│               │   │   ├── server.py
│               │   │   ├── shell.py
│               │   │   ├── stop.sh
│               │   │   ├── tail.sh
│               │   │   ├── tcprelay.py
│               │   │   ├── udprelay.py
│               │   │   ├── user.py
│               │   │   └── version.py
│               │   ├── stop.sh
│               │   ├── switchrule.py
│               │   ├── tail.sh
│               │   ├── tests/
│               │   │   ├── aes-cfb1.json
│               │   │   ├── aes-cfb8.json
│               │   │   ├── aes-ctr.json
│               │   │   ├── aes.json
│               │   │   ├── assert.sh
│               │   │   ├── chacha20.json
│               │   │   ├── client-multi-server-ip.json
│               │   │   ├── coverage_server.py
│               │   │   ├── fastopen.json
│               │   │   ├── ipv6-client-side.json
│               │   │   ├── ipv6.json
│               │   │   ├── jenkins.sh
│               │   │   ├── libsodium/
│               │   │   │   └── install.sh
│               │   │   ├── nose_plugin.py
│               │   │   ├── rc4-md5.json
│               │   │   ├── salsa20-ctr.json
│               │   │   ├── salsa20.json
│               │   │   ├── server-multi-passwd-client-side.json
│               │   │   ├── server-multi-passwd-table.json
│               │   │   ├── server-multi-passwd.json
│               │   │   ├── server-multi-ports.json
│               │   │   ├── setup_tc.sh
│               │   │   ├── socksify/
│               │   │   │   ├── install.sh
│               │   │   │   └── socks.conf
│               │   │   ├── table.json
│               │   │   ├── test.py
│               │   │   ├── test_command.sh
│               │   │   ├── test_daemon.sh
│               │   │   ├── test_large_file.sh
│               │   │   ├── test_udp_src.py
│               │   │   ├── test_udp_src.sh
│               │   │   └── workers.json
│               │   ├── user-config.json
│               │   ├── userapiconfig.py
│               │   ├── usermysql.json
│               │   └── utils/
│               │       ├── autoban.py
│               │       └── fail2ban/
│               │           └── shadowsocks.conf
│               └── ucitrack/
│                   └── luci-app-ssr-mudb-server.json
├── luci-app-ssr-plus/
│   ├── chinadns-ng/
│   │   └── Makefile
│   ├── dns2socks/
│   │   └── Makefile
│   ├── dns2socks-rust/
│   │   └── Makefile
│   ├── dns2tcp/
│   │   └── Makefile
│   ├── dnsproxy/
│   │   └── Makefile
│   ├── gn/
│   │   ├── Makefile
│   │   └── src/
│   │       └── out/
│   │           └── last_commit_position.h
│   ├── hysteria/
│   │   └── Makefile
│   ├── ipt2socks/
│   │   └── Makefile
│   ├── lua-neturl/
│   │   ├── Makefile
│   │   └── patches/
│   │       └── 010-userinfo-regex.patch
│   ├── luci-app-ssr-plus/
│   │   ├── Makefile
│   │   ├── luasrc/
│   │   │   ├── controller/
│   │   │   │   └── shadowsocksr.lua
│   │   │   ├── model/
│   │   │   │   └── cbi/
│   │   │   │       └── shadowsocksr/
│   │   │   │           ├── advanced.lua
│   │   │   │           ├── client-config.lua
│   │   │   │           ├── client.lua
│   │   │   │           ├── control.lua
│   │   │   │           ├── log.lua
│   │   │   │           ├── server-config.lua
│   │   │   │           ├── server.lua
│   │   │   │           ├── servers.lua
│   │   │   │           └── status.lua
│   │   │   └── view/
│   │   │       └── shadowsocksr/
│   │   │           ├── backup_restore.htm
│   │   │           ├── certupload.htm
│   │   │           ├── check.htm
│   │   │           ├── checkport.htm
│   │   │           ├── log.htm
│   │   │           ├── optimize_cbi_ui.htm
│   │   │           ├── ping.htm
│   │   │           ├── refresh.htm
│   │   │           ├── reset.htm
│   │   │           ├── server_list.htm
│   │   │           ├── socket.htm
│   │   │           ├── ssrurl.htm
│   │   │           ├── status.htm
│   │   │           └── subscribe.htm
│   │   ├── po/
│   │   │   ├── templates/
│   │   │   │   └── ssr-plus.pot
│   │   │   └── zh_Hans/
│   │   │       └── ssr-plus.po
│   │   └── root/
│   │       ├── etc/
│   │       │   ├── config/
│   │       │   │   └── shadowsocksr
│   │       │   ├── init.d/
│   │       │   │   └── shadowsocksr
│   │       │   ├── ssrplus/
│   │       │   │   ├── ad.conf
│   │       │   │   ├── applechina.conf
│   │       │   │   ├── black.list
│   │       │   │   ├── china_ssr.txt
│   │       │   │   ├── deny.list
│   │       │   │   ├── dnsproxy_dns.list
│   │       │   │   ├── gfw_base.conf
│   │       │   │   ├── gfw_list.conf
│   │       │   │   ├── mosdns-config.yaml
│   │       │   │   ├── netflix.list
│   │       │   │   ├── netflixip.list
│   │       │   │   ├── oversea_list.conf
│   │       │   │   └── white.list
│   │       │   └── uci-defaults/
│   │       │       └── luci-ssr-plus
│   │       └── usr/
│   │           ├── bin/
│   │           │   ├── ssr-monitor
│   │           │   ├── ssr-rules
│   │           │   └── ssr-switch
│   │           └── share/
│   │               ├── rpcd/
│   │               │   └── acl.d/
│   │               │       └── luci-app-ssr-plus.json
│   │               ├── shadowsocksr/
│   │               │   ├── chinaipset.sh
│   │               │   ├── gen_config.lua
│   │               │   ├── genred2config.sh
│   │               │   ├── gfw2ipset.sh
│   │               │   ├── hy2_test.sh
│   │               │   ├── shadowsocksr.config
│   │               │   ├── ssrplusupdate.sh
│   │               │   ├── subscribe.lua
│   │               │   └── update.lua
│   │               └── ucitrack/
│   │                   └── luci-app-ssr-plus.json
│   ├── microsocks/
│   │   └── Makefile
│   ├── mosdns/
│   │   ├── Makefile
│   │   └── patches/
│   │       ├── 203-add-response-for-bad-request-in-ServeHTTP-handler.patch
│   │       ├── 204-black_hole-apply-Fisher-Yates-shuffle-algorithm-to-r.patch
│   │       └── 205-format-logtime.patch
│   ├── naiveproxy/
│   │   ├── Makefile
│   │   └── src/
│   │       └── init_env.sh
│   ├── redsocks2/
│   │   └── Makefile
│   ├── shadow-tls/
│   │   ├── Makefile
│   │   └── patches/
│   │       ├── 010-Fix-reading-WildcardSNI-from-sip003_arg-115.patch
│   │       ├── 011-fix-use-tls1-2-only-website-for-tls12-test-suites-129.patch
│   │       └── 100-update-monoio.patch
│   ├── shadowsocks-libev/
│   │   ├── Makefile
│   │   ├── files/
│   │   │   ├── shadowsocks-libev.config
│   │   │   ├── shadowsocks-libev.init
│   │   │   └── ss-rules/
│   │   │       ├── chain.uc
│   │   │       ├── set.uc
│   │   │       └── ss-rules.uc
│   │   └── patches/
│   │       ├── 100-Upgrade-PCRE-to-PCRE2.patch
│   │       ├── 101-Fix-mishandling-of-incoming-socket-buffer.-It-must-b.patch
│   │       └── 102-deprecate-load16-be-replace-with-ntohs.patch
│   ├── shadowsocks-rust/
│   │   └── Makefile
│   ├── shadowsocksr-libev/
│   │   ├── Makefile
│   │   ├── patches/
│   │   │   ├── 0001-Add-ss-server-and-ss-check.patch
│   │   │   ├── 0002-Revert-verify_simple-and-auth_simple.patch
│   │   │   ├── 0003-Refine-Usage.patch
│   │   │   ├── 100-fix-gcc-10.patch
│   │   │   ├── 101-Fix-Werror-sizeof-pointer-memaccess.patch
│   │   │   ├── 102-Read-listening-mode-from-config.patch
│   │   │   ├── 103-Add-TPROXY-support-for-TCP-ssr-redir.patch
│   │   │   ├── 104-fix-use-after-free.patch
│   │   │   └── 105-Upgrade-PCRE-to-PCRE2.patch
│   │   └── src/
│   │       ├── AUTHORS
│   │       ├── CMakeLists.txt
│   │       ├── COPYING
│   │       ├── Changes
│   │       ├── INSTALL
│   │       ├── Makefile.am
│   │       ├── Makefile.in
│   │       ├── acl/
│   │       │   ├── chn.acl
│   │       │   ├── gfwlist.acl
│   │       │   ├── local.acl
│   │       │   └── server_block_chn.acl
│   │       ├── aclocal.m4
│   │       ├── auto/
│   │       │   ├── ar-lib
│   │       │   ├── compile
│   │       │   ├── config.guess
│   │       │   ├── config.rpath
│   │       │   ├── config.sub
│   │       │   ├── depcomp
│   │       │   ├── install-sh
│   │       │   ├── ltmain.sh
│   │       │   └── missing
│   │       ├── autogen.sh
│   │       ├── cmake/
│   │       │   ├── CheckDIRSymbolExists.cmake
│   │       │   ├── CheckPrototypeExists.cmake
│   │       │   ├── CheckSTDC.cmake
│   │       │   ├── FindPCRE.cmake
│   │       │   ├── configure.cmake
│   │       │   └── dist.cmake
│   │       ├── completions/
│   │       │   └── bash/
│   │       │       ├── ss-local
│   │       │       ├── ss-manager
│   │       │       ├── ss-redir
│   │       │       ├── ss-server
│   │       │       └── ss-tunnel
│   │       ├── config.h.cmake
│   │       ├── config.h.in
│   │       ├── configure
│   │       ├── configure.ac
│   │       ├── debian/
│   │       │   ├── README.Debian
│   │       │   ├── changelog
│   │       │   ├── compat
│   │       │   ├── config.json
│   │       │   ├── control
│   │       │   ├── copyright
│   │       │   ├── copyright.original
│   │       │   ├── libshadowsocks-libev-dev.install
│   │       │   ├── libshadowsocks-libev2.install
│   │       │   ├── rules
│   │       │   ├── shadowsocks-libev-local@.service
│   │       │   ├── shadowsocks-libev-redir@.service
│   │       │   ├── shadowsocks-libev-server@.service
│   │       │   ├── shadowsocks-libev-tunnel@.service
│   │       │   ├── shadowsocks-libev.default
│   │       │   ├── shadowsocks-libev.docs
│   │       │   ├── shadowsocks-libev.init
│   │       │   ├── shadowsocks-libev.install
│   │       │   ├── shadowsocks-libev.postinst
│   │       │   ├── shadowsocks-libev.postrm
│   │       │   ├── shadowsocks-libev.service
│   │       │   ├── source/
│   │       │   │   └── format
│   │       │   ├── source.lintian-overrides
│   │       │   └── watch
│   │       ├── doc/
│   │       │   ├── Makefile.am
│   │       │   ├── Makefile.in
│   │       │   ├── asciidoc.conf
│   │       │   ├── manpage-base.xsl
│   │       │   ├── manpage-bold-literal.xsl
│   │       │   ├── manpage-normal.xsl
│   │       │   ├── shadowsocks-libev.asciidoc
│   │       │   ├── ss-local.asciidoc
│   │       │   ├── ss-manager.asciidoc
│   │       │   ├── ss-nat.asciidoc
│   │       │   ├── ss-redir.asciidoc
│   │       │   ├── ss-server.asciidoc
│   │       │   └── ss-tunnel.asciidoc
│   │       ├── docker/
│   │       │   ├── alpine/
│   │       │   │   ├── Dockerfile
│   │       │   │   └── docker-compose.yml
│   │       │   └── ubuntu/
│   │       │       ├── Dockerfile
│   │       │       └── entrypoint
│   │       ├── libcork/
│   │       │   ├── .idea/
│   │       │   │   ├── libcork-develop.iml
│   │       │   │   ├── misc.xml
│   │       │   │   ├── modules.xml
│   │       │   │   └── workspace.xml
│   │       │   ├── CMakeLists.txt
│   │       │   ├── COPYING
│   │       │   ├── Makefile.am
│   │       │   ├── Makefile.in
│   │       │   ├── README.markdown
│   │       │   ├── cli/
│   │       │   │   └── commands.c
│   │       │   ├── cmake/
│   │       │   │   └── FindCTargets.cmake
│   │       │   ├── core/
│   │       │   │   ├── allocator.c
│   │       │   │   ├── error.c
│   │       │   │   ├── gc.c
│   │       │   │   ├── hash.c
│   │       │   │   ├── ip-address.c
│   │       │   │   ├── mempool.c
│   │       │   │   ├── timestamp.c
│   │       │   │   ├── u128.c
│   │       │   │   └── version.c
│   │       │   ├── ds/
│   │       │   │   ├── array.c
│   │       │   │   ├── bitset.c
│   │       │   │   ├── buffer.c
│   │       │   │   ├── dllist.c
│   │       │   │   ├── file-stream.c
│   │       │   │   ├── hash-table.c
│   │       │   │   ├── managed-buffer.c
│   │       │   │   ├── ring-buffer.c
│   │       │   │   └── slice.c
│   │       │   ├── include/
│   │       │   │   └── libcork/
│   │       │   │       ├── cli/
│   │       │   │       │   └── commands.h
│   │       │   │       ├── cli.h
│   │       │   │       ├── config/
│   │       │   │       │   ├── arch.h
│   │       │   │       │   ├── bsd.h
│   │       │   │       │   ├── config.h
│   │       │   │       │   ├── gcc.h
│   │       │   │       │   ├── linux.h
│   │       │   │       │   ├── macosx.h
│   │       │   │       │   ├── mingw32.h
│   │       │   │       │   ├── solaris.h
│   │       │   │       │   └── version.h
│   │       │   │       ├── config.h
│   │       │   │       ├── core/
│   │       │   │       │   ├── allocator.h
│   │       │   │       │   ├── api.h
│   │       │   │       │   ├── attributes.h
│   │       │   │       │   ├── byte-order.h
│   │       │   │       │   ├── callbacks.h
│   │       │   │       │   ├── error.h
│   │       │   │       │   ├── gc.h
│   │       │   │       │   ├── hash.h
│   │       │   │       │   ├── id.h
│   │       │   │       │   ├── mempool.h
│   │       │   │       │   ├── net-addresses.h
│   │       │   │       │   ├── timestamp.h
│   │       │   │       │   ├── types.h
│   │       │   │       │   └── u128.h
│   │       │   │       ├── core.h
│   │       │   │       ├── ds/
│   │       │   │       │   ├── array.h
│   │       │   │       │   ├── bitset.h
│   │       │   │       │   ├── buffer.h
│   │       │   │       │   ├── dllist.h
│   │       │   │       │   ├── hash-table.h
│   │       │   │       │   ├── managed-buffer.h
│   │       │   │       │   ├── ring-buffer.h
│   │       │   │       │   ├── slice.h
│   │       │   │       │   └── stream.h
│   │       │   │       ├── ds.h
│   │       │   │       ├── helpers/
│   │       │   │       │   ├── errors.h
│   │       │   │       │   ├── gc.h
│   │       │   │       │   └── posix.h
│   │       │   │       ├── os/
│   │       │   │       │   ├── files.h
│   │       │   │       │   ├── process.h
│   │       │   │       │   └── subprocess.h
│   │       │   │       ├── os.h
│   │       │   │       ├── threads/
│   │       │   │       │   ├── atomics.h
│   │       │   │       │   └── basics.h
│   │       │   │       └── threads.h
│   │       │   ├── posix/
│   │       │   │   ├── directory-walker.c
│   │       │   │   ├── env.c
│   │       │   │   ├── exec.c
│   │       │   │   ├── files.c
│   │       │   │   ├── process.c
│   │       │   │   └── subprocess.c
│   │       │   └── pthreads/
│   │       │       └── thread.c
│   │       ├── libev/
│   │       │   ├── CMakeLists.txt
│   │       │   ├── Changes
│   │       │   ├── Makefile.am
│   │       │   ├── Makefile.in
│   │       │   ├── README
│   │       │   ├── Symbols.ev
│   │       │   ├── Symbols.event
│   │       │   ├── aclocal.m4
│   │       │   ├── autogen.sh
│   │       │   ├── cmake/
│   │       │   │   ├── configure.cmake
│   │       │   │   └── dist.cmake
│   │       │   ├── config.h.cmake
│   │       │   ├── configure.ac
│   │       │   ├── ev++.h
│   │       │   ├── ev.3
│   │       │   ├── ev.c
│   │       │   ├── ev.h
│   │       │   ├── ev.pod
│   │       │   ├── ev_epoll.c
│   │       │   ├── ev_kqueue.c
│   │       │   ├── ev_poll.c
│   │       │   ├── ev_port.c
│   │       │   ├── ev_select.c
│   │       │   ├── ev_vars.h
│   │       │   ├── ev_win32.c
│   │       │   ├── ev_wrap.h
│   │       │   ├── event.c
│   │       │   ├── event.h
│   │       │   └── libev.m4
│   │       ├── libipset/
│   │       │   ├── CMakeLists.txt
│   │       │   ├── LICENSE.txt
│   │       │   ├── Makefile.am
│   │       │   ├── Makefile.in
│   │       │   ├── README.markdown
│   │       │   ├── bdd/
│   │       │   │   ├── Makefile.am
│   │       │   │   ├── Makefile.in
│   │       │   │   ├── assignments.c
│   │       │   │   ├── basics.c
│   │       │   │   ├── bdd-iterator.c
│   │       │   │   ├── expanded.c
│   │       │   │   ├── reachable.c
│   │       │   │   ├── read.c
│   │       │   │   └── write.c
│   │       │   ├── cmake/
│   │       │   │   └── FindCTargets.cmake
│   │       │   ├── general.c
│   │       │   ├── include/
│   │       │   │   └── ipset/
│   │       │   │       ├── bdd/
│   │       │   │       │   └── nodes.h
│   │       │   │       ├── bits.h
│   │       │   │       ├── errors.h
│   │       │   │       ├── ipset.h
│   │       │   │       └── logging.h
│   │       │   ├── map/
│   │       │   │   ├── Makefile.am
│   │       │   │   ├── Makefile.in
│   │       │   │   ├── allocation.c
│   │       │   │   ├── inspection-template.c.in
│   │       │   │   ├── inspection.c
│   │       │   │   ├── ipv4_map.c
│   │       │   │   ├── ipv6_map.c
│   │       │   │   └── storage.c
│   │       │   └── set/
│   │       │       ├── Makefile.am
│   │       │       ├── Makefile.in
│   │       │       ├── allocation.c
│   │       │       ├── inspection-template.c.in
│   │       │       ├── inspection.c
│   │       │       ├── ipv4_set.c
│   │       │       ├── ipv6_set.c
│   │       │       ├── iterator.c
│   │       │       └── storage.c
│   │       ├── libsodium/
│   │       │   ├── .travis.yml
│   │       │   ├── AUTHORS
│   │       │   ├── CMakeLists.txt
│   │       │   ├── ChangeLog
│   │       │   ├── Makefile.am
│   │       │   ├── Makefile.in
│   │       │   ├── README
│   │       │   ├── README.markdown
│   │       │   ├── THANKS
│   │       │   ├── autogen.sh
│   │       │   ├── build-aux/
│   │       │   │   ├── config.guess
│   │       │   │   ├── config.sub
│   │       │   │   ├── depcomp
│   │       │   │   ├── install-sh
│   │       │   │   ├── ltmain.sh
│   │       │   │   └── missing
│   │       │   ├── configure
│   │       │   ├── configure.ac
│   │       │   ├── libsodium.pc.in
│   │       │   ├── libsodium.sln
│   │       │   ├── libsodium.vcxproj
│   │       │   ├── libsodium.vcxproj.filters
│   │       │   ├── m4/
│   │       │   │   ├── ax_check_compile_flag.m4
│   │       │   │   ├── ax_check_define.m4
│   │       │   │   ├── ax_check_gnu_make.m4
│   │       │   │   ├── ax_check_link_flag.m4
│   │       │   │   ├── ld-output-def.m4
│   │       │   │   └── pkg.m4
│   │       │   ├── packaging/
│   │       │   │   └── nuget/
│   │       │   │       ├── package.bat
│   │       │   │       ├── package.config
│   │       │   │       └── package.gsl
│   │       │   ├── src/
│   │       │   │   ├── Makefile.am
│   │       │   │   ├── Makefile.in
│   │       │   │   └── libsodium/
│   │       │   │       ├── Makefile.am
│   │       │   │       ├── Makefile.in
│   │       │   │       ├── crypto_aead/
│   │       │   │       │   ├── aes256gcm/
│   │       │   │       │   │   └── aesni/
│   │       │   │       │   │       └── aead_aes256gcm_aesni.c
│   │       │   │       │   └── chacha20poly1305/
│   │       │   │       │       └── sodium/
│   │       │   │       │           └── aead_chacha20poly1305.c
│   │       │   │       ├── crypto_auth/
│   │       │   │       │   ├── crypto_auth.c
│   │       │   │       │   ├── hmacsha256/
│   │       │   │       │   │   ├── auth_hmacsha256_api.c
│   │       │   │       │   │   └── cp/
│   │       │   │       │   │       ├── hmac_hmacsha256.c
│   │       │   │       │   │       └── verify_hmacsha256.c
│   │       │   │       │   ├── hmacsha512/
│   │       │   │       │   │   ├── auth_hmacsha512_api.c
│   │       │   │       │   │   └── cp/
│   │       │   │       │   │       ├── hmac_hmacsha512.c
│   │       │   │       │   │       └── verify_hmacsha512.c
│   │       │   │       │   └── hmacsha512256/
│   │       │   │       │       ├── auth_hmacsha512256_api.c
│   │       │   │       │       └── cp/
│   │       │   │       │           ├── hmac_hmacsha512256.c
│   │       │   │       │           └── verify_hmacsha512256.c
│   │       │   │       ├── crypto_box/
│   │       │   │       │   ├── crypto_box.c
│   │       │   │       │   ├── crypto_box_easy.c
│   │       │   │       │   ├── crypto_box_seal.c
│   │       │   │       │   └── curve25519xsalsa20poly1305/
│   │       │   │       │       ├── box_curve25519xsalsa20poly1305_api.c
│   │       │   │       │       └── ref/
│   │       │   │       │           ├── after_curve25519xsalsa20poly1305.c
│   │       │   │       │           ├── before_curve25519xsalsa20poly1305.c
│   │       │   │       │           ├── box_curve25519xsalsa20poly1305.c
│   │       │   │       │           └── keypair_curve25519xsalsa20poly1305.c
│   │       │   │       ├── crypto_core/
│   │       │   │       │   ├── hsalsa20/
│   │       │   │       │   │   ├── core_hsalsa20_api.c
│   │       │   │       │   │   └── ref2/
│   │       │   │       │   │       └── core_hsalsa20.c
│   │       │   │       │   ├── salsa20/
│   │       │   │       │   │   ├── core_salsa20_api.c
│   │       │   │       │   │   └── ref/
│   │       │   │       │   │       └── core_salsa20.c
│   │       │   │       │   ├── salsa2012/
│   │       │   │       │   │   ├── core_salsa2012_api.c
│   │       │   │       │   │   └── ref/
│   │       │   │       │   │       └── core_salsa2012.c
│   │       │   │       │   └── salsa208/
│   │       │   │       │       ├── core_salsa208_api.c
│   │       │   │       │       └── ref/
│   │       │   │       │           └── core_salsa208.c
│   │       │   │       ├── crypto_generichash/
│   │       │   │       │   ├── blake2/
│   │       │   │       │   │   ├── generichash_blake2_api.c
│   │       │   │       │   │   └── ref/
│   │       │   │       │   │       ├── blake2-impl.h
│   │       │   │       │   │       ├── blake2.h
│   │       │   │       │   │       ├── blake2b-compress-ref.c
│   │       │   │       │   │       ├── blake2b-compress-sse41.c
│   │       │   │       │   │       ├── blake2b-compress-ssse3.c
│   │       │   │       │   │       ├── blake2b-load-sse2.h
│   │       │   │       │   │       ├── blake2b-load-sse41.h
│   │       │   │       │   │       ├── blake2b-ref.c
│   │       │   │       │   │       ├── blake2b-round.h
│   │       │   │       │   │       └── generichash_blake2b.c
│   │       │   │       │   └── crypto_generichash.c
│   │       │   │       ├── crypto_hash/
│   │       │   │       │   ├── crypto_hash.c
│   │       │   │       │   ├── sha256/
│   │       │   │       │   │   ├── cp/
│   │       │   │       │   │   │   └── hash_sha256.c
│   │       │   │       │   │   └── hash_sha256_api.c
│   │       │   │       │   └── sha512/
│   │       │   │       │       ├── cp/
│   │       │   │       │       │   └── hash_sha512.c
│   │       │   │       │       └── hash_sha512_api.c
│   │       │   │       ├── crypto_onetimeauth/
│   │       │   │       │   ├── crypto_onetimeauth.c
│   │       │   │       │   └── poly1305/
│   │       │   │       │       ├── donna/
│   │       │   │       │       │   ├── poly1305_donna.c
│   │       │   │       │       │   ├── poly1305_donna.h
│   │       │   │       │       │   ├── poly1305_donna32.h
│   │       │   │       │       │   └── poly1305_donna64.h
│   │       │   │       │       ├── onetimeauth_poly1305.c
│   │       │   │       │       ├── onetimeauth_poly1305.h
│   │       │   │       │       └── sse2/
│   │       │   │       │           ├── poly1305_sse2.c
│   │       │   │       │           └── poly1305_sse2.h
│   │       │   │       ├── crypto_pwhash/
│   │       │   │       │   └── scryptsalsa208sha256/
│   │       │   │       │       ├── crypto_scrypt-common.c
│   │       │   │       │       ├── crypto_scrypt.h
│   │       │   │       │       ├── nosse/
│   │       │   │       │       │   └── pwhash_scryptsalsa208sha256_nosse.c
│   │       │   │       │       ├── pbkdf2-sha256.c
│   │       │   │       │       ├── pbkdf2-sha256.h
│   │       │   │       │       ├── pwhash_scryptsalsa208sha256.c
│   │       │   │       │       ├── scrypt_platform.c
│   │       │   │       │       ├── sse/
│   │       │   │       │       │   └── pwhash_scryptsalsa208sha256_sse.c
│   │       │   │       │       └── sysendian.h
│   │       │   │       ├── crypto_scalarmult/
│   │       │   │       │   ├── crypto_scalarmult.c
│   │       │   │       │   └── curve25519/
│   │       │   │       │       ├── donna_c64/
│   │       │   │       │       │   ├── curve25519_donna_c64.c
│   │       │   │       │       │   └── curve25519_donna_c64.h
│   │       │   │       │       ├── ref10/
│   │       │   │       │       │   ├── curve25519_ref10.c
│   │       │   │       │       │   ├── curve25519_ref10.h
│   │       │   │       │       │   ├── fe.h
│   │       │   │       │       │   ├── fe_0_curve25519_ref10.c
│   │       │   │       │       │   ├── fe_1_curve25519_ref10.c
│   │       │   │       │       │   ├── fe_add_curve25519_ref10.c
│   │       │   │       │       │   ├── fe_copy_curve25519_ref10.c
│   │       │   │       │       │   ├── fe_cswap_curve25519_ref10.c
│   │       │   │       │       │   ├── fe_frombytes_curve25519_ref10.c
│   │       │   │       │       │   ├── fe_invert_curve25519_ref10.c
│   │       │   │       │       │   ├── fe_mul121666_curve25519_ref10.c
│   │       │   │       │       │   ├── fe_mul_curve25519_ref10.c
│   │       │   │       │       │   ├── fe_sq_curve25519_ref10.c
│   │       │   │       │       │   ├── fe_sub_curve25519_ref10.c
│   │       │   │       │       │   ├── fe_tobytes_curve25519_ref10.c
│   │       │   │       │       │   ├── montgomery.h
│   │       │   │       │       │   └── pow225521.h
│   │       │   │       │       ├── sandy2x/
│   │       │   │       │       │   ├── consts.S
│   │       │   │       │       │   ├── consts_namespace.h
│   │       │   │       │       │   ├── curve25519_sandy2x.c
│   │       │   │       │       │   ├── curve25519_sandy2x.h
│   │       │   │       │       │   ├── fe.h
│   │       │   │       │       │   ├── fe51.h
│   │       │   │       │       │   ├── fe51_invert.c
│   │       │   │       │       │   ├── fe51_mul.S
│   │       │   │       │       │   ├── fe51_namespace.h
│   │       │   │       │       │   ├── fe51_nsquare.S
│   │       │   │       │       │   ├── fe51_pack.S
│   │       │   │       │       │   ├── fe_frombytes_sandy2x.c
│   │       │   │       │       │   ├── ladder.S
│   │       │   │       │       │   ├── ladder.h
│   │       │   │       │       │   ├── ladder_base.S
│   │       │   │       │       │   ├── ladder_base.h
│   │       │   │       │       │   ├── ladder_base_namespace.h
│   │       │   │       │       │   ├── ladder_namespace.h
│   │       │   │       │       │   └── sandy2x.S
│   │       │   │       │       ├── scalarmult_curve25519.c
│   │       │   │       │       └── scalarmult_curve25519.h
│   │       │   │       ├── crypto_secretbox/
│   │       │   │       │   ├── crypto_secretbox.c
│   │       │   │       │   ├── crypto_secretbox_easy.c
│   │       │   │       │   └── xsalsa20poly1305/
│   │       │   │       │       ├── ref/
│   │       │   │       │       │   └── box_xsalsa20poly1305.c
│   │       │   │       │       └── secretbox_xsalsa20poly1305_api.c
│   │       │   │       ├── crypto_shorthash/
│   │       │   │       │   ├── crypto_shorthash.c
│   │       │   │       │   └── siphash24/
│   │       │   │       │       ├── ref/
│   │       │   │       │       │   └── shorthash_siphash24.c
│   │       │   │       │       └── shorthash_siphash24_api.c
│   │       │   │       ├── crypto_sign/
│   │       │   │       │   ├── crypto_sign.c
│   │       │   │       │   └── ed25519/
│   │       │   │       │       ├── description
│   │       │   │       │       ├── ref10/
│   │       │   │       │       │   ├── base.h
│   │       │   │       │       │   ├── base2.h
│   │       │   │       │       │   ├── d.h
│   │       │   │       │       │   ├── d2.h
│   │       │   │       │       │   ├── fe.h
│   │       │   │       │       │   ├── fe_0.c
│   │       │   │       │       │   ├── fe_1.c
│   │       │   │       │       │   ├── fe_add.c
│   │       │   │       │       │   ├── fe_cmov.c
│   │       │   │       │       │   ├── fe_copy.c
│   │       │   │       │       │   ├── fe_frombytes.c
│   │       │   │       │       │   ├── fe_invert.c
│   │       │   │       │       │   ├── fe_isnegative.c
│   │       │   │       │       │   ├── fe_isnonzero.c
│   │       │   │       │       │   ├── fe_mul.c
│   │       │   │       │       │   ├── fe_neg.c
│   │       │   │       │       │   ├── fe_pow22523.c
│   │       │   │       │       │   ├── fe_sq.c
│   │       │   │       │       │   ├── fe_sq2.c
│   │       │   │       │       │   ├── fe_sub.c
│   │       │   │       │       │   ├── fe_tobytes.c
│   │       │   │       │       │   ├── ge.h
│   │       │   │       │       │   ├── ge_add.c
│   │       │   │       │       │   ├── ge_add.h
│   │       │   │       │       │   ├── ge_double_scalarmult.c
│   │       │   │       │       │   ├── ge_frombytes.c
│   │       │   │       │       │   ├── ge_madd.c
│   │       │   │       │       │   ├── ge_madd.h
│   │       │   │       │       │   ├── ge_msub.c
│   │       │   │       │       │   ├── ge_msub.h
│   │       │   │       │       │   ├── ge_p1p1_to_p2.c
│   │       │   │       │       │   ├── ge_p1p1_to_p3.c
│   │       │   │       │       │   ├── ge_p2_0.c
│   │       │   │       │       │   ├── ge_p2_dbl.c
│   │       │   │       │       │   ├── ge_p2_dbl.h
│   │       │   │       │       │   ├── ge_p3_0.c
│   │       │   │       │       │   ├── ge_p3_dbl.c
│   │       │   │       │       │   ├── ge_p3_to_cached.c
│   │       │   │       │       │   ├── ge_p3_to_p2.c
│   │       │   │       │       │   ├── ge_p3_tobytes.c
│   │       │   │       │       │   ├── ge_precomp_0.c
│   │       │   │       │       │   ├── ge_scalarmult_base.c
│   │       │   │       │       │   ├── ge_sub.c
│   │       │   │       │       │   ├── ge_sub.h
│   │       │   │       │       │   ├── ge_tobytes.c
│   │       │   │       │       │   ├── keypair.c
│   │       │   │       │       │   ├── obsolete.c
│   │       │   │       │       │   ├── open.c
│   │       │   │       │       │   ├── pow22523.h
│   │       │   │       │       │   ├── pow225521.h
│   │       │   │       │       │   ├── sc.h
│   │       │   │       │       │   ├── sc_muladd.c
│   │       │   │       │       │   ├── sc_reduce.c
│   │       │   │       │       │   ├── sign.c
│   │       │   │       │       │   └── sqrtm1.h
│   │       │   │       │       └── sign_ed25519_api.c
│   │       │   │       ├── crypto_stream/
│   │       │   │       │   ├── aes128ctr/
│   │       │   │       │   │   ├── portable/
│   │       │   │       │   │   │   ├── afternm_aes128ctr.c
│   │       │   │       │   │   │   ├── beforenm_aes128ctr.c
│   │       │   │       │   │   │   ├── common.h
│   │       │   │       │   │   │   ├── common_aes128ctr.c
│   │       │   │       │   │   │   ├── consts.h
│   │       │   │       │   │   │   ├── consts_aes128ctr.c
│   │       │   │       │   │   │   ├── int128.h
│   │       │   │       │   │   │   ├── int128_aes128ctr.c
│   │       │   │       │   │   │   ├── stream_aes128ctr.c
│   │       │   │       │   │   │   ├── types.h
│   │       │   │       │   │   │   └── xor_afternm_aes128ctr.c
│   │       │   │       │   │   └── stream_aes128ctr_api.c
│   │       │   │       │   ├── chacha20/
│   │       │   │       │   │   ├── ref/
│   │       │   │       │   │   │   ├── stream_chacha20_ref.c
│   │       │   │       │   │   │   └── stream_chacha20_ref.h
│   │       │   │       │   │   ├── stream_chacha20.c
│   │       │   │       │   │   ├── stream_chacha20.h
│   │       │   │       │   │   └── vec/
│   │       │   │       │   │       ├── stream_chacha20_vec.c
│   │       │   │       │   │       └── stream_chacha20_vec.h
│   │       │   │       │   ├── crypto_stream.c
│   │       │   │       │   ├── salsa20/
│   │       │   │       │   │   ├── amd64_xmm6/
│   │       │   │       │   │   │   └── stream_salsa20_amd64_xmm6.S
│   │       │   │       │   │   ├── ref/
│   │       │   │       │   │   │   ├── stream_salsa20_ref.c
│   │       │   │       │   │   │   └── xor_salsa20_ref.c
│   │       │   │       │   │   └── stream_salsa20_api.c
│   │       │   │       │   ├── salsa2012/
│   │       │   │       │   │   ├── ref/
│   │       │   │       │   │   │   ├── stream_salsa2012.c
│   │       │   │       │   │   │   └── xor_salsa2012.c
│   │       │   │       │   │   └── stream_salsa2012_api.c
│   │       │   │       │   ├── salsa208/
│   │       │   │       │   │   ├── ref/
│   │       │   │       │   │   │   ├── stream_salsa208.c
│   │       │   │       │   │   │   └── xor_salsa208.c
│   │       │   │       │   │   └── stream_salsa208_api.c
│   │       │   │       │   └── xsalsa20/
│   │       │   │       │       ├── ref/
│   │       │   │       │       │   ├── stream_xsalsa20.c
│   │       │   │       │       │   └── xor_xsalsa20.c
│   │       │   │       │       └── stream_xsalsa20_api.c
│   │       │   │       ├── crypto_verify/
│   │       │   │       │   ├── 16/
│   │       │   │       │   │   ├── ref/
│   │       │   │       │   │   │   └── verify_16.c
│   │       │   │       │   │   └── verify_16_api.c
│   │       │   │       │   ├── 32/
│   │       │   │       │   │   ├── ref/
│   │       │   │       │   │   │   └── verify_32.c
│   │       │   │       │   │   └── verify_32_api.c
│   │       │   │       │   └── 64/
│   │       │   │       │       ├── ref/
│   │       │   │       │       │   └── verify_64.c
│   │       │   │       │       └── verify_64_api.c
│   │       │   │       ├── include/
│   │       │   │       │   ├── Makefile.am
│   │       │   │       │   ├── Makefile.in
│   │       │   │       │   ├── sodium/
│   │       │   │       │   │   ├── core.h
│   │       │   │       │   │   ├── crypto_aead_aes256gcm.h
│   │       │   │       │   │   ├── crypto_aead_chacha20poly1305.h
│   │       │   │       │   │   ├── crypto_auth.h
│   │       │   │       │   │   ├── crypto_auth_hmacsha256.h
│   │       │   │       │   │   ├── crypto_auth_hmacsha512.h
│   │       │   │       │   │   ├── crypto_auth_hmacsha512256.h
│   │       │   │       │   │   ├── crypto_box.h
│   │       │   │       │   │   ├── crypto_box_curve25519xsalsa20poly1305.h
│   │       │   │       │   │   ├── crypto_core_hsalsa20.h
│   │       │   │       │   │   ├── crypto_core_salsa20.h
│   │       │   │       │   │   ├── crypto_core_salsa2012.h
│   │       │   │       │   │   ├── crypto_core_salsa208.h
│   │       │   │       │   │   ├── crypto_generichash.h
│   │       │   │       │   │   ├── crypto_generichash_blake2b.h
│   │       │   │       │   │   ├── crypto_hash.h
│   │       │   │       │   │   ├── crypto_hash_sha256.h
│   │       │   │       │   │   ├── crypto_hash_sha512.h
│   │       │   │       │   │   ├── crypto_int32.h
│   │       │   │       │   │   ├── crypto_int64.h
│   │       │   │       │   │   ├── crypto_onetimeauth.h
│   │       │   │       │   │   ├── crypto_onetimeauth_poly1305.h
│   │       │   │       │   │   ├── crypto_pwhash_scryptsalsa208sha256.h
│   │       │   │       │   │   ├── crypto_scalarmult.h
│   │       │   │       │   │   ├── crypto_scalarmult_curve25519.h
│   │       │   │       │   │   ├── crypto_secretbox.h
│   │       │   │       │   │   ├── crypto_secretbox_xsalsa20poly1305.h
│   │       │   │       │   │   ├── crypto_shorthash.h
│   │       │   │       │   │   ├── crypto_shorthash_siphash24.h
│   │       │   │       │   │   ├── crypto_sign.h
│   │       │   │       │   │   ├── crypto_sign_ed25519.h
│   │       │   │       │   │   ├── crypto_sign_edwards25519sha512batch.h
│   │       │   │       │   │   ├── crypto_stream.h
│   │       │   │       │   │   ├── crypto_stream_aes128ctr.h
│   │       │   │       │   │   ├── crypto_stream_chacha20.h
│   │       │   │       │   │   ├── crypto_stream_salsa20.h
│   │       │   │       │   │   ├── crypto_stream_salsa2012.h
│   │       │   │       │   │   ├── crypto_stream_salsa208.h
│   │       │   │       │   │   ├── crypto_stream_xsalsa20.h
│   │       │   │       │   │   ├── crypto_uint16.h
│   │       │   │       │   │   ├── crypto_uint32.h
│   │       │   │       │   │   ├── crypto_uint64.h
│   │       │   │       │   │   ├── crypto_uint8.h
│   │       │   │       │   │   ├── crypto_verify_16.h
│   │       │   │       │   │   ├── crypto_verify_32.h
│   │       │   │       │   │   ├── crypto_verify_64.h
│   │       │   │       │   │   ├── export.h
│   │       │   │       │   │   ├── randombytes.h
│   │       │   │       │   │   ├── randombytes_nativeclient.h
│   │       │   │       │   │   ├── randombytes_salsa20_random.h
│   │       │   │       │   │   ├── randombytes_sysrandom.h
│   │       │   │       │   │   ├── runtime.h
│   │       │   │       │   │   ├── utils.h
│   │       │   │       │   │   └── version.h.in
│   │       │   │       │   └── sodium.h
│   │       │   │       ├── randombytes/
│   │       │   │       │   ├── nativeclient/
│   │       │   │       │   │   └── randombytes_nativeclient.c
│   │       │   │       │   ├── randombytes.c
│   │       │   │       │   ├── salsa20/
│   │       │   │       │   │   └── randombytes_salsa20_random.c
│   │       │   │       │   └── sysrandom/
│   │       │   │       │       └── randombytes_sysrandom.c
│   │       │   │       └── sodium/
│   │       │   │           ├── core.c
│   │       │   │           ├── runtime.c
│   │       │   │           ├── utils.c
│   │       │   │           └── version.c
│   │       │   └── test/
│   │       │       ├── HAVE_AMD64_ASM.c
│   │       │       ├── HAVE_CPUID.c
│   │       │       ├── HAVE_TI_MODE.c
│   │       │       ├── HAVE_WEAK_SYMBOLS.c
│   │       │       ├── IS_STDC_LIMIT_MACROS_NEEDED.c
│   │       │       ├── Makefile.am
│   │       │       ├── default/
│   │       │       │   ├── CMakeLists.txt
│   │       │       │   ├── Makefile.am
│   │       │       │   ├── aead_chacha20poly1305.c
│   │       │       │   ├── auth.c
│   │       │       │   ├── auth2.c
│   │       │       │   ├── auth3.c
│   │       │       │   ├── auth5.c
│   │       │       │   ├── auth6.c
│   │       │       │   ├── auth7.c
│   │       │       │   ├── box.c
│   │       │       │   ├── box2.c
│   │       │       │   ├── box7.c
│   │       │       │   ├── box8.c
│   │       │       │   ├── box_easy.c
│   │       │       │   ├── box_easy2.c
│   │       │       │   ├── box_seal.c
│   │       │       │   ├── box_seed.c
│   │       │       │   ├── chacha20.c
│   │       │       │   ├── cmptest.h
│   │       │       │   ├── core1.c
│   │       │       │   ├── core2.c
│   │       │       │   ├── core3.c
│   │       │       │   ├── core4.c
│   │       │       │   ├── core5.c
│   │       │       │   ├── core6.c
│   │       │       │   ├── ed25519_convert.c
│   │       │       │   ├── generichash.c
│   │       │       │   ├── generichash2.c
│   │       │       │   ├── generichash3.c
│   │       │       │   ├── hash.c
│   │       │       │   ├── hash3.c
│   │       │       │   ├── onetimeauth.c
│   │       │       │   ├── onetimeauth2.c
│   │       │       │   ├── onetimeauth7.c
│   │       │       │   ├── pre.js.inc
│   │       │       │   ├── pwhash.c
│   │       │       │   ├── pwhash_scrypt_ll.c
│   │       │       │   ├── randombytes.c
│   │       │       │   ├── scalarmult.c
│   │       │       │   ├── scalarmult2.c
│   │       │       │   ├── scalarmult5.c
│   │       │       │   ├── scalarmult6.c
│   │       │       │   ├── scalarmult7.c
│   │       │       │   ├── secretbox.c
│   │       │       │   ├── secretbox2.c
│   │       │       │   ├── secretbox7.c
│   │       │       │   ├── secretbox8.c
│   │       │       │   ├── secretbox_easy.c
│   │       │       │   ├── secretbox_easy2.c
│   │       │       │   ├── shorthash.c
│   │       │       │   ├── sign.c
│   │       │       │   ├── sodium_core.c
│   │       │       │   ├── sodium_utils.c
│   │       │       │   ├── sodium_utils2.c
│   │       │       │   ├── sodium_utils3.c
│   │       │       │   ├── sodium_version.c
│   │       │       │   ├── stream.c
│   │       │       │   ├── stream2.c
│   │       │       │   ├── stream3.c
│   │       │       │   ├── stream4.c
│   │       │       │   ├── verify1.c
│   │       │       │   └── wintest.bat
│   │       │       └── quirks/
│   │       │           └── quirks.h
│   │       ├── libudns/
│   │       │   ├── CMakeLists.txt
│   │       │   ├── COPYING.LGPL
│   │       │   ├── Makefile.am
│   │       │   ├── Makefile.in
│   │       │   ├── NEWS
│   │       │   ├── NOTES
│   │       │   ├── TODO
│   │       │   ├── dnsget.1
│   │       │   ├── dnsget.c
│   │       │   ├── ex-rdns.c
│   │       │   ├── getopt.c
│   │       │   ├── inet_XtoX.c
│   │       │   ├── rblcheck.1
│   │       │   ├── rblcheck.c
│   │       │   ├── udns.3
│   │       │   ├── udns.h
│   │       │   ├── udns_XtoX.c
│   │       │   ├── udns_bl.c
│   │       │   ├── udns_codes.c
│   │       │   ├── udns_dn.c
│   │       │   ├── udns_dntosp.c
│   │       │   ├── udns_init.c
│   │       │   ├── udns_jran.c
│   │       │   ├── udns_misc.c
│   │       │   ├── udns_parse.c
│   │       │   ├── udns_resolver.c
│   │       │   ├── udns_rr_a.c
│   │       │   ├── udns_rr_mx.c
│   │       │   ├── udns_rr_naptr.c
│   │       │   ├── udns_rr_ptr.c
│   │       │   ├── udns_rr_srv.c
│   │       │   └── udns_rr_txt.c
│   │       ├── m4/
│   │       │   ├── ax_pthread.m4
│   │       │   ├── ax_tls.m4
│   │       │   ├── inet_ntop.m4
│   │       │   ├── libtool.m4
│   │       │   ├── ltoptions.m4
│   │       │   ├── ltsugar.m4
│   │       │   ├── ltversion.m4
│   │       │   ├── lt~obsolete.m4
│   │       │   ├── mbedtls.m4
│   │       │   ├── openssl.m4
│   │       │   ├── pcre.m4
│   │       │   ├── polarssl.m4
│   │       │   ├── stack-protector.m4
│   │       │   └── zlib.m4
│   │       ├── rpm/
│   │       │   ├── SOURCES/
│   │       │   │   └── etc/
│   │       │   │       └── init.d/
│   │       │   │           └── shadowsocks-libev
│   │       │   ├── SPECS/
│   │       │   │   └── shadowsocks-libev.spec.in
│   │       │   └── genrpm.sh
│   │       ├── server/
│   │       │   ├── Makefile.am
│   │       │   ├── Makefile.in
│   │       │   ├── acl.c
│   │       │   ├── acl.h
│   │       │   ├── auth.c
│   │       │   ├── auth.h
│   │       │   ├── base64.c
│   │       │   ├── base64.h
│   │       │   ├── cache.c
│   │       │   ├── cache.h
│   │       │   ├── check.c
│   │       │   ├── common.h
│   │       │   ├── crc32.c
│   │       │   ├── encrypt.c
│   │       │   ├── encrypt.h
│   │       │   ├── http.c
│   │       │   ├── http.h
│   │       │   ├── http_simple.c
│   │       │   ├── http_simple.h
│   │       │   ├── jconf.c
│   │       │   ├── jconf.h
│   │       │   ├── json.c
│   │       │   ├── json.h
│   │       │   ├── list.c
│   │       │   ├── list.h
│   │       │   ├── netutils.c
│   │       │   ├── netutils.h
│   │       │   ├── obfs.c
│   │       │   ├── obfs.h
│   │       │   ├── obfsutil.c
│   │       │   ├── protocol.h
│   │       │   ├── resolv.c
│   │       │   ├── resolv.h
│   │       │   ├── rule.c
│   │       │   ├── rule.h
│   │       │   ├── server.c
│   │       │   ├── server.h
│   │       │   ├── tls.c
│   │       │   ├── tls.h
│   │       │   ├── tls1.2_ticket.c
│   │       │   ├── tls1.2_ticket.h
│   │       │   ├── udprelay.c
│   │       │   ├── udprelay.h
│   │       │   ├── uthash.h
│   │       │   ├── utils.c
│   │       │   ├── utils.h
│   │       │   ├── verify.c
│   │       │   └── verify.h
│   │       ├── shadowsocks-libev.pc.in
│   │       └── src/
│   │           ├── CMakeLists.txt
│   │           ├── Makefile.am
│   │           ├── Makefile.in
│   │           ├── acl.c
│   │           ├── acl.h
│   │           ├── android.c
│   │           ├── cache.c
│   │           ├── cache.h
│   │           ├── common.h
│   │           ├── encrypt.c
│   │           ├── encrypt.h
│   │           ├── http.c
│   │           ├── http.h
│   │           ├── includeobfs.h
│   │           ├── jconf.c
│   │           ├── jconf.h
│   │           ├── json.c
│   │           ├── json.h
│   │           ├── local.c
│   │           ├── local.h
│   │           ├── manager.c
│   │           ├── manager.h
│   │           ├── netutils.c
│   │           ├── netutils.h
│   │           ├── obfs/
│   │           │   ├── auth.c
│   │           │   ├── auth.h
│   │           │   ├── auth_chain.c
│   │           │   ├── auth_chain.h
│   │           │   ├── base64.c
│   │           │   ├── base64.h
│   │           │   ├── crc32.c
│   │           │   ├── crc32.h
│   │           │   ├── http_simple.c
│   │           │   ├── http_simple.h
│   │           │   ├── obfs.c
│   │           │   ├── obfs.h
│   │           │   ├── obfsutil.c
│   │           │   ├── obfsutil.h
│   │           │   ├── tls1.2_ticket.c
│   │           │   ├── tls1.2_ticket.h
│   │           │   ├── verify.c
│   │           │   └── verify.h
│   │           ├── protocol.h
│   │           ├── redir.c
│   │           ├── redir.h
│   │           ├── resolv.c
│   │           ├── resolv.h
│   │           ├── rule.c
│   │           ├── rule.h
│   │           ├── server.c
│   │           ├── server.h
│   │           ├── shadowsocks.h
│   │           ├── socks5.h
│   │           ├── ss-nat
│   │           ├── ssrlink.py
│   │           ├── tls.c
│   │           ├── tls.h
│   │           ├── tunnel.c
│   │           ├── tunnel.h
│   │           ├── udprelay.c
│   │           ├── udprelay.h
│   │           ├── uthash.h
│   │           ├── utils.c
│   │           ├── utils.h
│   │           ├── win32.c
│   │           └── win32.h
│   ├── simple-obfs/
│   │   └── Makefile
│   ├── tcping/
│   │   ├── Makefile
│   │   └── src/
│   │       ├── Makefile
│   │       ├── license.txt
│   │       ├── main.c
│   │       ├── readme.txt
│   │       ├── tcp.c
│   │       └── tcp.h
│   ├── trojan/
│   │   ├── Makefile
│   │   ├── boost-version.mk
│   │   └── patches/
│   │       ├── 001-force-openssl-version.patch
│   │       └── 002-Fix-boost1.89-build.patch
│   ├── tuic-client/
│   │   ├── Makefile
│   │   └── patches/
│   │       └── 001-Fix-rust-stable-build.patch
│   ├── v2ray-core/
│   │   └── Makefile
│   ├── v2ray-plugin/
│   │   └── Makefile
│   ├── v2raya/
│   │   ├── Makefile
│   │   └── files/
│   │       ├── v2raya.config
│   │       └── v2raya.init
│   ├── xray-core/
│   │   └── Makefile
│   └── xray-plugin/
│       └── Makefile
├── luci-app-store/
│   ├── luci/
│   │   ├── luci-app-store/
│   │   │   ├── Makefile
│   │   │   ├── luasrc/
│   │   │   │   ├── controller/
│   │   │   │   │   └── store.lua
│   │   │   │   └── view/
│   │   │   │       └── store/
│   │   │   │           └── main.htm
│   │   │   ├── root/
│   │   │   │   ├── bin/
│   │   │   │   │   └── is-opkg
│   │   │   │   ├── etc/
│   │   │   │   │   ├── config/
│   │   │   │   │   │   └── istore
│   │   │   │   │   ├── init.d/
│   │   │   │   │   │   └── istore
│   │   │   │   │   └── uci-defaults/
│   │   │   │   │       └── luci-app-store
│   │   │   │   └── usr/
│   │   │   │       ├── libexec/
│   │   │   │       │   └── istore/
│   │   │   │       │       ├── backup
│   │   │   │       │       ├── docker
│   │   │   │       │       ├── ipkg-build
│   │   │   │       │       ├── ipv4-bin/
│   │   │   │       │       │   ├── curl
│   │   │   │       │       │   └── wget
│   │   │   │       │       └── overlay-backup
│   │   │   │       └── share/
│   │   │   │           └── opkg/
│   │   │   │               └── intercept/
│   │   │   │                   └── rm
│   │   │   ├── src/
│   │   │   │   ├── Makefile
│   │   │   │   ├── compat.conf
│   │   │   │   ├── dummy/
│   │   │   │   │   └── package.mk
│   │   │   │   ├── key-build.pub
│   │   │   │   └── po/
│   │   │   │       ├── templates/
│   │   │   │       │   └── iStore.pot
│   │   │   │       ├── zh-tw/
│   │   │   │       │   └── iStore.po
│   │   │   │       └── zh_Hans/
│   │   │   │           └── iStore.po
│   │   │   └── swagger.yaml
│   │   ├── luci-lib-taskd/
│   │   │   ├── Makefile
│   │   │   ├── htdocs/
│   │   │   │   └── luci-static/
│   │   │   │       └── resources/
│   │   │   │           └── tasks/
│   │   │   │               ├── tasks.css
│   │   │   │               └── tasks.js
│   │   │   ├── luasrc/
│   │   │   │   ├── controller/
│   │   │   │   │   └── tasks-lib.lua
│   │   │   │   ├── model/
│   │   │   │   │   └── tasks.lua
│   │   │   │   └── view/
│   │   │   │       └── tasks/
│   │   │   │           ├── docker.htm
│   │   │   │           └── embed.htm
│   │   │   └── src/
│   │   │       ├── Makefile
│   │   │       ├── dummy/
│   │   │       │   └── package.mk
│   │   │       └── po/
│   │   │           └── zh_Hans/
│   │   │               └── lib-tasks.po
│   │   ├── luci-lib-xterm/
│   │   │   ├── Makefile
│   │   │   ├── htdocs/
│   │   │   │   └── luci-static/
│   │   │   │       └── resources/
│   │   │   │           └── xterm/
│   │   │   │               ├── xterm.css
│   │   │   │               └── xterm.js
│   │   │   └── luasrc/
│   │   │       └── view/
│   │   │           └── xterm/
│   │   │               └── embed.htm
│   │   └── taskd/
│   │       ├── Makefile
│   │       └── files/
│   │           ├── taskd.sh
│   │           └── tasks.init
│   └── translations/
│       ├── en/
│       │   └── app.po
│       ├── templates/
│       │   └── app.pot
│       └── zh_Hans/
│           └── app.po
├── luci-app-supervisord/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── supervisord.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── supervisord.lua
│   │   └── view/
│   │       └── supervisord/
│   │           ├── index.htm
│   │           ├── list.htm
│   │           ├── log.htm
│   │           └── version.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── supervisord.po
│   └── root/
│       └── etc/
│           ├── config/
│           │   └── supervisord
│           ├── init.d/
│           │   └── supervisord
│           ├── supervisord/
│           │   ├── program/
│           │   │   └── templates
│           │   └── supervisord.conf
│           └── uci-defaults/
│               └── luci-supervisord
├── luci-app-syncthing/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── syncthing.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── syncthing.lua
│   │   └── view/
│   │       └── syncthing/
│   │           └── syncthing_status.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── syncthing.po
│   └── root/
│       ├── etc/
│       │   └── uci-defaults/
│       │       └── luci-syncthing
│       └── usr/
│           └── share/
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-syncthing.json
├── luci-app-taskplan/
│   ├── Makefile
│   ├── htdocs/
│   │   └── luci-static/
│   │       └── resources/
│   │           └── view/
│   │               └── taskplan/
│   │                   ├── log.js
│   │                   ├── scheduled.js
│   │                   └── startup.js
│   ├── po/
│   │   └── zh_Hans/
│   │       └── taskplan.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── taskplan
│       │   ├── init.d/
│       │   │   └── taskplan
│       │   ├── taskplan/
│       │   │   ├── taskplancustomscript
│       │   │   ├── taskplancustomscript2
│       │   │   └── taskplanrun
│       │   └── uci-defaults/
│       │       └── luci-taskplan
│       └── usr/
│           ├── bin/
│           │   └── taskplanhandler
│           ├── libexec/
│           │   └── rpcd/
│           │       └── luci.taskplan
│           └── share/
│               ├── luci/
│               │   └── menu.d/
│               │       └── luci-app-taskplan.json
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-taskplan.json
├── luci-app-tcpdump/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── tcpdump.lua
│   │   └── view/
│   │       └── tcpdump.htm
│   └── po/
│       └── zh_Hans/
│           └── tcpdump.po
├── luci-app-tencentddns/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── tencentddns.lua
│   │   └── model/
│   │       └── cbi/
│   │           └── tencentddns.lua
│   ├── po/
│   │   └── zh_Hans/
│   │       └── tencentddns.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── tencentddns
│       │   ├── init.d/
│       │   │   └── tencentddns
│       │   └── uci-defaults/
│       │       └── luci-tencentddns
│       └── usr/
│           ├── sbin/
│           │   └── tencentddns
│           └── share/
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-tencentddns.json
├── luci-app-timecontrol/
│   └── luci-app-timecontrol/
│       ├── Makefile
│       ├── htdocs/
│       │   └── luci-static/
│       │       └── resources/
│       │           └── view/
│       │               └── timecontrol/
│       │                   ├── basic.js
│       │                   └── log.js
│       ├── po/
│       │   └── zh_Hans/
│       │       └── timecontrol.po
│       └── root/
│           ├── etc/
│           │   ├── config/
│           │   │   └── timecontrol
│           │   ├── init.d/
│           │   │   └── timecontrol
│           │   └── uci-defaults/
│           │       └── luci-timecontrol
│           └── usr/
│               ├── bin/
│               │   ├── timecontrol
│               │   ├── timecontrol-log
│               │   └── timecontrolctrl
│               ├── libexec/
│               │   └── timecontrol-call
│               └── share/
│                   ├── luci/
│                   │   └── menu.d/
│                   │       └── luci-app-timecontrol.json
│                   └── rpcd/
│                       └── acl.d/
│                           └── luci-app-timecontrol.json
├── luci-app-udp2raw/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── udp2raw.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── udp2raw/
│   │   │           ├── general.lua
│   │   │           ├── servers-details.lua
│   │   │           └── servers.lua
│   │   └── view/
│   │       └── udp2raw/
│   │           ├── dynamiclist.htm
│   │           └── status.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── udp2raw.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── udp2raw
│       │   ├── init.d/
│       │   │   └── udp2raw
│       │   └── uci-defaults/
│       │       └── luci-udp2raw
│       └── usr/
│           └── share/
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-udp2raw.json
├── luci-app-unblockneteasemusic/
│   ├── Makefile
│   ├── htdocs/
│   │   └── luci-static/
│   │       └── resources/
│   │           └── view/
│   │               └── unblockneteasemusic/
│   │                   ├── config.js
│   │                   └── status.js
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── unblockneteasemusic
│       │   ├── init.d/
│       │   │   └── unblockneteasemusic
│       │   └── uci-defaults/
│       │       └── luci-unblockneteasemusic
│       └── usr/
│           ├── bin/
│           │   └── unm-debug
│           └── share/
│               ├── luci/
│               │   └── menu.d/
│               │       └── luci-app-unblockneteasemusic.json
│               ├── rpcd/
│               │   └── acl.d/
│               │       └── luci-app-unblockneteasemusic.json
│               └── unblockneteasemusic/
│                   ├── debugging.sh
│                   ├── log_check.sh
│                   ├── nftables.ut
│                   └── update.sh
├── luci-app-unishare/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── unishare.lua
│   │   └── model/
│   │       └── cbi/
│   │           └── unishare/
│   │               ├── index.lua
│   │               ├── share.lua
│   │               └── users.lua
│   └── po/
│       └── zh_Hans/
│           └── unishare.po
├── luci-app-watchdog/
│   ├── luci-app-watchdog/
│   │   ├── Makefile
│   │   ├── htdocs/
│   │   │   └── luci-static/
│   │   │       └── resources/
│   │   │           └── view/
│   │   │               └── watchdog/
│   │   │                   ├── basic.js
│   │   │                   └── log.js
│   │   ├── po/
│   │   │   ├── templates/
│   │   │   │   └── watchdog.pot
│   │   │   └── zh_Hans/
│   │   │       └── watchdog.po
│   │   └── root/
│   │       └── usr/
│   │           └── share/
│   │               ├── luci/
│   │               │   └── menu.d/
│   │               │       └── luci-app-watchdog.json
│   │               ├── rpcd/
│   │               │   └── acl.d/
│   │               │       └── luci-app-watchdog.json
│   │               └── watchdog/
│   │                   └── api/
│   │                       ├── device_aliases.list
│   │                       ├── ip_attribution.list
│   │                       ├── ip_blacklist
│   │                       ├── ipv4.list
│   │                       └── ipv6.list
│   └── watchdog/
│       ├── Makefile
│       └── files/
│           ├── watchdog-call.libexec
│           ├── watchdog.config
│           ├── watchdog.init
│           └── watchdog.share
├── luci-app-webd/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── webd.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── webd.lua
│   │   └── view/
│   │       └── webd/
│   │           └── webd_status.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── webd.po
│   └── root/
│       └── etc/
│           ├── config/
│           │   └── webd
│           ├── init.d/
│           │   └── webd
│           └── uci-defaults/
│               └── luci-webd
└── relevance/
    ├── OpenAppFilter/
    │   ├── luci-app-oaf/
    │   │   ├── Makefile
    │   │   ├── htdocs/
    │   │   │   └── luci-static/
    │   │   │       └── resources/
    │   │   │           └── css/
    │   │   │               └── common.css
    │   │   ├── luasrc/
    │   │   │   ├── controller/
    │   │   │   │   └── appfilter.lua
    │   │   │   ├── model/
    │   │   │   │   └── cbi/
    │   │   │   │       └── appfilter/
    │   │   │   │           ├── advance.lua
    │   │   │   │           ├── app_filter.lua
    │   │   │   │           ├── dev_status.lua
    │   │   │   │           ├── feature.lua
    │   │   │   │           ├── time.lua
    │   │   │   │           ├── time_setting.lua
    │   │   │   │           ├── user.lua
    │   │   │   │           └── user_list.lua
    │   │   │   └── view/
    │   │   │       ├── admin_network/
    │   │   │       │   ├── advance.htm
    │   │   │       │   ├── app_filter.htm
    │   │   │       │   ├── dev_status.htm
    │   │   │       │   ├── feature.htm
    │   │   │       │   ├── time.htm
    │   │   │       │   ├── user.htm
    │   │   │       │   └── user_status.htm
    │   │   │       └── cbi/
    │   │   │           ├── oaf_dvalue.htm
    │   │   │           └── oaf_upload.htm
    │   │   ├── po/
    │   │   │   └── zh_Hans/
    │   │   │       └── oaf.po
    │   │   └── root/
    │   │       ├── etc/
    │   │       │   └── uci-defaults/
    │   │       │       ├── 94_feature_3.0
    │   │       │       └── 95_time_daily_limit
    │   │       └── usr/
    │   │           └── share/
    │   │               └── rpcd/
    │   │                   └── acl.d/
    │   │                       └── luci-app-oaf.json
    │   ├── oaf/
    │   │   ├── Makefile
    │   │   └── src/
    │   │       ├── Makefile
    │   │       ├── af_client.c
    │   │       ├── af_client.h
    │   │       ├── af_client_fs.c
    │   │       ├── af_client_fs.h
    │   │       ├── af_config.c
    │   │       ├── af_config.h
    │   │       ├── af_conntrack.c
    │   │       ├── af_conntrack.h
    │   │       ├── af_log.c
    │   │       ├── af_log.h
    │   │       ├── af_rule_config.c
    │   │       ├── af_rule_config.h
    │   │       ├── af_user_config.c
    │   │       ├── af_user_config.h
    │   │       ├── af_utils.c
    │   │       ├── af_utils.h
    │   │       ├── af_whitelist_config.c
    │   │       ├── af_whitelist_config.h
    │   │       ├── app_filter.c
    │   │       ├── app_filter.h
    │   │       ├── cJSON.c
    │   │       ├── cJSON.h
    │   │       └── regexp.c
    │   └── open-app-filter/
    │       ├── Makefile
    │       ├── files/
    │       │   ├── appfilter.config
    │       │   ├── appfilter.init
    │       │   ├── feature.cfg
    │       │   ├── feature_cn.cfg
    │       │   ├── feature_en.cfg
    │       │   ├── gen_class.sh
    │       │   ├── hnat.sh
    │       │   ├── oaf_rule
    │       │   └── user_info.config
    │       └── src/
    │           ├── Makefile
    │           ├── appfilter.h
    │           ├── appfilter_config.c
    │           ├── appfilter_config.h
    │           ├── appfilter_netlink.c
    │           ├── appfilter_netlink.h
    │           ├── appfilter_ubus.c
    │           ├── appfilter_ubus.h
    │           ├── appfilter_user.c
    │           ├── appfilter_user.h
    │           ├── main.c
    │           ├── utils.c
    │           └── utils.h
    ├── WiFiPortal/
    │   ├── autokick-wiwiz/
    │   │   ├── Makefile
    │   │   ├── files/
    │   │   │   ├── etc/
    │   │   │   │   ├── config/
    │   │   │   │   │   └── autokick
    │   │   │   │   └── init.d/
    │   │   │   │       └── autokick
    │   │   │   └── usr/
    │   │   │       ├── bin/
    │   │   │       │   └── autokick.sh
    │   │   │       └── lib/
    │   │   │           └── lua/
    │   │   │               └── luci/
    │   │   │                   ├── controller/
    │   │   │                   │   └── autokick.lua
    │   │   │                   └── model/
    │   │   │                       └── cbi/
    │   │   │                           └── autokick.lua
    │   │   └── po/
    │   │       └── zh_Hans/
    │   │           └── autokick.po
    │   ├── dcc2-wiwiz/
    │   │   ├── Makefile
    │   │   ├── files/
    │   │   │   ├── rtty.config
    │   │   │   ├── rtty.init
    │   │   │   ├── uci-defaults-rtty
    │   │   │   ├── usr/
    │   │   │   │   ├── bin/
    │   │   │   │   │   └── assocnum.sh
    │   │   │   │   └── lib/
    │   │   │   │       └── lua/
    │   │   │   │           └── luci/
    │   │   │   │               ├── controller/
    │   │   │   │               │   └── rtty.lua
    │   │   │   │               └── model/
    │   │   │   │                   └── cbi/
    │   │   │   │                       └── rtty.lua
    │   │   │   └── www/
    │   │   │       └── cgi-bin/
    │   │   │           └── dvstatus
    │   │   ├── po/
    │   │   │   └── zh_Hans/
    │   │   │       └── dcc2-wiwiz.po
    │   │   └── src/
    │   │       ├── CMakeLists.txt
    │   │       ├── cmake/
    │   │       │   └── Modules/
    │   │       │       └── FindLibev.cmake
    │   │       ├── src/
    │   │       │   ├── CMakeLists.txt
    │   │       │   ├── buffer/
    │   │       │   │   ├── buffer.c
    │   │       │   │   └── buffer.h
    │   │       │   ├── command.c
    │   │       │   ├── command.h
    │   │       │   ├── config.h.in
    │   │       │   ├── file.c
    │   │       │   ├── file.h
    │   │       │   ├── filectl.c
    │   │       │   ├── http.c
    │   │       │   ├── http.h
    │   │       │   ├── list.h
    │   │       │   ├── log/
    │   │       │   │   ├── log.c
    │   │       │   │   └── log.h
    │   │       │   ├── main.c
    │   │       │   ├── net.c
    │   │       │   ├── net.h
    │   │       │   ├── rtty.c
    │   │       │   ├── rtty.h
    │   │       │   ├── ssl/
    │   │       │   │   ├── CMakeLists.txt
    │   │       │   │   ├── cmake/
    │   │       │   │   │   └── Modules/
    │   │       │   │   │       ├── FindMbedTLS.cmake
    │   │       │   │   │       └── FindWolfSSL.cmake
    │   │       │   │   ├── example-client.c
    │   │       │   │   ├── example-server.c
    │   │       │   │   ├── mbedtls.c
    │   │       │   │   ├── openssl.c
    │   │       │   │   └── ssl.h
    │   │       │   ├── utils.c
    │   │       │   └── utils.h
    │   │       └── tools/
    │   │           ├── sendcmd.sh
    │   │           └── test.sh
    │   ├── eqos-master-wiwiz/
    │   │   ├── Makefile
    │   │   └── files/
    │   │       ├── eqos-cbi.lua
    │   │       ├── eqos-controller.lua
    │   │       ├── eqos.config
    │   │       ├── eqos.hotplug
    │   │       ├── eqos.init
    │   │       ├── eqos.sh
    │   │       ├── po/
    │   │       │   └── zh_Hans/
    │   │       │       └── eqos.po
    │   │       └── uci-defaults-eqos
    │   └── wifidog-wiwiz/
    │       ├── Config.in
    │       ├── Makefile
    │       ├── files/
    │       │   ├── etc/
    │       │   │   ├── config/
    │       │   │   │   └── wiwiz
    │       │   │   └── uci-defaults/
    │       │   │       ├── 199-noredir
    │       │   │       └── 299-noportal
    │       │   ├── usr/
    │       │   │   ├── lib/
    │       │   │   │   └── lua/
    │       │   │   │       └── luci/
    │       │   │   │           ├── controller/
    │       │   │   │           │   └── wiwiz.lua
    │       │   │   │           └── model/
    │       │   │   │               └── cbi/
    │       │   │   │                   └── wiwiz.lua
    │       │   │   └── local/
    │       │   │       └── hsbuilder/
    │       │   │           ├── auth.sh
    │       │   │           ├── checkauth.sh
    │       │   │           ├── dhcp_portal.sh
    │       │   │           ├── getmodel.sh
    │       │   │           ├── handle_ipv6.sh
    │       │   │           ├── hsbuilder.conf
    │       │   │           ├── hsbuilder.sh
    │       │   │           ├── hsbuilder_helper.sh
    │       │   │           ├── kickmac.sh
    │       │   │           ├── setspeed.sh
    │       │   │           ├── ver
    │       │   │           ├── wiwizroaming.sh
    │       │   │           └── wiwizroaming.sh.old
    │       │   ├── wifidog.init
    │       │   └── www/
    │       │       ├── cgi-bin/
    │       │       │   ├── cpi
    │       │       │   ├── kickmac
    │       │       │   ├── myip
    │       │       │   ├── mymac
    │       │       │   ├── showdevinfo
    │       │       │   └── wiwiz404
    │       │       ├── error.html.wiwiz
    │       │       ├── index.html.wiwiz
    │       │       └── mymac.htm
    │       ├── po/
    │       │   └── zh_Hans/
    │       │       └── wifidog-wiwiz.po
    │       └── src/
    │           ├── AUTHORS
    │           ├── COPYING
    │           ├── ChangeLog
    │           ├── FAQ
    │           ├── Makefile.am
    │           ├── NEWS
    │           ├── README
    │           ├── README.openwrt
    │           ├── autogen.sh
    │           ├── configure.in
    │           ├── contrib/
    │           │   ├── airos/
    │           │   │   └── wifidog/
    │           │   │       ├── Makefile
    │           │   │       ├── files/
    │           │   │       │   ├── wifidog.conf
    │           │   │       │   └── wifidog.init
    │           │   │       ├── files.patch
    │           │   │       ├── patches/
    │           │   │       │   └── 100-counter_outoing.patch
    │           │   │       └── readme.txt
    │           │   ├── build-deb/
    │           │   │   ├── changelog
    │           │   │   ├── control
    │           │   │   └── rules
    │           │   ├── build-openwrt-kamikazeipk/
    │           │   │   └── wifidog/
    │           │   │       ├── Makefile
    │           │   │       └── files/
    │           │   │           ├── wifidog.conf
    │           │   │           └── wifidog.init
    │           │   ├── build-openwrt-kamikazeipk8.09up/
    │           │   │   └── wifidog/
    │           │   │       ├── Makefile
    │           │   │       └── files/
    │           │   │           ├── wifidog.conf
    │           │   │           └── wifidog.init
    │           │   ├── build-openwrt-whiterussianipk/
    │           │   │   └── wifidog/
    │           │   │       ├── Config.in
    │           │   │       ├── Makefile
    │           │   │       ├── files/
    │           │   │       │   ├── wifidog.conf
    │           │   │       │   └── wifidog.init
    │           │   │       └── ipkg/
    │           │   │           ├── wifidog.conffiles
    │           │   │           └── wifidog.control
    │           │   └── dump_fw.sh
    │           ├── doc/
    │           │   ├── Makefile.am
    │           │   ├── README.developers.txt
    │           │   ├── doxygen.cfg.in
    │           │   └── wifidog_firewall_diagram.dia
    │           ├── libhttpd/
    │           │   ├── Makefile.am
    │           │   ├── README
    │           │   ├── api.c
    │           │   ├── httpd.h
    │           │   ├── httpd_priv.h
    │           │   ├── ip_acl.c
    │           │   ├── protocol.c
    │           │   └── version.c
    │           ├── scripts/
    │           │   └── init.d/
    │           │       └── wifidog
    │           ├── src/
    │           │   ├── Makefile.am
    │           │   ├── auth.c
    │           │   ├── auth.h
    │           │   ├── centralserver.c
    │           │   ├── centralserver.h
    │           │   ├── client_list.c
    │           │   ├── client_list.h
    │           │   ├── commandline.c
    │           │   ├── commandline.h
    │           │   ├── common.h
    │           │   ├── conf.c
    │           │   ├── conf.h
    │           │   ├── debug.c
    │           │   ├── debug.h
    │           │   ├── firewall.c
    │           │   ├── firewall.h
    │           │   ├── fw_iptables-org.c
    │           │   ├── fw_iptables.c
    │           │   ├── fw_iptables.h
    │           │   ├── gateway.c
    │           │   ├── gateway.h
    │           │   ├── http.c
    │           │   ├── http.h
    │           │   ├── httpd_thread.c
    │           │   ├── httpd_thread.h
    │           │   ├── ping_thread.c
    │           │   ├── ping_thread.h
    │           │   ├── safe.c
    │           │   ├── safe.h
    │           │   ├── util.c
    │           │   ├── util.h
    │           │   ├── wdctl.c
    │           │   ├── wdctl.h
    │           │   ├── wdctl_thread.c
    │           │   └── wdctl_thread.h
    │           ├── wifidog-msg.html.in
    │           ├── wifidog-msg.html.in.org
    │           ├── wifidog.conf
    │           └── wifidog.spec.in
    ├── adguardhome/
    │   ├── Makefile
    │   └── files/
    │       └── adguardhome.init
    ├── cdnspeedtest/
    │   ├── Makefile
    │   └── test.sh
    ├── cpulimit/
    │   ├── Makefile
    │   └── patches/
    │       └── 010-gcc14.patch
    ├── filebrowser/
    │   ├── Makefile
    │   └── files/
    │       ├── filebrowser.config
    │       └── filebrowser.init
    ├── gost/
    │   ├── Makefile
    │   └── files/
    │       ├── gost.config
    │       ├── gost.init
    │       └── gost.uci
    ├── luci-lib-iform/
    │   ├── Makefile
    │   ├── luasrc/
    │   │   └── iform.lua
    │   └── root/
    │       └── www/
    │           └── luci-static/
    │               └── iform/
    │                   ├── 1.0/
    │                   │   ├── index.js
    │                   │   └── style.css
    │                   └── 1.1/
    │                       ├── index.js
    │                       └── style.css
    ├── luci-mod-istorenext/
    │   ├── Makefile
    │   ├── po/
    │   │   ├── templates/
    │   │   │   └── istorenext.pot
    │   │   └── zh_Hans/
    │   │       └── istorenext.po
    │   ├── root/
    │   │   ├── etc/
    │   │   │   ├── nginx/
    │   │   │   │   └── conf.d/
    │   │   │   │       ├── istorenext.conf
    │   │   │   │       └── istorenext.locations
    │   │   │   └── uci-defaults/
    │   │   │       └── 50_luci-istorenext
    │   │   └── usr/
    │   │       ├── lib/
    │   │       │   └── lua/
    │   │       │       └── luci/
    │   │       │           └── view/
    │   │       │               └── istorenext/
    │   │       │                   ├── index.htm
    │   │       │                   └── login.htm
    │   │       └── share/
    │   │           └── luci/
    │   │               └── menu.d/
    │   │                   └── luci-mod-istorenext.json
    │   ├── root-demo/
    │   │   ├── demo/
    │   │   │   └── cgi-bin/
    │   │   │       └── luci/
    │   │   │           └── istorenext/
    │   │   │               ├── cgi-bin/
    │   │   │               │   └── logon
    │   │   │               └── index.htm
    │   │   └── etc/
    │   │       └── init.d/
    │   │           └── istorenext-demo
    │   └── test.conf
    ├── luci-nginxer/
    │   ├── Makefile
    │   └── root/
    │       └── etc/
    │           └── uci-defaults/
    │               └── 50_luci-nginxer
    ├── msd_lite/
    │   ├── Makefile
    │   ├── files/
    │   │   ├── msd_lite.config
    │   │   ├── msd_lite.init
    │   │   └── msd_lite.sample
    │   └── patches/
    │       └── 010-Add-rejoin-option-as-ugly-hack-to-allow-send-IGMP-MLD-lea.patch
    ├── nas-packages/
    │   ├── multimedia/
    │   │   └── ffmpeg-remux/
    │   │       └── Makefile
    │   └── network/
    │       └── services/
    │           ├── ddnsto/
    │           │   ├── Makefile
    │           │   └── files/
    │           │       ├── ddnsto-monitor.sh
    │           │       ├── ddnsto.config
    │           │       ├── ddnsto.init
    │           │       └── ddnsto.uci-default
    │           ├── fastnet/
    │           │   ├── Makefile
    │           │   └── files/
    │           │       ├── fastnet.config
    │           │       ├── fastnet.init
    │           │       └── fastnet.uci-default
    │           ├── floatip/
    │           │   ├── Makefile
    │           │   └── files/
    │           │       ├── floatip.config
    │           │       ├── floatip.init
    │           │       ├── floatip.sh
    │           │       └── floatip.uci-default
    │           ├── istoreenhance/
    │           │   ├── Makefile
    │           │   └── files/
    │           │       ├── istoreenhance.config
    │           │       ├── istoreenhance.init
    │           │       └── istoreenhance.uci-default
    │           ├── kai/
    │           │   ├── Makefile
    │           │   └── files/
    │           │       ├── kai.config
    │           │       └── kai.init
    │           ├── kai_session/
    │           │   └── Makefile
    │           ├── linkease/
    │           │   ├── Makefile
    │           │   └── files/
    │           │       ├── aria2.sh
    │           │       ├── linkease-config.sh
    │           │       ├── linkease.config
    │           │       ├── linkease.init
    │           │       └── linkease.uci-default
    │           ├── linkmount/
    │           │   └── Makefile
    │           ├── quickstart/
    │           │   ├── Makefile
    │           │   └── files/
    │           │       ├── dhcpvalid.sh
    │           │       ├── manuf
    │           │       ├── quickstart.config
    │           │       ├── quickstart.hotplug
    │           │       ├── quickstart.init
    │           │       ├── quickstart.uci-default
    │           │       ├── startdhns.hotplug
    │           │       └── startdhns.init
    │           ├── unishare/
    │           │   ├── Makefile
    │           │   └── files/
    │           │       ├── unishare.config
    │           │       └── unishare.init
    │           └── webdav2/
    │               ├── Makefile
    │               └── files/
    │                   ├── webdav2.config
    │                   └── webdav2.init
    ├── natter/
    │   └── Makefile
    ├── natter2/
    │   └── Makefile
    ├── onekey-install.sh
    ├── oscam/
    │   ├── Config.in
    │   ├── Makefile
    │   └── files/
    │       ├── oscam-watchdog.sh
    │       ├── oscam.conf
    │       ├── oscam.dvbapi
    │       ├── oscam.init
    │       ├── oscam.server
    │       └── oscam.user
    ├── passwall-packages/
    │   ├── chinadns-ng/
    │   │   └── Makefile
    │   ├── dns2socks/
    │   │   └── Makefile
    │   ├── geoview/
    │   │   └── Makefile
    │   ├── hysteria/
    │   │   └── Makefile
    │   ├── ipt2socks/
    │   │   └── Makefile
    │   ├── microsocks/
    │   │   ├── Makefile
    │   │   └── patches/
    │   │       └── 100-Add-SOCKS5-forwarding-rules-support.patch
    │   ├── naiveproxy/
    │   │   ├── Makefile
    │   │   └── files/
    │   │       ├── naiveproxy.config
    │   │       └── naiveproxy.init
    │   ├── shadow-tls/
    │   │   ├── Makefile
    │   │   └── patches/
    │   │       ├── 010-Fix-reading-WildcardSNI-from-sip003_arg-115.patch
    │   │       ├── 011-fix-use-tls1-2-only-website-for-tls12-test-suites-129.patch
    │   │       └── 100-update-monoio.patch
    │   ├── shadowsocks-libev/
    │   │   ├── Makefile
    │   │   └── patches/
    │   │       ├── 100-Upgrade-PCRE-to-PCRE2.patch
    │   │       ├── 101-Fix-mishandling-of-incoming-socket-buffer.-It-must-b.patch
    │   │       └── 102-deprecate-load16-be-replace-with-ntohs.patch
    │   ├── shadowsocks-rust/
    │   │   └── Makefile
    │   ├── shadowsocksr-libev/
    │   │   ├── Makefile
    │   │   ├── patches/
    │   │   │   ├── 0001-Add-ss-server-and-ss-check.patch
    │   │   │   ├── 0002-Revert-verify_simple-and-auth_simple.patch
    │   │   │   ├── 0003-Refine-Usage.patch
    │   │   │   ├── 100-fix-gcc-10.patch
    │   │   │   ├── 101-Fix-Werror-sizeof-pointer-memaccess.patch
    │   │   │   ├── 102-Read-listening-mode-from-config.patch
    │   │   │   ├── 103-Add-TPROXY-support-for-TCP-ssr-redir.patch
    │   │   │   └── 105-Upgrade-PCRE-to-PCRE2.patch
    │   │   └── src/
    │   │       └── server/
    │   │           ├── Makefile.am
    │   │           ├── Makefile.in
    │   │           ├── acl.c
    │   │           ├── acl.h
    │   │           ├── auth.c
    │   │           ├── auth.h
    │   │           ├── base64.c
    │   │           ├── base64.h
    │   │           ├── cache.c
    │   │           ├── cache.h
    │   │           ├── check.c
    │   │           ├── common.h
    │   │           ├── crc32.c
    │   │           ├── encrypt.c
    │   │           ├── encrypt.h
    │   │           ├── http.c
    │   │           ├── http.h
    │   │           ├── http_simple.c
    │   │           ├── http_simple.h
    │   │           ├── jconf.c
    │   │           ├── jconf.h
    │   │           ├── json.c
    │   │           ├── json.h
    │   │           ├── list.c
    │   │           ├── list.h
    │   │           ├── netutils.c
    │   │           ├── netutils.h
    │   │           ├── obfs.c
    │   │           ├── obfs.h
    │   │           ├── obfsutil.c
    │   │           ├── protocol.h
    │   │           ├── resolv.c
    │   │           ├── resolv.h
    │   │           ├── rule.c
    │   │           ├── rule.h
    │   │           ├── server.c
    │   │           ├── server.h
    │   │           ├── tls.c
    │   │           ├── tls.h
    │   │           ├── tls1.2_ticket.c
    │   │           ├── tls1.2_ticket.h
    │   │           ├── udprelay.c
    │   │           ├── udprelay.h
    │   │           ├── uthash.h
    │   │           ├── utils.c
    │   │           ├── utils.h
    │   │           ├── verify.c
    │   │           └── verify.h
    │   ├── simple-obfs/
    │   │   ├── Makefile
    │   │   └── patches/
    │   │       └── 001-convert-arguments-of-isdigit-to-int.patch
    │   ├── sing-box/
    │   │   └── Makefile
    │   ├── tcping/
    │   │   └── Makefile
    │   ├── trojan-plus/
    │   │   ├── Makefile
    │   │   ├── boost-version.mk
    │   │   └── patches/
    │   │       ├── 001-Fix-boost1.87-build.patch
    │   │       └── 002-Fix-boost1.89-build.patch
    │   ├── tuic-client/
    │   │   └── Makefile
    │   ├── v2ray-geodata/
    │   │   └── Makefile
    │   ├── v2ray-plugin/
    │   │   └── Makefile
    │   ├── xray-core/
    │   │   └── Makefile
    │   └── xray-plugin/
    │       └── Makefile
    ├── quectel_cm-5G/
    │   ├── Makefile
    │   ├── files/
    │   │   ├── dhcp
    │   │   ├── rmnet.script
    │   │   ├── rmnet.sh
    │   │   ├── rmnet6.script
    │   │   ├── rmnet6.sh
    │   │   └── rmnet_init.sh
    │   └── src/
    │       ├── CMakeLists.txt
    │       ├── GobiNetCM.c
    │       ├── Makefile
    │       ├── Makefile.am
    │       ├── NOTICE
    │       ├── QCQCTL.h
    │       ├── QCQMI.h
    │       ├── QCQMUX.c
    │       ├── QCQMUX.h
    │       ├── QMIThread.c
    │       ├── QMIThread.h
    │       ├── QmiWwanCM.c
    │       ├── ReleaseNote.txt
    │       ├── at_tok.c
    │       ├── at_tok.h
    │       ├── atc.c
    │       ├── atchannel.c
    │       ├── atchannel.h
    │       ├── configure.ac
    │       ├── default.script
    │       ├── default.script_ip
    │       ├── device.c
    │       ├── ethtool-copy.h
    │       ├── log/
    │       │   ├── cdc_mbim.txt
    │       │   ├── cdc_mbim_vlan.txt
    │       │   ├── ecm_ncm_rndis.txt
    │       │   ├── gobinet.txt
    │       │   ├── gobinet_bridge.txt
    │       │   ├── gobinet_qmap=1.txt
    │       │   ├── gobinet_qmap=1_bridge.txt
    │       │   ├── gobinet_qmap=4.txt
    │       │   ├── gobinet_qmap=4_bridge.txt
    │       │   ├── pcie_mhi_mbim.txt
    │       │   ├── pcie_mhi_mbim_qmap=4.txt
    │       │   ├── pcie_mhi_qmap=1.txt
    │       │   ├── pcie_mhi_qmap=1_bridge.txt
    │       │   ├── pcie_mhi_qmap=4.txt
    │       │   ├── pcie_mhi_qmap=4_bridge.txt
    │       │   ├── qmi_wwan_q.txt
    │       │   ├── qmi_wwan_q_bridge.txt
    │       │   ├── qmi_wwan_q_qmap=1.txt
    │       │   ├── qmi_wwan_q_qmap=1_bridge.txt
    │       │   ├── qmi_wwan_q_qmap=4.txt
    │       │   ├── qmi_wwan_q_qmap=4_bridge.txt
    │       │   ├── qmi_wwan_qmap=4.txt
    │       │   └── usage_of_argument/
    │       │       ├── 6.txt
    │       │       └── m.txt
    │       ├── main.c
    │       ├── mbim-cm.c
    │       ├── qendian.h
    │       ├── qlist.h
    │       ├── qmap_bridge_mode.c
    │       ├── qrtr.c
    │       ├── qrtr.h
    │       ├── quectel-atc-proxy.c
    │       ├── quectel-mbim-proxy.c
    │       ├── quectel-qmi-proxy.c
    │       ├── quectel-qrtr-proxy.c
    │       ├── rmnetctl.c
    │       ├── udhcpc.c
    │       ├── udhcpc_netlink.c
    │       ├── udhcpc_script.c
    │       ├── util.c
    │       └── util.h
    ├── smartmontools/
    │   ├── Makefile
    │   ├── files/
    │   │   ├── smartd.conf
    │   │   └── smartd.init
    │   ├── patches/
    │   │   ├── 001-use-external-drivedb.patch
    │   │   └── 002-os_mailer-is-mailx.patch
    │   └── test.sh
    ├── socat/
    │   ├── Makefile
    │   └── files/
    │       ├── socat.config
    │       └── socat.init
    ├── syncthing/
    │   ├── Makefile
    │   ├── files/
    │   │   ├── stdiscosrv.conf
    │   │   ├── stdiscosrv.init
    │   │   ├── strelaysrv.conf
    │   │   ├── strelaysrv.init
    │   │   ├── syncthing.conf
    │   │   ├── syncthing.init
    │   │   └── syncthing.sysctl
    │   └── test.sh
    ├── udp2raw/
    │   └── Makefile
    ├── upx-static/
    │   └── Makefile
    └── webd/
        └── Makefile

================================================
FILE CONTENTS
================================================

================================================
FILE: LICENSE
================================================
                    GNU GENERAL PUBLIC LICENSE
                       Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
 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.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    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 <https://www.gnu.org/licenses/>.

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:

    <program>  Copyright (C) <year>  <name of author>
    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
<https://www.gnu.org/licenses/>.

  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
<https://www.gnu.org/licenses/why-not-lgpl.html>.


================================================
FILE: README.md
================================================
- [个人脚本专用配套插件包](https://github.com/281677160/build-actions)


================================================
FILE: luci-app-adguardhome/Makefile
================================================
# This is free software, licensed under the Apache License, Version 2.0 .
#

include $(TOPDIR)/rules.mk

PKG_NAME:=luci-app-adguardhome
PKG_RELEASE:=15

PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)

include $(INCLUDE_DIR)/package.mk

define Package/luci-app-adguardhome
	SECTION:=luci
	CATEGORY:=LuCI
	SUBMENU:=3. Applications
	TITLE:=LuCI app for adguardhome
	PKG_MAINTAINER:=<https://github.com/rufengsuixing/luci-app-adguardhome>
	PKGARCH:=all
	DEPENDS:=+!wget-ssl&&!curl:wget-ssl
endef

define Package/luci-app-adguardhome/description
	LuCI support for adguardhome
endef

define Build/Prepare
endef

define Build/Compile
endef

define Package/luci-app-adguardhome/conffiles
/usr/share/AdGuardHome/links.txt
/etc/config/AdGuardHome
endef

define Package/luci-app-adguardhome/install
    $(INSTALL_DIR) $(1)/usr/lib/lua/luci
	cp -pR ./luasrc/* $(1)/usr/lib/lua/luci
	$(INSTALL_DIR) $(1)/
	cp -pR ./root/* $(1)/
	$(INSTALL_DIR) $(1)/usr/lib/lua/luci/i18n
	po2lmo ./po/zh_Hans/AdGuardHome.po $(1)/usr/lib/lua/luci/i18n/AdGuardHome.zh-cn.lmo
endef

define Package/luci-app-adguardhome/postinst
#!/bin/sh
	/etc/init.d/AdGuardHome enable >/dev/null 2>&1
	enable=$(uci get AdGuardHome.AdGuardHome.enabled 2>/dev/null)
	if [ "$enable" == "1" ]; then
		/etc/init.d/AdGuardHome reload
	fi
	rm -f /tmp/luci-indexcache
	rm -f /tmp/luci-modulecache/*
exit 0
endef

define Package/luci-app-adguardhome/prerm
#!/bin/sh
if [ -z "$${IPKG_INSTROOT}" ]; then
     /etc/init.d/AdGuardHome disable
     /etc/init.d/AdGuardHome stop
uci -q batch <<-EOF >/dev/null 2>&1
	delete ucitrack.@AdGuardHome[-1]
	commit ucitrack
EOF
fi
exit 0
endef

$(eval $(call BuildPackage,luci-app-adguardhome))


================================================
FILE: luci-app-adguardhome/luasrc/controller/AdGuardHome.lua
================================================
module("luci.controller.AdGuardHome", package.seeall)
local fs = require "nixio.fs"
local http = require "luci.http"
local uci = require"luci.model.uci".cursor()
function index()
    entry({"admin", "services", "AdGuardHome"}, alias("admin", "services", "AdGuardHome", "base"), _("AdGuard Home"), 10).dependent = true
    entry({"admin", "services", "AdGuardHome", "base"}, cbi("AdGuardHome/base"),  _("Base Setting"), 1).leaf = true
    entry({"admin", "services", "AdGuardHome", "log"}, form("AdGuardHome/log"), _("Log"), 2).leaf = true
    entry({"admin", "services", "AdGuardHome", "manual"}, cbi("AdGuardHome/manual"), _("Manual Config"), 3).leaf = true
    entry({"admin", "services", "AdGuardHome", "status"}, call("act_status")).leaf = true
    entry({"admin", "services", "AdGuardHome", "check"}, call("check_update"))
    entry({"admin", "services", "AdGuardHome", "doupdate"}, call("do_update"))
    entry({"admin", "services", "AdGuardHome", "getlog"}, call("get_log"))
    entry({"admin", "services", "AdGuardHome", "dodellog"}, call("do_dellog"))
    entry({"admin", "services", "AdGuardHome", "reloadconfig"}, call("reload_config"))
    entry({"admin", "services", "AdGuardHome", "gettemplateconfig"}, call("get_template_config"))
end

function get_template_config()
    local b
	local d = ""
	local file = "/tmp/resolv.conf.d/resolv.conf.auto"
	if not fs.access(file) then
		file = "/tmp/resolv.conf.auto"
	end
    for cnt in io.lines(file) do
        b = string.match(cnt, "^[^#]*nameserver%s+([^%s]+)$")
        if (b ~= nil) then d = d .. "  - " .. b .. "\n" end
    end
    local f = io.open("/usr/share/AdGuardHome/AdGuardHome_template.yaml", "r+")
    local tbl = {}
    local a = ""
    while (1) do
        a = f:read("*l")
        if (a == "#bootstrap_dns") then
            a = d
        elseif (a == "#upstream_dns") then
            a = d
        elseif (a == nil) then
            break
        end
        table.insert(tbl, a)
    end
    f:close()
    http.prepare_content("text/plain; charset=utf-8")
    http.write(table.concat(tbl, "\n"))
end

function reload_config()
    fs.remove("/tmp/AdGuardHometmpconfig.yaml")
    http.prepare_content("application/json")
    http.write('')
end

function act_status()
    local e = {}
    local binpath = uci:get("AdGuardHome", "AdGuardHome", "binpath")
    e.running = luci.sys.call("pgrep " .. binpath .. " >/dev/null") == 0
    e.redirect = (fs.readfile("/var/run/AdGredir") == "1")
    http.prepare_content("application/json")
    http.write_json(e)
end

function do_update()
    fs.writefile("/var/run/lucilogpos", "0")
    http.prepare_content("application/json")
    http.write('')
    local arg
    if luci.http.formvalue("force") == "1" then
        arg = "force"
    else
        arg = ""
    end
    if fs.access("/var/run/update_core") then
        if arg == "force" then
            luci.sys.exec("kill $(pgrep /usr/share/AdGuardHome/update_core.sh) ; sh /usr/share/AdGuardHome/update_core.sh " .. arg .. " >/tmp/AdGuardHome_update.log 2>&1 &")
        end
    else
        luci.sys.exec("sh /usr/share/AdGuardHome/update_core.sh " .. arg .. " >/tmp/AdGuardHome_update.log 2>&1 &")
    end
end

function get_log()
    local logfile = uci:get("AdGuardHome", "AdGuardHome", "logfile")
    if (logfile == nil) then
        http.write("no log available\n")
        return
    elseif (logfile == "syslog") then
        if not fs.access("/var/run/AdGuardHomesyslog") then
            luci.sys.exec("(/usr/share/AdGuardHome/getsyslog.sh &); sleep 1;")
        end
        logfile = "/tmp/AdGuardHometmp.log"
        fs.writefile("/var/run/AdGuardHomesyslog", "1")
    elseif not fs.access(logfile) then
        http.write("")
        return
    end
    http.prepare_content("text/plain; charset=utf-8")
    local fdp = tonumber(fs.readfile("/var/run/lucilogpos")) or 0
    local f = io.open(logfile, "r+")
    f:seek("set", fdp)
    local a = f:read(2048000) or ""
    fdp = f:seek()
    fs.writefile("/var/run/lucilogpos", tostring(fdp))
    f:close()
    http.write(a)
end

function do_dellog()
    local logfile = uci:get("AdGuardHome", "AdGuardHome", "logfile")
    fs.writefile(logfile, "")
    http.prepare_content("application/json")
    http.write('')
end

function check_update()
    http.prepare_content("text/plain; charset=utf-8")
    local fdp = tonumber(fs.readfile("/var/run/lucilogpos")) or 0
    local f = io.open("/tmp/AdGuardHome_update.log", "r+")
    f:seek("set", fdp)
    local a = f:read(2048000) or ""
    fdp = f:seek()
    fs.writefile("/var/run/lucilogpos", tostring(fdp))
    f:close()
    if fs.access("/var/run/update_core") then
        http.write(a)
    else
        http.write(a .. "\0")
    end
end


================================================
FILE: luci-app-adguardhome/luasrc/model/cbi/AdGuardHome/base.lua
================================================
require("luci.sys")
require("luci.util")
require("io")
local m, s, o, o1
local fs = require "nixio.fs"
local uci = require"luci.model.uci".cursor()
local configpath = uci:get("AdGuardHome", "AdGuardHome", "configpath") or "/etc/config/AdGuardHome.yaml"
local binpath = uci:get("AdGuardHome", "AdGuardHome", "binpath") or "/usr/bin/AdGuardHome/AdGuardHome"
httpport = uci:get("AdGuardHome", "AdGuardHome", "httpport") or "3000"

m = Map("AdGuardHome", "AdGuard Home")
m.description = translate("Free and open source, powerful network-wide ads & trackers blocking DNS server.")
m:section(SimpleSection).template = "AdGuardHome/AdGuardHome_status"

s = m:section(TypedSection, "AdGuardHome")
s.anonymous = true
s.addremove = false

---- enable
o = s:option(Flag, "enabled", translate("Enable"))
o.default = 0
o.optional = false

---- httpport
o = s:option(Value, "httpport", translate("Browser management port"))
o.placeholder = 3000
o.default = 3000
o.datatype = "port"
o.optional = false
o.description = translate("<input type='button' style='width:210px; border-color:Teal; text-align:center; font-weight:bold;color:Green;' value='AdGuardHome Web:" .. httpport .. "' onclick=\"window.open('http://'+window.location.hostname+':" .. httpport .. "')\"/>")

---- update warning not safe
local binmtime = uci:get("AdGuardHome", "AdGuardHome", "binmtime") or "0"
local e = ""
if not fs.access(configpath) then e = e .. " " .. translate("no config") end
if not fs.access(binpath) then
    e = e .. " " .. translate("no core")
else
    local version = uci:get("AdGuardHome", "AdGuardHome", "version")
    local testtime = fs.stat(binpath, "mtime")
    if testtime ~= tonumber(binmtime) or version == nil then
        -- local tmp=luci.sys.exec(binpath.." -c /dev/null --check-config 2>&1| grep -m 1 -E 'v[0-9.]+' -o")
        -- version=string.sub(tmp, 1, -2)
        version = luci.sys.exec(string.format("echo -n $(%s --version 2>&1 | awk -F 'version ' '{print $2}' | awk -F ',' '{print $1}')", binpath))
        if version == "" then version = "core error" end
        uci:set("AdGuardHome", "AdGuardHome", "version", version)
        uci:set("AdGuardHome", "AdGuardHome", "binmtime", testtime)
        uci:commit("AdGuardHome")
    end
    e = version .. e
end
o = s:option(Button, "restart", translate("Update"))
o.inputtitle = translate("Update core version")
o.template = "AdGuardHome/AdGuardHome_check"
o.showfastconfig = (not fs.access(configpath))
o.description = string.format(translate("core version:") .. "<strong><font id='updateversion' color='green'>%s </font></strong>", e)

---- port warning not safe
local port = luci.sys.exec("awk '/  port:/{printf($2);exit;}' " .. configpath .. " 2>nul")
if (port == "") then port = "?" end

---- Redirect
o = s:option(ListValue, "redirect", port .. translate("Redirect"), translate("AdGuardHome redirect mode"))
o.placeholder = "none"
o:value("none", translate("none"))
o:value("dnsmasq-upstream", translate("Run as dnsmasq upstream server"))
o:value("redirect", translate("Redirect 53 port to AdGuardHome"))
o:value("exchange", translate("Use port 53 replace dnsmasq"))
o.default = "none"
o.optional = true

---- bin path
o = s:option(Value, "binpath", translate("Bin Path"), translate("AdGuardHome Bin path if no bin will auto download"))
o.default = "/usr/bin/AdGuardHome/AdGuardHome"
o.datatype = "string"
o.optional = false
o.rmempty = false
o.validate = function(self, value)
    if value == "" then return nil end
    if fs.stat(value, "type") == "dir" then fs.rmdir(value) end
    if fs.stat(value, "type") == "dir" then
        if (m.message) then
            m.message = m.message .. "\nerror!bin path is a dir"
        else
            m.message = "error!bin path is a dir"
        end
        return nil
    end
    return value
end

--- upx
o = s:option(ListValue, "upxflag", translate("use upx to compress bin after download"))
o:value("", translate("none"))
o:value("-1", translate("compress faster"))
o:value("-9", translate("compress better"))
o:value("--best", translate("compress best(can be slow for big files)"))
o:value("--brute", translate("try all available compression methods & filters [slow]"))
o:value("--ultra-brute", translate("try even more compression variants [very slow]"))
o.default = ""
o.description = translate("bin use less space,but may have compatibility issues")
o.rmempty = true

---- config path
o = s:option(Value, "configpath", translate("Config Path"), translate("AdGuardHome config path"))
o.default = "/etc/config/AdGuardHome.yaml"
o.datatype = "string"
o.optional = false
o.rmempty = false
o.validate = function(self, value)
    if value == nil then return nil end
    if fs.stat(value, "type") == "dir" then fs.rmdir(value) end
    if fs.stat(value, "type") == "dir" then
        if m.message then
            m.message = m.message .. "\nerror!config path is a dir"
        else
            m.message = "error!config path is a dir"
        end
        return nil
    end
    return value
end

---- work dir
o = s:option(Value, "workdir", translate("Work dir"), translate("AdGuardHome work dir include rules,audit log and database"))
o.default = "/usr/bin/AdGuardHome"
o.datatype = "string"
o.optional = false
o.rmempty = false
o.validate = function(self, value)
    if value == "" then return nil end
    if fs.stat(value, "type") == "reg" then
        if m.message then
            m.message = m.message .. "\nerror!work dir is a file"
        else
            m.message = "error!work dir is a file"
        end
        return nil
    end
    if string.sub(value, -1) == "/" then
        return string.sub(value, 1, -2)
    else
        return value
    end
end

---- log file
o = s:option(Value, "logfile", translate("Runtime log file"), translate("AdGuardHome runtime Log file if 'syslog': write to system log;if empty no log"))
o.datatype = "string"
o.rmempty = true
o.validate = function(self, value)
    if fs.stat(value, "type") == "dir" then fs.rmdir(value) end
    if fs.stat(value, "type") == "dir" then
        if m.message then
            m.message = m.message .. "\nerror!log file is a dir"
        else
            m.message = "error!log file is a dir"
        end
        return nil
    end
    return value
end

---- debug
o = s:option(Flag, "verbose", translate("Verbose log"))
o.default = 0
o.optional = true

---- gfwlist 
local a = luci.sys.call("grep -m 1 -q programadd " .. configpath)
if (a == 0) then
    a = "Added"
else
    a = "Not added"
end

o = s:option(Button, "gfwdel", translate("Del gfwlist"), translate(a))
o.optional = true
o.inputtitle = translate("Del")
o.write = function()
    luci.sys.exec("sh /usr/share/AdGuardHome/gfw2adg.sh del 2>&1")
    luci.http.redirect(luci.dispatcher.build_url("admin", "services", "AdGuardHome"))
end

o = s:option(Button, "gfwadd", translate("Add gfwlist"), translate(a))
o.optional = true
o.inputtitle = translate("Add")
o.write = function()
    luci.sys.exec("sh /usr/share/AdGuardHome/gfw2adg.sh 2>&1")
    luci.http.redirect(luci.dispatcher.build_url("admin", "services", "AdGuardHome"))
end

o = s:option(Value, "gfwupstream", translate("Gfwlist upstream dns server"), translate("Gfwlist domain upstream dns service") .. translate(a))
o.default = "tcp://208.67.220.220:5353"
o.datatype = "string"
o.optional = true

---- chpass
o = s:option(Value, "hashpass", translate("Change browser management password"), translate("Press load culculate model and culculate finally save/apply"))
o.default = ""
o.datatype = "string"
o.template = "AdGuardHome/AdGuardHome_chpass"
o.optional = true

---- upgrade protect
o = s:option(MultiValue, "upprotect", translate("Keep files when system upgrade"))
o:value("$binpath", translate("core bin"))
o:value("$configpath", translate("config file"))
o:value("$logfile", translate("log file"))
o:value("$workdir/data/sessions.db", translate("sessions.db"))
o:value("$workdir/data/stats.db", translate("stats.db"))
o:value("$workdir/data/querylog.json", translate("querylog.json"))
o:value("$workdir/data/filters", translate("filters"))
o.widget = "checkbox"
o.default = nil
o.optional = true

---- wait net on boot
o = s:option(Flag, "waitonboot", translate("On boot when network ok restart"))
o.default = 1
o.optional = true

---- backup workdir on shutdown
local workdir = uci:get("AdGuardHome", "AdGuardHome", "workdir") or "/usr/bin/AdGuardHome"
o = s:option(MultiValue, "backupfile", translate("Backup workdir files when shutdown"))
o1 = s:option(Value, "backupwdpath", translate("Backup workdir path"))
local name
o:value("filters", "filters")
o:value("stats.db", "stats.db")
o:value("querylog.json", "querylog.json")
o:value("sessions.db", "sessions.db")
o1:depends("backupfile", "filters")
o1:depends("backupfile", "stats.db")
o1:depends("backupfile", "querylog.json")
o1:depends("backupfile", "sessions.db")
for name in fs.glob(workdir .. "/data/*") do
    name = fs.basename(name)
    if name ~= "filters" and name ~= "stats.db" and name ~= "querylog.json" and
        name ~= "sessions.db" then
        o:value(name, name)
        o1:depends("backupfile", name)
    end
end
o.widget = "checkbox"
o.default = nil
o.optional = false
o.description = translate("Will be restore when workdir/data is empty")
----backup workdir path
o1.default = "/usr/bin/AdGuardHome"
o1.datatype = "string"
o1.optional = false
o1.validate = function(self, value)
    if fs.stat(value, "type") == "reg" then
        if m.message then
            m.message = m.message .. "\nerror!backup dir is a file"
        else
            m.message = "error!backup dir is a file"
        end
        return nil
    end
    if string.sub(value, -1) == "/" then
        return string.sub(value, 1, -2)
    else
        return value
    end
end

----Crontab
o = s:option(MultiValue, "crontab", translate("Crontab task"), translate("Please change time and args in crontab"))
o:value("autoupdate", translate("Auto update core"))
o:value("cutquerylog", translate("Auto tail querylog"))
o:value("cutruntimelog", translate("Auto tail runtime log"))
o:value("autohost", translate("Auto update ipv6 hosts and restart adh"))
o:value("autogfw", translate("Auto update gfwlist and restart adh"))
o.widget = "checkbox"
o.default = nil
o.optional = true

----downloadpath
o = s:option(TextValue, "downloadlinks", translate("Download links for update"))
o.optional = false
o.rows = 4
o.wrap = "soft"
o.cfgvalue = function(self, section)
    return fs.readfile("/usr/share/AdGuardHome/links.txt")
end
o.write = function(self, section, value)
    fs.writefile("/usr/share/AdGuardHome/links.txt", value:gsub("\r\n", "\n"))
end
fs.writefile("/var/run/lucilogpos", "0")
function m.on_commit(map)
    if (fs.access("/var/run/AdGserverdis")) then
        io.popen("/etc/init.d/AdGuardHome reload &")
        return
    end
    local ucitracktest = uci:get("AdGuardHome", "AdGuardHome", "ucitracktest")
    if ucitracktest == "1" then
        return
    elseif ucitracktest == "0" then
        io.popen("/etc/init.d/AdGuardHome reload &")
    else
        if (fs.access("/var/run/AdGlucitest")) then
            uci:set("AdGuardHome", "AdGuardHome", "ucitracktest", "0")
            io.popen("/etc/init.d/AdGuardHome reload &")
        else
            fs.writefile("/var/run/AdGlucitest", "")
            if (ucitracktest == "2") then
                uci:set("AdGuardHome", "AdGuardHome", "ucitracktest", "1")
            else
                uci:set("AdGuardHome", "AdGuardHome", "ucitracktest", "2")
            end
        end
        uci:commit("AdGuardHome")
    end
end
return m


================================================
FILE: luci-app-adguardhome/luasrc/model/cbi/AdGuardHome/log.lua
================================================
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 = "AdGuardHome/log"
t.readonly = "readonly"
local logfile = uci:get("AdGuardHome", "AdGuardHome", "logfile") or ""
t.timereplace = (logfile ~= "syslog" and logfile ~= "")
t.pollcheck = logfile ~= ""
fs.writefile("/var/run/lucilogpos", "0")
return f


================================================
FILE: luci-app-adguardhome/luasrc/model/cbi/AdGuardHome/manual.lua
================================================
local m, s, o
local fs = require "nixio.fs"
local uci = require"luci.model.uci".cursor()
local sys = require "luci.sys"
require("string")
require("io")
require("table")
function gen_template_config()
    local b
    local d = ""
	local file = "/tmp/resolv.conf.d/resolv.conf.auto"
	if not fs.access(file) then
		file = "/tmp/resolv.conf.auto"
	end
    for cnt in io.lines(file) do
        b = string.match(cnt, "^[^#]*nameserver%s+([^%s]+)$")
        if (b ~= nil) then d = d .. "  - " .. b .. "\n" end
    end
    local f = io.open("/usr/share/AdGuardHome/AdGuardHome_template.yaml", "r+")
    local tbl = {}
    local a = ""
    while (1) do
        a = f:read("*l")
        if (a == "#bootstrap_dns") then
            a = d
        elseif (a == "#upstream_dns") then
            a = d
        elseif (a == nil) then
            break
        end
        table.insert(tbl, a)
    end
    f:close()
    return table.concat(tbl, "\n")
end

m = Map("AdGuardHome")
local configpath = uci:get("AdGuardHome", "AdGuardHome", "configpath")
local binpath = uci:get("AdGuardHome", "AdGuardHome", "binpath")
s = m:section(TypedSection, "AdGuardHome")
s.anonymous = true
s.addremove = false

--- config
o = s:option(TextValue, "escconf")
o.rows = 66
o.wrap = "off"
o.rmempty = true
o.cfgvalue = function(self, section)
    return fs.readfile("/tmp/AdGuardHometmpconfig.yaml") or fs.readfile(configpath) or gen_template_config() or ""
end
o.validate = function(self, value)
    fs.writefile("/tmp/AdGuardHometmpconfig.yaml", value:gsub("\r\n", "\n"))
    if fs.access(binpath) then
        if (sys.call(binpath .. " -c /tmp/AdGuardHometmpconfig.yaml --check-config 2> /tmp/AdGuardHometest.log") == 0) then return value end
    else
        return value
    end
    luci.http.redirect(luci.dispatcher.build_url("admin", "services", "AdGuardHome", "manual"))
    return nil
end
o.write = function(self, section, value)
    fs.move("/tmp/AdGuardHometmpconfig.yaml", configpath)
end
o.remove = function(self, section, value) fs.writefile(configpath, "") end

--- js and reload button
o = s:option(DummyValue, "")
o.anonymous = true
o.template = "AdGuardHome/yamleditor"
if not fs.access(binpath) then
    o.description = translate("WARNING!!! no bin found apply config will not be test")
end

--- log 
if (fs.access("/tmp/AdGuardHometmpconfig.yaml")) then
    local c = fs.readfile("/tmp/AdGuardHometest.log")
    if (c ~= "") then
        o = s:option(TextValue, "")
        o.readonly = true
        o.rows = 5
        o.rmempty = true
        o.name = ""
        o.cfgvalue = function(self, section)
            return fs.readfile("/tmp/AdGuardHometest.log")
        end
    end
end

function m.on_commit(map)
    local ucitracktest = uci:get("AdGuardHome", "AdGuardHome", "ucitracktest")
    if ucitracktest == "1" then
        return
    elseif ucitracktest == "0" then
        io.popen("/etc/init.d/AdGuardHome reload &")
    else
        fs.writefile("/var/run/AdGlucitest", "")
    end
end
return m


================================================
FILE: luci-app-adguardhome/luasrc/view/AdGuardHome/AdGuardHome_check.htm
================================================
<%+cbi/valueheader%>
<%local fs=require"nixio.fs"%>
<input type="button" class="cbi-button cbi-button-apply" id="apply_update_button" value="<%:Update core version%>" onclick=" return apply_update() "/>
<input type="button" class="cbi-button cbi-button-apply" id="apply_forceupdate_button" value="<%:Force update%>" onclick=" return apply_forceupdate()" style="display:none"/>
<% if self.showfastconfig then %>
<input type="button" class="cbi-button cbi-button-apply" id="to_configpage" value="<%:Fast config%>" onclick="location.href='<%=url([[admin]], [[services]], [[AdGuardHome]], [[manual]])%>'"/>
<%end%>
<div id="logview" style="display:none">
<input type="checkbox" id="reversetag" value="reverse" onclick=" return reverselog()" style="vertical-align:middle;height: auto;"><%:reverse%></input>
<textarea id="cbid.logview.1.conf" class="cbi-input-textarea" style="width: 100%;display:block;" data-update="change" rows="5" cols="60" readonly="readonly" > </textarea>
</div>
<script type="text/javascript">//<![CDATA[
var updatebtn = document.getElementById('apply_update_button');
var forceupdatebtn = document.getElementById('apply_forceupdate_button');
var islogreverse = false;
function apply_forceupdate(){
	XHR.get('<%=url([[admin]], [[services]], [[AdGuardHome]], [[doupdate]])%>',{ force: 1 },function(x, data){}
		);
	updatebtn.disabled = true;
	poll_check();
	return
}
function reverselog(){
	var lv = document.getElementById('cbid.logview.1.conf');
	lv.innerHTML=lv.innerHTML.split('\n').reverse().join('\n')
	if (islogreverse){
	islogreverse=false;
	}else{
	islogreverse=true;
	}
	return
}
function apply_update(){
	XHR.get('<%=url([[admin]], [[services]], [[AdGuardHome]], [[doupdate]])%>',null,function(x, data){}
		);
	updatebtn.disabled = true;
	updatebtn.value    = '<%:Check...%>';
	forceupdatebtn.style.display="inline"
	poll_check();
	return
}
function poll_check(){
var tag = document.getElementById('logview');
	tag.style.display="block"
XHR.poll(3, '<%=url([[admin]], [[services]], [[AdGuardHome]], [[check]])%>', null,
	function(x, data) {
		var lv = document.getElementById('cbid.logview.1.conf');
		if (x.responseText && lv) {
			if (x.responseText=="\u0000"){
				for(j = 0,len=this.XHR._q.length; j < len; j++) {
					if (this.XHR._q[j].url == '<%=url([[admin]], [[services]], [[AdGuardHome]], [[check]])%>'){
						this.XHR._q.splice(j,1);
						updatebtn.disabled = false;
						updatebtn.value    = '<%:Updated%>';
						break;
					}
				}
				return	
			}
			if (islogreverse){
				lv.innerHTML = x.responseText.split('\n').reverse().join('\n')+lv.innerHTML;
			}else{
				lv.innerHTML += x.responseText;
			}
		}
	}
);}
<% if fs.access("/var/run/update_core") then %>
	updatebtn.disabled = true;
	updatebtn.value    = '<%:Check...%>';
	forceupdatebtn.style.display="inline"
	poll_check();
<%elseif fs.access("/var/run/update_core_error") then %>
	poll_check();
<%end%>
//]]>
</script>
<%+cbi/valuefooter%>

================================================
FILE: luci-app-adguardhome/luasrc/view/AdGuardHome/AdGuardHome_chpass.htm
================================================
<%+cbi/valueheader%>
<script type="text/javascript">//<![CDATA[
function chpass(btn)
	{
		btn.disabled = true;
		btn.value    = '<%:loading...%>';
		if (typeof bcryptloaded == 'undefined' ){
		var theHead = document.getElementsByTagName('head').item(0);
		//创建脚本的dom对象实例
		var myScript = document.createElement('script');
		myScript.src = '<%=resource%>/twin-bcrypt.min.js';            //指定脚本路径
		myScript.type = 'text/javascript';    //指定脚本类型
		myScript.defer = true;                //程序下载完后再解析和执行
		theHead.appendChild(myScript);
		bcryptloaded=1;
		btn.value    = '<%:Culculate%>';
		btn.disabled = false;
		return
		}
		var lv = document.getElementById('cbid.AdGuardHome.AdGuardHome.hashpass');
		if (lv.value != ""){
		var hash = TwinBcrypt.hashSync(lv.value);
		lv.value=hash;
		btn.value    = '<%:Please save/apply%>';
		}else{
		btn.value    = '<%:is empty%>';
		btn.disabled = false;
		}
	}
//]]>
</script> 
		<input data-update="change"<%=
		attr("id", cbid) ..
		attr("name", cbid) ..
		attr("type", self.password and "password" or "text") ..
		attr("class", self.password and "cbi-input-password" or "cbi-input-text") ..
		attr("value", self:cfgvalue(section) or self.default) ..
		ifattr(self.size, "size") ..
		ifattr(self.placeholder, "placeholder") ..
		ifattr(self.readonly, "readonly") ..
		ifattr(self.maxlength, "maxlength") ..
		ifattr(self.datatype, "data-type", self.datatype) ..
		ifattr(self.datatype, "data-optional", self.optional or self.rmempty) ..
		ifattr(self.combobox_manual, "data-manual", self.combobox_manual) ..
		ifattr(#self.keylist > 0, "data-choices", { self.keylist, self.vallist })
	%> />
	<% if self.password then %><img src="<%=resource%>/cbi/reload.gif" style="vertical-align:middle" title="<%:Reveal/hide password%>" onclick="var e = document.getElementById('<%=cbid%>'); e.type = (e.type=='password') ? 'text' : 'password';" /><% end %>
	<input type="button" class="cbi-button cbi-button-apply" id="cbid.AdGuardHome.AdGuardHome.applychpass" value="<%:Load culculate model%>" onclick="return chpass(this)"/>
<%+cbi/valuefooter%>

================================================
FILE: luci-app-adguardhome/luasrc/view/AdGuardHome/AdGuardHome_status.htm
================================================
<script type="text/javascript">//<![CDATA[
XHR.poll(3, '<%=url([[admin]], [[services]], [[AdGuardHome]], [[status]])%>', null,
	function(x, data) {
		var tb = document.getElementById('AdGuardHome_status');
		if (data && tb) {
			if (data.running) {
				tb.innerHTML = '<em><b><font color=green>AdGuardHome <%:RUNNING%></font></b></em>';
			} else {
				tb.innerHTML = '<em><b><font color=red>AdGuardHome <%:NOT RUNNING%></font></b></em>';
			}
			if (data.redirect)
			{
				tb.innerHTML+='<em><b><font color=green><%:Redirected%></font></b></em>'
			} else {
				tb.innerHTML+='<em><b><font color=red><%:Not redirect%></font></b></em>'	
			}
		}
	}
);
//]]>
</script>
<style>.mar-10 {margin-left: 50px; margin-right: 10px;}</style>
<fieldset class="cbi-section">
	<p id="AdGuardHome_status">
		<em><%:Collecting data...%></em>
	</p>
</fieldset>

================================================
FILE: luci-app-adguardhome/luasrc/view/AdGuardHome/log.htm
================================================
<%+cbi/valueheader%>
<input type="checkbox" name="NAME" value="reverse" onclick=" return reverselog()" style="vertical-align:middle;height: auto;" checked><%:reverse%></input>
<%if self.timereplace then%>
<input type="checkbox" name="NAME" value="localtime" onclick=" return chlogtime()" style="vertical-align:middle;height: auto;" checked><%:localtime%></input><br>
<%end%>
<textarea id="cbid.logview.1.conf" class="cbi-input-textarea" style="width: 100%;display:inline" data-update="change" rows="32" cols="60" readonly="readonly" > </textarea>
<input type="button" class="cbi-button cbi-button-apply" id="apply_update_button" value="<%:dellog%>" onclick=" return apply_del_log() "/>
<input type="button" class="cbi-button cbi-button-apply" value="<%:download log%>" style=" display:inline;" onclick=" return download_log()" />
<script type="text/javascript">//<![CDATA[
var islogreverse = true;
var isutc2local = <%=tostring(self.timereplace)%>;
function createAndDownloadFile(fileName, content) {
    var aTag = document.createElement('a');
    var blob = new Blob([content]);
    aTag.download = fileName;
    aTag.href = URL.createObjectURL(blob);
    aTag.click();
    URL.revokeObjectURL(blob);
}
function download_log(){
	var lv = document.getElementById('cbid.logview.1.conf');
	var dt = new Date();
	var timestamp = (dt.getMonth()+1)+"-"+dt.getDate()+"-"+dt.getHours()+"_"+dt.getMinutes();
	createAndDownloadFile("AdGuardHome"+timestamp+".log",lv.innerHTML)
	return
}
function apply_del_log(){
	XHR.get('<%=url([[admin]], [[services]], [[AdGuardHome]], [[dodellog]])%>',null,function(x, data){
	var lv = document.getElementById('cbid.logview.1.conf');
		lv.innerHTML="";
	}
		);
	return
}
function chlogtime(){
	var lv = document.getElementById('cbid.logview.1.conf');
	if (isutc2local){
	lv.innerHTML=line_toUTC(lv.innerHTML).join('\n');
	isutc2local=false;
	}else{
	lv.innerHTML=line_tolocal(lv.innerHTML).join('\n');
	isutc2local=true;
	}
	return
}
function reverselog(){
	var lv = document.getElementById('cbid.logview.1.conf');
	lv.innerHTML=lv.innerHTML.split('\n').reverse().join('\n')
	if (islogreverse){
	islogreverse=false;
	}else{
	islogreverse=true;
	}
	return
}
function p(s) {
        return s < 10 ? '0' + s: s;
}
function line_tolocal(str){
var strt=new Array();
str.trim().split('\n').forEach(function(v, i) {
var dt = new Date(v.substring(0,19)+" UTC");
if (dt != "Invalid Date"){
  strt[i]=dt.getFullYear()+"/"+p(dt.getMonth()+1)+"/"+p(dt.getDate())+" "+p(dt.getHours())+":"+p(dt.getMinutes())+":"+p(dt.getSeconds())+v.substring(19);
}else{
  strt[i]=v;}})
return strt
}
function line_toUTC(str){
var strt=new Array();
str.trim().split('\n').forEach(function(v, i) {
var dt = new Date(v.substring(0,19))
if (dt != "Invalid Date"){
  strt[i]=dt.getUTCFullYear()+"/"+p(dt.getUTCMonth()+1)+"/"+p(dt.getUTCDate())+" "+p(dt.getUTCHours())+":"+p(dt.getUTCMinutes())+":"+p(dt.getUTCSeconds())+v.substring(19);
}else{
  strt[i]=v;}})
return strt
}
function poll_check(){
XHR.poll(3, '<%=url([[admin]], [[services]], [[AdGuardHome]], [[getlog]])%>', null,
	function(x, data) {
		var lv = document.getElementById('cbid.logview.1.conf');
		if (x.responseText && lv) {
			if (isutc2local)
			{
				var lines=line_tolocal(x.responseText);
				if (islogreverse){
					lv.innerHTML = lines.reverse().join('\n')+lv.innerHTML;
				}else{
					lv.innerHTML += lines.join('\n');
				}
			}else{
				if (islogreverse){
					lv.innerHTML = x.responseText.split('\n').reverse().join('\n')+lv.innerHTML;
				}else{
					lv.innerHTML += x.responseText;
				}
			}
		}
	}
);}
<%if self.pollcheck then%>
poll_check();
<%else%>
var lv = document.getElementById('cbid.logview.1.conf');
lv.innerHTML="<%:Please add log path in config to enable log%>"
<%end%>
//]]>
</script>	
<%+cbi/valuefooter%>

================================================
FILE: luci-app-adguardhome/luasrc/view/AdGuardHome/yamleditor.htm
================================================
<%+cbi/valueheader%>
<script src="/luci-static/resources/codemirror/lib/codemirror.js"></script>
<link rel="stylesheet" href="/luci-static/resources/codemirror/lib/codemirror.css"/>
<script src="/luci-static/resources/codemirror/mode/yaml/yaml.js"></script>
<link rel="stylesheet" href="/luci-static/resources/codemirror/theme/dracula.css"/>
<link rel="stylesheet" href="/luci-static/resources/codemirror/addon/fold/foldgutter.css"/>
<script src="/luci-static/resources/codemirror/addon/fold/foldcode.js"></script>
<script src="/luci-static/resources/codemirror/addon/fold/foldgutter.js"></script>
<script src="/luci-static/resources/codemirror/addon/fold/indent-fold.js"></script>
<script type="text/javascript">//<![CDATA[
var editor = CodeMirror.fromTextArea(document.getElementById("cbid.AdGuardHome.AdGuardHome.escconf"), {
mode: "text/yaml",    //实现groovy代码高亮
styleActiveLine: true,
lineNumbers: true,	//显示行号
theme: "dracula",	//设置主题
lineWrapping: true,	//代码折叠
foldGutter: true,
gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter"],
matchBrackets: true //括号匹配
}
);
function reload_config(){
	XHR.get('<%=url([[admin]], [[services]], [[AdGuardHome]], [[reloadconfig]])%>', null,
	function(x, data) {
	location.reload();
	});}
function use_template(){
	XHR.get('<%=url([[admin]], [[services]], [[AdGuardHome]], [[gettemplateconfig]])%>', null,
	function(x, data) {
	editor.setValue(x.responseText)
	});}
//]]>
</script> 
<%fs=require"nixio.fs"%>
<%if fs.access("/tmp/AdGuardHometmpconfig.yaml") then%>
<input type="button" id="apply_update_button" value="<%:Reload Config%>" onclick=" return reload_config() "/>
<%end%>
<input type="button" id="template_button" value="<%:Use template%>" onclick=" return use_template() "/>
<%+cbi/valuefooter%>

================================================
FILE: luci-app-adguardhome/po/zh_Hans/AdGuardHome.po
================================================
#/cgi-bin/luci/admin/services/AdGuardHome
msgid "Base Setting"
msgstr "基础设置"

msgid "Log"
msgstr "日志"

msgid "Manual Config"
msgstr "手动设置"

msgid "Free and open source, powerful network-wide ads & trackers blocking DNS server."
msgstr "免费去广告和跟踪程序拦截DNS服务器,网页管理初始账号和密码均为:admin"

msgid "RUNNING"
msgstr "运行中"

msgid "NOT RUNNING"
msgstr "未运行"

msgid "Redirected"
msgstr "已重定向"

msgid "Not redirect"
msgstr "未重定向"

msgid "Collecting data..."
msgstr "获取数据中..."

msgid "Enable"
msgstr "启用"

msgid "Browser management port"
msgstr "网页管理端口"

msgid "Update"
msgstr "更新"
#button change
msgid "Update core version"
msgstr "更新核心版本"

msgid "Check..."
msgstr "检查中..."

msgid "Updated"
msgstr "已更新"

#button hide
msgid "Force update"
msgstr "强制更新"

msgid "Fast config"
msgstr "快速配置"
#
msgid "core version:"
msgstr "核心版本:"
#description change
msgid "no config"
msgstr "没有配置文件"
msgid "no core"
msgstr "没有核心"
#
msgid "Redirect"
msgstr "重定向"
#inlist
msgid "none"
msgstr "无"

msgid "Run as dnsmasq upstream server"
msgstr "作为dnsmasq的上游服务器"

msgid "Redirect 53 port to AdGuardHome"
msgstr "重定向53端口到AdGuardHome"

msgid "Use port 53 replace dnsmasq"
msgstr "使用53端口替换dnsmasq"
#
msgid "AdGuardHome redirect mode"
msgstr "AdGuardHome重定向模式"

msgid "Bin Path"
msgstr "执行文件路径"

msgid "AdGuardHome Bin path if no bin will auto download"
msgstr "AdGuardHome 执行文件路径 如果没有执行文件将自动下载"

msgid "use upx to compress bin after download"
msgstr "下载后使用upx压缩执行文件"
#inlist
msgid "compress faster"
msgstr "快速压缩"

msgid "compress better"
msgstr "更好的压缩"

msgid "compress best(can be slow for big files)"
msgstr "最好的压缩(大文件可能慢)"

msgid "try all available compression methods & filters [slow]"
msgstr "尝试所有可能的压缩方法和过滤器[慢]"

msgid "try even more compression variants [very slow]"
msgstr "尝试更多变体压缩手段[很慢]"

msgid "bin use less space,but may have compatibility issues"
msgstr "减小执行文件空间占用,但是可能压缩后有兼容性问题"
#
msgid "Config Path"
msgstr "配置文件路径"

msgid "AdGuardHome config path"
msgstr "AdGuardHome 配置文件路径"

msgid "Work dir"
msgstr "工作目录"

msgid "AdGuardHome work dir include rules,audit log and database"
msgstr "AdGuardHome 工作目录包含规则,审计日志和数据库"

msgid "Runtime log file"
msgstr "运行日志"

msgid "AdGuardHome runtime Log file if 'syslog': write to system log;if empty no log"
msgstr "AdGuardHome 运行日志 如果填syslog将写入系统日志;如果空则不记录日志"

msgid "Verbose log"
msgstr "详细日志"
#hide div
msgid "Add gfwlist"
msgstr "加入gfw列表"

msgid "Add"
msgstr "添加"

msgid "Added"
msgstr "已添加"

msgid "Not added"
msgstr "未添加"
#hide div
msgid "Del gfwlist"
msgstr "删除gfw列表"

msgid "Del"
msgstr "删除"
#hide div
msgid "Gfwlist upstream dns server"
msgstr "gfw列表上游服务器"

msgid "Gfwlist domain upstream dns service"
msgstr "gfw列表域名上游服务器"
#hide div
msgid "Change browser management password"
msgstr "改变网页登录密码"

msgid "Culculate"
msgstr "计算"
##button change
msgid "Load culculate model"
msgstr "载入计算模块"

msgid "loading..."
msgstr "载入中"

msgid "Please save/apply"
msgstr "请提交"

msgid "is empty"
msgstr "为空"

msgid "Press load culculate model and culculate finally save/apply"
msgstr "按载入计算模块 然后计算 最后保存/提交"
#
msgid "Keep files when system upgrade"
msgstr "系统升级时保留文件"
#checkbox
msgid "core bin"
msgstr "核心执行文件"

msgid "config file"
msgstr "配置文件"

msgid "log file"
msgstr "日志文件"

msgid "querylog.json"
msgstr "审计日志.json"
#
msgid "On boot when network ok restart"
msgstr "开机后网络准备好时重启"

msgid "Backup workdir files when shutdown"
msgstr "在关机时备份工作目录文件"

msgid "Will be restore when workdir/data is empty"
msgstr "在工作目录/data为空的时候恢复"

msgid "Backup workdir path"
msgstr "工作目录备份路径"

msgid "Crontab task"
msgstr "计划任务"

msgid "Auto update core"
msgstr "自动升级核心"

msgid "Auto tail querylog"
msgstr "自动截短查询日志"

msgid "Auto tail runtime log"
msgstr "自动截短运行日志"

msgid "Auto update ipv6 hosts and restart adh"
msgstr "自动更新ipv6主机并重启adh"

msgid "Auto update gfwlist and restart adh"
msgstr "自动更新gfw列表并重启adh"

msgid "Please change time and args in crontab"
msgstr "请在计划任务中修改时间和参数"

msgid "Download links for update"
msgstr "升级用的下载链接"

#/cgi-bin/luci/admin/services/AdGuardHome/log/
msgid "reverse"
msgstr "逆序"

msgid "localtime"
msgstr "本地时间"

msgid "Please add log path in config to enable log"
msgstr "请在设置里填写日志路径以启用日志"

msgid "dellog"
msgstr "删除日志"

msgid "download log"
msgstr "下载日志"

#/cgi-bin/luci//admin/services/AdGuardHome/manual/
msgid "Use template"
msgstr "使用模板"
#hide button
msgid "Reload Config"
msgstr "重新载入配置"

msgid "WARNING!!! no bin found apply config will not be test"
msgstr "警告!!!未找到执行文件,提交配置将不会进行校验"
#unused
msgid "Change browser management username"
msgstr "改变网页登录用户名"

msgid "Username"
msgstr "用户名"

msgid "Check Config"
msgstr "检查配置"

msgid "unknown"
msgstr "未知"

msgid "Keep database when system upgrade"
msgstr "系统升级时保留数据"

msgid "Boot delay until network ok"
msgstr "开机时直到网络准备好再启动"


================================================
FILE: luci-app-adguardhome/root/etc/config/AdGuardHome
================================================
config AdGuardHome 'AdGuardHome'
	option enabled '0'
	option httpport '3000'
	option configpath '/etc/config/AdGuardHome.yaml'
	option workdir '/tmp/AdGuardHome'
	option logfile '/tmp/AdGuardHome.log'
	option verbose '0'
	option binpath '/usr/bin/AdGuardHome/AdGuardHome'
	option upxflag ''
	option redirect 'dnsmasq-upstream'
	option waitonboot '0'
	option ucitracktest '1'


================================================
FILE: luci-app-adguardhome/root/etc/config/AdGuardHome.yaml
================================================
http:
  address: 0.0.0.0:3000
  session_ttl: 720h
users:
  - name: admin
    password: $2y$10$vHRcARdPCieYG3RXWomV5evDYN.Nj/edtwEkQgQJZcK6z7qTLaIc6
auth_attempts: 5
block_auth_min: 15
http_proxy: ""
language: zh-cn
theme: auto
debug_pprof: false
dns:
  bind_hosts:
    - 0.0.0.0
  port: 1745
  anonymize_client_ip: false
  protection_enabled: true
  blocking_mode: default
  blocking_ipv4: ""
  blocking_ipv6: ""
  blocked_response_ttl: 10
  protection_disabled_until: null
  parental_block_host: family-block.dns.adguard.com
  safebrowsing_block_host: standard-block.dns.adguard.com
  ratelimit: 0
  ratelimit_whitelist: []
  refuse_any: false
  upstream_dns:
    - 223.5.5.5
  upstream_dns_file: ""
  bootstrap_dns:
    - 119.29.29.29
    - 223.5.5.5
  all_servers: false
  fastest_addr: false
  fastest_timeout: 1s
  allowed_clients: []
  disallowed_clients: []
  blocked_hosts:
    - version.bind
    - id.server
    - hostname.bind
  trusted_proxies:
    - 127.0.0.0/8
    - ::1/128
  cache_size: 4194304
  cache_ttl_min: 0
  cache_ttl_max: 0
  cache_optimistic: true
  bogus_nxdomain: []
  aaaa_disabled: false
  enable_dnssec: false
  edns_client_subnet: false
  max_goroutines: 300
  ipset: []
  filtering_enabled: true
  filters_update_interval: 24
  parental_enabled: false
  safesearch_enabled: false
  safebrowsing_enabled: false
  safebrowsing_cache_size: 1048576
  safesearch_cache_size: 1048576
  parental_cache_size: 1048576
  cache_time: 30
  rewrites: []
  blocked_services: []
  upstream_timeout: 10s
  private_networks: []
  use_private_ptr_resolvers: true
  local_ptr_upstreams: []
tls:
  enabled: false
  server_name: ""
  force_https: false
  port_https: 443
  port_dns_over_tls: 853
  port_dns_over_quic: 784
  port_dnscrypt: 0
  dnscrypt_config_file: ""
  allow_unencrypted_doh: false
  certificate_chain: ""
  private_key: ""
  certificate_path: ""
  private_key_path: ""
filters:
  - enabled: true
    url: https://adguardteam.github.io/AdGuardSDNSFilter/Filters/filter.txt
    name: AdGuard DNS filter
    id: 1228750870
  - enabled: true
    url: http://sub.adtchrome.com/adt-chinalist-easylist.txt
    name: 广告终结者使用的拦截规则,基于ChinaList+EasyList修正维护
    id: 139789181
  - enabled: true
    url: https://easylist-downloads.adblockplus.org/easylist.txt
    name: EasyList-去除国际网页中大多数广告,包括不需要的框架、图像和对象
    id: 139789112
  - enabled: true
    url: https://easylist-downloads.adblockplus.org/easylistchina.txt
    name: EasyList China-EasyList针对国内的补充规则
    id: 139789121
  - enabled: true
    url: https://anti-ad.net/adguard.txt
    name: anti-AD命中率最高列表
    id: 139789122
  - enabled: false
    url: https://raw.iqiq.io/banbendalao/ADgk/master/ADgk.txt
    name: ADgk去广告easylistchina补充规则
    id: 139789131
  - enabled: false
    url: https://raw.iqiq.io/banbendalao/ADgk/master/kill-baidu-ad.txt
    name: ADgk百度广告过滤
    id: 139789133
  - enabled: false
    url: https://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=1&mimetype=plaintext
    name: Peter Lowe’s Ad and tracking server list​
    id: 139789152
  - enabled: false
    url: https://easylist.to/easylist/fanboy-social.txt
    name: Fanboy's Social Blocking List
    id: 139789153
  - enabled: false
    url: https://easylist.to/easylist/fanboy-annoyance.txt
    name: Fanboy's Annoyance List
    id: 139789154
  - enabled: false
    url: https://secure.fanboy.co.nz/fanboy-cookiemonster.txt
    name: EasyList Cookie List
    id: 139789155
  - enabled: false
    url: https://fanboy.co.nz/fanboy-antifacebook.txt
    name: Anti-Facebook List
    id: 139789161
  - enabled: false
    url: https://filters.adtidy.org/extension/ublock/filters/14.txt
    name: AdGuard Annoyances filter
    id: 139789162
  - enabled: false
    url: https://www.fanboy.co.nz/enhancedstats.txt
    name: Fanboy's Enhanced Tracking List
    id: 139789164
  - enabled: false
    url: https://filters.adtidy.org/extension/ublock/filters/3.txt
    name: AdGuard Tracking Protection filter
    id: 139789165
  - enabled: false
    url: https://easylist.to/easylist/easylist.txt
    name: EasyList
    id: 139789171
  - enabled: false
    url: https://filters.adtidy.org/extension/ublock/filters/11.txt
    name: AdGuard Mobile Ads filter
    id: 139789172
  - enabled: false
    url: https://filters.adtidy.org/extension/ublock/filters/2_without_easylist.txt
    name: AdGuard Base filter
    id: 139789173
  - enabled: false
    url: https://easylist-downloads.adblockplus.org/antiadblockfilters.txt
    name: Adblock Warning Removal List
    id: 139789174
  - enabled: false
    url: https://fanboy.co.nz/fanboy-problematic-sites.txt
    name: Fanboy's problematic-sites
    id: 139789175
  - enabled: false
    url: https://adaway.org/hosts.txt
    name: Adaway HOST
    id: 139789187
whitelist_filters: []
user_rules:
  - '@@||taobao.com^$important'
  - '@@||tmall.com^$important'
  - '@@||jd.com^important'
  - '@@||flyme.cn^$important'
  - '@@||meizu.com^$important'
  - '@@||wl.jd.com^$important'
  - '@@||flydigi.com^'
  - '@@||pv.sohu.com^$important'
  - /googleads.$~script,domain=~googleads.github.io
  - /pagead/lvz?
  - '||google.com/pagead/'
  - '||static.doubleclick.net^$domain=youtube.com'
  - '||youtube.com/get_midroll_'
  - '||5hz.org^'
  - '@@||000714.xyz^'
  - '@@||blueskyxn.com^'
  - '||topnewsfeeds.net^'
  - '||nbryb.com^'
  - '||superbdolly.com^'
  - '||salutationcheerlessdemote.com^'
  - '||buildingdoodlesquare.com^'
  - '||colonistnobilityheroic.com^'
dhcp:
  enabled: false
  interface_name: ""
  dhcpv4:
    gateway_ip: ""
    subnet_mask: ""
    range_start: ""
    range_end: ""
    lease_duration: 86400
    icmp_timeout_msec: 1000
    options: []
  dhcpv6:
    range_start: ""
    lease_duration: 86400
    ra_slaac_only: false
    ra_allow_slaac: false
clients: []
log_compress: false
log_localtime: false
log_max_backups: 0
log_max_size: 100
log_max_age: 3
log_file: ""
verbose: false
schema_version: 10


================================================
FILE: luci-app-adguardhome/root/etc/init.d/AdGuardHome
================================================
#!/bin/sh /etc/rc.common

USE_PROCD=1

START=95
STOP=01

CONFIGURATION=AdGuardHome
CRON_FILE=/etc/crontabs/root
EXTRA_COMMANDS="do_redirect testbackup test_crontab force_reload isrunning"
EXTRA_HELP="        do_redirect 0 or 1\
        testbackup backup or restore\
		test_crontab
		force_reload
		isrunning"
set_forward_dnsmasq()
{
	local PORT="$1"
	addr="127.0.0.1#$PORT"
	OLD_SERVER="`uci get dhcp.@dnsmasq[0].server 2>/dev/null`"
	echo $OLD_SERVER | grep "^$addr" >/dev/null 2>&1
	if [ $? -eq 0 ]; then
		return
	fi
	uci delete dhcp.@dnsmasq[0].server 2>/dev/null
	uci add_list dhcp.@dnsmasq[0].server=$addr
	for server in $OLD_SERVER; do
		if [ "$server" = "$addr" ]; then
			continue
		fi
		uci add_list dhcp.@dnsmasq[0].server=$server
	done
	uci delete dhcp.@dnsmasq[0].resolvfile 2>/dev/null
	uci set dhcp.@dnsmasq[0].noresolv=1
	uci commit dhcp
	/etc/init.d/dnsmasq restart
}

stop_forward_dnsmasq()
{
	local OLD_PORT="$1"
	addr="127.0.0.1#$OLD_PORT"
	OLD_SERVER="`uci get dhcp.@dnsmasq[0].server 2>/dev/null`"
	echo $OLD_SERVER | grep "^$addr" >/dev/null 2>&1
	if [ $? -ne 0 ]; then
		return
	fi

	uci del_list dhcp.@dnsmasq[0].server=$addr 2>/dev/null
	addrlist="`uci get dhcp.@dnsmasq[0].server 2>/dev/null`"
	if [ -z "$addrlist" ] ; then
		resolvfile="/tmp/resolv.conf.d/resolv.conf.auto"
		[ ! -f "$resolvfile" ] && resolvfile="/tmp/resolv.conf.auto"
		uci set dhcp.@dnsmasq[0].resolvfile="$resolvfile" 2>/dev/null
		uci delete dhcp.@dnsmasq[0].noresolv 2>/dev/null
	fi
	uci commit dhcp
	/etc/init.d/dnsmasq restart
}

set_iptable()
{
	local ipv6_server=$1
	local tcp_server=$2
	uci -q batch <<-EOF >/dev/null 2>&1
  delete firewall.AdGuardHome
	set firewall.AdGuardHome=include
	set firewall.AdGuardHome.type=script
	set firewall.AdGuardHome.path=/usr/share/AdGuardHome/firewall.start
	set firewall.AdGuardHome.reload=1
	commit firewall
EOF
	
	[ "$tcp_server" == "1" ] && iptables -t nat -I PREROUTING 1 -m comment --comment "AdGuardHome" -p tcp --dport 53 -j REDIRECT --to-ports $AdGuardHome_PORT
	iptables -t nat -I PREROUTING 1 -m comment --comment "AdGuardHome" -p udp --dport 53 -j REDIRECT --to-ports $AdGuardHome_PORT

	[ "$ipv6_server" == 0 ] && return

	[ "$tcp_server" == "1" ] && ip6tables -t nat -I PREROUTING 1 -m comment --comment "AdGuardHome" -p tcp --dport 53 -j REDIRECT --to-ports $AdGuardHome_PORT
	ip6tables -t nat -I PREROUTING 1 -m comment --comment "AdGuardHome" -p udp --dport 53 -j REDIRECT --to-ports $AdGuardHome_PORT
}

clear_iptable()
{
	uci -q batch <<-EOF >/dev/null 2>&1
  delete firewall.AdGuardHome
	commit firewall
EOF

	nums=$(iptables -t nat -n -L PREROUTING 2>/dev/null | grep -c "AdGuardHome")
	if [ -n "$nums" ]; then
		until [ "$nums" = 0 ]
		do
			rules=$(iptables -t nat -n -L PREROUTING --line-num 2>/dev/null | grep "AdGuardHome" | awk '{print $1}')
			for rule in $rules
			do
				iptables -t nat -D PREROUTING $rule 2> /dev/null
				break
			done
			nums=$(expr $nums - 1)
		done
	fi
	
	nums=$(ip6tables -t nat -n -L PREROUTING 2>/dev/null | grep -c "AdGuardHome")
	if [ -n "$nums" ]; then
		until [ "$nums" = 0 ]
		do
			rules=$(ip6tables -t nat -n -L PREROUTING --line-num 2>/dev/null | grep "AdGuardHome" | awk '{print $1}')
			for rule in $rules
			do
				ip6tables -t nat -D PREROUTING $rule 2> /dev/null
				break
			done
			nums=$(expr $nums - 1)
		done
	fi
}

service_triggers() {
	procd_add_reload_trigger "$CONFIGURATION"
	[ "$(uci get AdGuardHome.AdGuardHome.redirect)" == "redirect" ] && procd_add_reload_trigger firewall
}
isrunning(){
config_load "${CONFIGURATION}"
_isrunning
local r=$?
([ "$r" == "0" ] && echo "running") || ([ "$r" == "1" ] && echo "not run" ) || echo "no bin"
return $r
}
_isrunning(){
	config_get binpath $CONFIGURATION binpath "/usr/bin/AdGuardHome/AdGuardHome"
	[ ! -f "$binpath" ] && return 2
	pgrep $binpath 2>&1 >/dev/null && return 0
	return 1
}
force_reload(){
	config_load "${CONFIGURATION}"
	_isrunning && procd_send_signal "$CONFIGURATION" || start
}
get_tz()
{
	SET_TZ=""

	if [ -e "/etc/localtime" ]; then
		return
	fi

	for tzfile in /etc/TZ /var/etc/TZ
	do
		if [ ! -e "$tzfile" ]; then
			continue
		fi

		tz="`cat $tzfile 2>/dev/null`"
	done

	if [ -z "$tz" ]; then
		return
	fi

	SET_TZ=$tz
}

rm_port53()
{
	local AdGuardHome_PORT=$(config_editor "dns.port" "" "$configpath" "1")
	dnsmasq_port=$(uci get dhcp.@dnsmasq[0].port 2>/dev/null)
	if [ -z "$dnsmasq_port" ]; then
	dnsmasq_port="53"
	fi
	if [ "$dnsmasq_port" == "$AdGuardHome_PORT" ]; then
		if [ "$dnsmasq_port" == "53" ]; then
			dnsmasq_port="1745"
		fi
	elif [ "$dnsmasq_port" == "53" ]; then
		return
	fi
	config_editor "dns.port" "$dnsmasq_port" "$configpath"
	uci set dhcp.@dnsmasq[0].port="53"
	uci commit dhcp
	/etc/init.d/dnsmasq restart
}

use_port53()
{
	local AdGuardHome_PORT=$(config_editor "dns.port" "" "$configpath" "1")
	dnsmasq_port=$(uci get dhcp.@dnsmasq[0].port 2>/dev/null)
	if [ -z "$dnsmasq_port" ]; then
		dnsmasq_port="53"
	fi
	if [ "$dnsmasq_port" == "$AdGuardHome_PORT" ]; then
		if [ "$dnsmasq_port" == "53" ]; then
			AdGuardHome_PORT="1745"
		fi
	elif [ "$AdGuardHome_PORT" == "53" ]; then
		return
	fi
	config_editor "dns.port" "53" "$configpath"
	uci set dhcp.@dnsmasq[0].port="$AdGuardHome_PORT"
	uci commit dhcp
	/etc/init.d/dnsmasq restart
}
do_redirect()
{
	config_load "${CONFIGURATION}"
	_do_redirect $1
}
_do_redirect()
{
	local section="$CONFIGURATION"
	args=""
	ipv6_server=1
	tcp_server=0
	enabled=$1
	if [ "$enabled" == "1" ]; then
		echo -n "1">/var/run/AdGredir
	else
		echo -n "0">/var/run/AdGredir
	fi
	config_get configpath $CONFIGURATION configpath "/etc/AdGuardHome.yaml"
	AdGuardHome_PORT=$(config_editor "dns.port" "" "$configpath" "1")
	if [ -z "$AdGuardHome_PORT" ]; then
		AdGuardHome_PORT="0"
	fi
	config_get "redirect" "$section" "redirect" "none"
	config_get "old_redirect" "$section" "old_redirect" "none"
	config_get "old_port" "$section" "old_port" "0"
	config_get "old_enabled" "$section" "old_enabled" "0"
	uci get dhcp.@dnsmasq[0].port >/dev/null 2>&1 || uci set dhcp.@dnsmasq[0].port="53" >/dev/null 2>&1
	uci commit dhcp
	if [ "$old_enabled" = "1" -a "$old_redirect" == "exchange" ]; then
		AdGuardHome_PORT=$(uci get dhcp.@dnsmasq[0].port 2>/dev/null)
	fi

	if [ "$old_redirect" != "$redirect" ] || [ "$old_port" != "$AdGuardHome_PORT" ] || [ "$old_enabled" = "1" -a "$enabled" = "0" ]; then
		if [ "$old_redirect" != "none" ]; then
			if [  "$old_redirect" == "redirect" -a "$old_port" != "0" ]; then
				clear_iptable
			elif [ "$old_redirect" == "dnsmasq-upstream" ]; then
				stop_forward_dnsmasq "$old_port"
			elif [ "$old_redirect" == "exchange" ]; then
				rm_port53
			fi
		fi
	elif [ "$old_enabled" = "1" -a "$enabled" = "1" ]; then
		if [  "$old_redirect" == "redirect" -a "$old_port" != "0" ]; then
			clear_iptable
		fi
	fi
	uci delete AdGuardHome.@AdGuardHome[0].old_redirect 2>/dev/null
	uci delete AdGuardHome.@AdGuardHome[0].old_port 2>/dev/null
	uci delete AdGuardHome.@AdGuardHome[0].old_enabled 2>/dev/null
	uci add_list AdGuardHome.@AdGuardHome[0].old_redirect="$redirect" 2>/dev/null
	uci add_list AdGuardHome.@AdGuardHome[0].old_port="$AdGuardHome_PORT" 2>/dev/null
	uci add_list AdGuardHome.@AdGuardHome[0].old_enabled="$enabled" 2>/dev/null
	uci commit AdGuardHome
	[ "$enabled" == "0" ] && return 1
	if [ "$AdGuardHome_PORT" == "0" ]; then
		return 1
	fi
	if [ "$redirect" = "redirect" ]; then
		set_iptable $ipv6_server $tcp_server
	elif [ "$redirect" = "dnsmasq-upstream" ]; then
		set_forward_dnsmasq "$AdGuardHome_PORT"
	elif [ "$redirect" == "exchange" -a "$(uci get dhcp.@dnsmasq[0].port 2>/dev/null)" == "53" ]; then
		use_port53
	fi
}
get_filesystem()
{
# print out path filesystem
    echo $1 | awk '
    BEGIN{
    while (("mount"| getline ret) > 0)
    {
    split(ret,d);
    fs[d[3]]=d[5];
    m=index(d[1],":")
    if (m==0)
    {
        pt[d[3]]=d[1]
    }else{
        pt[d[3]]=substr(d[1],m+1)
    }}}{
    split($0,d,"/");
    if ("/" in fs)
    {
    result1=fs["/"];
    }
    if ("/" in pt)
    {
    result2=pt["/"];
    }
    for (i=2;i<=length(d);i++)
    {
       p[i]=p[i-1]"/"d[i];
       if (p[i] in fs)
        {
        result1=fs[p[i]];
        result2=pt[p[i]];
        }
    }
    if (result2 in fs){
        result=fs[result2]}
    else{
        result=result1}
    print(result);}'
}

config_editor()
{
	awk -v yaml="$1" -v value="$2" -v file="$3" -v ro="$4" '
	BEGIN{split(yaml,part,"\.");s="";i=1;l=length(part);}
    {
        if (match($0,s""part[i]":"))
        {
            if (i==l)
            {
                split($0,t,": ");
				if (ro==""){
				system("sed -i '\''"FNR"c \\"t[1]": "value"'\'' "file);
				}else{
				print(t[2]);
				}
				exit;
            }
            s=s"[- ]{2}";
            i++;
        }
    }' $3
}

boot_service() {
	rm /var/run/AdGserverdis >/dev/null 2>&1
	config_load "${CONFIGURATION}"
	config_get waitonboot $CONFIGURATION waitonboot "0"
	config_get_bool enabled $CONFIGURATION enabled 0
	config_get binpath $CONFIGURATION binpath "/usr/bin/AdGuardHome/AdGuardHome"
	[ -f "$binpath" ] && start_service
	if [ "$enabled" == "1" ] && [ "$waitonboot" == "1" ]; then
		procd_open_instance "waitnet"
		procd_set_param command "/usr/share/AdGuardHome/waitnet.sh"
		procd_close_instance
		echo "no net start pinging"
	fi
}

testbackup(){
	config_load "${CONFIGURATION}"
	if [ "$1" == "backup" ]; then
		backup
	elif [ "$1" == "restore" ]; then
		restore
	fi
}
restore()
{
	config_get workdir $CONFIGURATION workdir "/usr/bin/AdGuardHome"
	config_get backupwdpath $CONFIGURATION backupwdpath "/usr/bin/AdGuardHome"
	cp -u -r -f $backupwdpath/data $workdir
}
backup() {
	config_get backupwdpath $CONFIGURATION backupwdpath "/usr/bin/AdGuardHome"
	mkdir -p $backupwdpath/data
	config_get workdir $CONFIGURATION workdir "/usr/bin/AdGuardHome"
	config_get backupfile $CONFIGURATION backupfile ""
	for one in $backupfile;
	do
		while :
		do
			if [ -d "$backupwdpath/data/$one" ]; then
				cpret=$(cp -u -r -f $workdir/data/$one $backupwdpath/data 2>&1)
			else
				cpret=$(cp -u -r -f $workdir/data/$one $backupwdpath/data/$one 2>&1)
			fi
			echo "$cpret"
			echo "$cpret" | grep "no space left on device"
			if [ "$?" == "0" ]; then
				echo "磁盘已满,删除log重试中"
				del_querylog && continue
				rm -f -r $backupwdpath/data/filters
				rm -f -r $workdir/data/filters && continue
				echo "backup failed"
			fi
			break
		done
	done
}
start_service() {
	# Reading config
	rm /var/run/AdGserverdis >/dev/null 2>&1
	config_load "${CONFIGURATION}"
	# update password
	config_get hashpass $CONFIGURATION hashpass ""
	config_get configpath $CONFIGURATION configpath "/etc/AdGuardHome.yaml"
	if [ -n "$hashpass" ]; then
		config_editor "users.password" "$hashpass" "$configpath"
		uci set $CONFIGURATION.$CONFIGURATION.hashpass=""
	fi
	local enabled
	config_get_bool enabled $CONFIGURATION enabled 0
	# update crontab
	do_crontab
	if [ "$enabled" == "0" ]; then
		_do_redirect 0
		return
	fi
	#what need to do before reload
	config_get workdir $CONFIGURATION workdir "/usr/bin/AdGuardHome"

	config_get backupfile $CONFIGURATION backupfile ""
	mkdir -p $workdir/data
	if [ -n "$backupfile" ] && [ ! -d "$workdir/data" ]; then
		restore
	fi
	# for overlay data-stk-oo not suppport
	local cwdfs=$(get_filesystem $workdir)
	echo "workdir is a $cwdfs filesystem"
	if [ "$cwdfs" == "jffs2" ]; then
		echo "fs error ln db to tmp $workdir $cwdfs"
		logger "AdGuardHome" "warning db redirect to tmp"
		touch $workdir/data/stats.db
		if [ ! -L $workdir/data/stats.db ]; then
		mv -f $workdir/data/stats.db /tmp/stats.db 2>/dev/null
		ln -s /tmp/stats.db $workdir/data/stats.db 2>/dev/null
		fi
		touch $workdir/data/sessions.db
		if [ ! -L $workdir/data/sessions.db ]; then
		mv -f $workdir/data/sessions.db /tmp/sessions.db 2>/dev/null
		ln -s /tmp/sessions.db $workdir/data/sessions.db 2>/dev/null
		fi
	fi
	local ADDITIONAL_ARGS=""
	config_get binpath $CONFIGURATION binpath "/usr/bin/AdGuardHome/AdGuardHome"

	mkdir -p ${binpath%/*}
	ADDITIONAL_ARGS="$ADDITIONAL_ARGS -c $configpath"
	ADDITIONAL_ARGS="$ADDITIONAL_ARGS -w $workdir"
	config_get httpport $CONFIGURATION httpport 3000
	ADDITIONAL_ARGS="$ADDITIONAL_ARGS -p $httpport"

	# hack to save config file when upgrade system
	config_get upprotect $CONFIGURATION upprotect ""
	eval upprotect=${upprotect// /\\\\n}
	echo -e "$upprotect">/lib/upgrade/keep.d/luci-app-adguardhome
	
	config_get logfile $CONFIGURATION logfile ""
	if [ -n "$logfile" ]; then
		ADDITIONAL_ARGS="$ADDITIONAL_ARGS -l $logfile"
	fi

	if [ ! -f "$binpath" ]; then
		_do_redirect 0
		/usr/share/AdGuardHome/update_core.sh 2>&1 >/tmp/AdGuardHome_update.log &
		exit 0
	fi

	config_get_bool verbose $CONFIGURATION verbose 0
	if [ "$verbose" -eq 1 ]; then
		ADDITIONAL_ARGS="$ADDITIONAL_ARGS -v"
	fi

	procd_open_instance
	get_tz
	if [ -n "$SET_TZ" ]; then
		procd_set_param env TZ="$SET_TZ"
	fi
	procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-5}
	procd_set_param limits core="unlimited" nofile="65535 65535"
	procd_set_param stderr 1
	procd_set_param command $binpath $ADDITIONAL_ARGS
	procd_set_param file "$configpath" "/etc/hosts" "/etc/config/AdGuardHome"
	procd_close_instance
	if [ -f "$configpath" ]; then
		_do_redirect 1
	else
		_do_redirect 0
		config_get "redirect" "AdGuardHome" "redirect" "none"
		if [ "$redirect" != "none" ]; then
			procd_open_instance "waitconfig"
			procd_set_param command "/usr/share/AdGuardHome/watchconfig.sh"
			procd_close_instance
			echo "no config start watching"
		fi
	fi
	echo "AdGuardHome service enabled"
	echo "luci enable switch=$enabled"
	(sleep 10 && [ -z "$(pgrep $binpath)" ] && logger "AdGuardHome" "no process in 10s cancel redirect" && _do_redirect 0 )&
}
reload_service()
{
	rm /var/run/AdGlucitest >/dev/null 2>&1
	echo "AdGuardHome reloading"
	start
}

del_querylog(){
local btarget=$(ls $backupwdpath/data | grep -F "querylog.json" | sort -r | head -n 1)
local wtarget=$(ls $workdir/data | grep -F "querylog.json" | sort -r | head -n 1)
if [ "$btarget"x == "$wtarget"x ]; then
	[ -z "$btarget" ] && return 1
	rm -f $workdir/data/$wtarget
	rm -f $backupwdpath/data/$btarget
	return 0
fi
if [ "$btarget" \> "$wtarget" ]; then
	rm -f $backupwdpath/data/$btarget
	return 0
else
	rm -f $workdir/data/$wtarget
	return 0
fi
}
stop_service()
{
	config_load "${CONFIGURATION}"
	_do_redirect 0
	do_crontab
	if [ "$1" != "nobackup" ]; then
		config_get backupfile $CONFIGURATION backupfile "0"
		if [ -n "$backupfile" ]; then
			backup
		fi
	fi
	echo "AdGuardHome service disabled"
	touch /var/run/AdGserverdis
}
boot() {
	rc_procd boot_service "$@"
	if eval "type service_started" 2>/dev/null >/dev/null; then
		service_started
	fi
}
test_crontab(){
config_load "${CONFIGURATION}"
do_crontab
}
do_crontab(){
	config_get_bool enabled $CONFIGURATION enabled 0
	config_get crontab $CONFIGURATION crontab ""
	local findstr default cronenable replace commit
	local cronreload=0
	local commit=0
	findstr="/usr/share/AdGuardHome/update_core.sh"
	default="30 3 * * * /usr/share/AdGuardHome/update_core.sh 2>&1"
	[ "$enabled" == "0" ] || [ "${crontab//autoupdate/}" == "$crontab" ] && cronenable=0 || cronenable=1
	crontab_editor
	
	config_get workdir $CONFIGURATION workdir "/usr/bin/AdGuardHome"
	config_get lastworkdir $CONFIGURATION lastworkdir "/usr/bin/AdGuardHome"
	findstr="/usr/share/AdGuardHome/tailto.sh [0-9]* \$(uci get AdGuardHome.AdGuardHome.workdir)/data/querylog.json"
	#[ -n "$lastworkdir" ] && findstr="/usr/share/AdGuardHome/tailto.sh [0-9]* $lastworkdir/data/querylog.json" && [ "$lastworkdir" != "$workdir" ] && replace="${lastworkdir//\//\\/}/${workdir//\//\\/}"
	default="0 * * * * /usr/share/AdGuardHome/tailto.sh 2000 \$(uci get AdGuardHome.AdGuardHome.workdir)/data/querylog.json"
	[ "$enabled" == "0" ] || [ "${crontab//cutquerylog/}" == "$crontab" ] && cronenable=0 || cronenable=1
	crontab_editor
	#[ "$lastworkdir" != "$workdir" ] && uci set AdGuardHome.AdGuardHome.lastworkdir="$workdir" && commit=1
	
	config_get logfile $CONFIGURATION logfile ""
	config_get lastlogfile $CONFIGURATION lastlogfile ""
	findstr="/usr/share/AdGuardHome/tailto.sh [0-9]* \$(uci get AdGuardHome.AdGuardHome.logfile)"
	default="30 3 * * * /usr/share/AdGuardHome/tailto.sh 2000 \$(uci get AdGuardHome.AdGuardHome.logfile)"
	#[ -n "$lastlogfile" ] && findstr="/usr/share/AdGuardHome/tailto.sh [0-9]* $lastlogfile" && [ -n "$logfile" ] && [ "$lastlogfile" != "$logfile" ] && replace="${lastlogfile//\//\\/}/${logfile//\//\\/}"
	[ "$logfile" == "syslog" ] || [ "$logfile" == "" ] || [ "$enabled" == "0" ] || [ "${crontab//cutruntimelog/}" == "$crontab" ] && cronenable=0 || cronenable=1
	crontab_editor
	#[ -n "$logfile" ] && [ "$lastlogfile" != "$logfile" ] && uci set AdGuardHome.AdGuardHome.lastlogfile="$logfile" && commit=1
	
	findstr="/usr/share/AdGuardHome/addhost.sh"
	default="0 * * * * /usr/share/AdGuardHome/addhost.sh"
	[ "$enabled" == "0" ] || [ "${crontab//autohost/}" == "$crontab" ] && cronenable=0 || cronenable=1
	crontab_editor
	[ "$cronenable" == "0" ] && /usr/share/AdGuardHome/addhost.sh "del" "noreload" || /usr/share/AdGuardHome/addhost.sh "" "noreload"

	findstr="/usr/share/AdGuardHome/gfw2adg.sh"
	default="30 3 * * * /usr/share/AdGuardHome/gfw2adg.sh"
	[ "$enabled" == "0" ] || [ "${crontab//autogfw/}" == "$crontab" ] && cronenable=0 || cronenable=1
	crontab_editor
	[ "$cronreload" -gt 0 ] && /etc/init.d/cron restart
	#[ "$commit" -gt 0 ] && uci commit AdGuardHome
}
crontab_editor(){
	#usage input:
	#findstr=
	#default=
	#cronenable=
	#replace="${last//\//\\/}/${now//\//\\/}"
	#output:cronreload:if >1 please /etc/init.d/cron restart manual
	local testline reload
	local line="$(grep "$findstr" $CRON_FILE)"
	[ -n "$replace" ] && [ -n "$line" ] && eval testline="\${line//$replace}" && [ "$testline" != "$line" ] && line="$testline" && reload="1" && replace="" 
	if [ "${line:0:1}" != "#" ]; then
		if [ $cronenable -eq 1 ]; then
			[ -z "$line" ] && line="$default" && reload="1"
			if [ -n "$reload" ]; then
				sed -i "\,$findstr,d" $CRON_FILE
				echo "$line" >> $CRON_FILE
				cronreload=$((cronreload+1))
			fi
		elif [ -n "$line" ]; then
			sed -i "\,$findstr,d" $CRON_FILE
			echo "#$line" >> $CRON_FILE
			cronreload=$((cronreload+1))
		fi
	else
		if [ $cronenable -eq 1 ]; then
			sed -i "\,$findstr,d" $CRON_FILE
			echo "${line:1}" >> $CRON_FILE
			cronreload=$((cronreload+1))
		elif [ -z "$reload" ]; then
			sed -i "\,$findstr,d" $CRON_FILE
			echo "$line" >> $CRON_FILE
		fi
	fi
	
}


================================================
FILE: luci-app-adguardhome/root/etc/uci-defaults/40_luci-AdGuardHome
================================================
#!/bin/sh

uci -q batch <<-EOF >/dev/null 2>&1
	delete ucitrack.@AdGuardHome[-1]
	add ucitrack AdGuardHome
	set ucitrack.@AdGuardHome[-1].init=AdGuardHome
	commit ucitrack
	delete AdGuardHome.AdGuardHome.ucitracktest
EOF

rm -f /tmp/luci-indexcache
exit 0


================================================
FILE: luci-app-adguardhome/root/usr/share/AdGuardHome/AdGuardHome_template.yaml
================================================
bind_host: 0.0.0.0
bind_port: 3000
beta_bind_port: 0
users:
  - name: admin
    password: $2y$10$vHRcARdPCieYG3RXWomV5evDYN.Nj/edtwEkQgQJZcK6z7qTLaIc6
auth_attempts: 5
block_auth_min: 15
http_proxy: ""
language: zh-cn
theme: auto
debug_pprof: false
dns:
  bind_hosts:
    - 0.0.0.0
  port: 1745
  anonymize_client_ip: false
  protection_enabled: true
  blocking_mode: default
  blocking_ipv4: ""
  blocking_ipv6: ""
  blocked_response_ttl: 10
  protection_disabled_until: null
  parental_block_host: family-block.dns.adguard.com
  safebrowsing_block_host: standard-block.dns.adguard.com
  ratelimit: 0
  ratelimit_whitelist: []
  refuse_any: false
  upstream_dns:
  - 223.5.5.5
  upstream_dns_file: ""
  bootstrap_dns:
  - 119.29.29.29
  - 223.5.5.5
  all_servers: false
  fastest_addr: false
  fastest_timeout: 1s
  allowed_clients: []
  disallowed_clients: []
  blocked_hosts:
  - version.bind
  - id.server
  - hostname.bind
  trusted_proxies:
  - 127.0.0.0/8
  - ::1/128
  cache_size: 4194304
  cache_ttl_min: 0
  cache_ttl_max: 0
  cache_optimistic: true
  bogus_nxdomain: []
  aaaa_disabled: false
  enable_dnssec: false
  edns_client_subnet: false
  max_goroutines: 300
  ipset: []
  filtering_enabled: true
  filters_update_interval: 24
  parental_enabled: false
  safesearch_enabled: false
  safebrowsing_enabled: false
  safebrowsing_cache_size: 1048576
  safesearch_cache_size: 1048576
  parental_cache_size: 1048576
  cache_time: 30
  rewrites: []
  blocked_services: []
  upstream_timeout: 10s
  private_networks: []
  use_private_ptr_resolvers: true
  local_ptr_upstreams: []
tls:
  enabled: false
  server_name: ""
  force_https: false
  port_https: 443
  port_dns_over_tls: 853
  port_dns_over_quic: 784
  port_dnscrypt: 0
  dnscrypt_config_file: ""
  allow_unencrypted_doh: false
  certificate_chain: ""
  private_key: ""
  certificate_path: ""
  private_key_path: ""
filters:
- enabled: true
  url: https://adguardteam.github.io/AdGuardSDNSFilter/Filters/filter.txt
  name: AdGuard DNS filter
  id: 1628750870
- enabled: true
  url: https://anti-ad.net/easylist.txt
  name: 'CHN: anti-AD'
  id: 1628750871
whitelist_filters: []
user_rules:
- '@@||taobao.com^$important'
- '@@||jd.com^important'
- '@@||flyme.cn^$important'
- '@@||meizu.com^$important'
- '@@||wl.jd.com^$important'
- '@@||flydigi.com^'
- '@@||pv.sohu.com^$important'
dhcp:
  enabled: false
  interface_name: ""
  dhcpv4:
    gateway_ip: ""
    subnet_mask: ""
    range_start: ""
    range_end: ""
    lease_duration: 86400
    icmp_timeout_msec: 1000
    options: []
  dhcpv6:
    range_start: ""
    lease_duration: 86400
    ra_slaac_only: false
    ra_allow_slaac: false
clients: []
log_compress: false
log_localtime: false
log_max_backups: 0
log_max_size: 100
log_max_age: 3
log_file: ""
verbose: false
schema_version: 10


================================================
FILE: luci-app-adguardhome/root/usr/share/AdGuardHome/addhost.sh
================================================
#!/bin/sh
checkmd5(){
local nowmd5=$(md5sum /etc/hosts)
nowmd5=${nowmd5%% *}
local lastmd5=$(uci get AdGuardHome.AdGuardHome.hostsmd5 2>/dev/null)
if [ "$nowmd5" != "$lastmd5" ]; then
	uci set AdGuardHome.AdGuardHome.hostsmd5="$nowmd5"
	uci commit AdGuardHome
	[ "$1" == "noreload" ] || /etc/init.d/AdGuardHome reload
fi
}
[ "$1" == "del" ] && sed -i '/programaddstart/,/programaddend/d' /etc/hosts && checkmd5 "$2" && exit 0
/usr/bin/awk 'BEGIN{
while ((getline < "/tmp/dhcp.leases") > 0)
{
    a[$2]=$4;
}
while (("ip -6 neighbor show | grep -v fe80" | getline) > 0)
{
    if (a[$5]) {print $1" "a[$5] >"/tmp/tmphost"; }
}
print "#programaddend" >"/tmp/tmphost";
}'
grep programaddstart /etc/hosts >/dev/null 2>&1
if [ "$?" == "0" ]; then
	sed -i '/programaddstart/,/programaddend/c\#programaddstart' /etc/hosts
	sed -i '/programaddstart/'r/tmp/tmphost /etc/hosts
else
	echo "#programaddstart" >>/etc/hosts
	cat /tmp/tmphost >> /etc/hosts
fi
rm /tmp/tmphost
checkmd5 "$2"

================================================
FILE: luci-app-adguardhome/root/usr/share/AdGuardHome/firewall.start
================================================
#!/bin/sh

AdGuardHome_enable=$(uci get AdGuardHome.AdGuardHome.enabled)
redirect=$(uci get AdGuardHome.AdGuardHome.redirect)

if [ $AdGuardHome_enable -eq 1 -a "$redirect" == "redirect" ]; then
	/etc/init.d/AdGuardHome do_redirect 1
fi


================================================
FILE: luci-app-adguardhome/root/usr/share/AdGuardHome/getsyslog.sh
================================================
#!/bin/sh
PATH="/usr/sbin:/usr/bin:/sbin:/bin"
logread -e AdGuardHome > /tmp/AdGuardHometmp.log
logread -e AdGuardHome -f >> /tmp/AdGuardHometmp.log &
pid=$!
echo "1">/var/run/AdGuardHomesyslog
while true
do
	sleep 12
	watchdog=$(cat /var/run/AdGuardHomesyslog)
	if [ "$watchdog"x == "0"x ]; then
		kill $pid
		rm /tmp/AdGuardHometmp.log
		rm /var/run/AdGuardHomesyslog
		exit 0
	else
		echo "0">/var/run/AdGuardHomesyslog
	fi
done

================================================
FILE: luci-app-adguardhome/root/usr/share/AdGuardHome/gfw2adg.sh
================================================
#!/bin/sh
PATH="/usr/sbin:/usr/bin:/sbin:/bin"
checkmd5(){
local nowmd5=$(md5sum /tmp/adguard.list 2>/dev/null)
nowmd5=${nowmd5%% *}
local lastmd5=$(uci get AdGuardHome.AdGuardHome.gfwlistmd5 2>/dev/null)
if [ "$nowmd5" != "$lastmd5" ]; then
	uci set AdGuardHome.AdGuardHome.gfwlistmd5="$nowmd5"
	uci commit AdGuardHome
	[ "$1" == "noreload" ] || /etc/init.d/AdGuardHome reload
fi
}
configpath=$(uci get AdGuardHome.AdGuardHome.configpath 2>/dev/null)
[ "$1" == "del" ] && sed -i '/programaddstart/,/programaddend/d' $configpath && checkmd5 "$2" && exit 0
gfwupstream=$(uci get AdGuardHome.AdGuardHome.gfwupstream 2>/dev/null)
if [ -z $gfwupstream ]; then
gfwupstream="tcp://208.67.220.220:5353"
fi
if [ ! -f "$configpath" ]; then
	echo "please make a config first"
	exit 1
fi
wget --no-check-certificate https://cdn.jsdelivr.net/gh/gfwlist/gfwlist/gfwlist.txt -O- | base64 -d > /tmp/gfwlist.txt
cat /tmp/gfwlist.txt | awk -v upst="$gfwupstream" 'BEGIN{getline;}{
s1=substr($0,1,1);
if (s1=="!")
{next;}
if (s1=="@"){
    $0=substr($0,3);
    s1=substr($0,1,1);
    white=1;}
else{
    white=0;
}

if (s1=="|")
    {s2=substr($0,2,1);
    if (s2=="|")
    {
        $0=substr($0,3);
        split($0,d,"/");
        $0=d[1];
    }else{
        split($0,d,"/");
        $0=d[3];
    }}
else{
    split($0,d,"/");
    $0=d[1];
}
star=index($0,"*");
if (star!=0)
{
    $0=substr($0,star+1);
    dot=index($0,".");
    if (dot!=0)
        $0=substr($0,dot+1);
    else
        next;
    s1=substr($0,1,1);
}
if (s1==".")
{fin=substr($0,2);}
else{fin=$0;}
if (index(fin,".")==0) next;
if (index(fin,"%")!=0) next;
if (index(fin,":")!=0) next;
match(fin,"^[0-9\.]+")
if (RSTART==1 && RLENGTH==length(fin)) {print "ipset add gfwlist "fin>"/tmp/doipset.sh";next;}
if (fin=="" || finl==fin) next;
finl=fin;
if (white==0)
    {print("  - '\''[/"fin"/]"upst"'\''");}
else{
    print("  - '\''[/"fin"/]#'\''");}
}END{print("  - '\''[/programaddend/]#'\''")}' > /tmp/adguard.list
grep programaddstart $configpath
if [ "$?" == "0" ]; then
	sed -i '/programaddstart/,/programaddend/c\  - '\''\[\/programaddstart\/\]#'\''' $configpath
	sed -i '/programaddstart/'r/tmp/adguard.list $configpath
else
	sed -i '1i\  - '\''[/programaddstart/]#'\''' /tmp/adguard.list
	sed -i '/upstream_dns:/'r/tmp/adguard.list $configpath
fi
checkmd5 "$2"
rm -f /tmp/gfwlist.txt /tmp/adguard.list

================================================
FILE: luci-app-adguardhome/root/usr/share/AdGuardHome/links.txt
================================================
https://static.adguard.com/adguardhome/release/AdGuardHome_linux_${Arch}.tar.gz
#https://github.com/AdguardTeam/AdGuardHome/releases/download/${latest_ver}/AdGuardHome_linux_${Arch}.tar.gz
#https://static.adguard.com/adguardhome/beta/AdGuardHome_linux_${Arch}.tar.gz

================================================
FILE: luci-app-adguardhome/root/usr/share/AdGuardHome/tailto.sh
================================================
#!/bin/sh
tail -n $1 "$2" > /var/run/tailtmp
cat /var/run/tailtmp > "$2"
rm /var/run/tailtmp

================================================
FILE: luci-app-adguardhome/root/usr/share/AdGuardHome/update_core.sh
================================================
#!/bin/bash
PATH="/usr/sbin:/usr/bin:/sbin:/bin"
binpath=$(uci get AdGuardHome.AdGuardHome.binpath)
if [ -z "$binpath" ]; then
uci set AdGuardHome.AdGuardHome.binpath="/tmp/AdGuardHome/AdGuardHome"
binpath="/tmp/AdGuardHome/AdGuardHome"
fi
mkdir -p ${binpath%/*}
upxflag=$(uci get AdGuardHome.AdGuardHome.upxflag 2>/dev/null)

check_if_already_running(){
	running_tasks="$(ps |grep "AdGuardHome" |grep "update_core" |grep -v "grep" |awk '{print $1}' |wc -l)"
	[ "${running_tasks}" -gt "2" ] && echo -e "\nA task is already running."  && EXIT 2
}

check_wgetcurl(){
	which curl && downloader="curl -L -k --retry 2 --connect-timeout 20 -o" && return
	which wget && downloader="wget --no-check-certificate -t 2 -T 20 -O" && return
	[ -z "$1" ] && opkg update || (echo error opkg && EXIT 1)
	[ -z "$1" ] && (opkg remove wget wget-nossl --force-depends ; opkg install wget ; check_wgetcurl 1 ;return)
	[ "$1" == "1" ] && (opkg install curl ; check_wgetcurl 2 ; return)
	echo error curl and wget && EXIT 1
}
check_latest_version(){
	check_wgetcurl
	latest_ver="$($downloader - https://api.github.com/repos/AdguardTeam/AdGuardHome/releases/latest 2>/dev/null|grep -E 'tag_name' |grep -E 'v[0-9.]+' -o 2>/dev/null)"
	if [ -z "${latest_ver}" ]; then
		echo -e "\nFailed to check latest version, please try again later."  && EXIT 1
	fi
	now_ver="$($binpath -c /dev/null --check-config 2>&1| grep -m 1 -E 'v[0-9.]+' -o)"
	if [ "${latest_ver}"x != "${now_ver}"x ] || [ "$1" == "force" ]; then
		echo -e "Local version: ${now_ver}., cloud version: ${latest_ver}." 
		doupdate_core
	else
			echo -e "\nLocal version: ${now_ver}, cloud version: ${latest_ver}." 
			echo -e "You're already using the latest version." 
			if [ ! -z "$upxflag" ]; then
				filesize=$(ls -l $binpath | awk '{ print $5 }')
				if [ $filesize -gt 8000000 ]; then
					echo -e "start upx may take a long time"
					doupx
					mkdir -p "/tmp/AdGuardHomeupdate/AdGuardHome" >/dev/null 2>&1
					rm -fr /tmp/AdGuardHomeupdate/AdGuardHome/${binpath##*/}
					/tmp/upx-${upx_latest_ver}-${Arch}_linux/upx $upxflag $binpath -o /tmp/AdGuardHomeupdate/AdGuardHome/${binpath##*/}
					rm -rf /tmp/upx-${upx_latest_ver}-${Arch}_linux
					/etc/init.d/AdGuardHome stop nobackup
					rm $binpath
					mv -f /tmp/AdGuardHomeupdate/AdGuardHome/${binpath##*/} $binpath
					/etc/init.d/AdGuardHome start
					echo -e "finished"
				fi
			fi
			EXIT 0
	fi
}
doupx(){
	Archt="$(opkg info kernel | grep Architecture | awk -F "[ _]" '{print($2)}')"
	case $Archt in
	"i386")
	Arch="i386"
	;;
	"i686")
	Arch="i386"
	echo -e "i686 use $Arch may have bug" 
	;;
	"x86")
	Arch="amd64"
	;;
	"mipsel")
	Arch="mipsel"
	;;
	"mips64el")
	Arch="mips64el"
	Arch="mipsel"
	echo -e "mips64el use $Arch may have bug" 
	;;
	"mips")
	Arch="mips"
	;;
	"mips64")
	Arch="mips64"
	Arch="mips"
	echo -e "mips64 use $Arch may have bug" 
	;;
	"arm")
	Arch="arm"
	;;
	"armeb")
	Arch="armeb"
	;;
	"aarch64")
	Arch="arm64"
	;;
	"powerpc")
	Arch="powerpc"
	;;
	"powerpc64")
	Arch="powerpc64"
	;;
	*)
	echo -e "error not support $Archt if you can use offical release please issue a bug" 
	EXIT 1
	;;
	esac
	upx_latest_ver="$($downloader - https://api.github.com/repos/upx/upx/releases/latest 2>/dev/null|grep -E 'tag_name' |grep -E '[0-9.]+' -o 2>/dev/null)"
	$downloader /tmp/upx-${upx_latest_ver}-${Arch}_linux.tar.xz "https://github.com/upx/upx/releases/download/v${upx_latest_ver}/upx-${upx_latest_ver}-${Arch}_linux.tar.xz" 2>&1
	#tar xvJf
	which xz || (opkg list | grep ^xz || opkg update && opkg install xz) || (echo "xz download fail" && EXIT 1)
	mkdir -p /tmp/upx-${upx_latest_ver}-${Arch}_linux
	xz -d -c /tmp/upx-${upx_latest_ver}-${Arch}_linux.tar.xz| tar -x -C "/tmp" >/dev/null 2>&1
	if [ ! -e "/tmp/upx-${upx_latest_ver}-${Arch}_linux/upx" ]; then
		echo -e "Failed to download upx." 
		EXIT 1
	fi
	rm /tmp/upx-${upx_latest_ver}-${Arch}_linux.tar.xz
}
doupdate_core(){
	echo -e "Updating core..." 
	mkdir -p "/tmp/AdGuardHomeupdate"
	rm -rf /tmp/AdGuardHomeupdate/* >/dev/null 2>&1
	Archt="$(opkg info kernel | grep Architecture | awk -F "[ _]" '{print($2)}')"
	case $Archt in
	"i386")
	Arch="386"
	;;
	"i686")
	Arch="386"
	;;
	"x86")
	Arch="amd64"
	;;
	"mipsel")
	Arch="mipsle"
	;;
	"mips64el")
	Arch="mips64le"
	Arch="mipsle"
	echo -e "mips64el use $Arch may have bug" 
	;;
	"mips")
	Arch="mips"
	;;
	"mips64")
	Arch="mips64"
	Arch="mips"
	echo -e "mips64 use $Arch may have bug" 
	;;
	"arm")
	Arch="arm"
	;;
	"aarch64")
	Arch="arm64"
	;;
	"powerpc")
	Arch="ppc"
	echo -e "error not support $Archt" 
	EXIT 1
	;;
	"powerpc64")
	Arch="ppc64"
	echo -e "error not support $Archt" 
	EXIT 1
	;;
	*)
	echo -e "error not support $Archt if you can use offical release please issue a bug" 
	EXIT 1
	;;
	esac
	echo -e "start download" 
	grep -v "^#" /usr/share/AdGuardHome/links.txt >/tmp/run/AdHlinks.txt
	while read link
	do
		eval link="$link"
		$downloader /tmp/AdGuardHomeupdate/${link##*/} "$link" 2>&1
		if [ "$?" != "0" ]; then
			echo "download failed try another download"
			rm -f /tmp/AdGuardHomeupdate/${link##*/}
		else
			local success="1"
			break
		fi 
	done < "/tmp/run/AdHlinks.txt"
	rm /tmp/run/AdHlinks.txt
	[ -z "$success" ] && echo "no download success" && EXIT 1
	if [ "${link##*.}" == "gz" ]; then
		tar -zxf "/tmp/AdGuardHomeupdate/${link##*/}" -C "/tmp/AdGuardHomeupdate/"
		if [ ! -e "/tmp/AdGuardHomeupdate/AdGuardHome" ]; then
			echo -e "Failed to download core." 
			rm -rf "/tmp/AdGuardHomeupdate" >/dev/null 2>&1
			EXIT 1
		fi
		downloadbin="/tmp/AdGuardHomeupdate/AdGuardHome/AdGuardHome"
	else
		downloadbin="/tmp/AdGuardHomeupdate/${link##*/}"
	fi
	chmod 755 $downloadbin
	echo -e "download success start copy" 
	if [ -n "$upxflag" ]; then
		echo -e "start upx may take a long time" 
		doupx
		/tmp/upx-${upx_latest_ver}-${Arch}_linux/upx $upxflag $downloadbin
		rm -rf /tmp/upx-${upx_latest_ver}-${Arch}_linux
	fi
	echo -e "start copy" 
	/etc/init.d/AdGuardHome stop nobackup
	rm "$binpath"
	mv -f "$downloadbin" "$binpath"
	if [ "$?" == "1" ]; then
		echo "mv failed maybe not enough space please use upx or change bin to /tmp/AdGuardHome" 
		EXIT 1
	fi
	/etc/init.d/AdGuardHome start
	rm -rf "/tmp/AdGuardHomeupdate" >/dev/null 2>&1
	echo -e "Succeeded in updating core." 
	echo -e "Local version: ${latest_ver}, cloud version: ${latest_ver}.\n" 
	EXIT 0
}
EXIT(){
	rm /var/run/update_core 2>/dev/null
	[ "$1" != "0" ] && touch /var/run/update_core_error
	exit $1
}
main(){
	
	check_if_already_running
	check_latest_version $1
}
	trap "EXIT 1" SIGTERM SIGINT
	touch /var/run/update_core
	rm /var/run/update_core_error 2>/dev/null
	main $1


================================================
FILE: luci-app-adguardhome/root/usr/share/AdGuardHome/waitnet.sh
================================================
#!/bin/sh
PATH="/usr/sbin:/usr/bin:/sbin:/bin"
count=0
while :
do
	ping -c 1 -W 1 -q www.baidu.com 1>/dev/null 2>&1
	if [ "$?" == "0" ]; then
		/etc/init.d/AdGuardHome force_reload
		break
	fi
	ping -c 1 -W 1 -q 202.108.22.5 1>/dev/null 2>&1
	if [ "$?" == "0" ]; then
		/etc/init.d/AdGuardHome force_reload
		break
	fi
	sleep 5
	ping -c 1 -W 1 -q www.google.com 1>/dev/null 2>&1
	if [ "$?" == "0" ]; then
		/etc/init.d/AdGuardHome force_reload
		break
	fi
	ping -c 1 -W 1 -q 8.8.8.8 1>/dev/null 2>&1
	if [ "$?" == "0" ]; then
		/etc/init.d/AdGuardHome force_reload
		break
	fi
	sleep 5
	count=$((count+1))
	if [ $count -gt 18 ]; then
		/etc/init.d/AdGuardHome force_reload
		break
	fi
done
return 0

================================================
FILE: luci-app-adguardhome/root/usr/share/AdGuardHome/watchconfig.sh
================================================
#!/bin/sh
PATH="/usr/sbin:/usr/bin:/sbin:/bin"
configpath=$(uci get AdGuardHome.AdGuardHome.configpath)
while :
do
	sleep 10
	if [ -f "$configpath" ]; then
		/etc/init.d/AdGuardHome do_redirect 1
		break
	fi
done
return 0

================================================
FILE: luci-app-adguardhome/root/usr/share/rpcd/acl.d/luci-app-adguardhome.json
================================================
{
	"luci-app-adguardhome": {
		"description": "Grant UCI access for luci-app-adguardhome",
		"read": {
			"uci": [ "AdGuardHome" ]
		},
		"write": {
			"uci": [ "AdGuardHome" ]
		}
	}
}


================================================
FILE: luci-app-adguardhome/root/www/luci-static/resources/codemirror/addon/fold/foldcode.js
================================================
!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.line<f)return null;for(var i=e.findMarksAt(r.from),d=0;d<i.length;++d)if(i[d].__isFold&&"fold"!==t){if(!n)return null;r.cleared=!0,i[d].clear()}return r}var u=d(!0);if(r(e,i,"scanUp"))for(;!u&&o.line>e.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<e.length;++o)if(e[o].__isFold)return!0}),n.commands.toggleFold=function(n){n.foldCode(n.getCursor())},n.commands.fold=function(n){n.foldCode(n.getCursor(),null,"fold")},n.commands.unfold=function(n){n.foldCode(n.getCursor(),null,"unfold")},n.commands.foldAll=function(e){e.operation(function(){for(var o=e.firstLine(),r=e.lastLine();o<=r;o++)e.foldCode(n.Pos(o,0),null,"fold")})},n.commands.unfoldAll=function(e){e.operation(function(){for(var o=e.firstLine(),r=e.lastLine();o<=r;o++)e.foldCode(n.Pos(o,0),null,"unfold")})},n.registerHelper("fold","combine",function(){var n=Array.prototype.slice.call(arguments,0);return function(e,o){for(var r=0;r<n.length;++r){var i=n[r](e,o);if(i)return i}}}),n.registerHelper("fold","auto",function(n,e){for(var o=n.getHelpers(e,"fold"),r=0;r<o.length;r++){var i=o[r](n,e);if(i)return i}});var o={rangeFinder:n.fold.auto,widget:"↔",minFoldSize:0,scanUp:!1,clearOnEnter:!0};function r(n,e,r){if(e&&void 0!==e[r])return e[r];var i=n.options.foldOptions;return i&&void 0!==i[r]?i[r]:o[r]}n.defineOption("foldOptions",null),n.defineExtension("foldOption",function(n,e){return r(this,n,e)})});

================================================
FILE: luci-app-adguardhome/root/www/luci-static/resources/codemirror/addon/fold/foldgutter.css
================================================
.CodeMirror-foldmarker{color:blue;text-shadow:#b9f 1px 1px 2px,#b9f -1px -1px 2px,#b9f 1px -1px 2px,#b9f -1px 1px 2px;font-family:arial;line-height:.3;cursor:pointer}.CodeMirror-foldgutter{width:.7em}.CodeMirror-foldgutter-open,.CodeMirror-foldgutter-folded{cursor:pointer}.CodeMirror-foldgutter-open:after{content:"\25BE"}.CodeMirror-foldgutter-folded:after{content:"\25B8"}


================================================
FILE: luci-app-adguardhome/root/www/luci-static/resources/codemirror/addon/fold/foldgutter.js
================================================
!function(t){"object"==typeof exports&&"object"==typeof module?t(require("../../lib/codemirror"),require("./foldcode")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","./foldcode"],t):t(CodeMirror)}(function(t){"use strict";t.defineOption("foldGutter",!1,function(o,e,r){r&&r!=t.Init&&(o.clearGutter(o.state.foldGutter.options.gutter),o.state.foldGutter=null,o.off("gutterClick",a),o.off("changes",d),o.off("viewportChange",u),o.off("fold",l),o.off("unfold",l),o.off("swapDoc",d)),e&&(o.state.foldGutter=new function(t){this.options=t,this.from=this.to=0}(function(t){!0===t&&(t={});null==t.gutter&&(t.gutter="CodeMirror-foldgutter");null==t.indicatorOpen&&(t.indicatorOpen="CodeMirror-foldgutter-open");null==t.indicatorFolded&&(t.indicatorFolded="CodeMirror-foldgutter-folded");return t}(e)),f(o),o.on("gutterClick",a),o.on("changes",d),o.on("viewportChange",u),o.on("fold",l),o.on("unfold",l),o.on("swapDoc",d))});var o=t.Pos;function e(t,e){for(var r=t.findMarks(o(e,0),o(e+1,0)),n=0;n<r.length;++n)if(r[n].__isFold){var i=r[n].find(-1);if(i&&i.line===e)return r[n]}}function r(t){if("string"==typeof t){var o=document.createElement("div");return o.className=t+" CodeMirror-guttermarker-subtle",o}return t.cloneNode(!0)}function n(t,n,f){var a=t.state.foldGutter.options,d=n-1,u=t.foldOption(a,"minFoldSize"),l=t.foldOption(a,"rangeFinder"),c="string"==typeof a.indicatorFolded&&i(a.indicatorFolded),s="string"==typeof a.indicatorOpen&&i(a.indicatorOpen);t.eachLine(n,f,function(n){++d;var i=null,f=n.gutterMarkers;if(f&&(f=f[a.gutter]),e(t,d)){if(c&&f&&c.test(f.className))return;i=r(a.indicatorFolded)}else{var p=o(d,0),m=l&&l(t,p);if(m&&m.to.line-m.from.line>=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.from<o.from&&(n(t,e.from,o.from),o.from=e.from),e.to>o.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&&r<e.to&&n(t,r,r+1)}}});

================================================
FILE: luci-app-adguardhome/root/www/luci-static/resources/codemirror/addon/fold/indent-fold.js
================================================
!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";function n(n,t){var i=n.getLine(t),o=i.search(/\S/);return-1==o||/\bcomment\b/.test(n.getTokenTypeAt(e.Pos(t,o+1)))?-1:e.countColumn(i,null,n.getOption("tabSize"))}e.registerHelper("fold","indent",function(t,i){var o=n(t,i.line);if(!(o<0)){for(var r=null,l=i.line+1,f=t.lastLine();l<=f;++l){var u=n(t,l);if(-1==u);else{if(!(u>o))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}})});

================================================
FILE: luci-app-adguardhome/root/www/luci-static/resources/codemirror/lib/codemirror.css
================================================
.CodeMirror{font-family:monospace;height:500px;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}


================================================
FILE: luci-app-adguardhome/root/www/luci-static/resources/codemirror/lib/codemirror.js
================================================
!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.length;++o)i.appendChild(t[o]);return i}function A(e,t,r,n){var i=O(e,t,r,n);return i.setAttribute("role","presentation"),i}function D(e,t){if(3==t.nodeType&&(t=t.parentNode),e.contains)return e.contains(t);do{if(11==t.nodeType&&(t=t.host),t==e)return!0}while(t=t.parentNode)}function W(){var e;try{e=document.activeElement}catch(t){e=document.body||null}for(;e&&e.shadowRoot&&e.shadowRoot.activeElement;)e=e.shadowRoot.activeElement;return e}function H(e,t){var r=e.className;L(t).test(r)||(e.className+=(r?" ":"")+t)}function F(e,t){for(var r=e.split(" "),n=0;n<r.length;n++)r[n]&&!L(r[n]).test(t)&&(t+=" "+r[n]);return t}k=document.createRange?function(e,t,r,n){var i=document.createRange();return i.setEnd(n||e,r),i.setStart(e,t),i}:function(e,t,r){var n=document.body.createTextRange();try{n.moveToElementText(e.parentNode)}catch(e){return n}return n.collapse(!0),n.moveEnd("character",r),n.moveStart("character",t),n};var P=function(e){e.select()};function E(e){var t=Array.prototype.slice.call(arguments,1);return function(){return e.apply(null,t)}}function I(e,t,r){for(var n in t||(t={}),e)!e.hasOwnProperty(n)||!1===r&&t.hasOwnProperty(n)||(t[n]=e[n]);return t}function z(e,t,r,n,i){null==t&&-1==(t=e.search(/[^\s\u00a0]/))&&(t=e.length);for(var o=n||0,l=i||0;;){var s=e.indexOf("\t",o);if(s<0||s>=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<e.length;++r)if(e[r]==t)return r;return-1}R.prototype.onTimeout=function(e){e.id=0,e.time<=+new Date?e.f():setTimeout(e.handler,e.time-+new Date)},R.prototype.set=function(e,t){this.f=t;var r=+new Date+e;(!this.id||r<this.time)&&(clearTimeout(this.id),this.id=setTimeout(this.handler,e),this.time=r)};var G=30,U={toString:function(){return"CodeMirror.Pass"}},V={scroll:!1},K={origin:"*mouse"},j={origin:"+move"};function X(e,t,r){for(var n=0,i=0;;){var o=e.indexOf("\t",n);-1==o&&(o=e.length);var l=o-n;if(o==e.length||i+l>=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.length;n++)r[n]=t(e[n],n);return r}function Z(){}function Q(e,t){var r;return Object.create?r=Object.create(e):(Z.prototype=e,r=new Z),t&&I(t,r),r}var J=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;function ee(e){return/\w/.test(e)||e>"€"&&(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:t<e.length)&&ie(e.charAt(t));)t+=r;return t}function le(e,t,r){for(var n=t>r?-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;i<e.length;++i){var o=e[i];if(o.from<t&&o.to>t)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<f;++p)d.push((h=a.charCodeAt(p))<=247?e.charAt(h):1424<=h&&h<=1524?"R":1536<=h&&h<=1785?t.charAt(h-1536):1774<=h&&h<=2220?"r":8192<=h&&h<=8203?"w":8204==h?"b":"L");for(var g=0,v=c;g<f;++g){var m=d[g];"m"==m?d[g]=v:v=m}for(var y=0,b=c;y<f;++y){var w=d[y];"1"==w&&"r"==b?d[y]="n":i.test(w)&&(b=w,"r"==w&&(d[y]="R"))}for(var x=1,C=d[0];x<f-1;++x){var S=d[x];"+"==S&&"1"==C&&"1"==d[x+1]?d[x]="1":","!=S||C!=d[x+1]||"1"!=C&&"n"!=C||(d[x]=C),C=S}for(var L=0;L<f;++L){var k=d[L];if(","==k)d[L]="N";else if("%"==k){var T=void 0;for(T=L+1;T<f&&"%"==d[T];++T);for(var M=L&&"!"==d[L-1]||T<f&&"1"==d[T]?"1":"N",N=L;N<T;++N)d[N]=M;L=T-1}}for(var O=0,A=c;O<f;++O){var D=d[O];"L"==A&&"1"==D?d[O]="L":i.test(D)&&(A=D)}for(var W=0;W<f;++W)if(n.test(d[W])){var H=void 0;for(H=W+1;H<f&&n.test(d[H]);++H);for(var F="L"==(W?d[W-1]:c),P=F==("L"==(H<f?d[H]:c))?F?"L":"R":c,E=W;E<H;++E)d[E]=P;W=H-1}for(var I,z=[],R=0;R<f;)if(o.test(d[R])){var B=R;for(++R;R<f&&o.test(d[R]);++R);z.push(new s(0,B,R))}else{var G=R,U=z.length;for(++R;R<f&&"L"!=d[R];++R);for(var V=G;V<R;)if(l.test(d[V])){G<V&&z.splice(U,0,new s(1,G,V));var K=V;for(++V;V<R&&l.test(d[V]);++V);z.splice(U,0,new s(2,K,V)),G=V}else++V;G<R&&z.splice(U,0,new s(1,G,R))}return"ltr"==u&&(1==z[0].level&&(I=a.match(/^\s+/))&&(z[0].from=I[0].length,z.unshift(new s(0,0,I[0].length))),1==$(z).level&&(I=a.match(/\s+$/))&&($(z).to-=I[0].length,z.push(new s(0,f-I[0].length,f)))),"rtl"==u?z.reverse():z}}();function ce(e,t){var r=e.order;return null==r&&(r=e.order=ue(e.text,t)),r}var he=[],fe=function(e,t,r){if(e.addEventListener)e.addEventListener(t,r,!1);else if(e.attachEvent)e.attachEvent("on"+t,r);else{var n=e._handlers||(e._handlers={});n[t]=(n[t]||he).concat(r)}};function de(e,t){return e._handlers&&e._handlers[t]||he}function pe(e,t,r){if(e.removeEventListener)e.removeEventListener(t,r,!1);else if(e.detachEvent)e.detachEvent("on"+t,r);else{var n=e._handlers,i=n&&n[t];if(i){var o=B(i,r);o>-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;i<r.length;++i)r[i].apply(null,n)}function ve(e,t,r){return"string"==typeof t&&(t={type:t,preventDefault:function(){this.defaultPrevented=!0}}),ge(e,r||t.type,e,t),Ce(t)||t.codemirrorIgnore}function me(e){var t=e._handlers&&e._handlers.cursorActivity;if(t)for(var r=e.curOp.cursorActivityHandlers||(e.curOp.cursorActivityHandlers=[]),n=0;n<t.length;++n)-1==B(r,t[n])&&r.push(t[n])}function ye(e,t){return de(e,t).length>0}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<o){r=i;break}t-=o}return r.lines[t]}function Ye(e,t,r){var n=[],i=t.line;return e.iter(t.line,r.line+1,function(e){var o=e.text;i==r.line&&(o=o.slice(0,r.ch)),i==t.line&&(o=o.slice(t.ch)),n.push(o),++i}),n}function _e(e,t,r){var n=[];return e.iter(t,r,function(e){n.push(e.text)}),n}function $e(e,t){var r=t-e.height;if(r)for(var n=e;n;n=n.parent)n.height+=r}function qe(e){if(null==e.parent)return null;for(var t=e.parent,r=B(t.lines,e),n=t.parent;n;t=n,n=n.parent)for(var i=0;n.children[i]!=t;++i)r+=n.children[i].chunkSize();return r+t.first}function Ze(e,t){var r=e.first;e:do{for(var n=0;n<e.children.length;++n){var i=e.children[n],o=i.height;if(t<o){e=i;continue e}t-=o,r+=i.chunkSize()}return r}while(!e.lines);for(var l=0;l<e.lines.length;++l){var s=e.lines[l].height;if(t<s)break;t-=s}return r+l}function Qe(e,t){return t>=e.first&&t<e.first+e.size}function Je(e,t){return String(e.lineNumberFormatter(t+e.firstLineNumber))}function et(e,t,r){if(void 0===r&&(r=null),!(this instanceof et))return new et(e,t,r);this.line=e,this.ch=t,this.sticky=r}function tt(e,t){return e.line-t.line||e.ch-t.ch}function rt(e,t){return e.sticky==t.sticky&&0==tt(e,t)}function nt(e){return et(e.line,e.ch)}function it(e,t){return tt(e,t)<0?t:e}function ot(e,t){return tt(e,t)<0?e:t}function lt(e,t){return Math.max(e.first,Math.min(t,e.first+e.size-1))}function st(e,t){if(t.line<e.first)return et(e.first,0);var r=e.first+e.size-1;return t.line>r?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<t.length;n++)r[n]=st(e,t[n]);return r}je.prototype.eol=function(){return this.pos>=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.pos<this.string.length)return this.string.charAt(this.pos++)},je.prototype.eat=function(e){var t=this.string.charAt(this.pos);if("string"==typeof e?t==e:t&&(e.test?e.test(t):e(t)))return++this.pos,t},je.prototype.eatWhile=function(e){for(var t=this.pos;this.eat(e););return this.pos>t},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.lastColumnPos<this.start&&(this.lastColumnValue=z(this.string,this.start,this.tabSize,this.lastColumnPos,this.lastColumnValue),this.lastColumnPos=this.start),this.lastColumnValue-(this.lineStart?z(this.string,this.lineStart,this.tabSize):0)},je.prototype.indentation=function(){return z(this.string,null,this.tabSize)-(this.lineStart?z(this.string,this.lineStart,this.tabSize):0)},je.prototype.match=function(e,t,r){if("string"!=typeof e){var n=this.string.slice(this.pos).match(e);return n&&n.index>0?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;u<e;){var n=i[a];n>e&&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(;r<a;r+=2){var o=i[r+1];i[r+1]=(o?o+" ":"")+"overlay "+t}},o),r.state=l,r.baseTokens=null,r.baseTokenPos=1},a=0;a<e.state.overlays.length;++a)s(a);return{styles:i,classes:o.bgClass||o.textClass?o:null}}function ft(e,t,r){if(!t.styles||t.styles[0]!=e.state.modeGen){var n=dt(e,qe(t)),i=t.text.length>e.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&&n<i.viewTo?s.save():null,s.nextLine()}),r&&(n.modeFrontier=s.line),s}function pt(e,t,r,n){var i=e.doc.mode,o=new je(t,e.options.tabSize,r);for(o.start=o.pos=n||0,""==t&&gt(i,r.state);!o.eol();)vt(i,o,r.state),o.start=o.pos}function gt(e,t){if(e.blankLine)return e.blankLine(t);if(e.innerMode){var r=Ve(e,t);return r.mode.blankLine?r.mode.blankLine(r.state):void 0}}function vt(e,t,r,n){for(var i=0;i<10;i++){n&&(n[0]=Ve(e,r).mode);var o=e.token(t,r);if(t.pos>t.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.pos<t.ch)&&!c.eol();)c.start=c.pos,i=vt(s,c,u.state),n&&o.push(new mt(c,i,Ue(l.mode,u.state)));return n?o:new mt(c,i,u.state)}function bt(e,t){if(e)for(;;){var r=e.match(/(?:^|\s+)line-(background-)?(\S+)/);if(!r)break;e=e.slice(0,r.index)+e.slice(r.index+r[0].length);var n=r[1]?"bgClass":"textClass";null==t[n]?t[n]=r[2]:new RegExp("(?:^|s)"+r[2]+"(?:$|s)").test(t[n])||(t[n]+=" "+r[2])}return e}function wt(e,t,r,n,i,o,l){var s=r.flattenSpans;null==s&&(s=e.options.flattenSpans);var a,u=0,c=null,h=new je(t,e.options.tabSize,n),f=e.options.addModeClass&&[null];for(""==t&&bt(gt(r,n.state),o);!h.eol();){if(h.pos>e.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<h.start;)i(u=Math.min(h.start,u+5e3),c);c=a}h.start=h.pos}for(;u<h.pos;){var p=Math.min(h.pos,u+5e3);i(p,c),u=p}}var xt=!1,Ct=!1;function St(e,t,r){this.marker=e,this.from=t,this.to=r}function Lt(e,t){if(e)for(var r=0;r<e.length;++r){var n=e[r];if(n.marker==t)return n}}function kt(e,t){for(var r,n=0;n<e.length;++n)e[n]!=t&&(r||(r=[])).push(e[n]);return r}function Tt(e,t){if(t.full)return null;var r=Qe(e,t.from.line)&&Xe(e,t.from.line).markedSpans,n=Qe(e,t.to.line)&&Xe(e,t.to.line).markedSpans;if(!r&&!n)return null;var i=t.from.ch,o=t.to.ch,l=0==tt(t.from,t.to),s=function(e,t,r){var n;if(e)for(var i=0;i<e.length;++i){var o=e[i],l=o.marker;if(null==o.from||(l.inclusiveLeft?o.from<=t:o.from<t)||o.from==t&&"bookmark"==l.type&&(!r||!o.marker.insertLeft)){var s=null==o.to||(l.inclusiveRight?o.to>=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<e.length;++i){var o=e[i],l=o.marker;if(null==o.to||(l.inclusiveRight?o.to>=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.from<t);(n||(n=[])).push(new St(l,s?null:o.from-t,null==o.to?null:o.to-t))}}return n}(n,o,l),u=1==t.text.length,c=$(t.text).length+(u?i:0);if(s)for(var h=0;h<s.length;++h){var f=s[h];if(null==f.to){var d=Lt(a,f.marker);d?u&&(f.to=null==d.to?null:d.to+c):f.to=i}}if(a)for(var p=0;p<a.length;++p){var g=a[p];if(null!=g.to&&(g.to+=c),null==g.from)Lt(s,g.marker)||(g.from=c,u&&(s||(s=[])).push(g));else g.from+=c,u&&(s||(s=[])).push(g)}s&&(s=Mt(s)),a&&a!=s&&(a=Mt(a));var v=[s];if(!u){var m,y=t.text.length-2;if(y>0&&s)for(var b=0;b<s.length;++b)null==s[b].to&&(m||(m=[])).push(new St(s[b].marker,null,null));for(var w=0;w<y;++w)v.push(m);v.push(a)}return v}function Mt(e){for(var t=0;t<e.length;++t){var r=e[t];null!=r.from&&r.from==r.to&&!1!==r.marker.clearWhenEmpty&&e.splice(t--,1)}return e.length?e:null}function Nt(e){var t=e.markedSpans;if(t){for(var r=0;r<t.length;++r)t[r].marker.detachLine(e);e.markedSpans=null}}function Ot(e,t){if(t){for(var r=0;r<t.length;++r)t[r].marker.attachLine(e);e.markedSpans=t}}function At(e){return e.inclusiveLeft?-1:0}function Dt(e){return e.inclusiveRight?1:0}function Wt(e,t){var r=e.lines.length-t.lines.length;if(0!=r)return r;var n=e.find(),i=t.find(),o=tt(n.from,i.from)||At(e)-At(t);if(o)return-o;var l=tt(n.to,i.to)||Dt(e)-Dt(t);return l||t.id-e.id}function Ht(e,t){var r,n=Ct&&e.markedSpans;if(n)for(var i=void 0,o=0;o<n.length;++o)(i=n[o]).marker.collapsed&&null==(t?i.from:i.to)&&(!r||Wt(r,i.marker)<0)&&(r=i.marker);return r}function Ft(e){return Ht(e,!0)}function Pt(e){return Ht(e,!1)}function Et(e,t){var r,n=Ct&&e.markedSpans;if(n)for(var i=0;i<n.length;++i){var o=n[i];o.marker.collapsed&&(null==o.from||o.from<t)&&(null==o.to||o.to>t)&&(!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<l.length;++s){var a=l[s];if(a.marker.collapsed){var u=a.marker.find(0),c=tt(u.from,r)||At(a.marker)-At(i),h=tt(u.to,n)||Dt(a.marker)-Dt(i);if(!(c>=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;i<r.length;++i)if((n=r[i]).marker.collapsed){if(null==n.from)return!0;if(!n.marker.widgetNode&&0==n.from&&n.marker.inclusiveLeft&&Ut(e,t,n))return!0}}function Ut(e,t,r){if(null==r.to){var n=r.marker.find(1,!0);return Ut(e,n.line,Lt(n.line.markedSpans,r.marker))}if(r.marker.inclusiveRight&&r.to==t.text.length)return!0;for(var i=void 0,o=0;o<t.markedSpans.length;++o)if((i=t.markedSpans[o]).marker.collapsed&&!i.marker.widgetNode&&i.from==r.to&&(null==i.to||i.to!=r.from)&&(i.marker.inclusiveLeft||r.marker.inclusiveRight)&&Ut(e,t,i))return!0}function Vt(e){for(var t=0,r=(e=zt(e)).parent,n=0;n<r.lines.length;++n){var i=r.lines[n];if(i==e)break;t+=i.height}for(var o=r.parent;o;o=(r=o).parent)for(var l=0;l<o.children.length;++l){var s=o.children[l];if(s==r)break;t+=s.height}return t}function Kt(e){if(0==e.height)return 0;for(var t,r=e.text.length,n=e;t=Ft(n);){var i=t.find(0,!0);n=i.from.line,r+=i.from.ch-i.to.ch}for(n=e;t=Pt(n);){var o=t.find(0,!0);r-=n.text.length-o.from.ch,r+=(n=o.to.line).text.length-o.to.ch}return r}function jt(e){var t=e.display,r=e.doc;t.maxLine=Xe(r,r.first),t.maxLineLength=Kt(t.maxLine),t.maxLineChanged=!0,r.iter(function(e){var r=Kt(e);r>t.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;i<e.length;i++){var o=e.charAt(i);" "!=o||!r||i!=e.length-1&&32!=e.charCodeAt(i+1)||(o=" "),n+=o,r=" "==o}return n}(t,e.trailingSpace):t,h=e.cm.state.specialChars,f=!1;if(h.test(t)){u=document.createDocumentFragment();for(var d=0;;){h.lastIndex=d;var p=h.exec(t),g=p?p.index-d:t.length-d;if(g){var v=document.createTextNode(c.slice(d,d+g));l&&s<9?u.appendChild(O("span",[v])):u.appendChild(v),e.map.push(e.pos,e.pos+g,v),e.col+=g,e.pos+=g}if(!p)break;d+=g+1;var m=void 0;if("\t"==p[0]){var y=e.cm.options.tabSize,b=y-e.col%y;(m=u.appendChild(O("span",_(b),"cm-tab"))).setAttribute("role","presentation"),m.setAttribute("cm-text","\t"),e.col+=b}else"\r"==p[0]||"\n"==p[0]?((m=u.appendChild(O("span","\r"==p[0]?"␍":"␤","cm-invalidchar"))).setAttribute("cm-text",p[0]),e.col+=1):((m=e.cm.options.specialCharPlaceholder(p[0])).setAttribute("cm-text",p[0]),l&&s<9?u.appendChild(O("span",[m])):u.appendChild(m),e.col+=1);e.map.push(e.pos,e.pos+1,m),e.pos++}}else e.col+=t.length,u=document.createTextNode(c),e.map.push(e.pos,e.pos+t.length,u),l&&s<9&&(f=!0),e.pos+=t.length;if(e.trailingSpace=32==c.charCodeAt(t.length-1),r||n||i||f||o){var w=r||"";n&&(w+=n),i&&(w+=i);var x=O("span",[u],w,o);if(a)for(var C in a)a.hasOwnProperty(C)&&"style"!=C&&"class"!=C&&x.setAttribute(C,a[C]);return e.content.appendChild(x)}e.content.appendChild(u)}}function er(e,t){return function(r,n,i,o,l,s,a){i=i?i+" cm-force-border":"cm-force-border";for(var u=r.pos,c=u+n.length;;){for(var h=void 0,f=0;f<t.length&&!((h=t[f]).to>u&&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;w<n.length;++w){var x=n[w],C=x.marker;if("bookmark"==C.type&&x.from==p&&C.widgetNode)y.push(C);else if(x.from<=p&&(null==x.to||x.to>p||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<b.length;L+=2)b[L+1]==m&&(u+=" "+b[L]);if(!h||h.from==p)for(var k=0;k<y.length;++k)tr(t,0,y[k]);if(h&&(h.from||0)==p){if(tr(t,(null==h.to?d+1:h.to)-p,h.marker,null==h.from),null==h.to)return;h.to==p&&(h=!1)}}if(p>=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;O<r.length;O+=2)t.addToken(t,i.slice(o,o=r[O]),qt(r[O+1],t.cm.options))}function nr(e,t,r){this.line=t,this.rest=function(e){for(var t,r;t=Pt(e);)e=t.find(1,!0).line,(r||(r=[])).push(e);return r}(t),this.size=this.rest?qe($(this.rest))-r+1:1,this.node=this.text=null,this.hidden=Gt(e,t)}function ir(e,t,r){for(var n,i=[],o=t;o<r;o=n){var l=new nr(e.doc,Xe(e.doc,o),o);n=o+l.size,i.push(l)}return i}var or=null;var lr=null;function sr(e,t){var r=de(e,t);if(r.length){var n,i=Array.prototype.slice.call(arguments,2);or?n=or.delayedCallbacks:lr?n=lr:(n=lr=[],setTimeout(ar,0));for(var o=function(e){n.push(function(){return r[e].apply(null,i)})},l=0;l<r.length;++l)o(l)}}function ar(){var e=lr;lr=null;for(var t=0;t<e.length;++t)e[t]()}function ur(e,t,r,n){for(var i=0;i<t.changes.length;i++){var o=t.changes[i];"text"==o?fr(e,t):"gutter"==o?pr(e,t,r,n):"class"==o?dr(e,t):"widget"==o&&gr(e,t,n)}t.changes=null}function cr(e){return e.node==e.text&&(e.node=O("div",null,null,"position: relative"),e.text.parentNode&&e.text.parentNode.replaceChild(e.node,e.text),e.node.appendChild(e.text),l&&s<8&&(e.node.style.zIndex=2)),e.node}function hr(e,t){var r=e.display.externalMeasured;return r&&r.line==t.line?(e.display.externalMeasured=null,t.measure=r.measure,r.built):Zt(e,t)}function fr(e,t){var r=t.text.className,n=hr(e,t);t.text==t.node&&(t.node=n.pre),t.text.parentNode.replaceChild(n.pre,t.text),t.text=n.pre,n.bgClass!=t.bgClass||n.textClass!=t.textClass?(t.bgClass=n.bgClass,t.textClass=n.textClass,dr(e,t)):r&&(t.text.className=r)}function dr(e,t){!function(e,t){var r=t.bgClass?t.bgClass+" "+(t.line.bgClass||""):t.line.bgClass;if(r&&(r+=" CodeMirror-linebackground"),t.background)r?t.background.className=r:(t.background.parentNode.removeChild(t.background),t.background=null);else if(r){var n=cr(t);t.background=n.insertBefore(O("div",null,r),n.firstChild),e.display.input.setUneditable(t.background)}}(e,t),t.line.wrapClass?cr(t).className=t.line.wrapClass:t.node!=t.text&&(t.node.className="");var r=t.textClass?t.textClass+" "+(t.line.textClass||""):t.line.textClass;t.text.className=r||""}function pr(e,t,r,n){if(t.gutter&&(t.node.removeChild(t.gutter),t.gutter=null),t.gutterBackground&&(t.node.removeChild(t.gutterBackground),t.gutterBackground=null),t.line.gutterClass){var i=cr(t);t.gutterBackground=O("div",null,"CodeMirror-gutter-background "+t.line.gutterClass,"left: "+(e.options.fixedGutter?n.fixedPos:-n.gutterTotalWidth)+"px; width: "+n.gutterTotalWidth+"px"),e.display.input.setUneditable(t.gutterBackground),i.insertBefore(t.gutterBackground,t.text)}var o=t.line.gutterMarkers;if(e.options.lineNumbers||o){var l=cr(t),s=t.gutter=O("div",null,"CodeMirror-gutter-wrapper","left: "+(e.options.fixedGutter?n.fixedPos:-n.gutterTotalWidth)+"px");if(e.display.input.setUneditable(s),l.insertBefore(s,t.text),t.line.gutterClass&&(s.className+=" "+t.line.gutterClass),!e.options.lineNumbers||o&&o["CodeMirror-linenumbers"]||(t.lineNumber=s.appendChild(O("div",Je(e.options,r),"CodeMirror-linenumber CodeMirror-gutter-elt","left: "+n.gutterLeft["CodeMirror-linenumbers"]+"px; width: "+e.display.lineNumInnerWidth+"px"))),o)for(var a=0;a<e.display.gutterSpecs.length;++a){var u=e.display.gutterSpecs[a].className,c=o.hasOwnProperty(u)&&o[u];c&&s.appendChild(O("div",[c],"CodeMirror-gutter-elt","left: "+n.gutterLeft[u]+"px; width: "+n.gutterWidth[u]+"px"))}}}function gr(e,t,r){t.alignable&&(t.alignable=null);for(var n=t.node.firstChild,i=void 0;n;n=i)i=n.nextSibling,"CodeMirror-linewidget"==n.className&&t.node.removeChild(n);mr(e,t,r)}function vr(e,t,r,n){var i=hr(e,t);return t.text=t.node=i.pre,i.bgClass&&(t.bgClass=i.bgClass),i.textClass&&(t.textClass=i.textClass),dr(e,t),pr(e,t,r,n),mr(e,t,n),t.node}function mr(e,t,r){if(yr(e,t.line,t,r,!0),t.rest)for(var n=0;n<t.rest.length;n++)yr(e,t.rest[n],t,r,!1)}function yr(e,t,r,n,i){if(t.widgets)for(var o=cr(r),l=0,s=t.widgets;l<s.length;++l){var a=s[l],u=O("div",[a.node],"CodeMirror-linewidget");a.handleMouseEvents||u.setAttribute("cm-ignore-events","true"),br(a,u,r,n),e.display.input.setUneditable(u),i&&a.above?o.insertBefore(u,r.gutter||r.text):o.appendChild(u),sr(a,"redraw")}}function br(e,t,r,n){if(e.noHScroll){(r.alignable||(r.alignable=[])).push(t);var i=n.wrapperWidth;t.style.left=n.fixedPos+"px",e.coverGutter||(i-=n.gutterTotalWidth,t.style.paddingLeft=n.gutterTotalWidth+"px"),t.style.width=i+"px"}e.coverGutter&&(t.style.zIndex=5,t.style.position="relative",e.noHScroll||(t.style.marginLeft=-n.gutterTotalWidth+"px"))}function wr(e){if(null!=e.height)return e.height;var t=e.doc.cm;if(!t)return 0;if(!D(document.body,e.node)){var r="position: relative;";e.coverGutter&&(r+="margin-left: -"+t.display.gutters.offsetWidth+"px;"),e.noHScroll&&(r+="width: "+t.display.wrapper.clientWidth+"px;"),N(t.display.measure,O("div",[e.node],null,r))}return e.height=e.node.parentNode.offsetHeight}function xr(e,t){for(var r=Le(t);r!=e.wrapper;r=r.parentNode)if(!r||1==r.nodeType&&"true"==r.getAttribute("cm-ignore-events")||r.parentNode==e.sizer&&r!=e.mover)return!0}function Cr(e){return e.lineSpace.offsetTop}function Sr(e){return e.mover.offsetHeight-e.lineSpace.offsetHeight}function Lr(e){if(e.cachedPaddingH)return e.cachedPaddingH;var t=N(e.measure,O("pre","x","CodeMirror-line-like")),r=window.getComputedStyle?window.getComputedStyle(t):t.currentStyle,n={left:parseInt(r.paddingLeft),right:parseInt(r.paddingRight)};return isNaN(n.left)||isNaN(n.right)||(e.cachedPaddingH=n),n}function kr(e){return G-e.display.nativeBarWidth}function Tr(e){return e.display.scroller.clientWidth-kr(e)-e.display.barWidth}function Mr(e){return e.display.scroller.clientHeight-kr(e)-e.display.barHeight}function Nr(e,t,r){if(e.line==t)return{map:e.measure.map,cache:e.measure.cache};for(var n=0;n<e.rest.length;n++)if(e.rest[n]==t)return{map:e.measure.maps[n],cache:e.measure.caches[n]};for(var i=0;i<e.rest.length;i++)if(qe(e.rest[i])>r)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<e.display.viewTo)return e.display.view[an(e,t)];var r=e.display.externalMeasured;return r&&t>=r.lineN&&t<r.lineN+r.size?r:void 0}function Dr(e,t){var r=qe(t),n=Ar(e,r);n&&!n.text?n=null:n&&n.changes&&(ur(e,n,r,rn(e)),e.curOp.forceUpdate=!0),n||(n=function(e,t){var r=qe(t=zt(t)),n=e.display.externalMeasured=new nr(e.doc,t,r);n.lineN=r;var i=n.built=Zt(e,n);return n.text=i.pre,N(e.display.lineMeasure,i.pre),n}(e,t));var i=Nr(n,t,r);return{line:t,view:n,rect:null,map:i.map,cache:i.cache,before:i.before,hasHeights:!1}}function Wr(e,t,r,n,i){t.before&&(r=-1);var o,a=r+(n||"");return t.cache.hasOwnProperty(a)?o=t.cache[a]:(t.rect||(t.rect=t.view.text.getBoundingClientRect()),t.hasHeights||(!function(e,t,r){var n=e.options.lineWrapping,i=n&&Tr(e);if(!t.measure.heights||n&&t.measure.width!=i){var o=t.measure.heights=[];if(n){t.measure.width=i;for(var l=t.text.firstChild.getClientRects(),s=0;s<l.length-1;s++){var a=l[s],u=l[s+1];Math.abs(a.bottom-u.bottom)>2&&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+c<o.coverEnd&&ie(t.line.text.charAt(o.coverStart+c));)++c;if((i=l&&s<9&&0==u&&c==o.coverEnd-o.coverStart?a.parentNode.getBoundingClientRect():Er(k(a,u,c).getClientRects(),n)).left||i.right||0==u)break;c=u,u-=1,h="right"}l&&s<11&&(i=function(e,t){if(!window.screen||null==screen.logicalXDPI||screen.logicalXDPI==screen.deviceXDPI||!function(e){if(null!=Pe)return Pe;var t=N(e,O("span","x")),r=t.getBoundingClientRect(),n=k(t,0,1).getBoundingClientRect();return Pe=Math.abs(r.left-n.left)>1}(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;b<y.length-1&&!(m<y[b]);b++);var w=b?y[b-1]:0,x=y[b],C={left:("right"==h?i.right:i.left)-t.rect.left,right:("left"==h?i.left:i.right)-t.rect.left,top:w,bottom:x};i.left||i.right||(C.bogus=!0);e.options.singleCursorHeightPerLine||(C.rtop=g,C.rbottom=v);return C}(e,t,r,n)).bogus||(t.cache[a]=o)),{left:o.left,right:o.right,top:i?o.rtop:o.top,bottom:i?o.rbottom:o.bottom}}var Hr,Fr={left:0,right:0,top:0,bottom:0};function Pr(e,t,r){for(var n,i,o,l,s,a,u=0;u<e.length;u+=3)if(s=e[u],a=e[u+1],t<s?(i=0,o=1,l="left"):t<a?o=(i=t-s)+1:(u==e.length-3||t==a&&e[u+3]>t)&&(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<e.length-3&&e[u+3]==e[u+4]&&!e[u+5].insertLeft;)n=e[(u+=3)+2],l="right";break}return{node:n,start:i,end:o,collapse:l,coverStart:s,coverEnd:a}}function Er(e,t){var r=Fr;if("left"==t)for(var n=0;n<e.length&&(r=e[n]).left==r.right;n++);else for(var i=e.length-1;i>=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<e.rest.length;t++)e.measure.caches[t]={}}function zr(e){e.display.externalMeasure=null,M(e.display.lineMeasure);for(var t=0;t<e.display.view.length;t++)Ir(e.display.view[t])}function Rr(e){zr(e),e.display.cachedCharWidth=e.display.cachedTextHeight=e.display.cachedPaddingH=null,e.options.lineWrapping||(e.display.maxLineChanged=!0),e.display.lineNumChars=null}function Br(){return c&&v?-(document.body.getBoundingClientRect().left-parseInt(getComputedStyle(document.body).marginLeft)):window.pageXOffset||(document.documentElement||document.body).scrollLeft}function Gr(){return c&&v?-(document.body.getBoundingClientRect().top-parseInt(getComputedStyle(document.body).marginTop)):window.pageYOffset||(document.documentElement||document.body).scrollTop}function Ur(e){var t=0;if(e.widgets)for(var r=0;r<e.widgets.length;++r)e.widgets[r].above&&(t+=wr(e.widgets[r]));return t}function Vr(e,t,r,n,i){if(!i){var o=Ur(t);r.top+=o,r.bottom+=o}if("line"==n)return r;n||(n="local");var l=Vt(t);if("local"==n?l+=Cr(e.display):l-=e.display.viewOffset,"page"==n||"window"==n){var s=e.display.lineSpace.getBoundingClientRect();l+=s.top+("window"==n?0:Gr());var a=s.left+("window"==n?0:Br());r.left+=a,r.right+=a}return r.top+=l,r.bottom+=l,r}function Kr(e,t,r){if("div"==r)return t;var n=t.left,i=t.top;if("page"==r)n-=Br(),i-=Gr();else if("local"==r||!r){var o=e.display.sizer.getBoundingClientRect();n+=o.left,i+=o.top}var l=e.display.lineSpace.getBoundingClientRect();return{left:n-l.left,top:i-l.top}}function jr(e,t,r,n,i){return n||(n=Xe(e.doc,t.line)),Vr(e,n,Or(e,n,t.ch,i),r)}function Xr(e,t,r,n,i,o){function l(t,l){var s=Wr(e,i,t,l?"right":"left",o);return l?s.left=s.right:s.right=s.left,Vr(e,n,s,r)}n=n||Xe(e.doc,t.line),i||(i=Dr(e,n));var s=ce(n,e.doc.direction),a=t.ch,u=t.sticky;if(a>=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<i.length;f++){var d=i[f];if(!(d.from>=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=g<o?o-g+1e9:g-o;(!c||h>v)&&(c=d,h=v)}}c||(c=i[i.length-1]);c.from<a&&(c={from:a,to:c.to,level:c.level});c.to>u&&(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<g.right-n,b=y==u;v=p+(b?0:1),d=b?"after":"before",f=y?g.left:g.right}else{u||v!=a&&v!=s||v++,d=0==v?"after":v==t.text.length?"before":Wr(e,o,v-(u?1:0)).bottom+l<=i==u?"after":"before";var w=Xr(e,et(r,v,d),"line",t,o);f=w.left,m=i<w.top?-1:i>=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<i.widgets.length;l++)i.widgets[l].height&&(o+=i.widgets[l].height);return r?o+(Math.ceil(i.text.length/n)||1)*t:o+t}}function ln(e){var t=e.doc,r=on(e);t.iter(function(e){var t=r(e);t!=e.height&&$e(e,t)})}function sn(e,t,r,n){var i=e.display;if(!r&&"true"==Le(t).getAttribute("cm-not-content"))return null;var o,l,s=i.lineSpace.getBoundingClientRect();try{o=t.clientX-s.left,l=t.clientY-s.top}catch(t){return null}var a,u=$r(e,o,l);if(n&&1==u.xRel&&(a=Xe(e.doc,u.line).text).length==u.ch){var c=z(a,a.length,e.options.tabSize)-a.length;u=et(u.line,Math.max(0,Math.round((o-Lr(e.display).left)/tn(e.display))-c))}return u}function an(e,t){if(t>=e.display.viewTo)return null;if((t-=e.display.viewFrom)<0)return null;for(var r=e.display.view,n=0;n<r.length;n++)if((t-=r[n].size)<0)return n}function un(e,t,r,n){null==t&&(t=e.doc.first),null==r&&(r=e.doc.first+e.doc.size),n||(n=0);var i=e.display;if(n&&r<i.viewTo&&(null==i.updateLineNumbers||i.updateLineNumbers>t)&&(i.updateLineNumbers=t),e.curOp.viewChanged=!0,t>=i.viewTo)Ct&&Rt(e.doc,t)<i.viewTo&&hn(e);else if(r<=i.viewFrom)Ct&&Bt(e.doc,r+n)>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<u.lineN?u.lineN+=n:t<u.lineN+u.size&&(i.externalMeasured=null))}function cn(e,t,r){e.curOp.viewChanged=!0;var n=e.display,i=e.display.externalMeasured;if(i&&t>=i.lineN&&t<i.lineN+i.size&&(n.externalMeasured=null),!(t<n.viewFrom||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;a<o;a++)s+=l[a].size;if(s!=t){if(n>0){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<t.length;n++){var i=t[n];i.hidden||i.node&&!i.changes||++r}return r}function pn(e){e.display.input.showSelection(e.display.input.prepareSelection())}function gn(e,t){void 0===t&&(t=!0);for(var r=e.doc,n={},i=n.cursors=document.createDocumentFragment(),o=n.selection=document.createDocumentFragment(),l=0;l<r.sel.ranges.length;l++)if(t||l!=r.sel.primIndex){var s=r.sel.ranges[l];if(!(s.from().line>=e.display.viewTo||s.to().line<e.display.viewFrom)){var a=s.empty();(a||e.options.showCursorWhenSelecting)&&vn(e,s.head,i),a||yn(e,s,o)}}return n}function vn(e,t,r){var n=Xr(e,t,"div",null,null,!e.options.singleCursorHeightPerLine),i=r.appendChild(O("div"," ","CodeMirror-cursor"));if(i.style.left=n.left+"px",i.style.top=n.top+"px",i.style.height=Math.max(0,n.bottom-n.top)*e.options.cursorHeight+"px",n.other){var o=r.appendChild(O("div"," ","CodeMirror-cursor CodeMirror-secondarycursor"));o.style.display="",o.style.left=n.other.left+"px",o.style.top=n.other.top+"px",o.style.height=.85*(n.other.bottom-n.other.top)+"px"}}function mn(e,t){return e.top-t.top||e.left-t.left}function yn(e,t,r){var n=e.display,i=e.doc,o=document.createDocumentFragment(),l=Lr(e.display),s=l.left,a=Math.max(n.sizerWidth,Tr(e)-n.sizer.offsetLeft)-l.right,u="ltr"==i.direction;function c(e,t,r,n){t<0&&(t=0),t=Math.round(t),n=Math.round(n),o.appendChild(O("div",null,"CodeMirror-selected","position: absolute; left: "+e+"px;\n                             top: "+t+"px; width: "+(null==r?a-e:r)+"px;\n                             height: "+(n-t)+"px"))}function h(t,r,n){var o,l,h=Xe(i,t),f=h.text.length;function d(r,n){return jr(e,et(t,r),"div",h,n)}function p(t,r,n){var i=Zr(e,h,null,t),o="ltr"==r==("after"==n)?"left":"right";return d("after"==n?i.begin:i.end-(/\s/.test(h.text.charAt(i.end-1))?2:1),o)[o]}var g=ce(h,i.direction);return function(e,t,r,n){if(!e)return n(t,r,"ltr",0);for(var i=!1,o=0;o<e.length;++o){var l=e[o];(l.from<r&&l.to>t||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.bottom<y.top&&c(s,m.bottom,null,y.top),c(N,y.top,O-N,y.bottom)}(!o||mn(m,o)<0)&&(o=m),mn(y,o)<0&&(o=y),(!l||mn(m,l)<0)&&(l=m),mn(y,l)<0&&(l=y)}),{start:o,end:l}}var f=t.from(),d=t.to();if(f.line==d.line)h(f.line,f.ch,d.ch);else{var p=Xe(i,f.line),g=Xe(i,d.line),v=zt(p)==zt(g),m=h(f.line,f.ch,v?p.text.length+1:null).end,y=h(d.line,v?0:null,d.ch).start;v&&(m.top<y.top-2?(c(m.right,m.top,null,m.bottom),c(s,y.top,y.left,y.bottom)):c(m.right,m.top,y.left-m.right,m.bottom)),m.bottom<y.top&&c(s,m.bottom,null,y.top)}r.appendChild(o)}function bn(e){if(e.state.focused){var t=e.display;clearInterval(t.blinker);var r=!0;t.cursorDiv.style.visibility="",e.options.cursorBlinkRate>0?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<t.view.length;n++){var i=t.view[n],o=e.options.lineWrapping,a=void 0,u=0;if(!i.hidden){if(l&&s<8){var c=i.node.offsetTop+i.node.offsetHeight;a=c-r,r=c}else{var h=i.node.getBoundingClientRect();a=h.bottom-h.top,!o&&i.text.firstChild&&(u=i.text.firstChild.getBoundingClientRect().right-h.left-1)}var f=i.line.height-a;if((f>.005||f<-.005)&&($e(i.line,a),kn(i.line),i.rest))for(var d=0;d<i.rest.length;d++)kn(i.rest[d]);if(u>e.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<e.widgets.length;++t){var r=e.widgets[t],n=r.node.parentNode;n&&(r.height=n.offsetHeight)}}function Tn(e,t,r){var n=r&&null!=r.top?Math.max(0,r.top):e.scroller.scrollTop;n=Math.floor(n-Cr(e));var i=r&&null!=r.bottom?r.bottom:n+e.wrapper.clientHeight,o=Ze(t,n),l=Ze(t,i);if(r&&r.ensure){var s=r.ensure.from.line,a=r.ensure.to.line;s<o?(o=s,l=Ze(t,Vt(Xe(t,s))+e.wrapper.clientHeight)):Math.min(a,t.lastLine())>=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.top<n,u=t.bottom>s-n;if(t.top<i)l.scrollTop=a?0:t.top;else if(t.bottom>i+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.left<h?l.scrollLeft=Math.max(0,t.left-(d?0:10)):t.right>f+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<t.length;r++)t[r].call(null);for(var n=0;n<e.ops.length;n++){var i=e.ops[n];if(i.cursorActivityHandlers)for(;i.cursorActivityCalled<i.cursorActivityHandlers.length;)i.cursorActivityHandlers[i.cursorActivityCalled++].call(null,i.cm)}}while(r<t.length)}(r)}finally{or=null,t(r)}}(t,function(e){for(var t=0;t<e.ops.length;t++)e.ops[t].cm.curOp=null;!function(e){for(var t=e.ops,r=0;r<t.length;r++)Xn(t[r]);for(var n=0;n<t.length;n++)(i=t[n]).updatedDisplay=i.mustUpdate&&ni(i.cm,i.update);var i;for(var o=0;o<t.length;o++)Yn(t[o]);for(var l=0;l<t.length;l++)_n(t[l]);for(var s=0;s<t.length;s++)$n(t[s])}(e)})}function Xn(e){var t=e.cm,r=t.display;!function(e){var t=e.display;!t.scrollbarsClipped&&t.scroller.offsetWidth&&(t.nativeBarWidth=t.scroller.offsetWidth-t.scroller.clientWidth,t.heightForcer.style.height=kr(e)+"px",t.sizer.style.marginBottom=-t.nativeBarWidth+"px",t.sizer.style.borderRightWidth=kr(e)+"px",t.scrollbarsClipped=!0)}(t),e.updateMaxLine&&jt(t),e.mustUpdate=e.viewChanged||e.forceUpdate||null!=e.scrollTop||e.scrollToPos&&(e.scrollToPos.from.line<r.viewFrom||e.scrollToPos.to.line>=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<t.doc.scrollLeft&&Pn(t,Math.min(t.display.scroller.scrollLeft,e.maxScrollLeft),!0),t.display.maxLineChanged=!1);var r=e.focus&&e.focus==W();e.preparedSelection&&t.display.input.showSelection(e.preparedSelection,r),(e.updatedDisplay||e.startHeight!=t.doc.height)&&Rn(t,e.barMeasure),e.updatedDisplay&&si(t,e.barMeasure),e.selectionChanged&&bn(t),t.state.focused&&e.updateInput&&t.display.input.reset(e.typing),r&&wn(e.cm)}function $n(e){var t=e.cm,r=t.display,n=t.doc;(e.updatedDisplay&&ii(t,e.update),null==r.wheelStartX||null==e.scrollTop&&null==e.scrollLeft&&!e.scrollToPos||(r.wheelStartX=r.wheelStartY=null),null!=e.scrollTop&&Fn(t,e.scrollTop,e.forceScroll),null!=e.scrollLeft&&Pn(t,e.scrollLeft,!0,!0),e.scrollToPos)&&function(e,t){if(!ve(e,"scrollCursorIntoView")){var r=e.display,n=r.sizer.getBoundingClientRect(),i=null;if(t.top+n.top<0?i=!0:t.bottom+n.top>(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<i.length;++l)i[l].lines.length||ge(i[l],"hide");if(o)for(var s=0;s<o.length;++s)o[s].lines.length&&ge(o[s],"unhide");r.wrapper.offsetHeight&&(n.scrollTop=t.display.scroller.scrollTop),e.changeObjs&&ge(t,"changes",t,e.changeObjs),e.update&&e.update.finish()}function qn(e,t){if(e.curOp)return t();Kn(e);try{return t()}finally{jn(e)}}function Zn(e,t){return function(){if(e.curOp)return t.apply(e,arguments);Kn(e);try{return t.apply(e,arguments)}finally{jn(e)}}}function Qn(e){return function(){if(this.curOp)return e.apply(this,arguments);Kn(this);try{return e.apply(this,arguments)}finally{jn(this)}}}function Jn(e){return function(){var t=this.cm;if(!t||t.curOp)return e.apply(this,arguments);Kn(t);try{return e.apply(this,arguments)}finally{jn(t)}}}function ei(e,t){e.doc.highlightFrontier<e.display.viewTo&&e.state.highlight.set(t,E(ti,e))}function ti(e){var t=e.doc;if(!(t.highlightFrontier>=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&&f<l.length;++f)h=l[f]!=o.styles[f];h&&i.push(n.line),o.stateAfter=n.save(),n.nextLine()}else o.text.length<=e.options.maxHighlightLength&&pt(e,o.text,n),o.stateAfter=n.line%5==0?n.save():null,n.nextLine();if(+new Date>r)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<i.length;t++)cn(e,i[t],"text")})}}var ri=function(e,t,r){var n=e.display;this.viewport=t,this.visible=Tn(n,e.doc,t),this.editorIsHidden=!n.wrapper.offsetWidth,this.wrapperHeight=n.wrapper.clientHeight,this.wrapperWidth=n.wrapper.clientWidth,this.oldDisplayWidth=Tr(e),this.force=r,this.dims=rn(e),this.events=[]};function ni(e,t){var r=e.display,n=e.doc;if(t.editorIsHidden)return hn(e),!1;if(!t.force&&t.visible.from>=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.viewFrom<o&&o-r.viewFrom<20&&(o=Math.max(n.first,r.viewFrom)),r.viewTo>l&&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.viewFrom<t&&(n.view=n.view.slice(an(e,t))),n.viewFrom=t,n.viewTo<r?n.view=n.view.concat(ir(e,n.viewTo,r)):n.viewTo>r&&(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<u.length;h++){var f=u[h];if(f.hidden);else if(f.node&&f.node.parentNode==o){for(;l!=f.node;)l=s(l);var d=i&&null!=t&&t<=c&&f.lineNumber;f.changes&&(B(f.changes,"gutter")>-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.
Download .txt
Showing preview only (217K chars total). Download the full file or copy to clipboard to get everything.
gitextract_p4lu5drf/

├── LICENSE
├── README.md
├── luci-app-adguardhome/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── AdGuardHome.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── AdGuardHome/
│   │   │           ├── base.lua
│   │   │           ├── log.lua
│   │   │           └── manual.lua
│   │   └── view/
│   │       └── AdGuardHome/
│   │           ├── AdGuardHome_check.htm
│   │           ├── AdGuardHome_chpass.htm
│   │           ├── AdGuardHome_status.htm
│   │           ├── log.htm
│   │           └── yamleditor.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── AdGuardHome.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   ├── AdGuardHome
│       │   │   └── AdGuardHome.yaml
│       │   ├── init.d/
│       │   │   └── AdGuardHome
│       │   └── uci-defaults/
│       │       └── 40_luci-AdGuardHome
│       ├── usr/
│       │   └── share/
│       │       ├── AdGuardHome/
│       │       │   ├── AdGuardHome_template.yaml
│       │       │   ├── addhost.sh
│       │       │   ├── firewall.start
│       │       │   ├── getsyslog.sh
│       │       │   ├── gfw2adg.sh
│       │       │   ├── links.txt
│       │       │   ├── tailto.sh
│       │       │   ├── update_core.sh
│       │       │   ├── waitnet.sh
│       │       │   └── watchconfig.sh
│       │       └── rpcd/
│       │           └── acl.d/
│       │               └── luci-app-adguardhome.json
│       └── www/
│           └── luci-static/
│               └── resources/
│                   └── codemirror/
│                       ├── addon/
│                       │   └── fold/
│                       │       ├── foldcode.js
│                       │       ├── foldgutter.css
│                       │       ├── foldgutter.js
│                       │       └── indent-fold.js
│                       ├── lib/
│                       │   ├── codemirror.css
│                       │   └── codemirror.js
│                       ├── mode/
│                       │   └── yaml/
│                       │       └── yaml.js
│                       └── theme/
│                           └── dracula.css
├── luci-app-amlogic/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── amlogic.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── amlogic/
│   │   │           ├── amlogic_armcpu.lua
│   │   │           ├── amlogic_backup.lua
│   │   │           ├── amlogic_backuplist.lua
│   │   │           ├── amlogic_check.lua
│   │   │           ├── amlogic_config.lua
│   │   │           ├── amlogic_info.lua
│   │   │           ├── amlogic_install.lua
│   │   │           ├── amlogic_log.lua
│   │   │           ├── amlogic_poweroff.lua
│   │   │           └── amlogic_upload.lua
│   │   └── view/
│   │       └── amlogic/
│   │           ├── other_button.htm
│   │           ├── other_check.htm
│   │           ├── other_dvalue.htm
│   │           ├── other_info.htm
│   │           ├── other_install.htm
│   │           ├── other_kvm.htm
│   │           ├── other_log.htm
│   │           ├── other_poweroff.htm
│   │           ├── other_rescue.htm
│   │           ├── other_snapshot.htm
│   │           ├── other_upfiles.htm
│   │           └── other_upload.htm
│   ├── po/
│   │   ├── ru/
│   │   │   └── amlogic.po
│   │   └── zh_Hans/
│   │       └── amlogic.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── amlogic
│       │   ├── init.d/
│       │   │   └── amlogic
│       │   └── uci-defaults/
│       │       └── luci-amlogic
│       └── usr/
│           ├── sbin/
│           │   ├── fixcpufreq.pl
│           │   ├── openwrt-backup
│           │   ├── openwrt-ddbr
│           │   ├── openwrt-install-amlogic
│           │   ├── openwrt-kernel
│           │   ├── openwrt-update-allwinner
│           │   ├── openwrt-update-amlogic
│           │   ├── openwrt-update-kvm
│           │   └── openwrt-update-rockchip
│           └── share/
│               ├── amlogic/
│               │   ├── amlogic_check_firmware.sh
│               │   ├── amlogic_check_kernel.sh
│               │   └── amlogic_check_plugin.sh
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-amlogic.json
├── luci-app-autoipsetadder/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── autoipsetadder.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── autoipsetadder.lua
│   │   └── view/
│   │       └── autoipsetadder/
│   │           ├── check.htm
│   │           └── status.htm
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── autoipsetadder
│       │   ├── init.d/
│       │   │   └── autoipsetadder
│       │   └── uci-defaults/
│       │       └── 40_luci-autoipsetadder
│       └── usr/
│           └── bin/
│               └── autoipsetadder/
│                   ├── autoaddlist.sh
│                   ├── debugip.sh
│                   ├── tailto.sh
│                   └── testip.sh
├── luci-app-beardropper/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── beardropper.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── beardropper/
│   │   │           ├── log.lua
│   │   │           └── setting.lua
│   │   └── view/
│   │       └── beardropper/
│   │           └── beardropper_status.htm
│   ├── po/
│   │   ├── zh_Hans/
│   │   │   └── beardropper.po
│   │   └── zh_Hant/
│   │       └── beardropper.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── beardropper
│       │   ├── init.d/
│       │   │   └── beardropper
│       │   └── uci-defaults/
│       │       └── luci-beardropper
│       └── usr/
│           ├── sbin/
│           │   └── beardropper
│           └── share/
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-beardropper.json
├── luci-app-cloudflarespeedtest/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── cloudflarespeedtest.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── cloudflarespeedtest/
│   │   │           ├── cloudflarespeedtest.lua
│   │   │           └── logread.lua
│   │   └── view/
│   │       └── cloudflarespeedtest/
│   │           ├── actions.htm
│   │           └── logread.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── cloudflarespeedtest.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── cloudflarespeedtest
│       │   └── init.d/
│       │       └── cloudflarespeedtest
│       └── usr/
│           ├── bin/
│           │   └── cloudflarespeedtest/
│           │       ├── aliddns.sh
│           │       └── cloudflarespeedtest.sh
│           └── share/
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-cloudflarespeedtest.json
├── luci-app-control-timewol/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── timewol.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── timewol.lua
│   │   └── view/
│   │       └── timewol/
│   │           ├── index.htm
│   │           └── timewol.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── timewol.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── luci-app-control-timewol
│       │   ├── init.d/
│       │   │   └── luci-app-control-timewol
│       │   └── uci-defaults/
│       │       └── luci-app-control-timewol
│       └── usr/
│           └── share/
│               ├── rpcd/
│               │   └── acl.d/
│               │       └── luci-app-control-timewol.json
│               └── ucitrack/
│                   └── luci-app-control-timewol.json
├── luci-app-control-webrestriction/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── webrestriction.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── webrestriction.lua
│   │   └── view/
│   │       └── webrestriction/
│   │           ├── index.htm
│   │           └── webrestriction.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── webrestriction.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── luci-app-control-webrestriction
│       │   ├── init.d/
│       │   │   └── luci-app-control-webrestriction
│       │   └── uci-defaults/
│       │       └── luci-app-control-webrestriction
│       └── usr/
│           └── share/
│               ├── rpcd/
│               │   └── acl.d/
│               │       └── luci-app-control-webrestriction.json
│               └── ucitrack/
│                   └── luci-app-control-webrestriction.json
├── luci-app-control-weburl/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── weburl.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── weburl.lua
│   │   └── view/
│   │       └── weburl/
│   │           ├── index.htm
│   │           └── weburl.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── weburl.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── luci-app-control-weburl
│       │   ├── init.d/
│       │   │   └── luci-app-control-weburl
│       │   └── uci-defaults/
│       │       └── luci-app-control-weburl
│       └── usr/
│           └── share/
│               ├── rpcd/
│               │   └── acl.d/
│               │       └── luci-app-control-weburl.json
│               └── ucitrack/
│                   └── luci-app-control-weburl.json
├── luci-app-cpulimit/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── cpulimit.lua
│   │   └── model/
│   │       └── cbi/
│   │           └── cpulimit.lua
│   ├── po/
│   │   └── zh_Hans/
│   │       └── cpulimit.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── cpulimit
│       │   ├── init.d/
│       │   │   └── cpulimit
│       │   └── uci-defaults/
│       │       └── luci-cpulimit
│       └── usr/
│           ├── bin/
│           │   └── cpulimit.sh
│           └── share/
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-cpulimit.json
├── luci-app-ddns-go/
│   ├── ddns-go/
│   │   ├── Makefile
│   │   └── files/
│   │       ├── ddns-go.conf
│   │       └── ddns-go.init
│   └── luci-app-ddns-go/
│       ├── Makefile
│       ├── htdocs/
│       │   └── luci-static/
│       │       └── resources/
│       │           └── view/
│       │               └── ddns-go/
│       │                   ├── config.js
│       │                   ├── ddns-go.js
│       │                   └── log.js
│       ├── po/
│       │   ├── templates/
│       │   │   └── ddns-go.pot
│       │   └── zh_Hans/
│       │       └── ddns-go.po
│       └── root/
│           ├── etc/
│           │   └── uci-defaults/
│           │       └── 99-luci-ddns-go
│           └── usr/
│               ├── libexec/
│               │   └── ddns-go-call
│               └── share/
│                   ├── luci/
│                   │   └── menu.d/
│                   │       └── luci-app-ddns-go.json
│                   └── rpcd/
│                       ├── acl.d/
│                       │   └── luci-app-ddns-go.json
│                       └── ucode/
│                           └── luci.ddns-go
├── luci-app-ddnsto/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── ddnsto.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── ddnsto.lua
│   │   └── view/
│   │       └── ddnsto/
│   │           └── main.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── ddnsto.po
│   └── root/
│       ├── etc/
│       │   └── uci-defaults/
│       │       └── 50_luci-ddnsto
│       └── www/
│           └── luci-static/
│               └── ddnsto/
│                   └── index.js
├── luci-app-eqosplus/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── eqosplus.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── eqosplus.lua
│   │   └── view/
│   │       └── eqosplus/
│   │           ├── eqosplus.htm
│   │           └── index.htm
│   ├── po/
│   │   ├── templates/
│   │   │   └── eqosplus.pot
│   │   └── zh_Hans/
│   │       └── eqosplus.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── eqosplus
│       │   ├── hotplug.d/
│       │   │   └── iface/
│       │   │       └── 10-eqosplus
│       │   ├── init.d/
│       │   │   └── eqosplus
│       │   └── uci-defaults/
│       │       └── luci-eqosplus
│       └── usr/
│           ├── bin/
│           │   ├── eqosplus
│           │   └── eqosplusctrl
│           └── share/
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-eqosplus.json
├── luci-app-fastnet/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── fastnet.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── fastnet.lua
│   │   └── view/
│   │       └── fastnet/
│   │           └── status.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── fastnet.po
│   └── root/
│       └── etc/
│           └── uci-defaults/
│               └── 50_luci-fastnet
├── luci-app-fileassistant/
│   ├── Makefile
│   ├── htdocs/
│   │   └── luci-static/
│   │       └── resources/
│   │           └── fileassistant/
│   │               ├── fb.css
│   │               └── fb.js
│   └── luasrc/
│       ├── controller/
│       │   └── fileassistant.lua
│       └── view/
│           └── fileassistant.htm
├── luci-app-filebrowser/
│   ├── Makefile
│   ├── htdocs/
│   │   └── luci-static/
│   │       └── resources/
│   │           └── view/
│   │               └── filebrowser.js
│   ├── po/
│   │   ├── templates/
│   │   │   └── filebrowser.pot
│   │   └── zh_Hans/
│   │       └── filebrowser.po
│   └── root/
│       └── usr/
│           └── share/
│               ├── luci/
│               │   └── menu.d/
│               │       └── luci-app-filebrowser.json
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-filebrowser.json
├── luci-app-floatip/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── floatip.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── floatip.lua
│   │   └── view/
│   │       └── floatip_status.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── floatip.po
│   └── root/
│       └── etc/
│           └── uci-defaults/
│               └── 50_luci-floatip
├── luci-app-gost/
│   ├── Makefile
│   ├── htdocs/
│   │   └── luci-static/
│   │       └── resources/
│   │           └── view/
│   │               └── gost.js
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── gost.lua
│   │   └── model/
│   │       └── cbi/
│   │           └── gost.lua
│   ├── po/
│   │   ├── templates/
│   │   │   └── gost.pot
│   │   └── zh_Hans/
│   │       └── gost.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── gost
│       │   └── init.d/
│       │       └── gost
│       └── usr/
│           └── share/
│               ├── luci/
│               │   └── menu.d/
│               │       └── luci-app-gost.json
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-gost.json
├── luci-app-homeproxy/
│   ├── Makefile
│   ├── README
│   ├── htdocs/
│   │   └── luci-static/
│   │       └── resources/
│   │           ├── homeproxy.js
│   │           └── view/
│   │               └── homeproxy/
│   │                   ├── client.js
│   │                   ├── node.js
│   │                   ├── server.js
│   │                   └── status.js
│   ├── po/
│   │   ├── templates/
│   │   │   └── homeproxy.pot
│   │   └── zh_Hans/
│   │       └── homeproxy.po
│   └── root/
│       ├── etc/
│       │   ├── capabilities/
│       │   │   └── homeproxy.json
│       │   ├── config/
│       │   │   └── homeproxy
│       │   ├── homeproxy/
│       │   │   ├── resources/
│       │   │   │   ├── china_ip4.txt
│       │   │   │   ├── china_ip4.ver
│       │   │   │   ├── china_ip6.txt
│       │   │   │   ├── china_ip6.ver
│       │   │   │   ├── china_list.txt
│       │   │   │   ├── china_list.ver
│       │   │   │   ├── gfw_list.txt
│       │   │   │   └── gfw_list.ver
│       │   │   └── scripts/
│       │   │       ├── clean_log.sh
│       │   │       ├── firewall_post.ut
│       │   │       ├── firewall_pre.uc
│       │   │       ├── generate_client.uc
│       │   │       ├── generate_server.uc
│       │   │       ├── homeproxy.uc
│       │   │       ├── migrate_config.uc
│       │   │       ├── update_crond.sh
│       │   │       ├── update_resources.sh
│       │   │       └── update_subscriptions.uc
│       │   ├── init.d/
│       │   │   └── homeproxy
│       │   └── uci-defaults/
│       │       ├── luci-homeproxy
│       │       └── luci-homeproxy-migration
│       └── usr/
│           └── share/
│               ├── luci/
│               │   └── menu.d/
│               │       └── luci-app-homeproxy.json
│               └── rpcd/
│                   ├── acl.d/
│                   │   └── luci-app-homeproxy.json
│                   └── ucode/
│                       └── luci.homeproxy
├── luci-app-ikoolproxy/
│   ├── Makefile
│   ├── change.log
│   ├── development.doc
│   ├── koolproxy/
│   │   ├── Makefile
│   │   └── files/
│   │       ├── aarch64
│   │       ├── arm
│   │       ├── i386
│   │       ├── mips
│   │       ├── mipsel
│   │       └── x86_64
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── koolproxy.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── koolproxy/
│   │   │           ├── add_rule.lua
│   │   │           ├── basic.lua
│   │   │           ├── black_list.lua
│   │   │           ├── cert.lua
│   │   │           ├── control.lua
│   │   │           ├── custom_rule.lua
│   │   │           ├── ip_black_list.lua
│   │   │           ├── ip_white_list.lua
│   │   │           ├── rss_rule.lua
│   │   │           ├── tips.lua
│   │   │           ├── update_log.lua
│   │   │           └── white_list.lua
│   │   └── view/
│   │       └── koolproxy/
│   │           ├── cadvalue.htm
│   │           ├── caupload.htm
│   │           ├── koolproxy_status.htm
│   │           └── tips.htm
│   └── root/
│       ├── etc/
│       │   ├── adblocklist/
│       │   │   ├── adblock
│       │   │   ├── adblockip
│       │   │   ├── adbypass
│       │   │   └── adbypassip
│       │   ├── config/
│       │   │   └── koolproxy
│       │   ├── init.d/
│       │   │   └── koolproxy
│       │   └── uci-defaults/
│       │       └── luci-koolproxy
│       ├── lib/
│       │   └── upgrade/
│       │       └── keep.d/
│       │           └── koolproxy
│       └── usr/
│           ├── sbin/
│           │   └── adblockplus
│           └── share/
│               ├── koolproxy/
│               │   ├── adblock.conf
│               │   ├── camanagement
│               │   ├── data/
│               │   │   ├── gen_ca.sh
│               │   │   ├── openssl.cnf
│               │   │   ├── rules/
│               │   │   │   └── user.txt
│               │   │   ├── source.list
│               │   │   └── user.txt
│               │   ├── dnsmasq.adblock
│               │   ├── koolproxy_ipset.conf
│               │   └── kpupdate
│               ├── rpcd/
│               │   └── acl.d/
│               │       └── luci-app-ikoolproxy.json
│               └── ucitrack/
│                   └── luci-app-ikoolproxy.json
├── luci-app-iperf3-server/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── iperf3-server.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── iperf3-server.lua
│   │   └── view/
│   │       └── iperf3-server/
│   │           └── iperf3-server_status.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── iperf3-server.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── iperf3-server
│       │   ├── init.d/
│       │   │   └── iperf3-server
│       │   └── uci-defaults/
│       │       └── iperf3-server
│       └── usr/
│           └── share/
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-iperf3-server.json
├── luci-app-istoreenhance/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── istoreenhance.lua
│   │   ├── model/
│   │   │   ├── cbi/
│   │   │   │   └── istoreenhance.lua
│   │   │   └── istoreenhance.lua
│   │   └── view/
│   │       └── istoreenhance_status.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── istoreenhance.po
│   └── root/
│       └── etc/
│           └── uci-defaults/
│               └── 50_luci-istoreenhance
├── luci-app-istorex/
│   ├── Makefile
│   ├── htdocs/
│   │   └── luci-static/
│   │       └── istorex/
│   │           ├── chunk.167c223d.js
│   │           ├── chunk.18e0c91d.js
│   │           ├── chunk.211ffb47.js
│   │           ├── chunk.2147605f.js
│   │           ├── chunk.25dae49f.js
│   │           ├── chunk.403244cc.js
│   │           ├── chunk.41b74402.js
│   │           ├── chunk.42bb6629.js
│   │           ├── chunk.4d4bc89c.js
│   │           ├── chunk.4f4af73e.js
│   │           ├── chunk.5e41a3f0.js
│   │           ├── chunk.6d3585bb.js
│   │           ├── chunk.6f7d3090.js
│   │           ├── chunk.7deee291.js
│   │           ├── chunk.83d679c2.js
│   │           ├── chunk.8bf617a1.js
│   │           ├── chunk.8f1ff823.js
│   │           ├── chunk.a1bcc52b.js
│   │           ├── chunk.b7ccb4ed.js
│   │           ├── chunk.d9ea7f57.js
│   │           ├── chunk.de33ea3e.js
│   │           ├── chunk.ead1f974.js
│   │           ├── chunk.f2b02e0d.js
│   │           ├── chunk.fb51d2b2.js
│   │           ├── chunk.fdf02bc2.js
│   │           ├── chunk.ff94f9f2.js
│   │           ├── chunk.ffd7724b.js
│   │           ├── index.js
│   │           └── style.css
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── istorex.lua
│   │   └── view/
│   │       └── istorex/
│   │           ├── index.htm
│   │           ├── main.htm
│   │           └── main_dev.htm
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── istorex
│       │   └── uci-defaults/
│       │       └── 50_luci-istorex
│       └── usr/
│           └── share/
│               └── luci/
│                   └── menu.d/
│                       └── luci-app-istorex.json
├── luci-app-kai/
│   ├── Makefile
│   └── luasrc/
│       ├── controller/
│       │   └── kai.lua
│       ├── model/
│       │   ├── cbi/
│       │   │   └── kai.lua
│       │   └── kai.lua
│       └── view/
│           └── kai/
│               └── kai_status.htm
├── luci-app-linkease/
│   ├── Makefile
│   ├── htdocs/
│   │   └── luci-static/
│   │       └── linkeasefile/
│   │           ├── chunk.22632dc4.js
│   │           ├── chunk.324cab41.js
│   │           ├── chunk.4a114b4a.js
│   │           ├── chunk.4ea0593d.js
│   │           ├── chunk.6424c2fc.js
│   │           ├── chunk.7191676b.js
│   │           ├── chunk.a0a5dece.js
│   │           ├── chunk.a6a47e72.js
│   │           ├── chunk.c69499bb.js
│   │           ├── chunk.d52f0fe8.js
│   │           ├── chunk.dc0a1b58.js
│   │           ├── index.js
│   │           └── style.css
│   ├── luasrc/
│   │   ├── controller/
│   │   │   ├── linkease.lua
│   │   │   └── linkease_backend.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── linkease.lua
│   │   └── view/
│   │       ├── admin_status/
│   │       │   └── index/
│   │       │       └── linkease.htm
│   │       ├── linkease/
│   │       │   └── file.htm
│   │       └── linkease_status.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── linkease.po
│   └── root/
│       └── etc/
│           └── uci-defaults/
│               └── 50_luci-linkease
├── luci-app-lucky/
│   ├── luci-app-lucky/
│   │   ├── Makefile
│   │   ├── htdocs/
│   │   │   └── luci-static/
│   │   │       └── resources/
│   │   │           └── view/
│   │   │               └── lucky/
│   │   │                   ├── config.js
│   │   │                   └── lucky.js
│   │   ├── po/
│   │   │   └── zh_Hans/
│   │   │       └── lucky.po
│   │   └── root/
│   │       ├── etc/
│   │       │   └── uci-defaults/
│   │       │       └── luci-app-lucky
│   │       └── usr/
│   │           └── share/
│   │               ├── luci/
│   │               │   └── menu.d/
│   │               │       └── luci-app-lucky.json
│   │               └── rpcd/
│   │                   ├── acl.d/
│   │                   │   └── luci-app-lucky.json
│   │                   └── ucode/
│   │                       └── luci.lucky
│   └── lucky/
│       ├── Makefile
│       └── files/
│           ├── lucky.config
│           └── lucky.init
├── luci-app-mentohust/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── mentohust.lua
│   │   └── model/
│   │       └── cbi/
│   │           └── mentohust/
│   │               ├── general.lua
│   │               └── log.lua
│   ├── po/
│   │   └── zh_Hans/
│   │       └── mentohust.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── mentohust
│       │   ├── init.d/
│       │   │   └── mentohust
│       │   └── uci-defaults/
│       │       └── luci-mentohust
│       └── usr/
│           └── share/
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-mentohust.json
├── luci-app-msd_lite/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── msd_lite.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── msd_lite.lua
│   │   └── view/
│   │       └── msd_lite/
│   │           └── msd_lite_status.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── msd_lite.po
│   └── root/
│       └── etc/
│           └── uci-defaults/
│               └── 40_luci-msd_lite
├── luci-app-natter/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── natter.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── natter/
│   │   │           ├── base.lua
│   │   │           ├── log.lua
│   │   │           └── ports.lua
│   │   └── view/
│   │       └── natter/
│   │           └── natter_log.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── natter.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── natter
│       │   ├── init.d/
│       │   │   └── natter
│       │   └── uci-defaults/
│       │       └── luci-natter
│       └── usr/
│           └── share/
│               └── luci-app-natter/
│                   ├── log.sh
│                   └── natcheck.sh
├── luci-app-natter2/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── natter2.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── natter2/
│   │   │           ├── base.lua
│   │   │           ├── instances.lua
│   │   │           └── log.lua
│   │   └── view/
│   │       └── natter2/
│   │           └── natter_log.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── natter2.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── natter2
│       │   ├── init.d/
│       │   │   └── natter2
│       │   └── uci-defaults/
│       │       └── luci-natter2
│       └── usr/
│           └── share/
│               └── luci-app-natter2/
│                   ├── log.sh
│                   ├── nat-check.sh
│                   ├── notify-base.sh
│                   └── notify-example.sh
├── luci-app-nginx-manager/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── nginx-manager.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── nginx-manager.lua
│   │   └── view/
│   │       └── nginx-manager/
│   │           └── index.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── nginx-manager.po
│   └── root/
│       ├── etc/
│       │   ├── nginx/
│       │   │   └── conf.d/
│       │   │       └── templates
│       │   └── uci-defaults/
│       │       └── luci-app-nginx-manager
│       └── usr/
│           └── share/
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-nginx-manager.json
├── luci-app-nginx-pingos/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── pingos.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── pingos.lua
│   │   └── view/
│   │       └── pingos/
│   │           └── status.htm
│   ├── modules/
│   │   ├── nginx-client-module/
│   │   │   ├── COPYRIGHT
│   │   │   ├── config
│   │   │   ├── ngx_client.c
│   │   │   ├── ngx_client.h
│   │   │   ├── ngx_http_client.c
│   │   │   ├── ngx_http_client.h
│   │   │   └── t/
│   │   │       ├── config
│   │   │       ├── nginx.conf
│   │   │       ├── ngx_client_stat_module.c
│   │   │       ├── ngx_client_test_module.c
│   │   │       ├── ngx_http_client_test_module.c
│   │   │       └── tcpserver.go
│   │   ├── nginx-multiport-module/
│   │   │   ├── COPYRIGHT
│   │   │   ├── config
│   │   │   ├── ngx_event_multiport_module.c
│   │   │   ├── ngx_http_broadcast_module.c
│   │   │   ├── ngx_http_inner_proxy_module.c
│   │   │   ├── ngx_multiport.h
│   │   │   ├── ngx_multiport_misc.c
│   │   │   ├── ngx_process_slot_module.c
│   │   │   ├── ngx_stream_zone_module.c
│   │   │   ├── ngx_stream_zone_module.h
│   │   │   └── t/
│   │   │       ├── config
│   │   │       ├── nginx.conf
│   │   │       ├── ngx_multiport_test_module.c
│   │   │       ├── ngx_stream_zone_test_module.c
│   │   │       └── ngx_test_macro.h
│   │   ├── nginx-rtmp-module/
│   │   │   ├── AUTHORS
│   │   │   ├── config
│   │   │   ├── dash/
│   │   │   │   ├── ngx_rtmp_dash_module.c
│   │   │   │   ├── ngx_rtmp_mp4.c
│   │   │   │   └── ngx_rtmp_mp4.h
│   │   │   ├── hls/
│   │   │   │   ├── ngx_rtmp_hls_module.c
│   │   │   │   ├── ngx_rtmp_mpegts.c
│   │   │   │   └── ngx_rtmp_mpegts.h
│   │   │   ├── http/
│   │   │   │   ├── ngx_http_flv_live_module.c
│   │   │   │   ├── ngx_http_set_header.c
│   │   │   │   └── ngx_http_set_header.h
│   │   │   ├── mpegts/
│   │   │   │   ├── ngx_hls_http_module.c
│   │   │   │   ├── ngx_hls_live_module.c
│   │   │   │   ├── ngx_hls_live_module.h
│   │   │   │   ├── ngx_mpegts_gop_module.c
│   │   │   │   ├── ngx_mpegts_gop_module.h
│   │   │   │   ├── ngx_mpegts_http_module.c
│   │   │   │   ├── ngx_mpegts_live_module.c
│   │   │   │   └── ngx_mpegts_live_module.h
│   │   │   ├── ngx_live.c
│   │   │   ├── ngx_live.h
│   │   │   ├── ngx_live_record.c
│   │   │   ├── ngx_live_record.h
│   │   │   ├── ngx_live_relay.c
│   │   │   ├── ngx_live_relay.h
│   │   │   ├── ngx_live_relay_httpflv.c
│   │   │   ├── ngx_live_relay_inner.c
│   │   │   ├── ngx_live_relay_rtmp.c
│   │   │   ├── ngx_live_relay_simple.c
│   │   │   ├── ngx_live_relay_static.c
│   │   │   ├── ngx_netcall.c
│   │   │   ├── ngx_netcall.h
│   │   │   ├── ngx_rtmp.c
│   │   │   ├── ngx_rtmp.h
│   │   │   ├── ngx_rtmp_access_module.c
│   │   │   ├── ngx_rtmp_amf.c
│   │   │   ├── ngx_rtmp_amf.h
│   │   │   ├── ngx_rtmp_bandwidth.c
│   │   │   ├── ngx_rtmp_bandwidth.h
│   │   │   ├── ngx_rtmp_bitop.c
│   │   │   ├── ngx_rtmp_bitop.h
│   │   │   ├── ngx_rtmp_cmd_module.c
│   │   │   ├── ngx_rtmp_cmd_module.h
│   │   │   ├── ngx_rtmp_codec_module.c
│   │   │   ├── ngx_rtmp_codec_module.h
│   │   │   ├── ngx_rtmp_control_module.c
│   │   │   ├── ngx_rtmp_core_module.c
│   │   │   ├── ngx_rtmp_dynamic.c
│   │   │   ├── ngx_rtmp_dynamic.h
│   │   │   ├── ngx_rtmp_eval.c
│   │   │   ├── ngx_rtmp_eval.h
│   │   │   ├── ngx_rtmp_exec_module.c
│   │   │   ├── ngx_rtmp_gop_module.c
│   │   │   ├── ngx_rtmp_handler.c
│   │   │   ├── ngx_rtmp_handshake.c
│   │   │   ├── ngx_rtmp_init.c
│   │   │   ├── ngx_rtmp_limit_module.c
│   │   │   ├── ngx_rtmp_live_module.c
│   │   │   ├── ngx_rtmp_live_module.h
│   │   │   ├── ngx_rtmp_log_module.c
│   │   │   ├── ngx_rtmp_monitor_module.c
│   │   │   ├── ngx_rtmp_monitor_module.h
│   │   │   ├── ngx_rtmp_notify_module.c
│   │   │   ├── ngx_rtmp_notify_module.h
│   │   │   ├── ngx_rtmp_proxy_protocol.c
│   │   │   ├── ngx_rtmp_proxy_protocol.h
│   │   │   ├── ngx_rtmp_receive.c
│   │   │   ├── ngx_rtmp_record_module.c
│   │   │   ├── ngx_rtmp_record_module.h
│   │   │   ├── ngx_rtmp_send.c
│   │   │   ├── ngx_rtmp_shared_module.c
│   │   │   ├── ngx_rtmp_stat_module.c
│   │   │   ├── ngx_rtmp_streams.h
│   │   │   ├── ngx_rtmp_sys_stat_module.c
│   │   │   ├── ngx_rtmp_variables.c
│   │   │   ├── ngx_rtmp_variables.h
│   │   │   └── ngx_rtmp_version.h
│   │   ├── nginx-toolkit-module/
│   │   │   ├── COPYRIGHT
│   │   │   ├── config
│   │   │   ├── ngx_dynamic_conf.c
│   │   │   ├── ngx_dynamic_conf.h
│   │   │   ├── ngx_dynamic_resolver.c
│   │   │   ├── ngx_dynamic_resolver.h
│   │   │   ├── ngx_event_resolver.c
│   │   │   ├── ngx_event_resolver.h
│   │   │   ├── ngx_event_timer_module.c
│   │   │   ├── ngx_event_timer_module.h
│   │   │   ├── ngx_http_dynamic.c
│   │   │   ├── ngx_http_dynamic.h
│   │   │   ├── ngx_http_trace_module.c
│   │   │   ├── ngx_map.c
│   │   │   ├── ngx_map.h
│   │   │   ├── ngx_poold.c
│   │   │   ├── ngx_poold.h
│   │   │   ├── ngx_rbuf.c
│   │   │   ├── ngx_rbuf.h
│   │   │   ├── ngx_timerd.c
│   │   │   ├── ngx_timerd.h
│   │   │   ├── ngx_toolkit_misc.c
│   │   │   ├── ngx_toolkit_misc.h
│   │   │   └── t/
│   │   │       ├── config
│   │   │       ├── dns_install.sh
│   │   │       ├── md5testfile
│   │   │       ├── named.conf
│   │   │       ├── nginx.conf
│   │   │       ├── nginx_dynamic.conf
│   │   │       ├── ngx_dynamic_conf_test_module.c
│   │   │       ├── ngx_dynamic_resolver_test_module.c
│   │   │       ├── ngx_event_resolver_test_module.c
│   │   │       ├── ngx_event_timer_test_module.c
│   │   │       ├── ngx_http_dynamic_test_module.c
│   │   │       ├── ngx_map_test_module.c
│   │   │       ├── ngx_poold_test_module.c
│   │   │       ├── ngx_rbuf_test_module.c
│   │   │       ├── ngx_test_macro.h
│   │   │       ├── ngx_timerd_test_module.c
│   │   │       ├── ngx_toolkit_misc_test_module.c
│   │   │       ├── test.com.zone
│   │   │       └── test1.com.zone
│   │   └── nginx-ts-module/
│   │       ├── README.rst
│   │       ├── config
│   │       └── src/
│   │           ├── ngx_http_ts_module.c
│   │           ├── ngx_stream_ts_module.c
│   │           ├── ngx_ts_aac.c
│   │           ├── ngx_ts_aac.h
│   │           ├── ngx_ts_avc.c
│   │           ├── ngx_ts_avc.h
│   │           ├── ngx_ts_dash.c
│   │           ├── ngx_ts_dash.h
│   │           ├── ngx_ts_dash_mp4.c
│   │           ├── ngx_ts_hls.c
│   │           ├── ngx_ts_hls.h
│   │           ├── ngx_ts_stream.c
│   │           └── ngx_ts_stream.h
│   ├── patches/
│   │   ├── 101-feature_test_fix.patch
│   │   ├── 102-sizeof_test_fix.patch
│   │   ├── 103-sys_nerr.patch
│   │   ├── 104-endianness_fix.patch
│   │   ├── 200-config.patch
│   │   └── 201-ignore-invalid-options.patch
│   ├── po/
│   │   └── zh_Hans/
│   │       └── pingos.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── pingos
│       │   ├── init.d/
│       │   │   └── pingos
│       │   ├── pingos.template
│       │   └── uci-defaults/
│       │       └── luci-app-nginx-pingos
│       ├── resource/
│       │   ├── conf-template/
│       │   │   └── nginx.conf
│       │   ├── crossdomain.xml
│       │   └── stat.xsl
│       └── usr/
│           └── share/
│               ├── rpcd/
│               │   └── acl.d/
│               │       └── luci-app-nginx-pingos.json
│               └── ucitrack/
│                   └── luci-app-nginx-pingos.json
├── luci-app-nikki/
│   ├── feed.sh
│   ├── install.sh
│   ├── luci-app-nikki/
│   │   ├── Makefile
│   │   ├── htdocs/
│   │   │   └── luci-static/
│   │   │       └── resources/
│   │   │           ├── tools/
│   │   │           │   └── nikki.js
│   │   │           └── view/
│   │   │               └── nikki/
│   │   │                   ├── app.js
│   │   │                   ├── editor.js
│   │   │                   ├── log.js
│   │   │                   ├── mixin.js
│   │   │                   ├── profile.js
│   │   │                   └── proxy.js
│   │   ├── po/
│   │   │   ├── ru/
│   │   │   │   └── nikki.po
│   │   │   ├── templates/
│   │   │   │   └── nikki.pot
│   │   │   ├── zh_Hans/
│   │   │   │   └── nikki.po
│   │   │   └── zh_Hant/
│   │   │       └── nikki.po
│   │   └── root/
│   │       └── usr/
│   │           └── share/
│   │               ├── luci/
│   │               │   └── menu.d/
│   │               │       └── luci-app-nikki.json
│   │               └── rpcd/
│   │                   ├── acl.d/
│   │                   │   └── luci-app-nikki.json
│   │                   └── ucode/
│   │                       └── luci.nikki
│   ├── mihomo-alpha/
│   │   └── Makefile
│   ├── mihomo-meta/
│   │   └── Makefile
│   ├── nikki/
│   │   ├── Makefile
│   │   └── files/
│   │       ├── mixin.yaml
│   │       ├── nftables/
│   │       │   ├── geoip6_cn.nft
│   │       │   └── geoip_cn.nft
│   │       ├── nikki.conf
│   │       ├── nikki.init
│   │       ├── nikki.upgrade
│   │       ├── scripts/
│   │       │   ├── debug.sh
│   │       │   ├── firewall_include.sh
│   │       │   └── include.sh
│   │       ├── uci-defaults/
│   │       │   ├── firewall.sh
│   │       │   ├── init.sh
│   │       │   └── migrate.sh
│   │       └── ucode/
│   │           ├── hijack.ut
│   │           ├── include.uc
│   │           └── mixin.uc
│   └── uninstall.sh
├── luci-app-npc/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── npc.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── npc.lua
│   │   └── view/
│   │       └── npc/
│   │           └── npc_status.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── npc.po
│   └── root/
│       └── etc/
│           ├── config/
│           │   └── npc
│           ├── init.d/
│           │   └── npc
│           └── uci-defaults/
│               └── luci-npc
├── luci-app-oled/
│   ├── linux/
│   │   ├── ssd1306.cfg
│   │   └── ssd1306.service
│   └── luci-app-oled/
│       ├── Makefile
│       ├── luasrc/
│       │   ├── controller/
│       │   │   └── oled.lua
│       │   ├── model/
│       │   │   └── cbi/
│       │   │       └── oled/
│       │   │           └── setting.lua
│       │   └── view/
│       │       └── oled/
│       │           └── status.htm
│       ├── po/
│       │   ├── zh_Hans/
│       │   │   └── oled.po
│       │   └── zh_Hant/
│       │       └── oled.po
│       ├── root/
│       │   ├── etc/
│       │   │   ├── config/
│       │   │   │   └── oled
│       │   │   ├── init.d/
│       │   │   │   └── oled
│       │   │   └── uci-defaults/
│       │   │       └── oled
│       │   └── usr/
│       │       └── share/
│       │           └── rpcd/
│       │               └── acl.d/
│       │                   └── luci-app-oled.json
│       └── src/
│           ├── Example_Code/
│           │   ├── .clang-format
│           │   ├── example_app.c
│           │   ├── example_app.h
│           │   └── main.c
│           ├── I2C_Library/
│           │   ├── .clang-format
│           │   ├── I2C.c
│           │   └── I2C.h
│           ├── Makefile
│           └── SSD1306_OLED_Library/
│               ├── .clang-format
│               ├── SSD1306_OLED.c
│               ├── SSD1306_OLED.h
│               └── gfxfont.h
├── luci-app-onliner/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── onliner.lua
│   │   └── view/
│   │       └── onliner/
│   │           ├── display.htm
│   │           └── onliner.htm
│   └── root/
│       └── usr/
│           └── share/
│               └── onliner/
│                   └── setnlbw.sh
├── luci-app-oscam/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── oscam.lua
│   │   └── model/
│   │       └── cbi/
│   │           └── oscam.lua
│   ├── po/
│   │   └── zh_Hans/
│   │       └── oscam.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── oscam
│       │   └── uci-defaults/
│       │       └── luci-oscam
│       └── usr/
│           └── share/
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-oscam.json
├── luci-app-partexp/
│   ├── Makefile
│   ├── htdocs/
│   │   └── luci-static/
│   │       └── resources/
│   │           └── view/
│   │               ├── partexp/
│   │               │   ├── manual.js
│   │               │   └── partexp.js
│   │               └── partexp.js
│   ├── po/
│   │   ├── templates/
│   │   │   └── partexp.po
│   │   └── zh_Hans/
│   │       └── partexp.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── partexp
│       │   └── uci-defaults/
│       │       └── zzz_luci-app-partexp
│       └── usr/
│           ├── bin/
│           │   └── partexp
│           ├── libexec/
│           │   └── rpcd/
│           │       └── partexp
│           └── share/
│               ├── luci/
│               │   └── menu.d/
│               │       └── luci-app-partexp.json
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-partexp.json
├── luci-app-passwall/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── passwall.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── passwall/
│   │   │           ├── client/
│   │   │           │   ├── acl.lua
│   │   │           │   ├── acl_config.lua
│   │   │           │   ├── app_update.lua
│   │   │           │   ├── global.lua
│   │   │           │   ├── haproxy.lua
│   │   │           │   ├── include/
│   │   │           │   │   └── shunt_options.lua
│   │   │           │   ├── log.lua
│   │   │           │   ├── node_config.lua
│   │   │           │   ├── node_list.lua
│   │   │           │   ├── node_subscribe.lua
│   │   │           │   ├── node_subscribe_config.lua
│   │   │           │   ├── other.lua
│   │   │           │   ├── rule.lua
│   │   │           │   ├── rule_list.lua
│   │   │           │   ├── shunt_rules.lua
│   │   │           │   ├── socks_config.lua
│   │   │           │   └── type/
│   │   │           │       ├── hysteria2.lua
│   │   │           │       ├── naive.lua
│   │   │           │       ├── ray.lua
│   │   │           │       ├── sing-box.lua
│   │   │           │       ├── ss-rust.lua
│   │   │           │       ├── ss.lua
│   │   │           │       └── ssr.lua
│   │   │           └── server/
│   │   │               ├── index.lua
│   │   │               ├── type/
│   │   │               │   ├── hysteria2.lua
│   │   │               │   ├── ray.lua
│   │   │               │   ├── sing-box.lua
│   │   │               │   ├── socks.lua
│   │   │               │   ├── ss-rust.lua
│   │   │               │   ├── ss.lua
│   │   │               │   └── ssr.lua
│   │   │               └── user.lua
│   │   ├── passwall/
│   │   │   ├── api.lua
│   │   │   ├── com.lua
│   │   │   ├── server_app.lua
│   │   │   ├── util_hysteria2.lua
│   │   │   ├── util_naiveproxy.lua
│   │   │   ├── util_shadowsocks.lua
│   │   │   ├── util_sing-box.lua
│   │   │   └── util_xray.lua
│   │   └── view/
│   │       └── passwall/
│   │           ├── acl/
│   │           │   └── view_chinadns_log.htm
│   │           ├── app_update/
│   │           │   └── app_version.htm
│   │           ├── cbi/
│   │           │   ├── hidevalue.htm
│   │           │   ├── nodes_dynamiclist.htm
│   │           │   ├── nodes_dynamiclist_com.htm
│   │           │   ├── nodes_listvalue.htm
│   │           │   ├── nodes_listvalue_com.htm
│   │           │   ├── nodes_multivalue.htm
│   │           │   ├── nodes_multivalue_com.htm
│   │           │   ├── nodes_value.htm
│   │           │   ├── nodes_value_com.htm
│   │           │   └── optimize_cbi_ui.htm
│   │           ├── global/
│   │           │   ├── backup.htm
│   │           │   ├── faq.htm
│   │           │   ├── footer.htm
│   │           │   ├── proxy.htm
│   │           │   └── status.htm
│   │           ├── haproxy/
│   │           │   ├── js.htm
│   │           │   └── status.htm
│   │           ├── include/
│   │           │   └── shunt_options.htm
│   │           ├── log/
│   │           │   └── log.htm
│   │           ├── node_config/
│   │           │   ├── footer.htm
│   │           │   ├── header.htm
│   │           │   └── link_share_man.htm
│   │           ├── node_list/
│   │           │   ├── link_add_node.htm
│   │           │   └── node_list.htm
│   │           ├── node_subscribe/
│   │           │   └── js.htm
│   │           ├── rule/
│   │           │   └── rule_version.htm
│   │           ├── rule_list/
│   │           │   ├── geoview.htm
│   │           │   └── js.htm
│   │           ├── server/
│   │           │   ├── log.htm
│   │           │   └── users_list_status.htm
│   │           └── socks_auto_switch/
│   │               └── btn.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── passwall.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── passwall_server
│       │   ├── hotplug.d/
│       │   │   └── iface/
│       │   │       └── 98-passwall
│       │   ├── init.d/
│       │   │   ├── passwall
│       │   │   └── passwall_server
│       │   └── uci-defaults/
│       │       └── luci-passwall
│       └── usr/
│           └── share/
│               ├── passwall/
│               │   ├── 0_default_config
│               │   ├── app.sh
│               │   ├── clash_subconverter.lua
│               │   ├── haproxy.lua
│               │   ├── haproxy_check.sh
│               │   ├── helper_chinadns_add.lua
│               │   ├── helper_dnsmasq.lua
│               │   ├── helper_smartdns.sh
│               │   ├── helper_smartdns_add.lua
│               │   ├── iptables.sh
│               │   ├── lease2hosts.sh
│               │   ├── monitor.sh
│               │   ├── nftables.sh
│               │   ├── rule_update.lua
│               │   ├── rules/
│               │   │   ├── block_host
│               │   │   ├── block_ip
│               │   │   ├── chnlist
│               │   │   ├── chnroute
│               │   │   ├── chnroute6
│               │   │   ├── direct_host
│               │   │   ├── direct_ip
│               │   │   ├── domains_excluded
│               │   │   ├── gfwlist
│               │   │   ├── lanlist_ipv4
│               │   │   ├── lanlist_ipv6
│               │   │   ├── proxy_host
│               │   │   └── proxy_ip
│               │   ├── socks_auto_switch.sh
│               │   ├── subscribe.lua
│               │   ├── tasks.sh
│               │   ├── test.sh
│               │   └── utils.sh
│               ├── rpcd/
│               │   └── acl.d/
│               │       └── luci-app-passwall.json
│               └── ucitrack/
│                   ├── luci-app-passwall-server.json
│                   └── luci-app-passwall.json
├── luci-app-passwall2/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── passwall2.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── passwall2/
│   │   │           ├── client/
│   │   │           │   ├── acl.lua
│   │   │           │   ├── acl_config.lua
│   │   │           │   ├── app_update.lua
│   │   │           │   ├── geoview.lua
│   │   │           │   ├── global.lua
│   │   │           │   ├── haproxy.lua
│   │   │           │   ├── include/
│   │   │           │   │   └── shunt_options.lua
│   │   │           │   ├── log.lua
│   │   │           │   ├── node_config.lua
│   │   │           │   ├── node_list.lua
│   │   │           │   ├── node_subscribe.lua
│   │   │           │   ├── node_subscribe_config.lua
│   │   │           │   ├── other.lua
│   │   │           │   ├── rule.lua
│   │   │           │   ├── shunt_rules.lua
│   │   │           │   ├── socks_config.lua
│   │   │           │   └── type/
│   │   │           │       ├── hysteria2.lua
│   │   │           │       ├── naive.lua
│   │   │           │       ├── ray.lua
│   │   │           │       ├── sing-box.lua
│   │   │           │       ├── ss-rust.lua
│   │   │           │       ├── ss.lua
│   │   │           │       ├── ssr.lua
│   │   │           │       └── tuic.lua
│   │   │           └── server/
│   │   │               ├── index.lua
│   │   │               ├── type/
│   │   │               │   ├── hysteria2.lua
│   │   │               │   ├── ray.lua
│   │   │               │   ├── sing-box.lua
│   │   │               │   ├── ss-rust.lua
│   │   │               │   ├── ss.lua
│   │   │               │   └── ssr.lua
│   │   │               └── user.lua
│   │   ├── passwall2/
│   │   │   ├── api.lua
│   │   │   ├── com.lua
│   │   │   ├── server_app.lua
│   │   │   ├── util_hysteria2.lua
│   │   │   ├── util_naiveproxy.lua
│   │   │   ├── util_shadowsocks.lua
│   │   │   ├── util_sing-box.lua
│   │   │   ├── util_tuic.lua
│   │   │   └── util_xray.lua
│   │   └── view/
│   │       └── passwall2/
│   │           ├── app_update/
│   │           │   └── app_version.htm
│   │           ├── cbi/
│   │           │   ├── hidevalue.htm
│   │           │   ├── nodes_dynamiclist.htm
│   │           │   ├── nodes_dynamiclist_com.htm
│   │           │   ├── nodes_listvalue.htm
│   │           │   ├── nodes_listvalue_com.htm
│   │           │   ├── nodes_multivalue.htm
│   │           │   ├── nodes_multivalue_com.htm
│   │           │   ├── nodes_value.htm
│   │           │   ├── nodes_value_com.htm
│   │           │   └── optimize_cbi_ui.htm
│   │           ├── global/
│   │           │   ├── backup.htm
│   │           │   ├── faq.htm
│   │           │   ├── footer.htm
│   │           │   └── status.htm
│   │           ├── haproxy/
│   │           │   ├── js.htm
│   │           │   └── status.htm
│   │           ├── include/
│   │           │   └── shunt_options.htm
│   │           ├── log/
│   │           │   └── log.htm
│   │           ├── node_config/
│   │           │   ├── footer.htm
│   │           │   ├── header.htm
│   │           │   └── link_share_man.htm
│   │           ├── node_list/
│   │           │   ├── link_add_node.htm
│   │           │   └── node_list.htm
│   │           ├── node_subscribe/
│   │           │   └── js.htm
│   │           ├── rule/
│   │           │   ├── geoview.htm
│   │           │   └── rule_version.htm
│   │           ├── server/
│   │           │   ├── log.htm
│   │           │   └── users_list_status.htm
│   │           └── socks_auto_switch/
│   │               └── btn.htm
│   ├── po/
│   │   ├── fa/
│   │   │   └── passwall2.po
│   │   ├── ru/
│   │   │   └── passwall2.po
│   │   ├── zh-tw/
│   │   │   └── passwall2.po
│   │   └── zh_Hans/
│   │       └── passwall2.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── passwall2_server
│       │   ├── hotplug.d/
│       │   │   └── iface/
│       │   │       └── 98-passwall2
│       │   ├── init.d/
│       │   │   ├── passwall2
│       │   │   └── passwall2_server
│       │   └── uci-defaults/
│       │       └── luci-passwall2
│       └── usr/
│           └── share/
│               ├── passwall2/
│               │   ├── 0_default_config
│               │   ├── app.sh
│               │   ├── domains_excluded
│               │   ├── haproxy.lua
│               │   ├── haproxy_check.sh
│               │   ├── helper_dnsmasq.lua
│               │   ├── i18n.lua
│               │   ├── iptables.sh
│               │   ├── lease2hosts.sh
│               │   ├── monitor.sh
│               │   ├── nftables.sh
│               │   ├── rule_update.lua
│               │   ├── socks_auto_switch.sh
│               │   ├── subscribe.lua
│               │   ├── tasks.sh
│               │   ├── test.sh
│               │   └── utils.sh
│               ├── rpcd/
│               │   └── acl.d/
│               │       └── luci-app-passwall2.json
│               └── ucitrack/
│                   ├── luci-app-passwall2-server.json
│                   └── luci-app-passwall2.json
├── luci-app-poweroffdevice/
│   └── luci-app-poweroffdevice/
│       ├── Makefile
│       ├── htdocs/
│       │   └── luci-static/
│       │       └── resources/
│       │           └── view/
│       │               └── system/
│       │                   └── poweroffdevice.js
│       ├── po/
│       │   └── zh_Hans/
│       │       └── poweroffdevice.po
│       └── root/
│           └── usr/
│               └── share/
│                   ├── luci/
│                   │   └── menu.d/
│                   │       └── luci-app-poweroffdevice.json
│                   └── rpcd/
│                       └── acl.d/
│                           └── luci-app-poweroffdevice.json
├── luci-app-pppoe-server/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── pppoe-server.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── pppoe-server/
│   │   │           ├── online.lua
│   │   │           ├── settings.lua
│   │   │           └── users.lua
│   │   └── view/
│   │       └── pppoe-server/
│   │           ├── index.htm
│   │           └── status.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── pppoe-server.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── luci-app-pppoe-server
│       │   ├── init.d/
│       │   │   └── luci-app-pppoe-server
│       │   └── uci-defaults/
│       │       └── luci-app-pppoe-server
│       └── usr/
│           └── share/
│               ├── luci-app-pppoe-server/
│               │   ├── ip-down
│               │   └── ip-up
│               ├── rpcd/
│               │   └── acl.d/
│               │       └── luci-app-pppoe-server.json
│               └── ucitrack/
│                   └── luci-app-pppoe-server.json
├── luci-app-pushbot/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── pushbot.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── pushbot/
│   │   │           ├── advanced.lua
│   │   │           ├── client.lua
│   │   │           ├── log.lua
│   │   │           └── setting.lua
│   │   └── view/
│   │       └── pushbot/
│   │           ├── pushbot_log.htm
│   │           └── pushbot_status.htm
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── pushbot
│       │   ├── init.d/
│       │   │   └── pushbot
│       │   └── uci-defaults/
│       │       └── luci-pushbot
│       └── usr/
│           ├── bin/
│           │   └── pushbot/
│           │       ├── api/
│           │       │   ├── bark.json
│           │       │   ├── dingding.json
│           │       │   ├── diy.json
│           │       │   ├── ent_wechat.json
│           │       │   ├── feishu.json
│           │       │   ├── ip_blacklist
│           │       │   ├── ipv4.list
│           │       │   ├── ipv6.list
│           │       │   ├── pushdeer.json
│           │       │   └── pushplus.json
│           │       └── pushbot
│           └── share/
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-pushbot.json
├── luci-app-qfirehose/
│   ├── Makefile
│   ├── htdocs/
│   │   └── luci-static/
│   │       └── resources/
│   │           └── view/
│   │               └── qfirehose.js
│   ├── po/
│   │   └── zh_Hans/
│   │       └── qfirehose.po
│   ├── qfirehose/
│   │   └── Makefile
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── qfirehose
│       │   └── init.d/
│       │       └── qfirehose
│       └── usr/
│           ├── sbin/
│           │   ├── qfirehose-modem-info
│           │   ├── qfirehose-start
│           │   └── qfirehose-status
│           └── share/
│               ├── luci/
│               │   └── menu.d/
│               │       └── luci-app-qfirehose.json
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-qfirehose.json
├── luci-app-qmodem/
│   ├── application/
│   │   ├── ndisc6/
│   │   │   ├── Makefile
│   │   │   └── patches/
│   │   │       ├── 100-favor_bsd.patch
│   │   │       └── 110-strverscmp.patch
│   │   ├── qfirehose/
│   │   │   ├── Makefile
│   │   │   └── src/
│   │   │       ├── .clang-format
│   │   │       ├── Android.mk
│   │   │       ├── CMakeLists.txt
│   │   │       ├── Makefile
│   │   │       ├── NOTICE
│   │   │       ├── ReleaseNote.txt
│   │   │       ├── android/
│   │   │       │   ├── arm64-v8a/
│   │   │       │   │   └── QFirehose
│   │   │       │   └── armeabi-v7a/
│   │   │       │       └── QFirehose
│   │   │       ├── firehose_protocol.c
│   │   │       ├── hostdl_packet.h
│   │   │       ├── log/
│   │   │       │   ├── MCU_local.log.txt
│   │   │       │   ├── MCU_remote.log.txt
│   │   │       │   ├── Ubuntu_remote.log.txt
│   │   │       │   └── pcie_mhi.log.txt
│   │   │       ├── md5.c
│   │   │       ├── md5.h
│   │   │       ├── qfirehose.c
│   │   │       ├── sahara.c
│   │   │       ├── sahara.h
│   │   │       ├── stream_download_protocol.c
│   │   │       ├── usb2tcp.c
│   │   │       ├── usb_linux.c
│   │   │       └── usb_linux.h
│   │   ├── qmodem/
│   │   │   ├── Makefile
│   │   │   └── files/
│   │   │       ├── etc/
│   │   │       │   ├── config/
│   │   │       │   │   └── qmodem
│   │   │       │   ├── hotplug.d/
│   │   │       │   │   ├── iface/
│   │   │       │   │   │   └── 80-wwan-led
│   │   │       │   │   ├── net/
│   │   │       │   │   │   └── 20-modem-net
│   │   │       │   │   └── usb/
│   │   │       │   │       └── 20-modem-usb
│   │   │       │   ├── init.d/
│   │   │       │   │   ├── qmodem_init
│   │   │       │   │   ├── qmodem_led
│   │   │       │   │   ├── qmodem_network
│   │   │       │   │   ├── qmodem_reboot
│   │   │       │   │   └── qmodem_usage_stats
│   │   │       │   └── uci-defaults/
│   │   │       │       ├── 99-add-5g-handler
│   │   │       │       └── luci-app-qmodem
│   │   │       └── usr/
│   │   │           ├── lib/
│   │   │           │   └── lua/
│   │   │           │       └── luci/
│   │   │           │           └── view/
│   │   │           │               └── admin_status/
│   │   │           │                   └── index/
│   │   │           │                       └── modem_overview.htm
│   │   │           ├── libexec/
│   │   │           │   └── rpcd/
│   │   │           │       ├── modem_ctrl
│   │   │           │       └── qmodem
│   │   │           └── share/
│   │   │               ├── qmodem/
│   │   │               │   ├── at_commands_en.json
│   │   │               │   ├── at_commands_zh.json
│   │   │               │   ├── generic.sh
│   │   │               │   ├── led_scripts/
│   │   │               │   │   ├── c2000_max.sh
│   │   │               │   │   └── m60k63.sh
│   │   │               │   ├── modem_ctrl.sh
│   │   │               │   ├── modem_dial.sh
│   │   │               │   ├── modem_hook.sh
│   │   │               │   ├── modem_port_rule.json
│   │   │               │   ├── modem_scan.sh
│   │   │               │   ├── modem_support.json
│   │   │               │   ├── modem_util.sh
│   │   │               │   ├── usage_stats.sh
│   │   │               │   └── vendor/
│   │   │               │       ├── dynamic_load.json
│   │   │               │       ├── fibocom.sh
│   │   │               │       ├── foxconn.sh
│   │   │               │       ├── gosuncn.sh
│   │   │               │       ├── huawei.sh
│   │   │               │       ├── meig.sh
│   │   │               │       ├── neoway.sh
│   │   │               │       ├── quectel.sh
│   │   │               │       ├── sierra.sh
│   │   │               │       ├── simcom.sh
│   │   │               │       └── telit.sh
│   │   │               └── rpcd/
│   │   │                   └── acl.d/
│   │   │                       ├── luci-app-qmodem.json
│   │   │                       └── qmodem.json
│   │   ├── qmodem_monitor/
│   │   │   ├── Makefile
│   │   │   └── files/
│   │   │       ├── etc/
│   │   │       │   └── init.d/
│   │   │       │       └── qmodem_monitor
│   │   │       └── usr/
│   │   │           └── share/
│   │   │               └── qmodem/
│   │   │                   └── modem_monitor.sh
│   │   ├── quectel_CM_5G_M/
│   │   │   ├── Makefile
│   │   │   ├── files/
│   │   │   │   ├── apns.json
│   │   │   │   ├── dhcp
│   │   │   │   ├── rmnet.script
│   │   │   │   ├── rmnet.sh
│   │   │   │   ├── rmnet6.script
│   │   │   │   ├── rmnet6.sh
│   │   │   │   └── rmnet_init.sh
│   │   │   └── src/
│   │   │       ├── CMakeLists.txt
│   │   │       ├── GobiNetCM.c
│   │   │       ├── Makefile
│   │   │       ├── Makefile.am
│   │   │       ├── NOTICE
│   │   │       ├── QCQCTL.h
│   │   │       ├── QCQMI.h
│   │   │       ├── QCQMUX.c
│   │   │       ├── QCQMUX.h
│   │   │       ├── QMIThread.c
│   │   │       ├── QMIThread.h
│   │   │       ├── QmiWwanCM.c
│   │   │       ├── ReleaseNote.txt
│   │   │       ├── at_tok.c
│   │   │       ├── at_tok.h
│   │   │       ├── atc.c
│   │   │       ├── atchannel.c
│   │   │       ├── atchannel.h
│   │   │       ├── configure.ac
│   │   │       ├── default.script
│   │   │       ├── default.script_ip
│   │   │       ├── device.c
│   │   │       ├── ethtool-copy.h
│   │   │       ├── log/
│   │   │       │   ├── cdc_mbim.txt
│   │   │       │   ├── cdc_mbim_vlan.txt
│   │   │       │   ├── ecm_ncm_rndis.txt
│   │   │       │   ├── gobinet.txt
│   │   │       │   ├── gobinet_bridge.txt
│   │   │       │   ├── gobinet_qmap=1.txt
│   │   │       │   ├── gobinet_qmap=1_bridge.txt
│   │   │       │   ├── gobinet_qmap=4.txt
│   │   │       │   ├── gobinet_qmap=4_bridge.txt
│   │   │       │   ├── pcie_mhi_mbim.txt
│   │   │       │   ├── pcie_mhi_mbim_qmap=4.txt
│   │   │       │   ├── pcie_mhi_qmap=1.txt
│   │   │       │   ├── pcie_mhi_qmap=1_bridge.txt
│   │   │       │   ├── pcie_mhi_qmap=4.txt
│   │   │       │   ├── pcie_mhi_qmap=4_bridge.txt
│   │   │       │   ├── qmi_wwan_q.txt
│   │   │       │   ├── qmi_wwan_q_bridge.txt
│   │   │       │   ├── qmi_wwan_q_qmap=1.txt
│   │   │       │   ├── qmi_wwan_q_qmap=1_bridge.txt
│   │   │       │   ├── qmi_wwan_q_qmap=4.txt
│   │   │       │   ├── qmi_wwan_q_qmap=4_bridge.txt
│   │   │       │   ├── qmi_wwan_qmap=4.txt
│   │   │       │   └── usage_of_argument/
│   │   │       │       ├── 6.txt
│   │   │       │       └── m.txt
│   │   │       ├── main.c
│   │   │       ├── mbim-cm.c
│   │   │       ├── qendian.h
│   │   │       ├── qlist.h
│   │   │       ├── qmap_bridge_mode.c
│   │   │       ├── qrtr.c
│   │   │       ├── qrtr.h
│   │   │       ├── quectel-atc-proxy.c
│   │   │       ├── quectel-mbim-proxy.c
│   │   │       ├── quectel-qmi-proxy.c
│   │   │       ├── quectel-qrtr-proxy.c
│   │   │       ├── rmnetctl.c
│   │   │       ├── udhcpc.c
│   │   │       ├── udhcpc_netlink.c
│   │   │       ├── udhcpc_script.c
│   │   │       ├── util.c
│   │   │       └── util.h
│   │   ├── sms-tool_q/
│   │   │   ├── Makefile
│   │   │   ├── patches/
│   │   │   │   ├── 0001-send_raw_pdu.patch
│   │   │   │   └── 0002-add_timeout_option.patch
│   │   │   └── src/
│   │   │       ├── LICENSE-2.0.txt
│   │   │       ├── Makefile
│   │   │       ├── pdu_lib/
│   │   │       │   ├── Makefile
│   │   │       │   ├── pdu.c
│   │   │       │   ├── pdu.h
│   │   │       │   ├── pdu_decoder.c
│   │   │       │   └── ucs2_to_utf8.c
│   │   │       └── sms_main.c
│   │   ├── sms_forwarder/
│   │   │   ├── Makefile
│   │   │   ├── files/
│   │   │   │   ├── etc/
│   │   │   │   │   ├── config/
│   │   │   │   │   │   └── sms_daemon
│   │   │   │   │   └── init.d/
│   │   │   │   │       └── sms_forwarder
│   │   │   │   └── usr/
│   │   │   │       └── bin/
│   │   │   │           ├── sms_forward_custom_example.sh
│   │   │   │           ├── sms_forward_feishu.sh
│   │   │   │           ├── sms_forward_pushdeer.sh
│   │   │   │           ├── sms_forward_serverchan.sh
│   │   │   │           ├── sms_forward_tgbot.sh
│   │   │   │           └── sms_forward_webhook.sh
│   │   │   └── src/
│   │   │       ├── Makefile
│   │   │       ├── Makefile.local
│   │   │       ├── main.c
│   │   │       └── sms_forwarder.h
│   │   ├── sms_forwarder_next/
│   │   │   ├── Makefile
│   │   │   └── files/
│   │   │       ├── scripts/
│   │   │       │   ├── sms_forward_custom_example.sh
│   │   │       │   ├── sms_forward_feishu.sh
│   │   │       │   ├── sms_forward_pushdeer.sh
│   │   │       │   ├── sms_forward_serverchan.sh
│   │   │       │   ├── sms_forward_tgbot.sh
│   │   │       │   └── sms_forward_webhook.sh
│   │   │       ├── sms_forwarder.example
│   │   │       ├── sms_forwarder.init
│   │   │       └── sms_forwarder_next
│   │   ├── tom_modem/
│   │   │   ├── Makefile
│   │   │   └── src/
│   │   │       ├── Makefile
│   │   │       ├── extlib/
│   │   │       │   ├── pdu.c
│   │   │       │   ├── pdu.h
│   │   │       │   ├── pdu_decoder.c
│   │   │       │   └── ucs2_to_utf8.c
│   │   │       ├── main.c
│   │   │       ├── main.h
│   │   │       ├── modem_types.h
│   │   │       ├── operations.c
│   │   │       ├── operations.h
│   │   │       ├── transport.c
│   │   │       ├── transport.h
│   │   │       ├── ttydevice.c
│   │   │       ├── ttydevice.h
│   │   │       ├── ubus_client.c
│   │   │       ├── ubus_client.h
│   │   │       ├── utils.c
│   │   │       └── utils.h
│   │   └── ubus_at_daemon/
│   │       ├── Makefile
│   │       ├── files/
│   │       │   └── etc/
│   │       │       ├── config/
│   │       │       │   └── ubus-at-daemon
│   │       │       └── init.d/
│   │       │           └── ubus-at-daemon
│   │       └── src/
│   │           ├── Makefile
│   │           ├── at_handler.c
│   │           ├── config_loader.c
│   │           ├── const.h
│   │           ├── event_callback.c
│   │           ├── main.c
│   │           ├── port_manager.c
│   │           └── ubus_at_daemon.h
│   ├── driver/
│   │   ├── fibocom_QMI_WWAN/
│   │   │   ├── Makefile
│   │   │   └── src/
│   │   │       ├── Makefile
│   │   │       └── qmi_wwan_f.c
│   │   ├── quectel_MHI/
│   │   │   ├── Makefile
│   │   │   ├── files/
│   │   │   │   └── pcie_mhi
│   │   │   └── src/
│   │   │       ├── Makefile
│   │   │       ├── README
│   │   │       ├── ReleaseNote.txt
│   │   │       ├── controllers/
│   │   │       │   ├── Kconfig
│   │   │       │   ├── Makefile
│   │   │       │   ├── mhi_arch_qti.c
│   │   │       │   ├── mhi_qcom.c
│   │   │       │   ├── mhi_qcom.h
│   │   │       │   ├── mhi_qti.c
│   │   │       │   └── mhi_qti.h
│   │   │       ├── core/
│   │   │       │   ├── Makefile
│   │   │       │   ├── mhi.h
│   │   │       │   ├── mhi_boot.c
│   │   │       │   ├── mhi_dtr.c
│   │   │       │   ├── mhi_init.c
│   │   │       │   ├── mhi_internal.h
│   │   │       │   ├── mhi_main.c
│   │   │       │   ├── mhi_pm.c
│   │   │       │   ├── mhi_sdx20.h
│   │   │       │   └── sdx20_mhi.h
│   │   │       ├── devices/
│   │   │       │   ├── Kconfig
│   │   │       │   ├── Makefile
│   │   │       │   ├── mhi_netdev.c
│   │   │       │   ├── mhi_netdev_quectel.c
│   │   │       │   ├── mhi_satellite.c
│   │   │       │   └── mhi_uci.c
│   │   │       └── log/
│   │   │           ├── AT_OVER_PCIE.txt
│   │   │           ├── MBIM_OVER_PCIE.txt
│   │   │           ├── QMI_OVER_PCIE.txt
│   │   │           └── QXDM_OVER_PCIE.txt
│   │   ├── quectel_QMI_WWAN/
│   │   │   ├── Makefile
│   │   │   └── src/
│   │   │       ├── Makefile
│   │   │       ├── ReleaseNote.txt
│   │   │       ├── qmi_wwan_q.c
│   │   │       └── rmnet_nss.c
│   │   └── simcom_QMI_WWAN/
│   │       ├── Makefile
│   │       └── src/
│   │           ├── Makefile
│   │           └── qmi_wwan_s.c
│   ├── luci/
│   │   ├── luci-app-qmodem/
│   │   │   ├── Makefile
│   │   │   ├── htdocs/
│   │   │   │   └── luci-static/
│   │   │   │       └── resources/
│   │   │   │           └── view/
│   │   │   │               └── status/
│   │   │   │                   └── include/
│   │   │   │                       └── 11_modem.js
│   │   │   ├── luasrc/
│   │   │   │   ├── controller/
│   │   │   │   │   └── qmodem.lua
│   │   │   │   ├── model/
│   │   │   │   │   └── cbi/
│   │   │   │   │       └── qmodem/
│   │   │   │   │           ├── dial_config.lua
│   │   │   │   │           ├── dial_overview.lua
│   │   │   │   │           ├── modem_cfg.lua
│   │   │   │   │           ├── modem_config.lua
│   │   │   │   │           ├── settings.lua
│   │   │   │   │           └── slot_config.lua
│   │   │   │   └── view/
│   │   │   │       └── qmodem/
│   │   │   │           ├── dial_overview.htm
│   │   │   │           ├── modem_config_add.htm
│   │   │   │           ├── modem_debug.htm
│   │   │   │           └── modem_info.htm
│   │   │   └── po/
│   │   │       ├── ru/
│   │   │       │   └── modem.po
│   │   │       ├── template/
│   │   │       │   └── qmodem.po
│   │   │       └── zh_Hans/
│   │   │           └── qmodem.po
│   │   ├── luci-app-qmodem-hc/
│   │   │   ├── Makefile
│   │   │   ├── luasrc/
│   │   │   │   ├── controller/
│   │   │   │   │   └── qmodem_hc.lua
│   │   │   │   ├── model/
│   │   │   │   │   └── cbi/
│   │   │   │   │       └── qmodem_hc/
│   │   │   │   │           └── modem_sim.lua
│   │   │   │   └── view/
│   │   │   │       └── qmodem_hc/
│   │   │   │           └── modem_sim.htm
│   │   │   ├── po/
│   │   │   │   └── zh_Hans/
│   │   │   │       └── modem_hc.po
│   │   │   └── root/
│   │   │       ├── etc/
│   │   │       │   ├── config/
│   │   │       │   │   └── qmodem_hc_sim
│   │   │       │   ├── init.d/
│   │   │       │   │   └── qmodem_hc_sim
│   │   │       │   └── uci-defaults/
│   │   │       │       └── luci-app-qmodem-hc
│   │   │       └── usr/
│   │   │           └── share/
│   │   │               └── qmodem/
│   │   │                   └── modem_sim.sh
│   │   ├── luci-app-qmodem-monitor/
│   │   │   ├── Makefile
│   │   │   ├── htdocs/
│   │   │   │   └── luci-static/
│   │   │   │       └── resources/
│   │   │   │           └── view/
│   │   │   │               └── qmodem/
│   │   │   │                   └── monitor.js
│   │   │   ├── po/
│   │   │   │   ├── templates/
│   │   │   │   │   └── qmodem-monitor.pot
│   │   │   │   └── zh_Hans/
│   │   │   │       └── qmodem-monitor.po
│   │   │   └── root/
│   │   │       └── usr/
│   │   │           └── share/
│   │   │               ├── luci/
│   │   │               │   └── menu.d/
│   │   │               │       └── luci-app-qmodem-monitor.json
│   │   │               └── rpcd/
│   │   │                   └── acl.d/
│   │   │                       └── luci-app-qmodem-monitor.json
│   │   ├── luci-app-qmodem-mwan/
│   │   │   ├── Makefile
│   │   │   ├── luasrc/
│   │   │   │   ├── controller/
│   │   │   │   │   └── qmodem_mwan.lua
│   │   │   │   └── model/
│   │   │   │       └── cbi/
│   │   │   │           └── qmodem/
│   │   │   │               └── mwan_config.lua
│   │   │   ├── po/
│   │   │   │   └── zh_Hans/
│   │   │   │       └── modem_mwan.po
│   │   │   └── root/
│   │   │       ├── etc/
│   │   │       │   ├── config/
│   │   │       │   │   └── qmodem_mwan
│   │   │       │   ├── init.d/
│   │   │       │   │   └── qmodem_mwan
│   │   │       │   ├── uci-defaults/
│   │   │       │   │   ├── 99-setup-mwan
│   │   │       │   │   └── luci-app-modem-mwan
│   │   │       │   └── udhcpc.user.d/
│   │   │       │       └── 01-reload-mwan3.dhcpscript
│   │   │       └── usr/
│   │   │           └── share/
│   │   │               └── qmodem/
│   │   │                   └── modem_mwan.sh
│   │   ├── luci-app-qmodem-next/
│   │   │   ├── Makefile
│   │   │   ├── htdocs/
│   │   │   │   └── luci-static/
│   │   │   │       └── resources/
│   │   │   │           ├── qmodem/
│   │   │   │           │   ├── modem_cfg.js
│   │   │   │           │   ├── qmodem-next.css
│   │   │   │           │   ├── qmodem.js
│   │   │   │           │   ├── sms-pdu.js
│   │   │   │           │   └── sms.js
│   │   │   │           └── view/
│   │   │   │               ├── qmodem/
│   │   │   │               │   ├── config_advanced.js
│   │   │   │               │   ├── debug.js
│   │   │   │               │   ├── network_config.js
│   │   │   │               │   ├── overview.js
│   │   │   │               │   ├── settings.js
│   │   │   │               │   ├── sim_switch.js
│   │   │   │               │   ├── sms.js
│   │   │   │               │   ├── sms_conversation.js
│   │   │   │               │   ├── sms_forward.js
│   │   │   │               │   └── sms_sim.js
│   │   │   │               └── status/
│   │   │   │                   └── include/
│   │   │   │                       └── 11_modem.js
│   │   │   ├── po/
│   │   │   │   ├── template/
│   │   │   │   │   └── qmodem-next.po
│   │   │   │   └── zh_Hans/
│   │   │   │       └── luci-app-qmodem-next.po
│   │   │   └── root/
│   │   │       ├── lib/
│   │   │       │   └── upgrade/
│   │   │       │       └── keep.d/
│   │   │       │           └── qmodme-next
│   │   │       └── usr/
│   │   │           └── share/
│   │   │               ├── luci/
│   │   │               │   └── menu.d/
│   │   │               │       └── luci-app-qmodem-next.json
│   │   │               └── rpcd/
│   │   │                   ├── acl.d/
│   │   │                   │   └── luci-app-qmodem-next.json
│   │   │                   └── ucode/
│   │   │                       └── qmodem_sms
│   │   ├── luci-app-qmodem-sms/
│   │   │   ├── Makefile
│   │   │   ├── luasrc/
│   │   │   │   ├── controller/
│   │   │   │   │   └── qmodem_sms.lua
│   │   │   │   ├── model/
│   │   │   │   │   └── cbi/
│   │   │   │   │       └── qmodem_sms/
│   │   │   │   │           ├── sms_forward.lua
│   │   │   │   │           └── sms_forward_extedit.lua
│   │   │   │   └── view/
│   │   │   │       └── modem_sms/
│   │   │   │           └── modem_sms.htm
│   │   │   └── po/
│   │   │       └── zh_Hans/
│   │   │           └── modem_sms.po
│   │   ├── luci-app-qmodem-ttl/
│   │   │   ├── Makefile
│   │   │   ├── luasrc/
│   │   │   │   ├── controller/
│   │   │   │   │   └── qmodem_ttl.lua
│   │   │   │   └── model/
│   │   │   │       └── cbi/
│   │   │   │           └── qmodem/
│   │   │   │               └── modem_ttl.lua
│   │   │   ├── po/
│   │   │   │   ├── templates/
│   │   │   │   │   └── qmodem-ttl.pot
│   │   │   │   └── zh_Hans/
│   │   │   │       └── qmodem-ttl.po
│   │   │   └── root/
│   │   │       └── etc/
│   │   │           ├── config/
│   │   │           │   └── qmodem_ttl
│   │   │           ├── init.d/
│   │   │           │   └── qmodem_ttl
│   │   │           └── uci-defaults/
│   │   │               └── add-fw-include
│   │   └── luci-app-qmodem-ttlfw4/
│   │       ├── Makefile
│   │       ├── htdocs/
│   │       │   └── luci-static/
│   │       │       └── resources/
│   │       │           └── view/
│   │       │               └── qmodem/
│   │       │                   └── ttl.js
│   │       ├── po/
│   │       │   ├── templates/
│   │       │   │   └── qmodem-ttlfw4.pot
│   │       │   └── zh_Hans/
│   │       │       └── qmodem-ttlfw4.po
│   │       └── root/
│   │           ├── etc/
│   │           │   ├── config/
│   │           │   │   └── qmodem_ttl
│   │           │   └── init.d/
│   │           │       └── qmodem_ttl
│   │           └── usr/
│   │               └── share/
│   │                   ├── luci/
│   │                   │   └── menu.d/
│   │                   │       └── luci-app-qmodem-ttlfw4.json
│   │                   └── rpcd/
│   │                       └── acl.d/
│   │                           └── luci-app-qmodem-ttlfw4.json
│   ├── scripts/
│   │   ├── auto_translate_i18n.py
│   │   ├── extract_i18n_strings.py
│   │   ├── ubus_benchmark.py
│   │   └── update_support_list.py
│   └── version.mk
├── luci-app-quickstart/
│   ├── Makefile
│   ├── htdocs/
│   │   └── luci-static/
│   │       └── quickstart/
│   │           ├── i18n/
│   │           │   ├── en.json
│   │           │   └── zh_Hans.json
│   │           ├── index.js
│   │           ├── style.css
│   │           └── vendor.js
│   ├── luasrc/
│   │   ├── controller/
│   │   │   ├── istore_backend.lua
│   │   │   └── quickstart.lua
│   │   └── view/
│   │       └── quickstart/
│   │           ├── home.htm
│   │           └── main.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── quickstart.po
│   └── root/
│       ├── etc/
│       │   └── uci-defaults/
│       │       └── 50_luci-quickstart
│       └── usr/
│           ├── libexec/
│           │   └── quickstart/
│           │       └── auto_setup.sh
│           └── share/
│               └── luci/
│                   └── menu.d/
│                       └── luci-app-quickstart.json
├── luci-app-shutdown/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── shutdown.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── shutdown.lua
│   │   └── view/
│   │       └── shutdown/
│   │           └── actions.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── shutdown.po
│   └── root/
│       └── usr/
│           └── share/
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-shutdown.json
├── luci-app-ssr-mudb-server/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── ssr_mudb_server.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── ssr_mudb_server/
│   │   │           └── index.lua
│   │   └── view/
│   │       └── ssr_mudb_server/
│   │           ├── status.htm
│   │           ├── user.htm
│   │           └── users.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── ssr_mudb_server.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   ├── ssr_mudb_server
│       │   │   └── ssr_mudb_server.json
│       │   ├── init.d/
│       │   │   └── ssr_mudb_server
│       │   └── uci-defaults/
│       │       └── luci-app-ssr-mudb-server
│       └── usr/
│           └── share/
│               ├── rpcd/
│               │   └── acl.d/
│               │       └── luci-app-ssr-mudb-server.json
│               ├── ssr_mudb_server/
│               │   ├── .travis.yml
│               │   ├── CHANGES
│               │   ├── Dockerfile
│               │   ├── MANIFEST.in
│               │   ├── apiconfig.py
│               │   ├── asyncmgr.py
│               │   ├── clear_traffic_all_users.sh
│               │   ├── config.json
│               │   ├── configloader.py
│               │   ├── db_transfer.py
│               │   ├── firewall.lua
│               │   ├── importloader.py
│               │   ├── initcfg.bat
│               │   ├── initcfg.sh
│               │   ├── initmudbjson.sh
│               │   ├── logrun.sh
│               │   ├── mudb.json
│               │   ├── mujson_mgr.py
│               │   ├── mysql.json
│               │   ├── run.sh
│               │   ├── server.py
│               │   ├── server_pool.py
│               │   ├── setup.py
│               │   ├── setup_cymysql.sh
│               │   ├── shadowsocks/
│               │   │   ├── __init__.py
│               │   │   ├── asyncdns.py
│               │   │   ├── common.py
│               │   │   ├── crypto/
│               │   │   │   ├── __init__.py
│               │   │   │   ├── ctypes_libsodium.py
│               │   │   │   ├── ctypes_openssl.py
│               │   │   │   ├── openssl.py
│               │   │   │   ├── rc4_md5.py
│               │   │   │   ├── sodium.py
│               │   │   │   ├── table.py
│               │   │   │   └── util.py
│               │   │   ├── daemon.py
│               │   │   ├── encrypt.py
│               │   │   ├── eventloop.py
│               │   │   ├── local.py
│               │   │   ├── logrun.sh
│               │   │   ├── lru_cache.py
│               │   │   ├── manager.py
│               │   │   ├── obfs.py
│               │   │   ├── obfsplugin/
│               │   │   │   ├── __init__.py
│               │   │   │   ├── auth.py
│               │   │   │   ├── auth_chain.py
│               │   │   │   ├── http_simple.py
│               │   │   │   ├── obfs_tls.py
│               │   │   │   ├── plain.py
│               │   │   │   └── verify.py
│               │   │   ├── ordereddict.py
│               │   │   ├── run.sh
│               │   │   ├── server.py
│               │   │   ├── shell.py
│               │   │   ├── stop.sh
│               │   │   ├── tail.sh
│               │   │   ├── tcprelay.py
│               │   │   ├── udprelay.py
│               │   │   ├── user.py
│               │   │   └── version.py
│               │   ├── stop.sh
│               │   ├── switchrule.py
│               │   ├── tail.sh
│               │   ├── tests/
│               │   │   ├── aes-cfb1.json
│               │   │   ├── aes-cfb8.json
│               │   │   ├── aes-ctr.json
│               │   │   ├── aes.json
│               │   │   ├── assert.sh
│               │   │   ├── chacha20.json
│               │   │   ├── client-multi-server-ip.json
│               │   │   ├── coverage_server.py
│               │   │   ├── fastopen.json
│               │   │   ├── ipv6-client-side.json
│               │   │   ├── ipv6.json
│               │   │   ├── jenkins.sh
│               │   │   ├── libsodium/
│               │   │   │   └── install.sh
│               │   │   ├── nose_plugin.py
│               │   │   ├── rc4-md5.json
│               │   │   ├── salsa20-ctr.json
│               │   │   ├── salsa20.json
│               │   │   ├── server-multi-passwd-client-side.json
│               │   │   ├── server-multi-passwd-table.json
│               │   │   ├── server-multi-passwd.json
│               │   │   ├── server-multi-ports.json
│               │   │   ├── setup_tc.sh
│               │   │   ├── socksify/
│               │   │   │   ├── install.sh
│               │   │   │   └── socks.conf
│               │   │   ├── table.json
│               │   │   ├── test.py
│               │   │   ├── test_command.sh
│               │   │   ├── test_daemon.sh
│               │   │   ├── test_large_file.sh
│               │   │   ├── test_udp_src.py
│               │   │   ├── test_udp_src.sh
│               │   │   └── workers.json
│               │   ├── user-config.json
│               │   ├── userapiconfig.py
│               │   ├── usermysql.json
│               │   └── utils/
│               │       ├── autoban.py
│               │       └── fail2ban/
│               │           └── shadowsocks.conf
│               └── ucitrack/
│                   └── luci-app-ssr-mudb-server.json
├── luci-app-ssr-plus/
│   ├── chinadns-ng/
│   │   └── Makefile
│   ├── dns2socks/
│   │   └── Makefile
│   ├── dns2socks-rust/
│   │   └── Makefile
│   ├── dns2tcp/
│   │   └── Makefile
│   ├── dnsproxy/
│   │   └── Makefile
│   ├── gn/
│   │   ├── Makefile
│   │   └── src/
│   │       └── out/
│   │           └── last_commit_position.h
│   ├── hysteria/
│   │   └── Makefile
│   ├── ipt2socks/
│   │   └── Makefile
│   ├── lua-neturl/
│   │   ├── Makefile
│   │   └── patches/
│   │       └── 010-userinfo-regex.patch
│   ├── luci-app-ssr-plus/
│   │   ├── Makefile
│   │   ├── luasrc/
│   │   │   ├── controller/
│   │   │   │   └── shadowsocksr.lua
│   │   │   ├── model/
│   │   │   │   └── cbi/
│   │   │   │       └── shadowsocksr/
│   │   │   │           ├── advanced.lua
│   │   │   │           ├── client-config.lua
│   │   │   │           ├── client.lua
│   │   │   │           ├── control.lua
│   │   │   │           ├── log.lua
│   │   │   │           ├── server-config.lua
│   │   │   │           ├── server.lua
│   │   │   │           ├── servers.lua
│   │   │   │           └── status.lua
│   │   │   └── view/
│   │   │       └── shadowsocksr/
│   │   │           ├── backup_restore.htm
│   │   │           ├── certupload.htm
│   │   │           ├── check.htm
│   │   │           ├── checkport.htm
│   │   │           ├── log.htm
│   │   │           ├── optimize_cbi_ui.htm
│   │   │           ├── ping.htm
│   │   │           ├── refresh.htm
│   │   │           ├── reset.htm
│   │   │           ├── server_list.htm
│   │   │           ├── socket.htm
│   │   │           ├── ssrurl.htm
│   │   │           ├── status.htm
│   │   │           └── subscribe.htm
│   │   ├── po/
│   │   │   ├── templates/
│   │   │   │   └── ssr-plus.pot
│   │   │   └── zh_Hans/
│   │   │       └── ssr-plus.po
│   │   └── root/
│   │       ├── etc/
│   │       │   ├── config/
│   │       │   │   └── shadowsocksr
│   │       │   ├── init.d/
│   │       │   │   └── shadowsocksr
│   │       │   ├── ssrplus/
│   │       │   │   ├── ad.conf
│   │       │   │   ├── applechina.conf
│   │       │   │   ├── black.list
│   │       │   │   ├── china_ssr.txt
│   │       │   │   ├── deny.list
│   │       │   │   ├── dnsproxy_dns.list
│   │       │   │   ├── gfw_base.conf
│   │       │   │   ├── gfw_list.conf
│   │       │   │   ├── mosdns-config.yaml
│   │       │   │   ├── netflix.list
│   │       │   │   ├── netflixip.list
│   │       │   │   ├── oversea_list.conf
│   │       │   │   └── white.list
│   │       │   └── uci-defaults/
│   │       │       └── luci-ssr-plus
│   │       └── usr/
│   │           ├── bin/
│   │           │   ├── ssr-monitor
│   │           │   ├── ssr-rules
│   │           │   └── ssr-switch
│   │           └── share/
│   │               ├── rpcd/
│   │               │   └── acl.d/
│   │               │       └── luci-app-ssr-plus.json
│   │               ├── shadowsocksr/
│   │               │   ├── chinaipset.sh
│   │               │   ├── gen_config.lua
│   │               │   ├── genred2config.sh
│   │               │   ├── gfw2ipset.sh
│   │               │   ├── hy2_test.sh
│   │               │   ├── shadowsocksr.config
│   │               │   ├── ssrplusupdate.sh
│   │               │   ├── subscribe.lua
│   │               │   └── update.lua
│   │               └── ucitrack/
│   │                   └── luci-app-ssr-plus.json
│   ├── microsocks/
│   │   └── Makefile
│   ├── mosdns/
│   │   ├── Makefile
│   │   └── patches/
│   │       ├── 203-add-response-for-bad-request-in-ServeHTTP-handler.patch
│   │       ├── 204-black_hole-apply-Fisher-Yates-shuffle-algorithm-to-r.patch
│   │       └── 205-format-logtime.patch
│   ├── naiveproxy/
│   │   ├── Makefile
│   │   └── src/
│   │       └── init_env.sh
│   ├── redsocks2/
│   │   └── Makefile
│   ├── shadow-tls/
│   │   ├── Makefile
│   │   └── patches/
│   │       ├── 010-Fix-reading-WildcardSNI-from-sip003_arg-115.patch
│   │       ├── 011-fix-use-tls1-2-only-website-for-tls12-test-suites-129.patch
│   │       └── 100-update-monoio.patch
│   ├── shadowsocks-libev/
│   │   ├── Makefile
│   │   ├── files/
│   │   │   ├── shadowsocks-libev.config
│   │   │   ├── shadowsocks-libev.init
│   │   │   └── ss-rules/
│   │   │       ├── chain.uc
│   │   │       ├── set.uc
│   │   │       └── ss-rules.uc
│   │   └── patches/
│   │       ├── 100-Upgrade-PCRE-to-PCRE2.patch
│   │       ├── 101-Fix-mishandling-of-incoming-socket-buffer.-It-must-b.patch
│   │       └── 102-deprecate-load16-be-replace-with-ntohs.patch
│   ├── shadowsocks-rust/
│   │   └── Makefile
│   ├── shadowsocksr-libev/
│   │   ├── Makefile
│   │   ├── patches/
│   │   │   ├── 0001-Add-ss-server-and-ss-check.patch
│   │   │   ├── 0002-Revert-verify_simple-and-auth_simple.patch
│   │   │   ├── 0003-Refine-Usage.patch
│   │   │   ├── 100-fix-gcc-10.patch
│   │   │   ├── 101-Fix-Werror-sizeof-pointer-memaccess.patch
│   │   │   ├── 102-Read-listening-mode-from-config.patch
│   │   │   ├── 103-Add-TPROXY-support-for-TCP-ssr-redir.patch
│   │   │   ├── 104-fix-use-after-free.patch
│   │   │   └── 105-Upgrade-PCRE-to-PCRE2.patch
│   │   └── src/
│   │       ├── AUTHORS
│   │       ├── CMakeLists.txt
│   │       ├── COPYING
│   │       ├── Changes
│   │       ├── INSTALL
│   │       ├── Makefile.am
│   │       ├── Makefile.in
│   │       ├── acl/
│   │       │   ├── chn.acl
│   │       │   ├── gfwlist.acl
│   │       │   ├── local.acl
│   │       │   └── server_block_chn.acl
│   │       ├── aclocal.m4
│   │       ├── auto/
│   │       │   ├── ar-lib
│   │       │   ├── compile
│   │       │   ├── config.guess
│   │       │   ├── config.rpath
│   │       │   ├── config.sub
│   │       │   ├── depcomp
│   │       │   ├── install-sh
│   │       │   ├── ltmain.sh
│   │       │   └── missing
│   │       ├── autogen.sh
│   │       ├── cmake/
│   │       │   ├── CheckDIRSymbolExists.cmake
│   │       │   ├── CheckPrototypeExists.cmake
│   │       │   ├── CheckSTDC.cmake
│   │       │   ├── FindPCRE.cmake
│   │       │   ├── configure.cmake
│   │       │   └── dist.cmake
│   │       ├── completions/
│   │       │   └── bash/
│   │       │       ├── ss-local
│   │       │       ├── ss-manager
│   │       │       ├── ss-redir
│   │       │       ├── ss-server
│   │       │       └── ss-tunnel
│   │       ├── config.h.cmake
│   │       ├── config.h.in
│   │       ├── configure
│   │       ├── configure.ac
│   │       ├── debian/
│   │       │   ├── README.Debian
│   │       │   ├── changelog
│   │       │   ├── compat
│   │       │   ├── config.json
│   │       │   ├── control
│   │       │   ├── copyright
│   │       │   ├── copyright.original
│   │       │   ├── libshadowsocks-libev-dev.install
│   │       │   ├── libshadowsocks-libev2.install
│   │       │   ├── rules
│   │       │   ├── shadowsocks-libev-local@.service
│   │       │   ├── shadowsocks-libev-redir@.service
│   │       │   ├── shadowsocks-libev-server@.service
│   │       │   ├── shadowsocks-libev-tunnel@.service
│   │       │   ├── shadowsocks-libev.default
│   │       │   ├── shadowsocks-libev.docs
│   │       │   ├── shadowsocks-libev.init
│   │       │   ├── shadowsocks-libev.install
│   │       │   ├── shadowsocks-libev.postinst
│   │       │   ├── shadowsocks-libev.postrm
│   │       │   ├── shadowsocks-libev.service
│   │       │   ├── source/
│   │       │   │   └── format
│   │       │   ├── source.lintian-overrides
│   │       │   └── watch
│   │       ├── doc/
│   │       │   ├── Makefile.am
│   │       │   ├── Makefile.in
│   │       │   ├── asciidoc.conf
│   │       │   ├── manpage-base.xsl
│   │       │   ├── manpage-bold-literal.xsl
│   │       │   ├── manpage-normal.xsl
│   │       │   ├── shadowsocks-libev.asciidoc
│   │       │   ├── ss-local.asciidoc
│   │       │   ├── ss-manager.asciidoc
│   │       │   ├── ss-nat.asciidoc
│   │       │   ├── ss-redir.asciidoc
│   │       │   ├── ss-server.asciidoc
│   │       │   └── ss-tunnel.asciidoc
│   │       ├── docker/
│   │       │   ├── alpine/
│   │       │   │   ├── Dockerfile
│   │       │   │   └── docker-compose.yml
│   │       │   └── ubuntu/
│   │       │       ├── Dockerfile
│   │       │       └── entrypoint
│   │       ├── libcork/
│   │       │   ├── .idea/
│   │       │   │   ├── libcork-develop.iml
│   │       │   │   ├── misc.xml
│   │       │   │   ├── modules.xml
│   │       │   │   └── workspace.xml
│   │       │   ├── CMakeLists.txt
│   │       │   ├── COPYING
│   │       │   ├── Makefile.am
│   │       │   ├── Makefile.in
│   │       │   ├── README.markdown
│   │       │   ├── cli/
│   │       │   │   └── commands.c
│   │       │   ├── cmake/
│   │       │   │   └── FindCTargets.cmake
│   │       │   ├── core/
│   │       │   │   ├── allocator.c
│   │       │   │   ├── error.c
│   │       │   │   ├── gc.c
│   │       │   │   ├── hash.c
│   │       │   │   ├── ip-address.c
│   │       │   │   ├── mempool.c
│   │       │   │   ├── timestamp.c
│   │       │   │   ├── u128.c
│   │       │   │   └── version.c
│   │       │   ├── ds/
│   │       │   │   ├── array.c
│   │       │   │   ├── bitset.c
│   │       │   │   ├── buffer.c
│   │       │   │   ├── dllist.c
│   │       │   │   ├── file-stream.c
│   │       │   │   ├── hash-table.c
│   │       │   │   ├── managed-buffer.c
│   │       │   │   ├── ring-buffer.c
│   │       │   │   └── slice.c
│   │       │   ├── include/
│   │       │   │   └── libcork/
│   │       │   │       ├── cli/
│   │       │   │       │   └── commands.h
│   │       │   │       ├── cli.h
│   │       │   │       ├── config/
│   │       │   │       │   ├── arch.h
│   │       │   │       │   ├── bsd.h
│   │       │   │       │   ├── config.h
│   │       │   │       │   ├── gcc.h
│   │       │   │       │   ├── linux.h
│   │       │   │       │   ├── macosx.h
│   │       │   │       │   ├── mingw32.h
│   │       │   │       │   ├── solaris.h
│   │       │   │       │   └── version.h
│   │       │   │       ├── config.h
│   │       │   │       ├── core/
│   │       │   │       │   ├── allocator.h
│   │       │   │       │   ├── api.h
│   │       │   │       │   ├── attributes.h
│   │       │   │       │   ├── byte-order.h
│   │       │   │       │   ├── callbacks.h
│   │       │   │       │   ├── error.h
│   │       │   │       │   ├── gc.h
│   │       │   │       │   ├── hash.h
│   │       │   │       │   ├── id.h
│   │       │   │       │   ├── mempool.h
│   │       │   │       │   ├── net-addresses.h
│   │       │   │       │   ├── timestamp.h
│   │       │   │       │   ├── types.h
│   │       │   │       │   └── u128.h
│   │       │   │       ├── core.h
│   │       │   │       ├── ds/
│   │       │   │       │   ├── array.h
│   │       │   │       │   ├── bitset.h
│   │       │   │       │   ├── buffer.h
│   │       │   │       │   ├── dllist.h
│   │       │   │       │   ├── hash-table.h
│   │       │   │       │   ├── managed-buffer.h
│   │       │   │       │   ├── ring-buffer.h
│   │       │   │       │   ├── slice.h
│   │       │   │       │   └── stream.h
│   │       │   │       ├── ds.h
│   │       │   │       ├── helpers/
│   │       │   │       │   ├── errors.h
│   │       │   │       │   ├── gc.h
│   │       │   │       │   └── posix.h
│   │       │   │       ├── os/
│   │       │   │       │   ├── files.h
│   │       │   │       │   ├── process.h
│   │       │   │       │   └── subprocess.h
│   │       │   │       ├── os.h
│   │       │   │       ├── threads/
│   │       │   │       │   ├── atomics.h
│   │       │   │       │   └── basics.h
│   │       │   │       └── threads.h
│   │       │   ├── posix/
│   │       │   │   ├── directory-walker.c
│   │       │   │   ├── env.c
│   │       │   │   ├── exec.c
│   │       │   │   ├── files.c
│   │       │   │   ├── process.c
│   │       │   │   └── subprocess.c
│   │       │   └── pthreads/
│   │       │       └── thread.c
│   │       ├── libev/
│   │       │   ├── CMakeLists.txt
│   │       │   ├── Changes
│   │       │   ├── Makefile.am
│   │       │   ├── Makefile.in
│   │       │   ├── README
│   │       │   ├── Symbols.ev
│   │       │   ├── Symbols.event
│   │       │   ├── aclocal.m4
│   │       │   ├── autogen.sh
│   │       │   ├── cmake/
│   │       │   │   ├── configure.cmake
│   │       │   │   └── dist.cmake
│   │       │   ├── config.h.cmake
│   │       │   ├── configure.ac
│   │       │   ├── ev++.h
│   │       │   ├── ev.3
│   │       │   ├── ev.c
│   │       │   ├── ev.h
│   │       │   ├── ev.pod
│   │       │   ├── ev_epoll.c
│   │       │   ├── ev_kqueue.c
│   │       │   ├── ev_poll.c
│   │       │   ├── ev_port.c
│   │       │   ├── ev_select.c
│   │       │   ├── ev_vars.h
│   │       │   ├── ev_win32.c
│   │       │   ├── ev_wrap.h
│   │       │   ├── event.c
│   │       │   ├── event.h
│   │       │   └── libev.m4
│   │       ├── libipset/
│   │       │   ├── CMakeLists.txt
│   │       │   ├── LICENSE.txt
│   │       │   ├── Makefile.am
│   │       │   ├── Makefile.in
│   │       │   ├── README.markdown
│   │       │   ├── bdd/
│   │       │   │   ├── Makefile.am
│   │       │   │   ├── Makefile.in
│   │       │   │   ├── assignments.c
│   │       │   │   ├── basics.c
│   │       │   │   ├── bdd-iterator.c
│   │       │   │   ├── expanded.c
│   │       │   │   ├── reachable.c
│   │       │   │   ├── read.c
│   │       │   │   └── write.c
│   │       │   ├── cmake/
│   │       │   │   └── FindCTargets.cmake
│   │       │   ├── general.c
│   │       │   ├── include/
│   │       │   │   └── ipset/
│   │       │   │       ├── bdd/
│   │       │   │       │   └── nodes.h
│   │       │   │       ├── bits.h
│   │       │   │       ├── errors.h
│   │       │   │       ├── ipset.h
│   │       │   │       └── logging.h
│   │       │   ├── map/
│   │       │   │   ├── Makefile.am
│   │       │   │   ├── Makefile.in
│   │       │   │   ├── allocation.c
│   │       │   │   ├── inspection-template.c.in
│   │       │   │   ├── inspection.c
│   │       │   │   ├── ipv4_map.c
│   │       │   │   ├── ipv6_map.c
│   │       │   │   └── storage.c
│   │       │   └── set/
│   │       │       ├── Makefile.am
│   │       │       ├── Makefile.in
│   │       │       ├── allocation.c
│   │       │       ├── inspection-template.c.in
│   │       │       ├── inspection.c
│   │       │       ├── ipv4_set.c
│   │       │       ├── ipv6_set.c
│   │       │       ├── iterator.c
│   │       │       └── storage.c
│   │       ├── libsodium/
│   │       │   ├── .travis.yml
│   │       │   ├── AUTHORS
│   │       │   ├── CMakeLists.txt
│   │       │   ├── ChangeLog
│   │       │   ├── Makefile.am
│   │       │   ├── Makefile.in
│   │       │   ├── README
│   │       │   ├── README.markdown
│   │       │   ├── THANKS
│   │       │   ├── autogen.sh
│   │       │   ├── build-aux/
│   │       │   │   ├── config.guess
│   │       │   │   ├── config.sub
│   │       │   │   ├── depcomp
│   │       │   │   ├── install-sh
│   │       │   │   ├── ltmain.sh
│   │       │   │   └── missing
│   │       │   ├── configure
│   │       │   ├── configure.ac
│   │       │   ├── libsodium.pc.in
│   │       │   ├── libsodium.sln
│   │       │   ├── libsodium.vcxproj
│   │       │   ├── libsodium.vcxproj.filters
│   │       │   ├── m4/
│   │       │   │   ├── ax_check_compile_flag.m4
│   │       │   │   ├── ax_check_define.m4
│   │       │   │   ├── ax_check_gnu_make.m4
│   │       │   │   ├── ax_check_link_flag.m4
│   │       │   │   ├── ld-output-def.m4
│   │       │   │   └── pkg.m4
│   │       │   ├── packaging/
│   │       │   │   └── nuget/
│   │       │   │       ├── package.bat
│   │       │   │       ├── package.config
│   │       │   │       └── package.gsl
│   │       │   ├── src/
│   │       │   │   ├── Makefile.am
│   │       │   │   ├── Makefile.in
│   │       │   │   └── libsodium/
│   │       │   │       ├── Makefile.am
│   │       │   │       ├── Makefile.in
│   │       │   │       ├── crypto_aead/
│   │       │   │       │   ├── aes256gcm/
│   │       │   │       │   │   └── aesni/
│   │       │   │       │   │       └── aead_aes256gcm_aesni.c
│   │       │   │       │   └── chacha20poly1305/
│   │       │   │       │       └── sodium/
│   │       │   │       │           └── aead_chacha20poly1305.c
│   │       │   │       ├── crypto_auth/
│   │       │   │       │   ├── crypto_auth.c
│   │       │   │       │   ├── hmacsha256/
│   │       │   │       │   │   ├── auth_hmacsha256_api.c
│   │       │   │       │   │   └── cp/
│   │       │   │       │   │       ├── hmac_hmacsha256.c
│   │       │   │       │   │       └── verify_hmacsha256.c
│   │       │   │       │   ├── hmacsha512/
│   │       │   │       │   │   ├── auth_hmacsha512_api.c
│   │       │   │       │   │   └── cp/
│   │       │   │       │   │       ├── hmac_hmacsha512.c
│   │       │   │       │   │       └── verify_hmacsha512.c
│   │       │   │       │   └── hmacsha512256/
│   │       │   │       │       ├── auth_hmacsha512256_api.c
│   │       │   │       │       └── cp/
│   │       │   │       │           ├── hmac_hmacsha512256.c
│   │       │   │       │           └── verify_hmacsha512256.c
│   │       │   │       ├── crypto_box/
│   │       │   │       │   ├── crypto_box.c
│   │       │   │       │   ├── crypto_box_easy.c
│   │       │   │       │   ├── crypto_box_seal.c
│   │       │   │       │   └── curve25519xsalsa20poly1305/
│   │       │   │       │       ├── box_curve25519xsalsa20poly1305_api.c
│   │       │   │       │       └── ref/
│   │       │   │       │           ├── after_curve25519xsalsa20poly1305.c
│   │       │   │       │           ├── before_curve25519xsalsa20poly1305.c
│   │       │   │       │           ├── box_curve25519xsalsa20poly1305.c
│   │       │   │       │           └── keypair_curve25519xsalsa20poly1305.c
│   │       │   │       ├── crypto_core/
│   │       │   │       │   ├── hsalsa20/
│   │       │   │       │   │   ├── core_hsalsa20_api.c
│   │       │   │       │   │   └── ref2/
│   │       │   │       │   │       └── core_hsalsa20.c
│   │       │   │       │   ├── salsa20/
│   │       │   │       │   │   ├── core_salsa20_api.c
│   │       │   │       │   │   └── ref/
│   │       │   │       │   │       └── core_salsa20.c
│   │       │   │       │   ├── salsa2012/
│   │       │   │       │   │   ├── core_salsa2012_api.c
│   │       │   │       │   │   └── ref/
│   │       │   │       │   │       └── core_salsa2012.c
│   │       │   │       │   └── salsa208/
│   │       │   │       │       ├── core_salsa208_api.c
│   │       │   │       │       └── ref/
│   │       │   │       │           └── core_salsa208.c
│   │       │   │       ├── crypto_generichash/
│   │       │   │       │   ├── blake2/
│   │       │   │       │   │   ├── generichash_blake2_api.c
│   │       │   │       │   │   └── ref/
│   │       │   │       │   │       ├── blake2-impl.h
│   │       │   │       │   │       ├── blake2.h
│   │       │   │       │   │       ├── blake2b-compress-ref.c
│   │       │   │       │   │       ├── blake2b-compress-sse41.c
│   │       │   │       │   │       ├── blake2b-compress-ssse3.c
│   │       │   │       │   │       ├── blake2b-load-sse2.h
│   │       │   │       │   │       ├── blake2b-load-sse41.h
│   │       │   │       │   │       ├── blake2b-ref.c
│   │       │   │       │   │       ├── blake2b-round.h
│   │       │   │       │   │       └── generichash_blake2b.c
│   │       │   │       │   └── crypto_generichash.c
│   │       │   │       ├── crypto_hash/
│   │       │   │       │   ├── crypto_hash.c
│   │       │   │       │   ├── sha256/
│   │       │   │       │   │   ├── cp/
│   │       │   │       │   │   │   └── hash_sha256.c
│   │       │   │       │   │   └── hash_sha256_api.c
│   │       │   │       │   └── sha512/
│   │       │   │       │       ├── cp/
│   │       │   │       │       │   └── hash_sha512.c
│   │       │   │       │       └── hash_sha512_api.c
│   │       │   │       ├── crypto_onetimeauth/
│   │       │   │       │   ├── crypto_onetimeauth.c
│   │       │   │       │   └── poly1305/
│   │       │   │       │       ├── donna/
│   │       │   │       │       │   ├── poly1305_donna.c
│   │       │   │       │       │   ├── poly1305_donna.h
│   │       │   │       │       │   ├── poly1305_donna32.h
│   │       │   │       │       │   └── poly1305_donna64.h
│   │       │   │       │       ├── onetimeauth_poly1305.c
│   │       │   │       │       ├── onetimeauth_poly1305.h
│   │       │   │       │       └── sse2/
│   │       │   │       │           ├── poly1305_sse2.c
│   │       │   │       │           └── poly1305_sse2.h
│   │       │   │       ├── crypto_pwhash/
│   │       │   │       │   └── scryptsalsa208sha256/
│   │       │   │       │       ├── crypto_scrypt-common.c
│   │       │   │       │       ├── crypto_scrypt.h
│   │       │   │       │       ├── nosse/
│   │       │   │       │       │   └── pwhash_scryptsalsa208sha256_nosse.c
│   │       │   │       │       ├── pbkdf2-sha256.c
│   │       │   │       │       ├── pbkdf2-sha256.h
│   │       │   │       │       ├── pwhash_scryptsalsa208sha256.c
│   │       │   │       │       ├── scrypt_platform.c
│   │       │   │       │       ├── sse/
│   │       │   │       │       │   └── pwhash_scryptsalsa208sha256_sse.c
│   │       │   │       │       └── sysendian.h
│   │       │   │       ├── crypto_scalarmult/
│   │       │   │       │   ├── crypto_scalarmult.c
│   │       │   │       │   └── curve25519/
│   │       │   │       │       ├── donna_c64/
│   │       │   │       │       │   ├── curve25519_donna_c64.c
│   │       │   │       │       │   └── curve25519_donna_c64.h
│   │       │   │       │       ├── ref10/
│   │       │   │       │       │   ├── curve25519_ref10.c
│   │       │   │       │       │   ├── curve25519_ref10.h
│   │       │   │       │       │   ├── fe.h
│   │       │   │       │       │   ├── fe_0_curve25519_ref10.c
│   │       │   │       │       │   ├── fe_1_curve25519_ref10.c
│   │       │   │       │       │   ├── fe_add_curve25519_ref10.c
│   │       │   │       │       │   ├── fe_copy_curve25519_ref10.c
│   │       │   │       │       │   ├── fe_cswap_curve25519_ref10.c
│   │       │   │       │       │   ├── fe_frombytes_curve25519_ref10.c
│   │       │   │       │       │   ├── fe_invert_curve25519_ref10.c
│   │       │   │       │       │   ├── fe_mul121666_curve25519_ref10.c
│   │       │   │       │       │   ├── fe_mul_curve25519_ref10.c
│   │       │   │       │       │   ├── fe_sq_curve25519_ref10.c
│   │       │   │       │       │   ├── fe_sub_curve25519_ref10.c
│   │       │   │       │       │   ├── fe_tobytes_curve25519_ref10.c
│   │       │   │       │       │   ├── montgomery.h
│   │       │   │       │       │   └── pow225521.h
│   │       │   │       │       ├── sandy2x/
│   │       │   │       │       │   ├── consts.S
│   │       │   │       │       │   ├── consts_namespace.h
│   │       │   │       │       │   ├── curve25519_sandy2x.c
│   │       │   │       │       │   ├── curve25519_sandy2x.h
│   │       │   │       │       │   ├── fe.h
│   │       │   │       │       │   ├── fe51.h
│   │       │   │       │       │   ├── fe51_invert.c
│   │       │   │       │       │   ├── fe51_mul.S
│   │       │   │       │       │   ├── fe51_namespace.h
│   │       │   │       │       │   ├── fe51_nsquare.S
│   │       │   │       │       │   ├── fe51_pack.S
│   │       │   │       │       │   ├── fe_frombytes_sandy2x.c
│   │       │   │       │       │   ├── ladder.S
│   │       │   │       │       │   ├── ladder.h
│   │       │   │       │       │   ├── ladder_base.S
│   │       │   │       │       │   ├── ladder_base.h
│   │       │   │       │       │   ├── ladder_base_namespace.h
│   │       │   │       │       │   ├── ladder_namespace.h
│   │       │   │       │       │   └── sandy2x.S
│   │       │   │       │       ├── scalarmult_curve25519.c
│   │       │   │       │       └── scalarmult_curve25519.h
│   │       │   │       ├── crypto_secretbox/
│   │       │   │       │   ├── crypto_secretbox.c
│   │       │   │       │   ├── crypto_secretbox_easy.c
│   │       │   │       │   └── xsalsa20poly1305/
│   │       │   │       │       ├── ref/
│   │       │   │       │       │   └── box_xsalsa20poly1305.c
│   │       │   │       │       └── secretbox_xsalsa20poly1305_api.c
│   │       │   │       ├── crypto_shorthash/
│   │       │   │       │   ├── crypto_shorthash.c
│   │       │   │       │   └── siphash24/
│   │       │   │       │       ├── ref/
│   │       │   │       │       │   └── shorthash_siphash24.c
│   │       │   │       │       └── shorthash_siphash24_api.c
│   │       │   │       ├── crypto_sign/
│   │       │   │       │   ├── crypto_sign.c
│   │       │   │       │   └── ed25519/
│   │       │   │       │       ├── description
│   │       │   │       │       ├── ref10/
│   │       │   │       │       │   ├── base.h
│   │       │   │       │       │   ├── base2.h
│   │       │   │       │       │   ├── d.h
│   │       │   │       │       │   ├── d2.h
│   │       │   │       │       │   ├── fe.h
│   │       │   │       │       │   ├── fe_0.c
│   │       │   │       │       │   ├── fe_1.c
│   │       │   │       │       │   ├── fe_add.c
│   │       │   │       │       │   ├── fe_cmov.c
│   │       │   │       │       │   ├── fe_copy.c
│   │       │   │       │       │   ├── fe_frombytes.c
│   │       │   │       │       │   ├── fe_invert.c
│   │       │   │       │       │   ├── fe_isnegative.c
│   │       │   │       │       │   ├── fe_isnonzero.c
│   │       │   │       │       │   ├── fe_mul.c
│   │       │   │       │       │   ├── fe_neg.c
│   │       │   │       │       │   ├── fe_pow22523.c
│   │       │   │       │       │   ├── fe_sq.c
│   │       │   │       │       │   ├── fe_sq2.c
│   │       │   │       │       │   ├── fe_sub.c
│   │       │   │       │       │   ├── fe_tobytes.c
│   │       │   │       │       │   ├── ge.h
│   │       │   │       │       │   ├── ge_add.c
│   │       │   │       │       │   ├── ge_add.h
│   │       │   │       │       │   ├── ge_double_scalarmult.c
│   │       │   │       │       │   ├── ge_frombytes.c
│   │       │   │       │       │   ├── ge_madd.c
│   │       │   │       │       │   ├── ge_madd.h
│   │       │   │       │       │   ├── ge_msub.c
│   │       │   │       │       │   ├── ge_msub.h
│   │       │   │       │       │   ├── ge_p1p1_to_p2.c
│   │       │   │       │       │   ├── ge_p1p1_to_p3.c
│   │       │   │       │       │   ├── ge_p2_0.c
│   │       │   │       │       │   ├── ge_p2_dbl.c
│   │       │   │       │       │   ├── ge_p2_dbl.h
│   │       │   │       │       │   ├── ge_p3_0.c
│   │       │   │       │       │   ├── ge_p3_dbl.c
│   │       │   │       │       │   ├── ge_p3_to_cached.c
│   │       │   │       │       │   ├── ge_p3_to_p2.c
│   │       │   │       │       │   ├── ge_p3_tobytes.c
│   │       │   │       │       │   ├── ge_precomp_0.c
│   │       │   │       │       │   ├── ge_scalarmult_base.c
│   │       │   │       │       │   ├── ge_sub.c
│   │       │   │       │       │   ├── ge_sub.h
│   │       │   │       │       │   ├── ge_tobytes.c
│   │       │   │       │       │   ├── keypair.c
│   │       │   │       │       │   ├── obsolete.c
│   │       │   │       │       │   ├── open.c
│   │       │   │       │       │   ├── pow22523.h
│   │       │   │       │       │   ├── pow225521.h
│   │       │   │       │       │   ├── sc.h
│   │       │   │       │       │   ├── sc_muladd.c
│   │       │   │       │       │   ├── sc_reduce.c
│   │       │   │       │       │   ├── sign.c
│   │       │   │       │       │   └── sqrtm1.h
│   │       │   │       │       └── sign_ed25519_api.c
│   │       │   │       ├── crypto_stream/
│   │       │   │       │   ├── aes128ctr/
│   │       │   │       │   │   ├── portable/
│   │       │   │       │   │   │   ├── afternm_aes128ctr.c
│   │       │   │       │   │   │   ├── beforenm_aes128ctr.c
│   │       │   │       │   │   │   ├── common.h
│   │       │   │       │   │   │   ├── common_aes128ctr.c
│   │       │   │       │   │   │   ├── consts.h
│   │       │   │       │   │   │   ├── consts_aes128ctr.c
│   │       │   │       │   │   │   ├── int128.h
│   │       │   │       │   │   │   ├── int128_aes128ctr.c
│   │       │   │       │   │   │   ├── stream_aes128ctr.c
│   │       │   │       │   │   │   ├── types.h
│   │       │   │       │   │   │   └── xor_afternm_aes128ctr.c
│   │       │   │       │   │   └── stream_aes128ctr_api.c
│   │       │   │       │   ├── chacha20/
│   │       │   │       │   │   ├── ref/
│   │       │   │       │   │   │   ├── stream_chacha20_ref.c
│   │       │   │       │   │   │   └── stream_chacha20_ref.h
│   │       │   │       │   │   ├── stream_chacha20.c
│   │       │   │       │   │   ├── stream_chacha20.h
│   │       │   │       │   │   └── vec/
│   │       │   │       │   │       ├── stream_chacha20_vec.c
│   │       │   │       │   │       └── stream_chacha20_vec.h
│   │       │   │       │   ├── crypto_stream.c
│   │       │   │       │   ├── salsa20/
│   │       │   │       │   │   ├── amd64_xmm6/
│   │       │   │       │   │   │   └── stream_salsa20_amd64_xmm6.S
│   │       │   │       │   │   ├── ref/
│   │       │   │       │   │   │   ├── stream_salsa20_ref.c
│   │       │   │       │   │   │   └── xor_salsa20_ref.c
│   │       │   │       │   │   └── stream_salsa20_api.c
│   │       │   │       │   ├── salsa2012/
│   │       │   │       │   │   ├── ref/
│   │       │   │       │   │   │   ├── stream_salsa2012.c
│   │       │   │       │   │   │   └── xor_salsa2012.c
│   │       │   │       │   │   └── stream_salsa2012_api.c
│   │       │   │       │   ├── salsa208/
│   │       │   │       │   │   ├── ref/
│   │       │   │       │   │   │   ├── stream_salsa208.c
│   │       │   │       │   │   │   └── xor_salsa208.c
│   │       │   │       │   │   └── stream_salsa208_api.c
│   │       │   │       │   └── xsalsa20/
│   │       │   │       │       ├── ref/
│   │       │   │       │       │   ├── stream_xsalsa20.c
│   │       │   │       │       │   └── xor_xsalsa20.c
│   │       │   │       │       └── stream_xsalsa20_api.c
│   │       │   │       ├── crypto_verify/
│   │       │   │       │   ├── 16/
│   │       │   │       │   │   ├── ref/
│   │       │   │       │   │   │   └── verify_16.c
│   │       │   │       │   │   └── verify_16_api.c
│   │       │   │       │   ├── 32/
│   │       │   │       │   │   ├── ref/
│   │       │   │       │   │   │   └── verify_32.c
│   │       │   │       │   │   └── verify_32_api.c
│   │       │   │       │   └── 64/
│   │       │   │       │       ├── ref/
│   │       │   │       │       │   └── verify_64.c
│   │       │   │       │       └── verify_64_api.c
│   │       │   │       ├── include/
│   │       │   │       │   ├── Makefile.am
│   │       │   │       │   ├── Makefile.in
│   │       │   │       │   ├── sodium/
│   │       │   │       │   │   ├── core.h
│   │       │   │       │   │   ├── crypto_aead_aes256gcm.h
│   │       │   │       │   │   ├── crypto_aead_chacha20poly1305.h
│   │       │   │       │   │   ├── crypto_auth.h
│   │       │   │       │   │   ├── crypto_auth_hmacsha256.h
│   │       │   │       │   │   ├── crypto_auth_hmacsha512.h
│   │       │   │       │   │   ├── crypto_auth_hmacsha512256.h
│   │       │   │       │   │   ├── crypto_box.h
│   │       │   │       │   │   ├── crypto_box_curve25519xsalsa20poly1305.h
│   │       │   │       │   │   ├── crypto_core_hsalsa20.h
│   │       │   │       │   │   ├── crypto_core_salsa20.h
│   │       │   │       │   │   ├── crypto_core_salsa2012.h
│   │       │   │       │   │   ├── crypto_core_salsa208.h
│   │       │   │       │   │   ├── crypto_generichash.h
│   │       │   │       │   │   ├── crypto_generichash_blake2b.h
│   │       │   │       │   │   ├── crypto_hash.h
│   │       │   │       │   │   ├── crypto_hash_sha256.h
│   │       │   │       │   │   ├── crypto_hash_sha512.h
│   │       │   │       │   │   ├── crypto_int32.h
│   │       │   │       │   │   ├── crypto_int64.h
│   │       │   │       │   │   ├── crypto_onetimeauth.h
│   │       │   │       │   │   ├── crypto_onetimeauth_poly1305.h
│   │       │   │       │   │   ├── crypto_pwhash_scryptsalsa208sha256.h
│   │       │   │       │   │   ├── crypto_scalarmult.h
│   │       │   │       │   │   ├── crypto_scalarmult_curve25519.h
│   │       │   │       │   │   ├── crypto_secretbox.h
│   │       │   │       │   │   ├── crypto_secretbox_xsalsa20poly1305.h
│   │       │   │       │   │   ├── crypto_shorthash.h
│   │       │   │       │   │   ├── crypto_shorthash_siphash24.h
│   │       │   │       │   │   ├── crypto_sign.h
│   │       │   │       │   │   ├── crypto_sign_ed25519.h
│   │       │   │       │   │   ├── crypto_sign_edwards25519sha512batch.h
│   │       │   │       │   │   ├── crypto_stream.h
│   │       │   │       │   │   ├── crypto_stream_aes128ctr.h
│   │       │   │       │   │   ├── crypto_stream_chacha20.h
│   │       │   │       │   │   ├── crypto_stream_salsa20.h
│   │       │   │       │   │   ├── crypto_stream_salsa2012.h
│   │       │   │       │   │   ├── crypto_stream_salsa208.h
│   │       │   │       │   │   ├── crypto_stream_xsalsa20.h
│   │       │   │       │   │   ├── crypto_uint16.h
│   │       │   │       │   │   ├── crypto_uint32.h
│   │       │   │       │   │   ├── crypto_uint64.h
│   │       │   │       │   │   ├── crypto_uint8.h
│   │       │   │       │   │   ├── crypto_verify_16.h
│   │       │   │       │   │   ├── crypto_verify_32.h
│   │       │   │       │   │   ├── crypto_verify_64.h
│   │       │   │       │   │   ├── export.h
│   │       │   │       │   │   ├── randombytes.h
│   │       │   │       │   │   ├── randombytes_nativeclient.h
│   │       │   │       │   │   ├── randombytes_salsa20_random.h
│   │       │   │       │   │   ├── randombytes_sysrandom.h
│   │       │   │       │   │   ├── runtime.h
│   │       │   │       │   │   ├── utils.h
│   │       │   │       │   │   └── version.h.in
│   │       │   │       │   └── sodium.h
│   │       │   │       ├── randombytes/
│   │       │   │       │   ├── nativeclient/
│   │       │   │       │   │   └── randombytes_nativeclient.c
│   │       │   │       │   ├── randombytes.c
│   │       │   │       │   ├── salsa20/
│   │       │   │       │   │   └── randombytes_salsa20_random.c
│   │       │   │       │   └── sysrandom/
│   │       │   │       │       └── randombytes_sysrandom.c
│   │       │   │       └── sodium/
│   │       │   │           ├── core.c
│   │       │   │           ├── runtime.c
│   │       │   │           ├── utils.c
│   │       │   │           └── version.c
│   │       │   └── test/
│   │       │       ├── HAVE_AMD64_ASM.c
│   │       │       ├── HAVE_CPUID.c
│   │       │       ├── HAVE_TI_MODE.c
│   │       │       ├── HAVE_WEAK_SYMBOLS.c
│   │       │       ├── IS_STDC_LIMIT_MACROS_NEEDED.c
│   │       │       ├── Makefile.am
│   │       │       ├── default/
│   │       │       │   ├── CMakeLists.txt
│   │       │       │   ├── Makefile.am
│   │       │       │   ├── aead_chacha20poly1305.c
│   │       │       │   ├── auth.c
│   │       │       │   ├── auth2.c
│   │       │       │   ├── auth3.c
│   │       │       │   ├── auth5.c
│   │       │       │   ├── auth6.c
│   │       │       │   ├── auth7.c
│   │       │       │   ├── box.c
│   │       │       │   ├── box2.c
│   │       │       │   ├── box7.c
│   │       │       │   ├── box8.c
│   │       │       │   ├── box_easy.c
│   │       │       │   ├── box_easy2.c
│   │       │       │   ├── box_seal.c
│   │       │       │   ├── box_seed.c
│   │       │       │   ├── chacha20.c
│   │       │       │   ├── cmptest.h
│   │       │       │   ├── core1.c
│   │       │       │   ├── core2.c
│   │       │       │   ├── core3.c
│   │       │       │   ├── core4.c
│   │       │       │   ├── core5.c
│   │       │       │   ├── core6.c
│   │       │       │   ├── ed25519_convert.c
│   │       │       │   ├── generichash.c
│   │       │       │   ├── generichash2.c
│   │       │       │   ├── generichash3.c
│   │       │       │   ├── hash.c
│   │       │       │   ├── hash3.c
│   │       │       │   ├── onetimeauth.c
│   │       │       │   ├── onetimeauth2.c
│   │       │       │   ├── onetimeauth7.c
│   │       │       │   ├── pre.js.inc
│   │       │       │   ├── pwhash.c
│   │       │       │   ├── pwhash_scrypt_ll.c
│   │       │       │   ├── randombytes.c
│   │       │       │   ├── scalarmult.c
│   │       │       │   ├── scalarmult2.c
│   │       │       │   ├── scalarmult5.c
│   │       │       │   ├── scalarmult6.c
│   │       │       │   ├── scalarmult7.c
│   │       │       │   ├── secretbox.c
│   │       │       │   ├── secretbox2.c
│   │       │       │   ├── secretbox7.c
│   │       │       │   ├── secretbox8.c
│   │       │       │   ├── secretbox_easy.c
│   │       │       │   ├── secretbox_easy2.c
│   │       │       │   ├── shorthash.c
│   │       │       │   ├── sign.c
│   │       │       │   ├── sodium_core.c
│   │       │       │   ├── sodium_utils.c
│   │       │       │   ├── sodium_utils2.c
│   │       │       │   ├── sodium_utils3.c
│   │       │       │   ├── sodium_version.c
│   │       │       │   ├── stream.c
│   │       │       │   ├── stream2.c
│   │       │       │   ├── stream3.c
│   │       │       │   ├── stream4.c
│   │       │       │   ├── verify1.c
│   │       │       │   └── wintest.bat
│   │       │       └── quirks/
│   │       │           └── quirks.h
│   │       ├── libudns/
│   │       │   ├── CMakeLists.txt
│   │       │   ├── COPYING.LGPL
│   │       │   ├── Makefile.am
│   │       │   ├── Makefile.in
│   │       │   ├── NEWS
│   │       │   ├── NOTES
│   │       │   ├── TODO
│   │       │   ├── dnsget.1
│   │       │   ├── dnsget.c
│   │       │   ├── ex-rdns.c
│   │       │   ├── getopt.c
│   │       │   ├── inet_XtoX.c
│   │       │   ├── rblcheck.1
│   │       │   ├── rblcheck.c
│   │       │   ├── udns.3
│   │       │   ├── udns.h
│   │       │   ├── udns_XtoX.c
│   │       │   ├── udns_bl.c
│   │       │   ├── udns_codes.c
│   │       │   ├── udns_dn.c
│   │       │   ├── udns_dntosp.c
│   │       │   ├── udns_init.c
│   │       │   ├── udns_jran.c
│   │       │   ├── udns_misc.c
│   │       │   ├── udns_parse.c
│   │       │   ├── udns_resolver.c
│   │       │   ├── udns_rr_a.c
│   │       │   ├── udns_rr_mx.c
│   │       │   ├── udns_rr_naptr.c
│   │       │   ├── udns_rr_ptr.c
│   │       │   ├── udns_rr_srv.c
│   │       │   └── udns_rr_txt.c
│   │       ├── m4/
│   │       │   ├── ax_pthread.m4
│   │       │   ├── ax_tls.m4
│   │       │   ├── inet_ntop.m4
│   │       │   ├── libtool.m4
│   │       │   ├── ltoptions.m4
│   │       │   ├── ltsugar.m4
│   │       │   ├── ltversion.m4
│   │       │   ├── lt~obsolete.m4
│   │       │   ├── mbedtls.m4
│   │       │   ├── openssl.m4
│   │       │   ├── pcre.m4
│   │       │   ├── polarssl.m4
│   │       │   ├── stack-protector.m4
│   │       │   └── zlib.m4
│   │       ├── rpm/
│   │       │   ├── SOURCES/
│   │       │   │   └── etc/
│   │       │   │       └── init.d/
│   │       │   │           └── shadowsocks-libev
│   │       │   ├── SPECS/
│   │       │   │   └── shadowsocks-libev.spec.in
│   │       │   └── genrpm.sh
│   │       ├── server/
│   │       │   ├── Makefile.am
│   │       │   ├── Makefile.in
│   │       │   ├── acl.c
│   │       │   ├── acl.h
│   │       │   ├── auth.c
│   │       │   ├── auth.h
│   │       │   ├── base64.c
│   │       │   ├── base64.h
│   │       │   ├── cache.c
│   │       │   ├── cache.h
│   │       │   ├── check.c
│   │       │   ├── common.h
│   │       │   ├── crc32.c
│   │       │   ├── encrypt.c
│   │       │   ├── encrypt.h
│   │       │   ├── http.c
│   │       │   ├── http.h
│   │       │   ├── http_simple.c
│   │       │   ├── http_simple.h
│   │       │   ├── jconf.c
│   │       │   ├── jconf.h
│   │       │   ├── json.c
│   │       │   ├── json.h
│   │       │   ├── list.c
│   │       │   ├── list.h
│   │       │   ├── netutils.c
│   │       │   ├── netutils.h
│   │       │   ├── obfs.c
│   │       │   ├── obfs.h
│   │       │   ├── obfsutil.c
│   │       │   ├── protocol.h
│   │       │   ├── resolv.c
│   │       │   ├── resolv.h
│   │       │   ├── rule.c
│   │       │   ├── rule.h
│   │       │   ├── server.c
│   │       │   ├── server.h
│   │       │   ├── tls.c
│   │       │   ├── tls.h
│   │       │   ├── tls1.2_ticket.c
│   │       │   ├── tls1.2_ticket.h
│   │       │   ├── udprelay.c
│   │       │   ├── udprelay.h
│   │       │   ├── uthash.h
│   │       │   ├── utils.c
│   │       │   ├── utils.h
│   │       │   ├── verify.c
│   │       │   └── verify.h
│   │       ├── shadowsocks-libev.pc.in
│   │       └── src/
│   │           ├── CMakeLists.txt
│   │           ├── Makefile.am
│   │           ├── Makefile.in
│   │           ├── acl.c
│   │           ├── acl.h
│   │           ├── android.c
│   │           ├── cache.c
│   │           ├── cache.h
│   │           ├── common.h
│   │           ├── encrypt.c
│   │           ├── encrypt.h
│   │           ├── http.c
│   │           ├── http.h
│   │           ├── includeobfs.h
│   │           ├── jconf.c
│   │           ├── jconf.h
│   │           ├── json.c
│   │           ├── json.h
│   │           ├── local.c
│   │           ├── local.h
│   │           ├── manager.c
│   │           ├── manager.h
│   │           ├── netutils.c
│   │           ├── netutils.h
│   │           ├── obfs/
│   │           │   ├── auth.c
│   │           │   ├── auth.h
│   │           │   ├── auth_chain.c
│   │           │   ├── auth_chain.h
│   │           │   ├── base64.c
│   │           │   ├── base64.h
│   │           │   ├── crc32.c
│   │           │   ├── crc32.h
│   │           │   ├── http_simple.c
│   │           │   ├── http_simple.h
│   │           │   ├── obfs.c
│   │           │   ├── obfs.h
│   │           │   ├── obfsutil.c
│   │           │   ├── obfsutil.h
│   │           │   ├── tls1.2_ticket.c
│   │           │   ├── tls1.2_ticket.h
│   │           │   ├── verify.c
│   │           │   └── verify.h
│   │           ├── protocol.h
│   │           ├── redir.c
│   │           ├── redir.h
│   │           ├── resolv.c
│   │           ├── resolv.h
│   │           ├── rule.c
│   │           ├── rule.h
│   │           ├── server.c
│   │           ├── server.h
│   │           ├── shadowsocks.h
│   │           ├── socks5.h
│   │           ├── ss-nat
│   │           ├── ssrlink.py
│   │           ├── tls.c
│   │           ├── tls.h
│   │           ├── tunnel.c
│   │           ├── tunnel.h
│   │           ├── udprelay.c
│   │           ├── udprelay.h
│   │           ├── uthash.h
│   │           ├── utils.c
│   │           ├── utils.h
│   │           ├── win32.c
│   │           └── win32.h
│   ├── simple-obfs/
│   │   └── Makefile
│   ├── tcping/
│   │   ├── Makefile
│   │   └── src/
│   │       ├── Makefile
│   │       ├── license.txt
│   │       ├── main.c
│   │       ├── readme.txt
│   │       ├── tcp.c
│   │       └── tcp.h
│   ├── trojan/
│   │   ├── Makefile
│   │   ├── boost-version.mk
│   │   └── patches/
│   │       ├── 001-force-openssl-version.patch
│   │       └── 002-Fix-boost1.89-build.patch
│   ├── tuic-client/
│   │   ├── Makefile
│   │   └── patches/
│   │       └── 001-Fix-rust-stable-build.patch
│   ├── v2ray-core/
│   │   └── Makefile
│   ├── v2ray-plugin/
│   │   └── Makefile
│   ├── v2raya/
│   │   ├── Makefile
│   │   └── files/
│   │       ├── v2raya.config
│   │       └── v2raya.init
│   ├── xray-core/
│   │   └── Makefile
│   └── xray-plugin/
│       └── Makefile
├── luci-app-store/
│   ├── luci/
│   │   ├── luci-app-store/
│   │   │   ├── Makefile
│   │   │   ├── luasrc/
│   │   │   │   ├── controller/
│   │   │   │   │   └── store.lua
│   │   │   │   └── view/
│   │   │   │       └── store/
│   │   │   │           └── main.htm
│   │   │   ├── root/
│   │   │   │   ├── bin/
│   │   │   │   │   └── is-opkg
│   │   │   │   ├── etc/
│   │   │   │   │   ├── config/
│   │   │   │   │   │   └── istore
│   │   │   │   │   ├── init.d/
│   │   │   │   │   │   └── istore
│   │   │   │   │   └── uci-defaults/
│   │   │   │   │       └── luci-app-store
│   │   │   │   └── usr/
│   │   │   │       ├── libexec/
│   │   │   │       │   └── istore/
│   │   │   │       │       ├── backup
│   │   │   │       │       ├── docker
│   │   │   │       │       ├── ipkg-build
│   │   │   │       │       ├── ipv4-bin/
│   │   │   │       │       │   ├── curl
│   │   │   │       │       │   └── wget
│   │   │   │       │       └── overlay-backup
│   │   │   │       └── share/
│   │   │   │           └── opkg/
│   │   │   │               └── intercept/
│   │   │   │                   └── rm
│   │   │   ├── src/
│   │   │   │   ├── Makefile
│   │   │   │   ├── compat.conf
│   │   │   │   ├── dummy/
│   │   │   │   │   └── package.mk
│   │   │   │   ├── key-build.pub
│   │   │   │   └── po/
│   │   │   │       ├── templates/
│   │   │   │       │   └── iStore.pot
│   │   │   │       ├── zh-tw/
│   │   │   │       │   └── iStore.po
│   │   │   │       └── zh_Hans/
│   │   │   │           └── iStore.po
│   │   │   └── swagger.yaml
│   │   ├── luci-lib-taskd/
│   │   │   ├── Makefile
│   │   │   ├── htdocs/
│   │   │   │   └── luci-static/
│   │   │   │       └── resources/
│   │   │   │           └── tasks/
│   │   │   │               ├── tasks.css
│   │   │   │               └── tasks.js
│   │   │   ├── luasrc/
│   │   │   │   ├── controller/
│   │   │   │   │   └── tasks-lib.lua
│   │   │   │   ├── model/
│   │   │   │   │   └── tasks.lua
│   │   │   │   └── view/
│   │   │   │       └── tasks/
│   │   │   │           ├── docker.htm
│   │   │   │           └── embed.htm
│   │   │   └── src/
│   │   │       ├── Makefile
│   │   │       ├── dummy/
│   │   │       │   └── package.mk
│   │   │       └── po/
│   │   │           └── zh_Hans/
│   │   │               └── lib-tasks.po
│   │   ├── luci-lib-xterm/
│   │   │   ├── Makefile
│   │   │   ├── htdocs/
│   │   │   │   └── luci-static/
│   │   │   │       └── resources/
│   │   │   │           └── xterm/
│   │   │   │               ├── xterm.css
│   │   │   │               └── xterm.js
│   │   │   └── luasrc/
│   │   │       └── view/
│   │   │           └── xterm/
│   │   │               └── embed.htm
│   │   └── taskd/
│   │       ├── Makefile
│   │       └── files/
│   │           ├── taskd.sh
│   │           └── tasks.init
│   └── translations/
│       ├── en/
│       │   └── app.po
│       ├── templates/
│       │   └── app.pot
│       └── zh_Hans/
│           └── app.po
├── luci-app-supervisord/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── supervisord.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── supervisord.lua
│   │   └── view/
│   │       └── supervisord/
│   │           ├── index.htm
│   │           ├── list.htm
│   │           ├── log.htm
│   │           └── version.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── supervisord.po
│   └── root/
│       └── etc/
│           ├── config/
│           │   └── supervisord
│           ├── init.d/
│           │   └── supervisord
│           ├── supervisord/
│           │   ├── program/
│           │   │   └── templates
│           │   └── supervisord.conf
│           └── uci-defaults/
│               └── luci-supervisord
├── luci-app-syncthing/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── syncthing.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── syncthing.lua
│   │   └── view/
│   │       └── syncthing/
│   │           └── syncthing_status.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── syncthing.po
│   └── root/
│       ├── etc/
│       │   └── uci-defaults/
│       │       └── luci-syncthing
│       └── usr/
│           └── share/
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-syncthing.json
├── luci-app-taskplan/
│   ├── Makefile
│   ├── htdocs/
│   │   └── luci-static/
│   │       └── resources/
│   │           └── view/
│   │               └── taskplan/
│   │                   ├── log.js
│   │                   ├── scheduled.js
│   │                   └── startup.js
│   ├── po/
│   │   └── zh_Hans/
│   │       └── taskplan.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── taskplan
│       │   ├── init.d/
│       │   │   └── taskplan
│       │   ├── taskplan/
│       │   │   ├── taskplancustomscript
│       │   │   ├── taskplancustomscript2
│       │   │   └── taskplanrun
│       │   └── uci-defaults/
│       │       └── luci-taskplan
│       └── usr/
│           ├── bin/
│           │   └── taskplanhandler
│           ├── libexec/
│           │   └── rpcd/
│           │       └── luci.taskplan
│           └── share/
│               ├── luci/
│               │   └── menu.d/
│               │       └── luci-app-taskplan.json
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-taskplan.json
├── luci-app-tcpdump/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── tcpdump.lua
│   │   └── view/
│   │       └── tcpdump.htm
│   └── po/
│       └── zh_Hans/
│           └── tcpdump.po
├── luci-app-tencentddns/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── tencentddns.lua
│   │   └── model/
│   │       └── cbi/
│   │           └── tencentddns.lua
│   ├── po/
│   │   └── zh_Hans/
│   │       └── tencentddns.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── tencentddns
│       │   ├── init.d/
│       │   │   └── tencentddns
│       │   └── uci-defaults/
│       │       └── luci-tencentddns
│       └── usr/
│           ├── sbin/
│           │   └── tencentddns
│           └── share/
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-tencentddns.json
├── luci-app-timecontrol/
│   └── luci-app-timecontrol/
│       ├── Makefile
│       ├── htdocs/
│       │   └── luci-static/
│       │       └── resources/
│       │           └── view/
│       │               └── timecontrol/
│       │                   ├── basic.js
│       │                   └── log.js
│       ├── po/
│       │   └── zh_Hans/
│       │       └── timecontrol.po
│       └── root/
│           ├── etc/
│           │   ├── config/
│           │   │   └── timecontrol
│           │   ├── init.d/
│           │   │   └── timecontrol
│           │   └── uci-defaults/
│           │       └── luci-timecontrol
│           └── usr/
│               ├── bin/
│               │   ├── timecontrol
│               │   ├── timecontrol-log
│               │   └── timecontrolctrl
│               ├── libexec/
│               │   └── timecontrol-call
│               └── share/
│                   ├── luci/
│                   │   └── menu.d/
│                   │       └── luci-app-timecontrol.json
│                   └── rpcd/
│                       └── acl.d/
│                           └── luci-app-timecontrol.json
├── luci-app-udp2raw/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── udp2raw.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── udp2raw/
│   │   │           ├── general.lua
│   │   │           ├── servers-details.lua
│   │   │           └── servers.lua
│   │   └── view/
│   │       └── udp2raw/
│   │           ├── dynamiclist.htm
│   │           └── status.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── udp2raw.po
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── udp2raw
│       │   ├── init.d/
│       │   │   └── udp2raw
│       │   └── uci-defaults/
│       │       └── luci-udp2raw
│       └── usr/
│           └── share/
│               └── rpcd/
│                   └── acl.d/
│                       └── luci-app-udp2raw.json
├── luci-app-unblockneteasemusic/
│   ├── Makefile
│   ├── htdocs/
│   │   └── luci-static/
│   │       └── resources/
│   │           └── view/
│   │               └── unblockneteasemusic/
│   │                   ├── config.js
│   │                   └── status.js
│   └── root/
│       ├── etc/
│       │   ├── config/
│       │   │   └── unblockneteasemusic
│       │   ├── init.d/
│       │   │   └── unblockneteasemusic
│       │   └── uci-defaults/
│       │       └── luci-unblockneteasemusic
│       └── usr/
│           ├── bin/
│           │   └── unm-debug
│           └── share/
│               ├── luci/
│               │   └── menu.d/
│               │       └── luci-app-unblockneteasemusic.json
│               ├── rpcd/
│               │   └── acl.d/
│               │       └── luci-app-unblockneteasemusic.json
│               └── unblockneteasemusic/
│                   ├── debugging.sh
│                   ├── log_check.sh
│                   ├── nftables.ut
│                   └── update.sh
├── luci-app-unishare/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── unishare.lua
│   │   └── model/
│   │       └── cbi/
│   │           └── unishare/
│   │               ├── index.lua
│   │               ├── share.lua
│   │               └── users.lua
│   └── po/
│       └── zh_Hans/
│           └── unishare.po
├── luci-app-watchdog/
│   ├── luci-app-watchdog/
│   │   ├── Makefile
│   │   ├── htdocs/
│   │   │   └── luci-static/
│   │   │       └── resources/
│   │   │           └── view/
│   │   │               └── watchdog/
│   │   │                   ├── basic.js
│   │   │                   └── log.js
│   │   ├── po/
│   │   │   ├── templates/
│   │   │   │   └── watchdog.pot
│   │   │   └── zh_Hans/
│   │   │       └── watchdog.po
│   │   └── root/
│   │       └── usr/
│   │           └── share/
│   │               ├── luci/
│   │               │   └── menu.d/
│   │               │       └── luci-app-watchdog.json
│   │               ├── rpcd/
│   │               │   └── acl.d/
│   │               │       └── luci-app-watchdog.json
│   │               └── watchdog/
│   │                   └── api/
│   │                       ├── device_aliases.list
│   │                       ├── ip_attribution.list
│   │                       ├── ip_blacklist
│   │                       ├── ipv4.list
│   │                       └── ipv6.list
│   └── watchdog/
│       ├── Makefile
│       └── files/
│           ├── watchdog-call.libexec
│           ├── watchdog.config
│           ├── watchdog.init
│           └── watchdog.share
├── luci-app-webd/
│   ├── Makefile
│   ├── luasrc/
│   │   ├── controller/
│   │   │   └── webd.lua
│   │   ├── model/
│   │   │   └── cbi/
│   │   │       └── webd.lua
│   │   └── view/
│   │       └── webd/
│   │           └── webd_status.htm
│   ├── po/
│   │   └── zh_Hans/
│   │       └── webd.po
│   └── root/
│       └── etc/
│           ├── config/
│           │   └── webd
│           ├── init.d/
│           │   └── webd
│           └── uci-defaults/
│               └── luci-webd
└── relevance/
    ├── OpenAppFilter/
    │   ├── luci-app-oaf/
    │   │   ├── Makefile
    │   │   ├── htdocs/
    │   │   │   └── luci-static/
    │   │   │       └── resources/
    │   │   │           └── css/
    │   │   │               └── common.css
    │   │   ├── luasrc/
    │   │   │   ├── controller/
    │   │   │   │   └── appfilter.lua
    │   │   │   ├── model/
    │   │   │   │   └── cbi/
    │   │   │   │       └── appfilter/
    │   │   │   │           ├── advance.lua
    │   │   │   │           ├── app_filter.lua
    │   │   │   │           ├── dev_status.lua
    │   │   │   │           ├── feature.lua
    │   │   │   │           ├── time.lua
    │   │   │   │           ├── time_setting.lua
    │   │   │   │           ├── user.lua
    │   │   │   │           └── user_list.lua
    │   │   │   └── view/
    │   │   │       ├── admin_network/
    │   │   │       │   ├── advance.htm
    │   │   │       │   ├── app_filter.htm
    │   │   │       │   ├── dev_status.htm
    │   │   │       │   ├── feature.htm
    │   │   │       │   ├── time.htm
    │   │   │       │   ├── user.htm
    │   │   │       │   └── user_status.htm
    │   │   │       └── cbi/
    │   │   │           ├── oaf_dvalue.htm
    │   │   │           └── oaf_upload.htm
    │   │   ├── po/
    │   │   │   └── zh_Hans/
    │   │   │       └── oaf.po
    │   │   └── root/
    │   │       ├── etc/
    │   │       │   └── uci-defaults/
    │   │       │       ├── 94_feature_3.0
    │   │       │       └── 95_time_daily_limit
    │   │       └── usr/
    │   │           └── share/
    │   │               └── rpcd/
    │   │                   └── acl.d/
    │   │                       └── luci-app-oaf.json
    │   ├── oaf/
    │   │   ├── Makefile
    │   │   └── src/
    │   │       ├── Makefile
    │   │       ├── af_client.c
    │   │       ├── af_client.h
    │   │       ├── af_client_fs.c
    │   │       ├── af_client_fs.h
    │   │       ├── af_config.c
    │   │       ├── af_config.h
    │   │       ├── af_conntrack.c
    │   │       ├── af_conntrack.h
    │   │       ├── af_log.c
    │   │       ├── af_log.h
    │   │       ├── af_rule_config.c
    │   │       ├── af_rule_config.h
    │   │       ├── af_user_config.c
    │   │       ├── af_user_config.h
    │   │       ├── af_utils.c
    │   │       ├── af_utils.h
    │   │       ├── af_whitelist_config.c
    │   │       ├── af_whitelist_config.h
    │   │       ├── app_filter.c
    │   │       ├── app_filter.h
    │   │       ├── cJSON.c
    │   │       ├── cJSON.h
    │   │       └── regexp.c
    │   └── open-app-filter/
    │       ├── Makefile
    │       ├── files/
    │       │   ├── appfilter.config
    │       │   ├── appfilter.init
    │       │   ├── feature.cfg
    │       │   ├── feature_cn.cfg
    │       │   ├── feature_en.cfg
    │       │   ├── gen_class.sh
    │       │   ├── hnat.sh
    │       │   ├── oaf_rule
    │       │   └── user_info.config
    │       └── src/
    │           ├── Makefile
    │           ├── appfilter.h
    │           ├── appfilter_config.c
    │           ├── appfilter_config.h
    │           ├── appfilter_netlink.c
    │           ├── appfilter_netlink.h
    │           ├── appfilter_ubus.c
    │           ├── appfilter_ubus.h
    │           ├── appfilter_user.c
    │           ├── appfilter_user.h
    │           ├── main.c
    │           ├── utils.c
    │           └── utils.h
    ├── WiFiPortal/
    │   ├── autokick-wiwiz/
    │   │   ├── Makefile
    │   │   ├── files/
    │   │   │   ├── etc/
    │   │   │   │   ├── config/
    │   │   │   │   │   └── autokick
    │   │   │   │   └── init.d/
    │   │   │   │       └── autokick
    │   │   │   └── usr/
    │   │   │       ├── bin/
    │   │   │       │   └── autokick.sh
    │   │   │       └── lib/
    │   │   │           └── lua/
    │   │   │               └── luci/
    │   │   │                   ├── controller/
    │   │   │                   │   └── autokick.lua
    │   │   │                   └── model/
    │   │   │                       └── cbi/
    │   │   │                           └── autokick.lua
    │   │   └── po/
    │   │       └── zh_Hans/
    │   │           └── autokick.po
    │   ├── dcc2-wiwiz/
    │   │   ├── Makefile
    │   │   ├── files/
    │   │   │   ├── rtty.config
    │   │   │   ├── rtty.init
    │   │   │   ├── uci-defaults-rtty
    │   │   │   ├── usr/
    │   │   │   │   ├── bin/
    │   │   │   │   │   └── assocnum.sh
    │   │   │   │   └── lib/
    │   │   │   │       └── lua/
    │   │   │   │           └── luci/
    │   │   │   │               ├── controller/
    │   │   │   │               │   └── rtty.lua
    │   │   │   │               └── model/
    │   │   │   │                   └── cbi/
    │   │   │   │                       └── rtty.lua
    │   │   │   └── www/
    │   │   │       └── cgi-bin/
    │   │   │           └── dvstatus
    │   │   ├── po/
    │   │   │   └── zh_Hans/
    │   │   │       └── dcc2-wiwiz.po
    │   │   └── src/
    │   │       ├── CMakeLists.txt
    │   │       ├── cmake/
    │   │       │   └── Modules/
    │   │       │       └── FindLibev.cmake
    │   │       ├── src/
    │   │       │   ├── CMakeLists.txt
    │   │       │   ├── buffer/
    │   │       │   │   ├── buffer.c
    │   │       │   │   └── buffer.h
    │   │       │   ├── command.c
    │   │       │   ├── command.h
    │   │       │   ├── config.h.in
    │   │       │   ├── file.c
    │   │       │   ├── file.h
    │   │       │   ├── filectl.c
    │   │       │   ├── http.c
    │   │       │   ├── http.h
    │   │       │   ├── list.h
    │   │       │   ├── log/
    │   │       │   │   ├── log.c
    │   │       │   │   └── log.h
    │   │       │   ├── main.c
    │   │       │   ├── net.c
    │   │       │   ├── net.h
    │   │       │   ├── rtty.c
    │   │       │   ├── rtty.h
    │   │       │   ├── ssl/
    │   │       │   │   ├── CMakeLists.txt
    │   │       │   │   ├── cmake/
    │   │       │   │   │   └── Modules/
    │   │       │   │   │       ├── FindMbedTLS.cmake
    │   │       │   │   │       └── FindWolfSSL.cmake
    │   │       │   │   ├── example-client.c
    │   │       │   │   ├── example-server.c
    │   │       │   │   ├── mbedtls.c
    │   │       │   │   ├── openssl.c
    │   │       │   │   └── ssl.h
    │   │       │   ├── utils.c
    │   │       │   └── utils.h
    │   │       └── tools/
    │   │           ├── sendcmd.sh
    │   │           └── test.sh
    │   ├── eqos-master-wiwiz/
    │   │   ├── Makefile
    │   │   └── files/
    │   │       ├── eqos-cbi.lua
    │   │       ├── eqos-controller.lua
    │   │       ├── eqos.config
    │   │       ├── eqos.hotplug
    │   │       ├── eqos.init
    │   │       ├── eqos.sh
    │   │       ├── po/
    │   │       │   └── zh_Hans/
    │   │       │       └── eqos.po
    │   │       └── uci-defaults-eqos
    │   └── wifidog-wiwiz/
    │       ├── Config.in
    │       ├── Makefile
    │       ├── files/
    │       │   ├── etc/
    │       │   │   ├── config/
    │       │   │   │   └── wiwiz
    │       │   │   └── uci-defaults/
    │       │   │       ├── 199-noredir
    │       │   │       └── 299-noportal
    │       │   ├── usr/
    │       │   │   ├── lib/
    │       │   │   │   └── lua/
    │       │   │   │       └── luci/
    │       │   │   │           ├── controller/
    │       │   │   │           │   └── wiwiz.lua
    │       │   │   │           └── model/
    │       │   │   │               └── cbi/
    │       │   │   │                   └── wiwiz.lua
    │       │   │   └── local/
    │       │   │       └── hsbuilder/
    │       │   │           ├── auth.sh
    │       │   │           ├── checkauth.sh
    │       │   │           ├── dhcp_portal.sh
    │       │   │           ├── getmodel.sh
    │       │   │           ├── handle_ipv6.sh
    │       │   │           ├── hsbuilder.conf
    │       │   │           ├── hsbuilder.sh
    │       │   │           ├── hsbuilder_helper.sh
    │       │   │           ├── kickmac.sh
    │       │   │           ├── setspeed.sh
    │       │   │           ├── ver
    │       │   │           ├── wiwizroaming.sh
    │       │   │           └── wiwizroaming.sh.old
    │       │   ├── wifidog.init
    │       │   └── www/
    │       │       ├── cgi-bin/
    │       │       │   ├── cpi
    │       │       │   ├── kickmac
    │       │       │   ├── myip
    │       │       │   ├── mymac
    │       │       │   ├── showdevinfo
    │       │       │   └── wiwiz404
    │       │       ├── error.html.wiwiz
    │       │       ├── index.html.wiwiz
    │       │       └── mymac.htm
    │       ├── po/
    │       │   └── zh_Hans/
    │       │       └── wifidog-wiwiz.po
    │       └── src/
    │           ├── AUTHORS
    │           ├── COPYING
    │           ├── ChangeLog
    │           ├── FAQ
    │           ├── Makefile.am
    │           ├── NEWS
    │           ├── README
    │           ├── README.openwrt
    │           ├── autogen.sh
    │           ├── configure.in
    │           ├── contrib/
    │           │   ├── airos/
    │           │   │   └── wifidog/
    │           │   │       ├── Makefile
    │           │   │       ├── files/
    │           │   │       │   ├── wifidog.conf
    │           │   │       │   └── wifidog.init
    │           │   │       ├── files.patch
    │           │   │       ├── patches/
    │           │   │       │   └── 100-counter_outoing.patch
    │           │   │       └── readme.txt
    │           │   ├── build-deb/
    │           │   │   ├── changelog
    │           │   │   ├── control
    │           │   │   └── rules
    │           │   ├── build-openwrt-kamikazeipk/
    │           │   │   └── wifidog/
    │           │   │       ├── Makefile
    │           │   │       └── files/
    │           │   │           ├── wifidog.conf
    │           │   │           └── wifidog.init
    │           │   ├── build-openwrt-kamikazeipk8.09up/
    │           │   │   └── wifidog/
    │           │   │       ├── Makefile
    │           │   │       └── files/
    │           │   │           ├── wifidog.conf
    │           │   │           └── wifidog.init
    │           │   ├── build-openwrt-whiterussianipk/
    │           │   │   └── wifidog/
    │           │   │       ├── Config.in
    │           │   │       ├── Makefile
    │           │   │       ├── files/
    │           │   │       │   ├── wifidog.conf
    │           │   │       │   └── wifidog.init
    │           │   │       └── ipkg/
    │           │   │           ├── wifidog.conffiles
    │           │   │           └── wifidog.control
    │           │   └── dump_fw.sh
    │           ├── doc/
    │           │   ├── Makefile.am
    │           │   ├── README.developers.txt
    │           │   ├── doxygen.cfg.in
    │           │   └── wifidog_firewall_diagram.dia
    │           ├── libhttpd/
    │           │   ├── Makefile.am
    │           │   ├── README
    │           │   ├── api.c
    │           │   ├── httpd.h
    │           │   ├── httpd_priv.h
    │           │   ├── ip_acl.c
    │           │   ├── protocol.c
    │           │   └── version.c
    │           ├── scripts/
    │           │   └── init.d/
    │           │       └── wifidog
    │           ├── src/
    │           │   ├── Makefile.am
    │           │   ├── auth.c
    │           │   ├── auth.h
    │           │   ├── centralserver.c
    │           │   ├── centralserver.h
    │           │   ├── client_list.c
    │           │   ├── client_list.h
    │           │   ├── commandline.c
    │           │   ├── commandline.h
    │           │   ├── common.h
    │           │   ├── conf.c
    │           │   ├── conf.h
    │           │   ├── debug.c
    │           │   ├── debug.h
    │           │   ├── firewall.c
    │           │   ├── firewall.h
    │           │   ├── fw_iptables-org.c
    │           │   ├── fw_iptables.c
    │           │   ├── fw_iptables.h
    │           │   ├── gateway.c
    │           │   ├── gateway.h
    │           │   ├── http.c
    │           │   ├── http.h
    │           │   ├── httpd_thread.c
    │           │   ├── httpd_thread.h
    │           │   ├── ping_thread.c
    │           │   ├── ping_thread.h
    │           │   ├── safe.c
    │           │   ├── safe.h
    │           │   ├── util.c
    │           │   ├── util.h
    │           │   ├── wdctl.c
    │           │   ├── wdctl.h
    │           │   ├── wdctl_thread.c
    │           │   └── wdctl_thread.h
    │           ├── wifidog-msg.html.in
    │           ├── wifidog-msg.html.in.org
    │           ├── wifidog.conf
    │           └── wifidog.spec.in
    ├── adguardhome/
    │   ├── Makefile
    │   └── files/
    │       └── adguardhome.init
    ├── cdnspeedtest/
    │   ├── Makefile
    │   └── test.sh
    ├── cpulimit/
    │   ├── Makefile
    │   └── patches/
    │       └── 010-gcc14.patch
    ├── filebrowser/
    │   ├── Makefile
    │   └── files/
    │       ├── filebrowser.config
    │       └── filebrowser.init
    ├── gost/
    │   ├── Makefile
    │   └── files/
    │       ├── gost.config
    │       ├── gost.init
    │       └── gost.uci
    ├── luci-lib-iform/
    │   ├── Makefile
    │   ├── luasrc/
    │   │   └── iform.lua
    │   └── root/
    │       └── www/
    │           └── luci-static/
    │               └── iform/
    │                   ├── 1.0/
    │                   │   ├── index.js
    │                   │   └── style.css
    │                   └── 1.1/
    │                       ├── index.js
    │                       └── style.css
    ├── luci-mod-istorenext/
    │   ├── Makefile
    │   ├── po/
    │   │   ├── templates/
    │   │   │   └── istorenext.pot
    │   │   └── zh_Hans/
    │   │       └── istorenext.po
    │   ├── root/
    │   │   ├── etc/
    │   │   │   ├── nginx/
    │   │   │   │   └── conf.d/
    │   │   │   │       ├── istorenext.conf
    │   │   │   │       └── istorenext.locations
    │   │   │   └── uci-defaults/
    │   │   │       └── 50_luci-istorenext
    │   │   └── usr/
    │   │       ├── lib/
    │   │       │   └── lua/
    │   │       │       └── luci/
    │   │       │           └── view/
    │   │       │               └── istorenext/
    │   │       │                   ├── index.htm
    │   │       │                   └── login.htm
    │   │       └── share/
    │   │           └── luci/
    │   │               └── menu.d/
    │   │                   └── luci-mod-istorenext.json
    │   ├── root-demo/
    │   │   ├── demo/
    │   │   │   └── cgi-bin/
    │   │   │       └── luci/
    │   │   │           └── istorenext/
    │   │   │               ├── cgi-bin/
    │   │   │               │   └── logon
    │   │   │               └── index.htm
    │   │   └── etc/
    │   │       └── init.d/
    │   │           └── istorenext-demo
    │   └── test.conf
    ├── luci-nginxer/
    │   ├── Makefile
    │   └── root/
    │       └── etc/
    │           └── uci-defaults/
    │               └── 50_luci-nginxer
    ├── msd_lite/
    │   ├── Makefile
    │   ├── files/
    │   │   ├── msd_lite.config
    │   │   ├── msd_lite.init
    │   │   └── msd_lite.sample
    │   └── patches/
    │       └── 010-Add-rejoin-option-as-ugly-hack-to-allow-send-IGMP-MLD-lea.patch
    ├── nas-packages/
    │   ├── multimedia/
    │   │   └── ffmpeg-remux/
    │   │       └── Makefile
    │   └── network/
    │       └── services/
    │           ├── ddnsto/
    │           │   ├── Makefile
    │           │   └── files/
    │           │       ├── ddnsto-monitor.sh
    │           │       ├── ddnsto.config
    │           │       ├── ddnsto.init
    │           │       └── ddnsto.uci-default
    │           ├── fastnet/
    │           │   ├── Makefile
    │           │   └── files/
    │           │       ├── fastnet.config
    │           │       ├── fastnet.init
    │           │       └── fastnet.uci-default
    │           ├── floatip/
    │           │   ├── Makefile
    │           │   └── files/
    │           │       ├── floatip.config
    │           │       ├── floatip.init
    │           │       ├── floatip.sh
    │           │       └── floatip.uci-default
    │           ├── istoreenhance/
    │           │   ├── Makefile
    │           │   └── files/
    │           │       ├── istoreenhance.config
    │           │       ├── istoreenhance.init
    │           │       └── istoreenhance.uci-default
    │           ├── kai/
    │           │   ├── Makefile
    │           │   └── files/
    │           │       ├── kai.config
    │           │       └── kai.init
    │           ├── kai_session/
    │           │   └── Makefile
    │           ├── linkease/
    │           │   ├── Makefile
    │           │   └── files/
    │           │       ├── aria2.sh
    │           │       ├── linkease-config.sh
    │           │       ├── linkease.config
    │           │       ├── linkease.init
    │           │       └── linkease.uci-default
    │           ├── linkmount/
    │           │   └── Makefile
    │           ├── quickstart/
    │           │   ├── Makefile
    │           │   └── files/
    │           │       ├── dhcpvalid.sh
    │           │       ├── manuf
    │           │       ├── quickstart.config
    │           │       ├── quickstart.hotplug
    │           │       ├── quickstart.init
    │           │       ├── quickstart.uci-default
    │           │       ├── startdhns.hotplug
    │           │       └── startdhns.init
    │           ├── unishare/
    │           │   ├── Makefile
    │           │   └── files/
    │           │       ├── unishare.config
    │           │       └── unishare.init
    │           └── webdav2/
    │               ├── Makefile
    │               └── files/
    │                   ├── webdav2.config
    │                   └── webdav2.init
    ├── natter/
    │   └── Makefile
    ├── natter2/
    │   └── Makefile
    ├── onekey-install.sh
    ├── oscam/
    │   ├── Config.in
    │   ├── Makefile
    │   └── files/
    │       ├── oscam-watchdog.sh
    │       ├── oscam.conf
    │       ├── oscam.dvbapi
    │       ├── oscam.init
    │       ├── oscam.server
    │       └── oscam.user
    ├── passwall-packages/
    │   ├── chinadns-ng/
    │   │   └── Makefile
    │   ├── dns2socks/
    │   │   └── Makefile
    │   ├── geoview/
    │   │   └── Makefile
    │   ├── hysteria/
    │   │   └── Makefile
    │   ├── ipt2socks/
    │   │   └── Makefile
    │   ├── microsocks/
    │   │   ├── Makefile
    │   │   └── patches/
    │   │       └── 100-Add-SOCKS5-forwarding-rules-support.patch
    │   ├── naiveproxy/
    │   │   ├── Makefile
    │   │   └── files/
    │   │       ├── naiveproxy.config
    │   │       └── naiveproxy.init
    │   ├── shadow-tls/
    │   │   ├── Makefile
    │   │   └── patches/
    │   │       ├── 010-Fix-reading-WildcardSNI-from-sip003_arg-115.patch
    │   │       ├── 011-fix-use-tls1-2-only-website-for-tls12-test-suites-129.patch
    │   │       └── 100-update-monoio.patch
    │   ├── shadowsocks-libev/
    │   │   ├── Makefile
    │   │   └── patches/
    │   │       ├── 100-Upgrade-PCRE-to-PCRE2.patch
    │   │       ├── 101-Fix-mishandling-of-incoming-socket-buffer.-It-must-b.patch
    │   │       └── 102-deprecate-load16-be-replace-with-ntohs.patch
    │   ├── shadowsocks-rust/
    │   │   └── Makefile
    │   ├── shadowsocksr-libev/
    │   │   ├── Makefile
    │   │   ├── patches/
    │   │   │   ├── 0001-Add-ss-server-and-ss-check.patch
    │   │   │   ├── 0002-Revert-verify_simple-and-auth_simple.patch
    │   │   │   ├── 0003-Refine-Usage.patch
    │   │   │   ├── 100-fix-gcc-10.patch
    │   │   │   ├── 101-Fix-Werror-sizeof-pointer-memaccess.patch
    │   │   │   ├── 102-Read-listening-mode-from-config.patch
    │   │   │   ├── 103-Add-TPROXY-support-for-TCP-ssr-redir.patch
    │   │   │   └── 105-Upgrade-PCRE-to-PCRE2.patch
    │   │   └── src/
    │   │       └── server/
    │   │           ├── Makefile.am
    │   │           ├── Makefile.in
    │   │           ├── acl.c
    │   │           ├── acl.h
    │   │           ├── auth.c
    │   │           ├── auth.h
    │   │           ├── base64.c
    │   │           ├── base64.h
    │   │           ├── cache.c
    │   │           ├── cache.h
    │   │           ├── check.c
    │   │           ├── common.h
    │   │           ├── crc32.c
    │   │           ├── encrypt.c
    │   │           ├── encrypt.h
    │   │           ├── http.c
    │   │           ├── http.h
    │   │           ├── http_simple.c
    │   │           ├── http_simple.h
    │   │           ├── jconf.c
    │   │           ├── jconf.h
    │   │           ├── json.c
    │   │           ├── json.h
    │   │           ├── list.c
    │   │           ├── list.h
    │   │           ├── netutils.c
    │   │           ├── netutils.h
    │   │           ├── obfs.c
    │   │           ├── obfs.h
    │   │           ├── obfsutil.c
    │   │           ├── protocol.h
    │   │           ├── resolv.c
    │   │           ├── resolv.h
    │   │           ├── rule.c
    │   │           ├── rule.h
    │   │           ├── server.c
    │   │           ├── server.h
    │   │           ├── tls.c
    │   │           ├── tls.h
    │   │           ├── tls1.2_ticket.c
    │   │           ├── tls1.2_ticket.h
    │   │           ├── udprelay.c
    │   │           ├── udprelay.h
    │   │           ├── uthash.h
    │   │           ├── utils.c
    │   │           ├── utils.h
    │   │           ├── verify.c
    │   │           └── verify.h
    │   ├── simple-obfs/
    │   │   ├── Makefile
    │   │   └── patches/
    │   │       └── 001-convert-arguments-of-isdigit-to-int.patch
    │   ├── sing-box/
    │   │   └── Makefile
    │   ├── tcping/
    │   │   └── Makefile
    │   ├── trojan-plus/
    │   │   ├── Makefile
    │   │   ├── boost-version.mk
    │   │   └── patches/
    │   │       ├── 001-Fix-boost1.87-build.patch
    │   │       └── 002-Fix-boost1.89-build.patch
    │   ├── tuic-client/
    │   │   └── Makefile
    │   ├── v2ray-geodata/
    │   │   └── Makefile
    │   ├── v2ray-plugin/
    │   │   └── Makefile
    │   ├── xray-core/
    │   │   └── Makefile
    │   └── xray-plugin/
    │       └── Makefile
    ├── quectel_cm-5G/
    │   ├── Makefile
    │   ├── files/
    │   │   ├── dhcp
    │   │   ├── rmnet.script
    │   │   ├── rmnet.sh
    │   │   ├── rmnet6.script
    │   │   ├── rmnet6.sh
    │   │   └── rmnet_init.sh
    │   └── src/
    │       ├── CMakeLists.txt
    │       ├── GobiNetCM.c
    │       ├── Makefile
    │       ├── Makefile.am
    │       ├── NOTICE
    │       ├── QCQCTL.h
    │       ├── QCQMI.h
    │       ├── QCQMUX.c
    │       ├── QCQMUX.h
    │       ├── QMIThread.c
    │       ├── QMIThread.h
    │       ├── QmiWwanCM.c
    │       ├── ReleaseNote.txt
    │       ├── at_tok.c
    │       ├── at_tok.h
    │       ├── atc.c
    │       ├── atchannel.c
    │       ├── atchannel.h
    │       ├── configure.ac
    │       ├── default.script
    │       ├── default.script_ip
    │       ├── device.c
    │       ├── ethtool-copy.h
    │       ├── log/
    │       │   ├── cdc_mbim.txt
    │       │   ├── cdc_mbim_vlan.txt
    │       │   ├── ecm_ncm_rndis.txt
    │       │   ├── gobinet.txt
    │       │   ├── gobinet_bridge.txt
    │       │   ├── gobinet_qmap=1.txt
    │       │   ├── gobinet_qmap=1_bridge.txt
    │       │   ├── gobinet_qmap=4.txt
    │       │   ├── gobinet_qmap=4_bridge.txt
    │       │   ├── pcie_mhi_mbim.txt
    │       │   ├── pcie_mhi_mbim_qmap=4.txt
    │       │   ├── pcie_mhi_qmap=1.txt
    │       │   ├── pcie_mhi_qmap=1_bridge.txt
    │       │   ├── pcie_mhi_qmap=4.txt
    │       │   ├── pcie_mhi_qmap=4_bridge.txt
    │       │   ├── qmi_wwan_q.txt
    │       │   ├── qmi_wwan_q_bridge.txt
    │       │   ├── qmi_wwan_q_qmap=1.txt
    │       │   ├── qmi_wwan_q_qmap=1_bridge.txt
    │       │   ├── qmi_wwan_q_qmap=4.txt
    │       │   ├── qmi_wwan_q_qmap=4_bridge.txt
    │       │   ├── qmi_wwan_qmap=4.txt
    │       │   └── usage_of_argument/
    │       │       ├── 6.txt
    │       │       └── m.txt
    │       ├── main.c
    │       ├── mbim-cm.c
    │       ├── qendian.h
    │       ├── qlist.h
    │       ├── qmap_bridge_mode.c
    │       ├── qrtr.c
    │       ├── qrtr.h
    │       ├── quectel-atc-proxy.c
    │       ├── quectel-mbim-proxy.c
    │       ├── quectel-qmi-proxy.c
    │       ├── quectel-qrtr-proxy.c
    │       ├── rmnetctl.c
    │       ├── udhcpc.c
    │       ├── udhcpc_netlink.c
    │       ├── udhcpc_script.c
    │       ├── util.c
    │       └── util.h
    ├── smartmontools/
    │   ├── Makefile
    │   ├── files/
    │   │   ├── smartd.conf
    │   │   └── smartd.init
    │   ├── patches/
    │   │   ├── 001-use-external-drivedb.patch
    │   │   └── 002-os_mailer-is-mailx.patch
    │   └── test.sh
    ├── socat/
    │   ├── Makefile
    │   └── files/
    │       ├── socat.config
    │       └── socat.init
    ├── syncthing/
    │   ├── Makefile
    │   ├── files/
    │   │   ├── stdiscosrv.conf
    │   │   ├── stdiscosrv.init
    │   │   ├── strelaysrv.conf
    │   │   ├── strelaysrv.init
    │   │   ├── syncthing.conf
    │   │   ├── syncthing.init
    │   │   └── syncthing.sysctl
    │   └── test.sh
    ├── udp2raw/
    │   └── Makefile
    ├── upx-static/
    │   └── Makefile
    └── webd/
        └── Makefile
Download .txt
Showing preview only (2,758K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (29484 symbols across 926 files)

FILE: luci-app-adguardhome/root/www/luci-static/resources/codemirror/addon/fold/foldcode.js
  function e (line 1) | function e(e,o,i,t){if(i&&i.call){var l=i;i=null}else l=r(e,i,"rangeFind...
  function r (line 1) | function r(n,e,r){if(e&&void 0!==e[r])return e[r];var i=n.options.foldOp...

FILE: luci-app-adguardhome/root/www/luci-static/resources/codemirror/addon/fold/foldgutter.js
  function e (line 1) | function e(t,e){for(var r=t.findMarks(o(e,0),o(e+1,0)),n=0;n<r.length;++...
  function r (line 1) | function r(t){if("string"==typeof t){var o=document.createElement("div")...
  function n (line 1) | function n(t,n,f){var a=t.state.foldGutter.options,d=n-1,u=t.foldOption(...
  function i (line 1) | function i(t){return new RegExp("(^|\\s)"+t+"(?:$|\\s)\\s*")}
  function f (line 1) | function f(t){var o=t.getViewport(),e=t.state.foldGutter;e&&(t.operation...
  function a (line 1) | function a(t,r,n){var i=t.state.foldGutter;if(i){var f=i.options;if(n==f...
  function d (line 1) | function d(t){var o=t.state.foldGutter;if(o){var e=o.options;o.from=o.to...
  function u (line 1) | function u(t){var o=t.state.foldGutter;if(o){var e=o.options;clearTimeou...
  function l (line 1) | function l(t,o){var e=t.state.foldGutter;if(e){var r=o.line;r>=e.from&&r...

FILE: luci-app-adguardhome/root/www/luci-static/resources/codemirror/addon/fold/indent-fold.js
  function n (line 1) | function n(n,t){var i=n.getLine(t),o=i.search(/\S/);return-1==o||/\bcomm...

FILE: luci-app-adguardhome/root/www/luci-static/resources/codemirror/lib/codemirror.js
  function L (line 1) | function L(e){return new RegExp("(^|\\s)"+e+"(?:$|\\s)\\s*")}
  function M (line 1) | function M(e){for(var t=e.childNodes.length;t>0;--t)e.removeChild(e.firs...
  function N (line 1) | function N(e,t){return M(e).appendChild(t)}
  function O (line 1) | function O(e,t,r,n){var i=document.createElement(e);if(r&&(i.className=r...
  function A (line 1) | function A(e,t,r,n){var i=O(e,t,r,n);return i.setAttribute("role","prese...
  function D (line 1) | function D(e,t){if(3==t.nodeType&&(t=t.parentNode),e.contains)return e.c...
  function W (line 1) | function W(){var e;try{e=document.activeElement}catch(t){e=document.body...
  function H (line 1) | function H(e,t){var r=e.className;L(t).test(r)||(e.className+=(r?" ":"")...
  function F (line 1) | function F(e,t){for(var r=e.split(" "),n=0;n<r.length;n++)r[n]&&!L(r[n])...
  function E (line 1) | function E(e){var t=Array.prototype.slice.call(arguments,1);return funct...
  function I (line 1) | function I(e,t,r){for(var n in t||(t={}),e)!e.hasOwnProperty(n)||!1===r&...
  function z (line 1) | function z(e,t,r,n,i){null==t&&-1==(t=e.search(/[^\s\u00a0]/))&&(t=e.len...
  function B (line 1) | function B(e,t){for(var r=0;r<e.length;++r)if(e[r]==t)return r;return-1}
  function X (line 1) | function X(e,t,r){for(var n=0,i=0;;){var o=e.indexOf("\t",n);-1==o&&(o=e...
  function _ (line 1) | function _(e){for(;Y.length<=e;)Y.push($(Y)+" ");return Y[e]}
  function $ (line 1) | function $(e){return e[e.length-1]}
  function q (line 1) | function q(e,t){for(var r=[],n=0;n<e.length;n++)r[n]=t(e[n],n);return r}
  function Z (line 1) | function Z(){}
  function Q (line 1) | function Q(e,t){var r;return Object.create?r=Object.create(e):(Z.prototy...
  function ee (line 1) | function ee(e){return/\w/.test(e)||e>"€"&&(e.toUpperCase()!=e.toLowerCas...
  function te (line 1) | function te(e,t){return t?!!(t.source.indexOf("\\w")>-1&&ee(e))||t.test(...
  function re (line 1) | function re(e){for(var t in e)if(e.hasOwnProperty(t)&&e[t])return!1;retu...
  function ie (line 1) | function ie(e){return e.charCodeAt(0)>=768&&ne.test(e)}
  function oe (line 1) | function oe(e,t,r){for(;(r<0?t>0:t<e.length)&&ie(e.charAt(t));)t+=r;retu...
  function le (line 1) | function le(e,t,r){for(var n=t>r?-1:1;;){if(t==r)return t;var i=(t+r)/2,...
  function ae (line 1) | function ae(e,t,r){var n;se=null;for(var i=0;i<e.length;++i){var o=e[i];...
  function s (line 1) | function s(e,t,r){this.level=e,this.from=t,this.to=r}
  function ce (line 1) | function ce(e,t){var r=e.order;return null==r&&(r=e.order=ue(e.text,t)),r}
  function de (line 1) | function de(e,t){return e._handlers&&e._handlers[t]||he}
  function pe (line 1) | function pe(e,t,r){if(e.removeEventListener)e.removeEventListener(t,r,!1...
  function ge (line 1) | function ge(e,t){var r=de(e,t);if(r.length)for(var n=Array.prototype.sli...
  function ve (line 1) | function ve(e,t,r){return"string"==typeof t&&(t={type:t,preventDefault:f...
  function me (line 1) | function me(e){var t=e._handlers&&e._handlers.cursorActivity;if(t)for(va...
  function ye (line 1) | function ye(e,t){return de(e,t).length>0}
  function be (line 1) | function be(e){e.prototype.on=function(e,t){fe(this,e,t)},e.prototype.of...
  function we (line 1) | function we(e){e.preventDefault?e.preventDefault():e.returnValue=!1}
  function xe (line 1) | function xe(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0}
  function Ce (line 1) | function Ce(e){return null!=e.defaultPrevented?e.defaultPrevented:0==e.r...
  function Se (line 1) | function Se(e){we(e),xe(e)}
  function Le (line 1) | function Le(e){return e.target||e.srcElement}
  function ke (line 1) | function ke(e){var t=e.which;return null==t&&(1&e.button?t=1:2&e.button?...
  function Oe (line 1) | function Oe(e){if(null==Te){var t=O("span","​");N(e,O("span",[t,document...
  function Ae (line 1) | function Ae(e){if(null!=Me)return Me;var t=N(e,document.createTextNode("...
  function ze (line 1) | function ze(e){if("string"==typeof e&&Ie.hasOwnProperty(e))e=Ie[e];else ...
  function Re (line 1) | function Re(e,t){t=ze(t);var r=Ee[t.name];if(!r)return Re(e,"text/plain"...
  function Ge (line 1) | function Ge(e,t){I(t,Be.hasOwnProperty(e)?Be[e]:Be[e]={})}
  function Ue (line 1) | function Ue(e,t){if(!0===t)return t;if(e.copyState)return e.copyState(t)...
  function Ve (line 1) | function Ve(e,t){for(var r;e.innerMode&&(r=e.innerMode(t))&&r.mode!=e;)t...
  function Ke (line 1) | function Ke(e,t,r){return!e.startState||e.startState(t,r)}
  function Xe (line 1) | function Xe(e,t){if((t-=e.first)<0||t>=e.size)throw new Error("There is ...
  function Ye (line 1) | function Ye(e,t,r){var n=[],i=t.line;return e.iter(t.line,r.line+1,funct...
  function _e (line 1) | function _e(e,t,r){var n=[];return e.iter(t,r,function(e){n.push(e.text)...
  function $e (line 1) | function $e(e,t){var r=t-e.height;if(r)for(var n=e;n;n=n.parent)n.height...
  function qe (line 1) | function qe(e){if(null==e.parent)return null;for(var t=e.parent,r=B(t.li...
  function Ze (line 1) | function Ze(e,t){var r=e.first;e:do{for(var n=0;n<e.children.length;++n)...
  function Qe (line 1) | function Qe(e,t){return t>=e.first&&t<e.first+e.size}
  function Je (line 1) | function Je(e,t){return String(e.lineNumberFormatter(t+e.firstLineNumber))}
  function et (line 1) | function et(e,t,r){if(void 0===r&&(r=null),!(this instanceof et))return ...
  function tt (line 1) | function tt(e,t){return e.line-t.line||e.ch-t.ch}
  function rt (line 1) | function rt(e,t){return e.sticky==t.sticky&&0==tt(e,t)}
  function nt (line 1) | function nt(e){return et(e.line,e.ch)}
  function it (line 1) | function it(e,t){return tt(e,t)<0?t:e}
  function ot (line 1) | function ot(e,t){return tt(e,t)<0?e:t}
  function lt (line 1) | function lt(e,t){return Math.max(e.first,Math.min(t,e.first+e.size-1))}
  function st (line 1) | function st(e,t){if(t.line<e.first)return et(e.first,0);var r=e.first+e....
  function at (line 1) | function at(e,t){for(var r=[],n=0;n<t.length;n++)r[n]=st(e,t[n]);return r}
  function ht (line 1) | function ht(e,t,r,n){var i=[e.state.modeGen],o={};wt(e,t.text,e.doc.mode...
  function ft (line 1) | function ft(e,t,r){if(!t.styles||t.styles[0]!=e.state.modeGen){var n=dt(...
  function dt (line 1) | function dt(e,t,r){var n=e.doc,i=e.display;if(!n.mode.startState)return ...
  function pt (line 1) | function pt(e,t,r,n){var i=e.doc.mode,o=new je(t,e.options.tabSize,r);fo...
  function gt (line 1) | function gt(e,t){if(e.blankLine)return e.blankLine(t);if(e.innerMode){va...
  function vt (line 1) | function vt(e,t,r,n){for(var i=0;i<10;i++){n&&(n[0]=Ve(e,r).mode);var o=...
  function yt (line 1) | function yt(e,t,r,n){var i,o,l=e.doc,s=l.mode,a=Xe(l,(t=st(l,t)).line),u...
  function bt (line 1) | function bt(e,t){if(e)for(;;){var r=e.match(/(?:^|\s+)line-(background-)...
  function wt (line 1) | function wt(e,t,r,n,i,o,l){var s=r.flattenSpans;null==s&&(s=e.options.fl...
  function St (line 1) | function St(e,t,r){this.marker=e,this.from=t,this.to=r}
  function Lt (line 1) | function Lt(e,t){if(e)for(var r=0;r<e.length;++r){var n=e[r];if(n.marker...
  function kt (line 1) | function kt(e,t){for(var r,n=0;n<e.length;++n)e[n]!=t&&(r||(r=[])).push(...
  function Tt (line 1) | function Tt(e,t){if(t.full)return null;var r=Qe(e,t.from.line)&&Xe(e,t.f...
  function Mt (line 1) | function Mt(e){for(var t=0;t<e.length;++t){var r=e[t];null!=r.from&&r.fr...
  function Nt (line 1) | function Nt(e){var t=e.markedSpans;if(t){for(var r=0;r<t.length;++r)t[r]...
  function Ot (line 1) | function Ot(e,t){if(t){for(var r=0;r<t.length;++r)t[r].marker.attachLine...
  function At (line 1) | function At(e){return e.inclusiveLeft?-1:0}
  function Dt (line 1) | function Dt(e){return e.inclusiveRight?1:0}
  function Wt (line 1) | function Wt(e,t){var r=e.lines.length-t.lines.length;if(0!=r)return r;va...
  function Ht (line 1) | function Ht(e,t){var r,n=Ct&&e.markedSpans;if(n)for(var i=void 0,o=0;o<n...
  function Ft (line 1) | function Ft(e){return Ht(e,!0)}
  function Pt (line 1) | function Pt(e){return Ht(e,!1)}
  function Et (line 1) | function Et(e,t){var r,n=Ct&&e.markedSpans;if(n)for(var i=0;i<n.length;+...
  function It (line 1) | function It(e,t,r,n,i){var o=Xe(e,t),l=Ct&&o.markedSpans;if(l)for(var s=...
  function zt (line 1) | function zt(e){for(var t;t=Ft(e);)e=t.find(-1,!0).line;return e}
  function Rt (line 1) | function Rt(e,t){var r=Xe(e,t),n=zt(r);return r==n?t:qe(n)}
  function Bt (line 1) | function Bt(e,t){if(t>e.lastLine())return t;var r,n=Xe(e,t);if(!Gt(e,n))...
  function Gt (line 1) | function Gt(e,t){var r=Ct&&t.markedSpans;if(r)for(var n=void 0,i=0;i<r.l...
  function Ut (line 1) | function Ut(e,t,r){if(null==r.to){var n=r.marker.find(1,!0);return Ut(e,...
  function Vt (line 1) | function Vt(e){for(var t=0,r=(e=zt(e)).parent,n=0;n<r.lines.length;++n){...
  function Kt (line 1) | function Kt(e){if(0==e.height)return 0;for(var t,r=e.text.length,n=e;t=F...
  function jt (line 1) | function jt(e){var t=e.display,r=e.doc;t.maxLine=Xe(r,r.first),t.maxLine...
  function Yt (line 1) | function Yt(e){e.parent=null,Nt(e)}
  function qt (line 1) | function qt(e,t){if(!e||/^\s*$/.test(e))return null;var r=t.addModeClass...
  function Zt (line 1) | function Zt(e,t){var r=A("span",null,null,a?"padding-right: .1px":null),...
  function Qt (line 1) | function Qt(e){var t=O("span","•","cm-invalidchar");return t.title="\\u"...
  function Jt (line 1) | function Jt(e,t,r,n,i,o,a){if(t){var u,c=e.splitSpaces?function(e,t){if(...
  function er (line 1) | function er(e,t){return function(r,n,i,o,l,s,a){i=i?i+" cm-force-border"...
  function tr (line 1) | function tr(e,t,r,n){var i=!n&&r.widgetNode;i&&e.map.push(e.pos,e.pos+t,...
  function rr (line 1) | function rr(e,t,r){var n=e.markedSpans,i=e.text,o=0;if(n)for(var l,s,a,u...
  function nr (line 1) | function nr(e,t,r){this.line=t,this.rest=function(e){for(var t,r;t=Pt(e)...
  function ir (line 1) | function ir(e,t,r){for(var n,i=[],o=t;o<r;o=n){var l=new nr(e.doc,Xe(e.d...
  function sr (line 1) | function sr(e,t){var r=de(e,t);if(r.length){var n,i=Array.prototype.slic...
  function ar (line 1) | function ar(){var e=lr;lr=null;for(var t=0;t<e.length;++t)e[t]()}
  function ur (line 1) | function ur(e,t,r,n){for(var i=0;i<t.changes.length;i++){var o=t.changes...
  function cr (line 1) | function cr(e){return e.node==e.text&&(e.node=O("div",null,null,"positio...
  function hr (line 1) | function hr(e,t){var r=e.display.externalMeasured;return r&&r.line==t.li...
  function fr (line 1) | function fr(e,t){var r=t.text.className,n=hr(e,t);t.text==t.node&&(t.nod...
  function dr (line 1) | function dr(e,t){!function(e,t){var r=t.bgClass?t.bgClass+" "+(t.line.bg...
  function pr (line 1) | function pr(e,t,r,n){if(t.gutter&&(t.node.removeChild(t.gutter),t.gutter...
  function gr (line 1) | function gr(e,t,r){t.alignable&&(t.alignable=null);for(var n=t.node.firs...
  function vr (line 1) | function vr(e,t,r,n){var i=hr(e,t);return t.text=t.node=i.pre,i.bgClass&...
  function mr (line 1) | function mr(e,t,r){if(yr(e,t.line,t,r,!0),t.rest)for(var n=0;n<t.rest.le...
  function yr (line 1) | function yr(e,t,r,n,i){if(t.widgets)for(var o=cr(r),l=0,s=t.widgets;l<s....
  function br (line 1) | function br(e,t,r,n){if(e.noHScroll){(r.alignable||(r.alignable=[])).pus...
  function wr (line 1) | function wr(e){if(null!=e.height)return e.height;var t=e.doc.cm;if(!t)re...
  function xr (line 1) | function xr(e,t){for(var r=Le(t);r!=e.wrapper;r=r.parentNode)if(!r||1==r...
  function Cr (line 1) | function Cr(e){return e.lineSpace.offsetTop}
  function Sr (line 1) | function Sr(e){return e.mover.offsetHeight-e.lineSpace.offsetHeight}
  function Lr (line 1) | function Lr(e){if(e.cachedPaddingH)return e.cachedPaddingH;var t=N(e.mea...
  function kr (line 1) | function kr(e){return G-e.display.nativeBarWidth}
  function Tr (line 1) | function Tr(e){return e.display.scroller.clientWidth-kr(e)-e.display.bar...
  function Mr (line 1) | function Mr(e){return e.display.scroller.clientHeight-kr(e)-e.display.ba...
  function Nr (line 1) | function Nr(e,t,r){if(e.line==t)return{map:e.measure.map,cache:e.measure...
  function Or (line 1) | function Or(e,t,r,n){return Wr(e,Dr(e,t),r,n)}
  function Ar (line 1) | function Ar(e,t){if(t>=e.display.viewFrom&&t<e.display.viewTo)return e.d...
  function Dr (line 1) | function Dr(e,t){var r=qe(t),n=Ar(e,r);n&&!n.text?n=null:n&&n.changes&&(...
  function Wr (line 1) | function Wr(e,t,r,n,i){t.before&&(r=-1);var o,a=r+(n||"");return t.cache...
  function Pr (line 1) | function Pr(e,t,r){for(var n,i,o,l,s,a,u=0;u<e.length;u+=3)if(s=e[u],a=e...
  function Er (line 1) | function Er(e,t){var r=Fr;if("left"==t)for(var n=0;n<e.length&&(r=e[n])....
  function Ir (line 1) | function Ir(e){if(e.measure&&(e.measure.cache={},e.measure.heights=null,...
  function zr (line 1) | function zr(e){e.display.externalMeasure=null,M(e.display.lineMeasure);f...
  function Rr (line 1) | function Rr(e){zr(e),e.display.cachedCharWidth=e.display.cachedTextHeigh...
  function Br (line 1) | function Br(){return c&&v?-(document.body.getBoundingClientRect().left-p...
  function Gr (line 1) | function Gr(){return c&&v?-(document.body.getBoundingClientRect().top-pa...
  function Ur (line 1) | function Ur(e){var t=0;if(e.widgets)for(var r=0;r<e.widgets.length;++r)e...
  function Vr (line 1) | function Vr(e,t,r,n,i){if(!i){var o=Ur(t);r.top+=o,r.bottom+=o}if("line"...
  function Kr (line 1) | function Kr(e,t,r){if("div"==r)return t;var n=t.left,i=t.top;if("page"==...
  function jr (line 1) | function jr(e,t,r,n,i){return n||(n=Xe(e.doc,t.line)),Vr(e,n,Or(e,n,t.ch...
  function Xr (line 1) | function Xr(e,t,r,n,i,o){function l(t,l){var s=Wr(e,i,t,l?"right":"left"...
  function Yr (line 1) | function Yr(e,t){var r=0;t=st(e.doc,t),e.options.lineWrapping||(r=tn(e.d...
  function _r (line 1) | function _r(e,t,r,n,i){var o=et(e,t,r);return o.xRel=i,n&&(o.outside=n),o}
  function $r (line 1) | function $r(e,t,r){var n=e.doc;if((r+=e.display.viewOffset)<0)return _r(...
  function qr (line 1) | function qr(e,t,r,n){n-=Ur(t);var i=t.text.length,o=le(function(t){retur...
  function Zr (line 1) | function Zr(e,t,r,n){return r||(r=Dr(e,t)),qr(e,t,r,Vr(e,t,Wr(e,r,n),"li...
  function Qr (line 1) | function Qr(e,t,r,n){return!(e.bottom<=r)&&(e.top>r||(n?e.left:e.right)>t)}
  function Jr (line 1) | function Jr(e,t,r,n,i){i-=Vt(t);var o=Dr(e,t),l=Ur(t),s=0,a=t.text.lengt...
  function en (line 1) | function en(e){if(null!=e.cachedTextHeight)return e.cachedTextHeight;if(...
  function tn (line 1) | function tn(e){if(null!=e.cachedCharWidth)return e.cachedCharWidth;var t...
  function rn (line 1) | function rn(e){for(var t=e.display,r={},n={},i=t.gutters.clientLeft,o=t....
  function nn (line 1) | function nn(e){return e.scroller.getBoundingClientRect().left-e.sizer.ge...
  function on (line 1) | function on(e){var t=en(e.display),r=e.options.lineWrapping,n=r&&Math.ma...
  function ln (line 1) | function ln(e){var t=e.doc,r=on(e);t.iter(function(e){var t=r(e);t!=e.he...
  function sn (line 1) | function sn(e,t,r,n){var i=e.display;if(!r&&"true"==Le(t).getAttribute("...
  function an (line 1) | function an(e,t){if(t>=e.display.viewTo)return null;if((t-=e.display.vie...
  function un (line 1) | function un(e,t,r,n){null==t&&(t=e.doc.first),null==r&&(r=e.doc.first+e....
  function cn (line 1) | function cn(e,t,r){e.curOp.viewChanged=!0;var n=e.display,i=e.display.ex...
  function hn (line 1) | function hn(e){e.display.viewFrom=e.display.viewTo=e.doc.first,e.display...
  function fn (line 1) | function fn(e,t,r,n){var i,o=an(e,t),l=e.display.view;if(!Ct||r==e.doc.f...
  function dn (line 1) | function dn(e){for(var t=e.display.view,r=0,n=0;n<t.length;n++){var i=t[...
  function pn (line 1) | function pn(e){e.display.input.showSelection(e.display.input.prepareSele...
  function gn (line 1) | function gn(e,t){void 0===t&&(t=!0);for(var r=e.doc,n={},i=n.cursors=doc...
  function vn (line 1) | function vn(e,t,r){var n=Xr(e,t,"div",null,null,!e.options.singleCursorH...
  function mn (line 1) | function mn(e,t){return e.top-t.top||e.left-t.left}
  function yn (line 1) | function yn(e,t,r){var n=e.display,i=e.doc,o=document.createDocumentFrag...
  function bn (line 1) | function bn(e){if(e.state.focused){var t=e.display;clearInterval(t.blink...
  function wn (line 1) | function wn(e){e.state.focused||(e.display.input.focus(),Cn(e))}
  function xn (line 1) | function xn(e){e.state.delayingBlurEvent=!0,setTimeout(function(){e.stat...
  function Cn (line 1) | function Cn(e,t){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!...
  function Sn (line 1) | function Sn(e,t){e.state.delayingBlurEvent||(e.state.focused&&(ge(e,"blu...
  function Ln (line 1) | function Ln(e){for(var t=e.display,r=t.lineDiv.offsetTop,n=0;n<t.view.le...
  function kn (line 1) | function kn(e){if(e.widgets)for(var t=0;t<e.widgets.length;++t){var r=e....
  function Tn (line 1) | function Tn(e,t,r){var n=r&&null!=r.top?Math.max(0,r.top):e.scroller.scr...
  function Mn (line 1) | function Mn(e,t){var r=e.display,n=en(e.display);t.top<0&&(t.top=0);var ...
  function Nn (line 1) | function Nn(e,t){null!=t&&(Dn(e),e.curOp.scrollTop=(null==e.curOp.scroll...
  function On (line 1) | function On(e){Dn(e);var t=e.getCursor();e.curOp.scrollToPos={from:t,to:...
  function An (line 1) | function An(e,t,r){null==t&&null==r||Dn(e),null!=t&&(e.curOp.scrollLeft=...
  function Dn (line 1) | function Dn(e){var t=e.curOp.scrollToPos;t&&(e.curOp.scrollToPos=null,Wn...
  function Wn (line 1) | function Wn(e,t,r,n){var i=Mn(e,{left:Math.min(t.left,r.left),top:Math.m...
  function Hn (line 1) | function Hn(e,t){Math.abs(e.doc.scrollTop-t)<2||(r||oi(e,{top:t}),Fn(e,t...
  function Fn (line 1) | function Fn(e,t,r){t=Math.min(e.display.scroller.scrollHeight-e.display....
  function Pn (line 1) | function Pn(e,t,r,n){t=Math.min(t,e.display.scroller.scrollWidth-e.displ...
  function En (line 1) | function En(e){var t=e.display,r=t.gutters.offsetWidth,n=Math.round(e.do...
  function Rn (line 1) | function Rn(e,t){t||(t=En(e));var r=e.display.barWidth,n=e.display.barHe...
  function Bn (line 1) | function Bn(e,t){var r=e.display,n=r.scrollbars.update(t);r.sizer.style....
  function Un (line 1) | function Un(e){e.display.scrollbars&&(e.display.scrollbars.clear(),e.dis...
  function Kn (line 1) | function Kn(e){var t;e.curOp={cm:e,viewChanged:!1,startHeight:e.doc.heig...
  function jn (line 1) | function jn(e){var t=e.curOp;t&&function(e,t){var r=e.ownsGroup;if(r)try...
  function Xn (line 1) | function Xn(e){var t=e.cm,r=t.display;!function(e){var t=e.display;!t.sc...
  function Yn (line 1) | function Yn(e){var t=e.cm,r=t.display;e.updatedDisplay&&Ln(t),e.barMeasu...
  function _n (line 1) | function _n(e){var t=e.cm;null!=e.adjustWidthTo&&(t.display.sizer.style....
  function $n (line 1) | function $n(e){var t=e.cm,r=t.display,n=t.doc;(e.updatedDisplay&&ii(t,e....
  function qn (line 1) | function qn(e,t){if(e.curOp)return t();Kn(e);try{return t()}finally{jn(e)}}
  function Zn (line 1) | function Zn(e,t){return function(){if(e.curOp)return t.apply(e,arguments...
  function Qn (line 1) | function Qn(e){return function(){if(this.curOp)return e.apply(this,argum...
  function Jn (line 1) | function Jn(e){return function(){var t=this.cm;if(!t||t.curOp)return e.a...
  function ei (line 1) | function ei(e,t){e.doc.highlightFrontier<e.display.viewTo&&e.state.highl...
  function ti (line 1) | function ti(e){var t=e.doc;if(!(t.highlightFrontier>=e.display.viewTo)){...
  function ni (line 1) | function ni(e,t){var r=e.display,n=e.doc;if(t.editorIsHidden)return hn(e...
  function ii (line 1) | function ii(e,t){for(var r=t.viewport,n=!0;(n&&e.options.lineWrapping&&t...
  function oi (line 1) | function oi(e,t){var r=new ri(e,t);if(ni(e,r)){Ln(e),ii(e,r);var n=En(e)...
  function li (line 1) | function li(e){var t=e.gutters.offsetWidth;e.sizer.style.marginLeft=t+"px"}
  function si (line 1) | function si(e,t){e.display.sizer.style.minHeight=t.docHeight+"px",e.disp...
  function ai (line 1) | function ai(e){var t=e.display,r=t.view;if(t.alignWidgets||t.gutters.fir...
  function ui (line 1) | function ui(e){if(!e.options.lineNumbers)return!1;var t=e.doc,r=Je(e.opt...
  function ci (line 1) | function ci(e,t){for(var r=[],n=!1,i=0;i<e.length;i++){var o=e[i],l=null...
  function hi (line 1) | function hi(e){var t=e.gutters,r=e.gutterSpecs;M(t),e.lineGutter=null;fo...
  function fi (line 1) | function fi(e){hi(e.display),un(e),ai(e)}
  function gi (line 1) | function gi(e){var t=e.wheelDeltaX,r=e.wheelDeltaY;return null==t&&e.det...
  function vi (line 1) | function vi(e){var t=gi(e);return t.x*=pi,t.y*=pi,t}
  function mi (line 1) | function mi(e,t){var n=gi(t),i=n.x,o=n.y,l=e.display,s=l.scroller,u=s.sc...
  function wi (line 1) | function wi(e,t,r){var n=e&&e.options.selectionsMayTouch,i=t[r];t.sort(f...
  function xi (line 1) | function xi(e,t){return new yi([new bi(e,t||e)],0)}
  function Ci (line 1) | function Ci(e){return e.text?et(e.from.line+e.text.length-1,$(e.text).le...
  function Si (line 1) | function Si(e,t){if(tt(e,t.from)<0)return e;if(tt(e,t.to)<=0)return Ci(t...
  function Li (line 1) | function Li(e,t){for(var r=[],n=0;n<e.sel.ranges.length;n++){var i=e.sel...
  function ki (line 1) | function ki(e,t,r){return e.line==t.line?et(r.line,e.ch-t.ch+r.ch):et(r....
  function Ti (line 1) | function Ti(e){e.doc.mode=Re(e.options,e.doc.modeOption),Mi(e)}
  function Mi (line 1) | function Mi(e){e.doc.iter(function(e){e.stateAfter&&(e.stateAfter=null),...
  function Ni (line 1) | function Ni(e,t){return 0==t.from.ch&&0==t.to.ch&&""==$(t.text)&&(!e.cm|...
  function Oi (line 1) | function Oi(e,t,r,n){function i(e){return r?r[e]:null}function o(e,r,i){...
  function Ai (line 1) | function Ai(e,t,r){!function e(n,i,o){if(n.linked)for(var l=0;l<n.linked...
  function Di (line 1) | function Di(e,t){if(t.cm)throw new Error("This document is already in us...
  function Wi (line 1) | function Wi(e){("rtl"==e.doc.direction?H:T)(e.display.lineDiv,"CodeMirro...
  function Hi (line 1) | function Hi(e){this.done=[],this.undone=[],this.undoDepth=1/0,this.lastM...
  function Fi (line 1) | function Fi(e,t){var r={from:nt(t.from),to:Ci(t),text:Ye(e,t.from,t.to)}...
  function Pi (line 1) | function Pi(e){for(;e.length;){if(!$(e).ranges)break;e.pop()}}
  function Ei (line 1) | function Ei(e,t,r,n){var i=e.history;i.undone.length=0;var o,l,s=+new Da...
  function Ii (line 1) | function Ii(e,t,r,n){var i=e.history,o=n&&n.origin;r==i.lastSelOp||o&&i....
  function zi (line 1) | function zi(e,t){var r=$(t);r&&r.ranges&&r.equals(e)||t.push(e)}
  function Ri (line 1) | function Ri(e,t,r,n){var i=t["spans_"+e.id],o=0;e.iter(Math.max(e.first,...
  function Bi (line 1) | function Bi(e){if(!e)return null;for(var t,r=0;r<e.length;++r)e[r].marke...
  function Gi (line 1) | function Gi(e,t){var r=function(e,t){var r=t["spans_"+e.id];if(!r)return...
  function Ui (line 1) | function Ui(e,t,r){for(var n=[],i=0;i<e.length;++i){var o=e[i];if(o.rang...
  function Vi (line 1) | function Vi(e,t,r,n){if(n){var i=e.anchor;if(r){var o=tt(t,i)<0;o!=tt(r,...
  function Ki (line 1) | function Ki(e,t,r,n,i){null==i&&(i=e.cm&&(e.cm.display.shift||e.extend))...
  function ji (line 1) | function ji(e,t,r){for(var n=[],i=e.cm&&(e.cm.display.shift||e.extend),o...
  function Xi (line 1) | function Xi(e,t,r,n){var i=e.sel.ranges.slice(0);i[t]=r,$i(e,wi(e.cm,i,e...
  function Yi (line 1) | function Yi(e,t,r,n){$i(e,xi(t,r),n)}
  function _i (line 1) | function _i(e,t,r){var n=e.history.done,i=$(n);i&&i.ranges?(n[n.length-1...
  function $i (line 1) | function $i(e,t,r){qi(e,t,r),Ii(e,e.sel,e.cm?e.cm.curOp.id:NaN,r)}
  function qi (line 1) | function qi(e,t,r){(ye(e,"beforeSelectionChange")||e.cm&&ye(e.cm,"before...
  function Zi (line 1) | function Zi(e,t){t.equals(e.sel)||(e.sel=t,e.cm&&(e.cm.curOp.updateInput...
  function Qi (line 1) | function Qi(e){Zi(e,Ji(e,e.sel,null,!1))}
  function Ji (line 1) | function Ji(e,t,r,n){for(var i,o=0;o<t.ranges.length;o++){var l=t.ranges...
  function eo (line 1) | function eo(e,t,r,n,i){var o=Xe(e,t.line);if(o.markedSpans)for(var l=0;l...
  function to (line 1) | 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)||e...
  function ro (line 1) | function ro(e,t,r,n){return r<0&&0==t.ch?t.line>e.first?st(e,et(t.line-1...
  function no (line 1) | function no(e){e.setSelection(et(e.firstLine(),0),et(e.lastLine()),V)}
  function io (line 1) | function io(e,t,r){var n={canceled:!1,from:t.from,to:t.to,text:t.text,or...
  function oo (line 1) | function oo(e,t,r){if(e.cm){if(!e.cm.curOp)return Zn(e.cm,oo)(e,t,r);if(...
  function lo (line 1) | function lo(e,t){if(1!=t.text.length||""!=t.text[0]||0!=tt(t.from,t.to))...
  function so (line 1) | function so(e,t,r){var n=e.cm&&e.cm.state.suppressEdits;if(!n||r){for(va...
  function ao (line 1) | function ao(e,t){if(0!=t&&(e.first+=t,e.sel=new yi(q(e.sel.ranges,functi...
  function uo (line 1) | function uo(e,t,r,n){if(e.cm&&!e.cm.curOp)return Zn(e.cm,uo)(e,t,r,n);if...
  function co (line 1) | function co(e,t,r,n,i){var o;n||(n=r),tt(n,r)<0&&(r=(o=[n,r])[0],n=o[1])...
  function ho (line 1) | function ho(e,t,r,n){r<e.line?e.line+=n:t<e.line&&(e.line=t,e.ch=0)}
  function fo (line 1) | function fo(e,t,r,n){for(var i=0;i<e.length;++i){var o=e[i],l=!0;if(o.ra...
  function po (line 1) | function po(e,t){var r=t.from.line,n=t.to.line,i=t.text.length-(n-r)-1;f...
  function go (line 1) | function go(e,t,r,n){var i=t,o=t;return"number"==typeof t?o=Xe(e,lt(e,t)...
  function vo (line 1) | function vo(e){this.lines=e,this.parent=null;for(var t=0,r=0;r<e.length;...
  function mo (line 1) | function mo(e){this.children=e;for(var t=0,r=0,n=0;n<e.length;++n){var i...
  function bo (line 1) | function bo(e,t,r){Vt(t)<(e.curOp&&e.curOp.scrollTop||e.doc.scrollTop)&&...
  function Co (line 1) | function Co(e,t,r,n,i){if(n&&n.shared)return function(e,t,r,n,i){(n=I(n)...
  function Lo (line 1) | function Lo(e){return e.findMarks(et(e.first,0),e.clipPos(et(e.lastLine(...
  function ko (line 1) | function ko(e){for(var t=function(t){var r=e[t],n=[r.primary.doc];Ai(r.p...
  function Oo (line 1) | function Oo(e){var t=this;if(Ao(t),!ve(t,e)&&!xr(t.display,e)){we(e),l&&...
  function Ao (line 1) | function Ao(e){e.display.dragCursor&&(e.display.lineSpace.removeChild(e....
  function Do (line 1) | function Do(e){if(document.getElementsByClassName){for(var t=document.ge...
  function Ho (line 1) | function Ho(){var e;Wo||(fe(window,"resize",function(){null==e&&(e=setTi...
  function Fo (line 1) | function Fo(e){var t=e.display;t.cachedCharWidth=t.cachedTextHeight=t.ca...
  function Bo (line 1) | function Bo(e){var t,r,n,i,o=e.split(/-(?!$)/);e=o[o.length-1];for(var l...
  function Go (line 1) | function Go(e){var t={};for(var r in e)if(e.hasOwnProperty(r)){var n=e[r...
  function Uo (line 1) | function Uo(e,t,r,n){var i=(t=Xo(t)).call?t.call(e,n):t[e];if(!1===i)ret...
  function Vo (line 1) | function Vo(e){var t="string"==typeof e?e:Po[e.keyCode];return"Ctrl"==t|...
  function Ko (line 1) | function Ko(e,t,r){var n=e;return t.altKey&&"Alt"!=n&&(e="Alt-"+e),(C?t....
  function jo (line 1) | function jo(e,t){if(h&&34==e.keyCode&&e.char)return!1;var r=Po[e.keyCode...
  function Xo (line 1) | function Xo(e){return"string"==typeof e?Ro[e]:e}
  function Yo (line 1) | function Yo(e,t){for(var r=e.doc.sel.ranges,n=[],i=0;i<r.length;i++){for...
  function _o (line 1) | function _o(e,t,r){var n=oe(e.text,t+r,r);return n<0||n>e.text.length?nu...
  function $o (line 1) | function $o(e,t,r){var n=_o(e,t.ch,r);return null==n?null:new et(t.line,...
  function qo (line 1) | function qo(e,t,r,n,i){if(e){var o=ce(r,t.doc.direction);if(o){var l,s=i...
  function Qo (line 1) | function Qo(e,t){var r=Xe(e.doc,t),n=zt(r);return n!=r&&(t=qe(n)),qo(!0,...
  function Jo (line 1) | function Jo(e,t){var r=Qo(e,t.line),n=Xe(e.doc,r.line),i=ce(n,e.doc.dire...
  function el (line 1) | function el(e,t,r){if("string"==typeof t&&!(t=Zo[t]))return!1;e.display....
  function rl (line 1) | function rl(e,t,r,n){var i=e.state.keySeq;if(i){if(Vo(t))return"handled"...
  function nl (line 1) | function nl(e,t,r,n){var i=function(e,t,r){for(var n=0;n<e.state.keyMaps...
  function il (line 1) | function il(e,t){var r=jo(t,!0);return!!r&&(t.shiftKey&&!e.state.keySeq?...
  function ll (line 1) | function ll(e){var t=this;if(t.curOp.focus=W(),!ve(t,e)){l&&s<11&&27==e....
  function sl (line 1) | function sl(e){16==e.keyCode&&(this.doc.sel.shift=!1),ve(this,e)}
  function al (line 1) | function al(e){var t=this;if(!(xr(t.display,e)||ve(t,e)||e.ctrlKey&&!e.a...
  function fl (line 1) | function fl(e){var t=this,r=t.display;if(!(ve(t,e)||r.activeTouch&&r.inp...
  function dl (line 1) | function dl(e,t,r){if("char"==r)return new bi(t,t);if("word"==r)return e...
  function pl (line 1) | function pl(e,t,r,n){var i,o;if(t.touches)i=t.touches[0].clientX,o=t.tou...
  function gl (line 1) | function gl(e,t){return pl(e,t,"gutterClick",!0)}
  function vl (line 1) | function vl(e,t){xr(e.display,t)||function(e,t){if(!ye(e,"gutterContextM...
  function ml (line 1) | function ml(e){e.display.wrapper.className=e.display.wrapper.className.r...
  function xl (line 1) | function xl(e,t,r){if(!t!=!(r&&r!=yl)){var n=e.display.dragFunctions,i=t...
  function Cl (line 1) | function Cl(e){e.options.lineWrapping?(H(e.display.wrapper,"CodeMirror-w...
  function Sl (line 1) | function Sl(e,t){var n=this;if(!(this instanceof Sl))return new Sl(e,t);...
  function kl (line 1) | function kl(e,t,r,n){var i,o=e.doc;null==r&&(r="add"),"smart"==r&&(o.mod...
  function Ml (line 1) | function Ml(e){Tl=e}
  function Nl (line 1) | function Nl(e,t,r,n,i){var o=e.doc;e.display.shift=!1,n||(n=o.sel);var l...
  function Ol (line 1) | function Ol(e,t){var r=e.clipboardData&&e.clipboardData.getData("Text");...
  function Al (line 1) | function Al(e,t){if(e.options.electricChars&&e.options.smartIndent)for(v...
  function Dl (line 1) | function Dl(e){for(var t=[],r=[],n=0;n<e.doc.sel.ranges.length;n++){var ...
  function Wl (line 1) | function Wl(e,t,r,n){e.setAttribute("autocorrect",r?"":"off"),e.setAttri...
  function Hl (line 1) | function Hl(){var e=O("textarea",null,null,"position: absolute; bottom: ...
  function Fl (line 1) | function Fl(e,t,r,n,i){var o=t,l=r,s=Xe(e,t.line);function a(n){var o,l;...
  function Pl (line 1) | function Pl(e,t,r,n){var i,o,l=e.doc,s=t.left;if("page"==n){var a=Math.m...
  function Il (line 1) | function Il(e,t){var r=Ar(e,t.line);if(!r||r.hidden)return null;var n=Xe...
  function zl (line 1) | function zl(e,t){return t&&(e.bad=!0),e}
  function Rl (line 1) | function Rl(e,t,r){var n;if(t==e.display.lineDiv){if(!(n=e.display.lineD...
  function Bl (line 1) | function Bl(e,t,r){var n=e.text.firstChild,i=!1;if(!t||!D(n,t))return zl...
  function o (line 1) | function o(e){if(!ve(n,e)){if(n.somethingSelected())Ml({lineWise:!1,text...
  function u (line 1) | function u(){l&&(o+=s,a&&(o+=s),l=a=!1)}
  function c (line 1) | function c(e){e&&(u(),o+=e)}
  function h (line 1) | function h(t){if(1==t.nodeType){var r=t.getAttribute("cm-text");if(r)ret...
  function o (line 1) | function o(e){if(!ve(n,e)){if(n.somethingSelected())Ml({lineWise:!1,text...
  function v (line 1) | function v(){if(null!=i.selectionStart){var e=r.somethingSelected(),o="​...
  function m (line 1) | function m(){if(t.contextMenuPending==m&&(t.contextMenuPending=!1,t.wrap...
  function r (line 1) | function r(r,n,i,o){e.defaults[r]=n,i&&(t[r]=o?function(e,t,r){r!=yl&&i(...
  function n (line 1) | function n(){e.value=s.getValue()}

FILE: luci-app-ddns-go/luci-app-ddns-go/htdocs/luci-static/resources/view/ddns-go/config.js
  function checkProcess (line 32) | async function checkProcess() {
  function getVersionInfo (line 55) | function getVersionInfo() {
  function checkUpdateStatus (line 64) | function checkUpdateStatus() {
  function extractPortNumber (line 72) | function extractPortNumber(portValue) {
  function renderStatus (line 81) | function renderStatus(isRunning, listen_port, noweb, version) {
  function renderUpdateStatus (line 100) | function renderUpdateStatus(updateInfo) {

FILE: luci-app-ddns-go/luci-app-ddns-go/htdocs/luci-static/resources/view/ddns-go/log.js
  function extractDDNSGoMessage (line 69) | function extractDDNSGoMessage(line) {
  function formatLogLine (line 99) | function formatLogLine(line) {
  function formatLogContent (line 122) | function formatLogContent(logContent) {
  function clearLogs (line 149) | function clearLogs(button) {
  function fetchLogs (line 170) | function fetchLogs() {

FILE: luci-app-ddnsto/root/www/luci-static/ddnsto/index.js
  function d (line 1) | function d(T){const L={};return T.integrity&&(L.integrity=T.integrity),T...
  function U (line 1) | function U(T){if(T.ep)return;T.ep=!0;const L=d(T);fetch(T.href,L)}
  function Vd (line 1) | function Vd(y){return y&&y.__esModule&&Object.prototype.hasOwnProperty.c...
  function Wd (line 9) | function Wd(){if(Iu)return J;Iu=1;var y=Symbol.for("react.element"),E=Sy...
  function Ai (line 9) | function Ai(){return Mu||(Mu=1,Oi.exports=Wd()),Oi.exports}
  function Bd (line 17) | function Bd(){if(Ou)return Nr;Ou=1;var y=Ai(),E=Symbol.for("react.elemen...
  function Qd (line 17) | function Qd(){return Du||(Du=1,Mi.exports=Bd()),Mi.exports}
  function Yd (line 25) | function Yd(){return Fu||(Fu=1,(function(y){function E(x,I){var g=x.leng...
  function Xd (line 25) | function Xd(){return bu||(bu=1,Fi.exports=Yd()),Fi.exports}
  function Gd (line 33) | function Gd(){if(Uu)return Je;Uu=1;var y=Ai(),E=Xd();function d(e){for(v...
  function Zd (line 40) | function Zd(){if(Au)return Di.exports;Au=1;function y(){if(!(typeof __RE...
  function Jd (line 40) | function Jd(){if($u)return Fl;$u=1;var y=Zd();return Fl.createRoot=y.cre...
  function yf (line 100) | function yf(){return m.jsx("div",{className:"bg-white rounded-lg border ...
  function wf (line 100) | function wf({isRunning:y,isConfigured:E,hostname:d,address:U,deviceId:T,...
  function Qu (line 100) | function Qu({checked:y,onChange:E,label:d,id:U,disabled:T,containerClass...
  function kf (line 100) | function kf({onSave:y,isInTab:E,token:d,enabled:U,advancedConfig:T,onReg...
  function xf (line 100) | function xf({token:y,enabled:E,advancedConfig:d,onSave:U,isInTab:T,onReg...
  function Sf (line 100) | function Sf({ddnstoToken:y,ddnstoEnabled:E,advancedConfig:d,onSave:U,sav...
  function _f (line 100) | function _f({apiBase:y,csrfToken:E,deviceId:d,onboardingBase:U,onComplet...
  function Ef (line 100) | function Ef({config:y}){const[E,d]=C.useState(!1),[U,T]=C.useState(!1),[...

FILE: luci-app-fileassistant/htdocs/luci-static/resources/fileassistant/fb.js
  function removePath (line 19) | function removePath(filename, isdir) {
  function installPath (line 35) | function installPath(filename, isdir) {
  function isIPK (line 63) | function isIPK(filename) {
  function renamePath (line 73) | function renamePath(filename) {
  function chmodPath (line 94) | function chmodPath(filename, isdir) {
  function chownPath (line 111) | function chownPath(filename) {
  function openpath (line 128) | function openpath(filename, dirname) {
  function getFileElem (line 135) | function getFileElem(elem) {
  function concatPath (line 144) | function concatPath(path, filename) {
  function handleClick (line 153) | function handleClick(evt) {
  function refresh_list (line 199) | function refresh_list(filenames, path) {
  function update_list (line 259) | function update_list(path, opt) {

FILE: luci-app-filebrowser/htdocs/luci-static/resources/view/filebrowser.js
  function getServiceStatus (line 15) | function getServiceStatus() {
  function renderStatus (line 25) | function renderStatus(isRunning, port) {

FILE: luci-app-gost/htdocs/luci-static/resources/view/gost.js
  function getServiceStatus (line 19) | function getServiceStatus() {
  function renderStatus (line 29) | function renderStatus(isRunning) {

FILE: luci-app-homeproxy/htdocs/luci-static/resources/homeproxy.js
  method calcStringMD5 (line 89) | calcStringMD5(e) {
  method decodeBase64Str (line 163) | decodeBase64Str(str) {
  method getBuiltinFeatures (line 178) | getBuiltinFeatures() {
  method generateRand (line 188) | generateRand(type, length) {
  method loadDefaultLabel (line 210) | loadDefaultLabel(uciconfig, ucisection) {
  method loadModalTitle (line 220) | loadModalTitle(title, addtitle, uciconfig, ucisection) {
  method renderSectionAdd (line 225) | renderSectionAdd(section, extra_class) {
  method uploadCertificate (line 247) | uploadCertificate(_option, type, filename, ev) {
  method validateBase64Key (line 267) | validateBase64Key(length, section_id, value) {
  method validateCertificatePath (line 276) | validateCertificatePath(section_id, value) {
  method validatePortRange (line 284) | validatePortRange(section_id, value) {
  method validateUniqueValue (line 303) | validateUniqueValue(uciconfig, ucisection, ucioption, section_id, value) {
  method validateUUID (line 323) | validateUUID(section_id, value) {

FILE: luci-app-homeproxy/htdocs/luci-static/resources/view/homeproxy/client.js
  function getServiceStatus (line 41) | function getServiceStatus() {
  function renderStatus (line 51) | function renderStatus(isRunning, version) {
  method apply (line 64) | apply(type, value, args) {
  method assert (line 70) | assert(condition) {
  method load (line 76) | load() {
  method render (line 84) | render(data) {

FILE: luci-app-homeproxy/htdocs/luci-static/resources/view/homeproxy/node.js
  function allowInsecureConfirm (line 17) | function allowInsecureConfirm(ev, _section_id, value) {
  function parseShareLink (line 22) | function parseShareLink(uri, features) {
  function renderNodeSettings (line 391) | function renderNodeSettings(section, data, features, main_node, routing_...
  method load (line 1189) | load() {
  method render (line 1196) | render(data) {

FILE: luci-app-homeproxy/htdocs/luci-static/resources/view/homeproxy/server.js
  method renderWidget (line 28) | renderWidget(/* ... */) {
  function getServiceStatus (line 44) | function getServiceStatus() {
  function renderStatus (line 54) | function renderStatus(isRunning, version) {
  function handleGenKey (line 65) | function handleGenKey(option) {
  method load (line 118) | load() {
  method render (line 125) | render(data) {

FILE: luci-app-homeproxy/htdocs/luci-static/resources/view/homeproxy/status.js
  function getConnStat (line 34) | function getConnStat(o, site) {
  function getResVersion (line 63) | function getResVersion(o, type) {
  function getRuntimeLog (line 116) | function getRuntimeLog(o, name, _option_index, section_id, _in_table) {
  method render (line 227) | render() {

FILE: luci-app-istorex/htdocs/luci-static/istorex/chunk.167c223d.js
  method setup (line 1) | setup(e){const l=e;p(()=>{var o;return((o=l.disk.childrens)==null?void 0...
  method setup (line 1) | setup(e){const l=S(),d=p(()=>l.disk),o=p(()=>l.raid.disks);return(u,c)=>...

FILE: luci-app-istorex/htdocs/luci-static/istorex/chunk.18e0c91d.js
  method setup (line 1) | setup(l){const a=[{name:"disk",title:"\u6211\u7684\u78C1\u76D8",path:"/r...

FILE: luci-app-istorex/htdocs/luci-static/istorex/chunk.211ffb47.js
  function _ (line 1) | function _(d,i){const e=n("router-loading");return r(),t("div",s,[a(e)])}

FILE: luci-app-istorex/htdocs/luci-static/istorex/chunk.2147605f.js
  method setup (line 1) | setup(r){return C(this,null,function*(){let h,d;const k=m(!1),c=m(""),F=...

FILE: luci-app-istorex/htdocs/luci-static/istorex/chunk.25dae49f.js
  method setup (line 1) | setup(s){const t=m(""),u=x({subnetMask:"255.255.255.0",staticDnsIp:"223....

FILE: luci-app-istorex/htdocs/luci-static/istorex/chunk.403244cc.js
  method setup (line 1) | setup(p){const t=l();return(()=>c(this,null,function*(){yield t.getApp()...

FILE: luci-app-istorex/htdocs/luci-static/istorex/chunk.41b74402.js
  function u (line 1) | function u(f,i){const e=r("router-view");return t(),n(a,null,{default:s(...

FILE: luci-app-istorex/htdocs/luci-static/istorex/chunk.42bb6629.js
  function n (line 1) | function n(_,c){return null}

FILE: luci-app-istorex/htdocs/luci-static/istorex/chunk.4d4bc89c.js
  method setup (line 1) | setup(p){return _(this,null,function*(){let d,a;const c=b(!1),n=b(""),o=...

FILE: luci-app-istorex/htdocs/luci-static/istorex/chunk.4f4af73e.js
  method setup (line 1) | setup(c){return r(this,null,function*(){let m,i;const w=I(),t=f(""),n=f(...

FILE: luci-app-istorex/htdocs/luci-static/istorex/chunk.5e41a3f0.js
  function n (line 1) | function n(_,c){return null}

FILE: luci-app-istorex/htdocs/luci-static/istorex/chunk.6d3585bb.js
  function y (line 1) | function y(t,e){if(t.indexOf("::")!==t.lastIndexOf("::"))return null;let...
  function m (line 1) | function m(t,e,n,r){if(t.length!==e.length)throw new Error("ipaddr: cann...
  function I (line 1) | function I(t){if(d.test(t))return parseInt(t,16);if(t[0]==="0"&&!isNaN(p...
  function E (line 1) | function E(t,e){for(;t.length<e;)t=`0${t}`;return t}
  function t (line 1) | function t(e){if(e.length!==4)throw new Error("ipaddr: ipv4 octet count ...
  function t (line 1) | function t(e,n){let r,i;if(e.length===16)for(this.parts=[],r=0;r<=14;r+=...

FILE: luci-app-istorex/htdocs/luci-static/istorex/chunk.6f7d3090.js
  method setup (line 1) | setup(o){return b(this,null,function*(){let u,s;const i=E(""),t=U({lanIp...

FILE: luci-app-istorex/htdocs/luci-static/istorex/chunk.7deee291.js
  method setup (line 1) | setup(n,{emit:u}){const c=b(),l=()=>{u("update:setup","wizard")},o=()=>{...
  function lt (line 1) | function lt(n,u){return h(),y("div",nt)}
  method setup (line 1) | setup(n,{emit:u}){const c=M(!1),l=b(),o=()=>f(this,null,function*(){c.va...
  method setup (line 1) | setup(c,l){return f(this,arguments,function*(n,{emit:u}){let o,d;const F...
  method setup (line 1) | setup(n,{emit:u}){const c=b(),l=()=>{u("update:setup","router")},o=M(!1)...
  method setup (line 1) | setup(n){b();const u=M("wizard");return(c,l)=>(h(),y("div",a6,[(h(),E(j,...

FILE: luci-app-istorex/htdocs/luci-static/istorex/chunk.83d679c2.js
  method setup (line 1) | setup(c){const t=[{name:"index",title:"\u7F51\u7EDC\u914D\u7F6E",path:"/...

FILE: luci-app-istorex/htdocs/luci-static/istorex/chunk.8bf617a1.js
  method setup (line 1) | setup(_){return d(this,null,function*(){let i,l;const t=v(""),e=h({accou...

FILE: luci-app-istorex/htdocs/luci-static/istorex/chunk.8f1ff823.js
  method setup (line 1) | setup(w){return A(this,null,function*(){let h,c;const l=M(""),t=f({wanPr...

FILE: luci-app-istorex/htdocs/luci-static/istorex/chunk.a1bcc52b.js
  method setup (line 1) | setup(i){const u=Y(),t=x(()=>u.localApps.filter(n=>n.name!="istorex")),s...
  method setup (line 1) | setup(i){const u=i,t=()=>{o.value&&location.reload(),u.close&&u.close()}...
  class A1 (line 1) | class A1 extends e1{Open(){this.openWindow(b1)}}
    method Open (line 1) | Open(){this.openWindow(b1)}
  method setup (line 1) | setup(i){return(u,t)=>{const s=m("nas-section-item"),_=m("nas-section-co...
  method setup (line 1) | setup(i){const u=i,t=q(u.disk),s=x(()=>t.errorInfo?"error":t.childrens==...
  method setup (line 1) | setup(i){const u=D(),t=x(()=>u.disk),s=x(()=>u.raid.disks);return(_,h)=>...
  method setup (line 1) | setup(i){const u=D(),t=q({cpuusage:0,temperature:0,menavailablePercentag...
  method setup (line 1) | setup(i){const u=D(),t=x(()=>u.network),s=x(()=>u.device),_=o=>{switch(o...
  method setup (line 1) | setup(i){const u=N.formatDateYMD,t=N.formatDateHMS,s=D(),_=x(()=>s.local...
  method setup (line 1) | setup(i){return(u,t)=>(a(),d(A,null,[c(O2),c(I2),c(u2)],64))}
  method setup (line 1) | setup(i){const u=v=>h.value.indexOf(v)!=-1,t=v=>p.value.indexOf(v)!=-1,s...
  method setup (line 1) | setup(i){const u=D(),t=$(!1),s=$(!1);(()=>b(this,null,function*(){try{co...
  method setup (line 1) | setup(i){D(),$(!1);const u=$(!1);return(()=>b(this,null,function*(){try{...
  function U0 (line 1) | function U0(i,u){return a(),d("div",G0,[l1(i.$slots,"default")])}
  method setup (line 1) | setup(i){const u=D(),t=x(()=>({"background-image":`url(/luci-static/isto...

FILE: luci-app-istorex/htdocs/luci-static/istorex/chunk.b7ccb4ed.js
  method setup (line 1) | setup(o){return p(this,null,function*(){let u,s;const h=B({ports:[]}),c=...

FILE: luci-app-istorex/htdocs/luci-static/istorex/chunk.d9ea7f57.js
  method setup (line 1) | setup(C){const n=p();return(w,B)=>{const _=t("layout-header"),r=t("route...

FILE: luci-app-istorex/htdocs/luci-static/istorex/chunk.de33ea3e.js
  method setup (line 1) | setup(u){const x=h.stampForm,F=h.stampForm,_=I(),n=l(()=>_.network),g=l(...

FILE: luci-app-istorex/htdocs/luci-static/istorex/chunk.ead1f974.js
  method setup (line 1) | setup(i){const t=[{name:"setting-index",title:"\u529F\u80FD\u4FE1\u606F"...

FILE: luci-app-istorex/htdocs/luci-static/istorex/chunk.f2b02e0d.js
  method setup (line 1) | setup(x){const o=u(),a=r(()=>o.device.devices);return d(),(y,B)=>(l(),e(...

FILE: luci-app-istorex/htdocs/luci-static/istorex/chunk.fb51d2b2.js
  method setup (line 1) | setup(v){return m(this,null,function*(){let c,d;const l=h(""),e=F({inter...

FILE: luci-app-istorex/htdocs/luci-static/istorex/chunk.fdf02bc2.js
  function p (line 1) | function p(l){var E;for(E in l)if(Object.prototype.hasOwnProperty.call(l...
  function r (line 1) | function r(l){return function(){throw l}}
  function s (line 1) | function s(l,E,h){try{l(E,h)}catch(k){setTimeout(r(k),0)}}
  function i (line 1) | function i(l,E,h){l(E,h)}
  function _ (line 1) | function _(l,E,h,k){var w=a[E],y=k?i:s,g;if(!!Object.prototype.hasOwnPro...
  function f (line 1) | function f(l,E,h){return function(){var w=String(l),y=w.lastIndexOf(".")...
  function b (line 1) | function b(l){var E=String(l),h=Boolean(Object.prototype.hasOwnProperty....
  function D (line 1) | function D(l){for(var E=String(l),h=b(E)||b(F),k=E.lastIndexOf(".");!h&&...
  function v (line 1) | function v(l,E,h,k){l=typeof l=="symbol"?l.toString():l;var w=f(l,E,k),y...
  method setup (line 1) | setup(e){const u=Ge(),n=C(!1),a=C(localStorage.getItem("i18n")),d=()=>{n...
  function un (line 1) | function un(e,u){return o(),c("div",tn,[t("input",{placeholder:e.$t("\u5...
  method setup (line 1) | setup(e){const u=e;return(n,a)=>(o(),c("div",sn,[t("div",{style:tt(`heig...
  function _n (line 1) | function _n(e,u){return o(),c("svg",cn,rn)}
  method setup (line 1) | setup(e){const u=e,n=C(!1);et(()=>{n.value=!0,document.body.setAttribute...
  method setup (line 1) | setup(e){return(u,n)=>(o(),z($n,{Close:e.Close,type:e.type,title:e.title...
  function Bn (line 1) | function Bn(e,u){return o(),c("svg",yn,kn)}
  function Pn (line 1) | function Pn(e,u){return o(),c("svg",xn,In)}
  method setup (line 1) | setup(e,{emit:u}){const n=e,a=W({get:()=>n.modelValue.valueOf(),set:d=>u...
  method setup (line 1) | setup(e){const u=e,n=C(0),a=C({lanIp:"",netMask:"255.255.255.0",enableDh...
  method setup (line 1) | setup(e){const u=e,n=C(0),a=je(),d=a.status,F=W(()=>a.status.proto!="sta...
  function Xs (line 1) | function Xs(e,u){return o(),c("svg",Gs,js)}
  method setup (line 1) | setup(e){const u=e,n=C(0);C("disk");const a=C(""),d=C(3),F=C(""),p=C([])...
  function Mo (line 1) | function Mo(e,u){return o(),c("svg",Io,Vo)}
  method setup (line 1) | setup(e){const u=e,n=C(0),a=C(""),d=C(),F=C();(()=>{P.Guide.SoftSourceLi...
  method setup (line 1) | setup(e){const u=C(!1),n=C(),a=()=>{window.location.href="/cgi-bin/luci/...
  function _a (line 1) | function _a(e,u){return o(),c("svg",ca,ra)}
  method setup (line 1) | setup(e){const u=e,n=C(!1),a=()=>{n.value=!n.value},d=mt({width:`calc(${...
  method setup (line 1) | setup(e){su([ou,au,iu,lu,cu,du]);const u=C(),n=D=>{var l;const v=(l=u.va...
  method setup (line 1) | setup(e){const u=Nt.stampForm,n=s=>{switch(s){case"pppoe":return ct.glob...
  method setup (line 1) | setup(e){const u=e,n=()=>{u.Close&&u.Close()},a=h=>{h.preventDefault(),u...
  method setup (line 1) | setup(e){var D;const u=e,n=()=>{u.Close&&u.Close()},a=v=>{v.preventDefau...
  method setup (line 1) | setup(e){const u=e,n=W(()=>u.value>=80?"#e45e5e":u.value>=70?"#ff9800":u...
  method setup (line 1) | setup(e){const u=e,n=W(()=>u.part.filesystem=="No FileSystem"),a=W(()=>n...
  method setup (line 1) | setup(e){const u=e,n=C(0),a=()=>{u.Close&&u.Close()},d=F=>{F.preventDefa...
  method setup (line 1) | setup(e){const u=e,n=Ae(),a=W(()=>{var f,b,D,v;if(u.type==="systemRoot")...
  method setup (line 1) | setup(e){const u=e,n=xe(),a=C(null),d=p=>{const r=p.target,{left:s,top:i...
  method setup (line 1) | setup(e){const u=C(),n=C(0),a=C(0),d=C(0),F=C(!1),p=()=>{if(d.value>=0){...
  method setup (line 1) | setup(e){const u=mt({portList:[],load:!1});return(()=>{P.Network.PortLis...
  method setup (line 1) | setup(e){const u=Nt.stampForm,n=mt({cpuUsage:0,cpuTemperature:0,memAvail...
  method setup (line 1) | setup(e){const u=e,n=C(localStorage.getItem("i18n")),a=d=>P.ApiStore.get...
  method setup (line 1) | setup(e){const u=Qe(),n=W(()=>u.localApps.filter(d=>d.name!="istorex"));...
  method setup (line 1) | setup(e,{emit:u}){const n=e,a=()=>{n.onSetup()},d=C(n.active),F=()=>{swi...
  method setup (line 1) | setup(e){const u=()=>{location.reload()};return(n,a)=>(o(),c("div",oc,[t...
  method setup (line 1) | setup(e){const u=e,n=()=>{u.onSetup()},a=d=>{if(d.data.auth=="ddnsto"){c...
  method setup (line 1) | setup(e,{emit:u}){const n=e,a=W(()=>{const{domain:p,token:r,sign:s,route...
  method setup (line 1) | setup(e){const u=()=>{location.reload()};return(n,a)=>(o(),c("div",wc,[t...
  method setup (line 1) | setup(e){const u=e,n=()=>{u.onSetup()},a=()=>T(this,null,function*(){if(...
  method setup (line 1) | setup(e){const u=e,n=C("\u6B63\u5728\u68C0\u6D4B\u63D2\u4EF6\u662F\u5426...
  method setup (line 1) | setup(e){const u=e,n=C("ddnsto-install"),a=s=>{s!=null?n.value=s:d()},d=...
  method setup (line 1) | setup(e){const u=e,n=()=>{u.next&&u.next(),u.Close&&u.Close()},a=()=>{u....
  method setup (line 1) | setup(e,{emit:u}){const n=e,a=C("ipv4"),d=C(n.name),F=C(""),p=C(""),r=C(...
  method setup (line 1) | setup(e){const u=e,n=C(""),a=C("index"),d=s=>{if(s!=null){if(s=="ddnsto"...
  function Yd (line 1) | function Yd(e){var u=(/mac os x/i.test(navigator.userAgent)?"\u2318":"Ct...
  function Kd (line 1) | function Kd(e,u){var n,a,d,F,p,r,s=!1;u||(u={}),n=u.debug||!1;try{d=Xd()...
  method setup (line 1) | setup(e){const u=C({});let n=!1,a;const d=s=>{Jd(s),A.Message("\u590D\u5...
  function Dr (line 1) | function Dr(e,u){return o(),c("svg",$r,yr)}
  method setup (line 1) | setup(e){const u=e,n=C(),a=C(),d=C(0),F=C("null"),p=C(""),r=C(),s=C(!1),...
  method setup (line 1) | setup(e){const u=C(!1),n=C(),a=mt({enable:!1,disabled:!1}),d=()=>T(this,...
  method setup (line 1) | setup(e,{emit:u}){const n=e,a=C(""),d=C(""),F=W({get:()=>n.modelValue.va...
  function H5 (line 1) | function H5(e,u){return o(),c("svg",N5,U5)}
  method setup (line 1) | setup(e){const u=e,n=C(""),a=C(""),d=C(""),F=C(""),p=C("default"),r=C("A...
  method setup (line 1) | setup(e){const u=C(),n=C("aria2"),a=C(window.location),d=()=>{P.Guide.Do...
  method setup (line 1) | setup(e){return(u,n)=>(o(),z(ft,{title:u.$t("\u670D\u52A1\u72B6\u6001"),...
  method setup (line 1) | setup(e){const u=C(""),n=C(""),a=()=>T(this,null,function*(){const p=A.L...
  method setup (line 1) | setup(e){const u=C(""),n=C(""),a=()=>T(this,null,function*(){const p=A.L...
  class n2 (line 1) | class n2 extends eu{Open(u){u==="sync"&&this.openWindow(u2),u==="backup"...
    method Open (line 1) | Open(u){u==="sync"&&this.openWindow(u2),u==="backup"&&this.openWindow(...
  method setup (line 1) | setup(e){const u=()=>{we.OpenGuideWindow()},n=C(window.innerWidth<668),a...
  method setup (line 1) | setup(e){const u=xe(),n=W(()=>u.portitemStyle.portitem),a=W(()=>u.portit...
  method setup (line 1) | setup(e){return(u,n)=>(o(),c("div",b2,[x(Ku),t("div",y2,[t("div",null,[x...

FILE: luci-app-istorex/htdocs/luci-static/istorex/chunk.ff94f9f2.js
  method setup (line 1) | setup(_){return m(this,null,function*(){let v,l;k({ipv4:"",ipv6:""});con...

FILE: luci-app-istorex/htdocs/luci-static/istorex/chunk.ffd7724b.js
  method setup (line 1) | setup(r){const e=r,t=(a,n)=>{a.folder&&(a.folder.openChildren=!a.folder....
  method setup (line 1) | setup(r){const e=r,t=(i,o)=>{o==="disk"&&i.disk&&(i.disk.openChildren=!i...
  method setup (line 1) | setup(r){const e=r,t=()=>{e.close&&e.close()},a=()=>{e.onOk&&e.onOk(o.va...
  class jI (line 1) | class jI extends cg{Open(e){this.openWindow(QI,e)}}
    method Open (line 1) | Open(e){this.openWindow(QI,e)}
  method setup (line 1) | setup(r,{emit:e}){const t=r;console.log("form",t.context);const a=()=>{i...
  method setup (line 1) | setup(r){const e=r;return(t,a)=>(_t(),It(lr,null,[N("div",null,[N("div",...
  method setup (line 1) | setup(r){const e=r,t=Gs({users:e.context.users}),a=()=>ra(this,null,func...
  method setup (line 1) | setup(r){const e=r,t=Ob(!1),n=Gs({title:"\u5171\u4EAB\u6587\u4EF6",servi...
  class JP (line 1) | class JP extends cg{Open(){this.openWindow(KP)}}
    method Open (line 1) | Open(){this.openWindow(KP)}
  method setup (line 1) | setup(r){const e=r,t=Gs({loading:!1,users:[]}),a=()=>{e.close&&e.close()...
  class pR (line 1) | class pR extends cg{Open(){this.openWindow(dR)}}
    method Open (line 1) | Open(){this.openWindow(dR)}
  function k (line 14) | function k(r,e){if(typeof e!="function"&&e!==null)throw new TypeError("C...
  function r (line 14) | function r(){this.firefox=!1,this.ie=!1,this.edge=!1,this.newEdge=!1,thi...
  function r (line 14) | function r(){this.browser=new gR,this.node=!1,this.wxa=!1,this.worker=!1...
  function mR (line 14) | function mR(r,e){var t=e.browser,a=r.match(/Firefox\/([\d.]+)/),n=r.matc...
  function wR (line 14) | function wR(r){var e={};if(typeof JSON=="undefined")return e;for(var t=0...
  function Fb (line 14) | function Fb(){return DR++}
  function mg (line 14) | function mg(){for(var r=[],e=0;e<arguments.length;e++)r[e]=arguments[e];...
  function at (line 14) | function at(r){if(r==null||typeof r!="object")return r;var e=r,t=xo.call...
  function ht (line 14) | function ht(r,e,t){if(!et(e)||!et(r))return t?at(e):r;for(var a in e)if(...
  function _g (line 14) | function _g(r,e){for(var t=r[0],a=1,n=r.length;a<n;a++)t=ht(t,r[a],e);re...
  function V (line 14) | function V(r,e){if(Object.assign)Object.assign(r,e);else for(var t in e)...
  function tt (line 14) | function tt(r,e,t){for(var a=St(e),n=0;n<a.length;n++){var i=a[n];(t?e[i...
  function dt (line 14) | function dt(r,e){if(r){if(r.indexOf)return r.indexOf(e);for(var t=0,a=r....
  function MR (line 14) | function MR(r,e){var t=r.prototype;function a(){}a.prototype=e.prototype...
  function te (line 14) | function te(r,e,t){if(r="prototype"in r?r.prototype:r,e="prototype"in e?...
  function Se (line 14) | function Se(r){return!r||typeof r=="string"?!1:typeof r.length=="number"}
  function A (line 14) | function A(r,e,t){if(!!(r&&e))if(r.forEach&&r.forEach===CR)r.forEach(e,t...
  function G (line 14) | function G(r,e,t){if(!r)return[];if(!e)return Sg(r);if(r.map&&r.map===AR...
  function Zr (line 14) | function Zr(r,e,t,a){if(!!(r&&e)){for(var n=0,i=r.length;n<i;n++)t=e.cal...
  function Et (line 14) | function Et(r,e,t){if(!r)return[];if(!e)return Sg(r);if(r.filter&&r.filt...
  function LR (line 14) | function LR(r,e,t){if(!!(r&&e)){for(var a=0,n=r.length;a<n;a++)if(e.call...
  function St (line 14) | function St(r){if(!r)return[];if(Object.keys)return Object.keys(r);var e...
  function IR (line 14) | function IR(r,e){for(var t=[],a=2;a<arguments.length;a++)t[a-2]=argument...
  function ot (line 14) | function ot(r){for(var e=[],t=1;t<arguments.length;t++)e[t-1]=arguments[...
  function F (line 14) | function F(r){return Array.isArray?Array.isArray(r):xo.call(r)==="[objec...
  function J (line 14) | function J(r){return typeof r=="function"}
  function U (line 14) | function U(r){return typeof r=="string"}
  function Ad (line 14) | function Ad(r){return xo.call(r)==="[object String]"}
  function Mt (line 14) | function Mt(r){return typeof r=="number"}
  function et (line 14) | function et(r){var e=typeof r;return e==="function"||!!r&&e==="object"}
  function Em (line 14) | function Em(r){return!!Vb[xo.call(r)]}
  function Ue (line 14) | function Ue(r){return!!zb[xo.call(r)]}
  function Hs (line 14) | function Hs(r){return typeof r=="object"&&typeof r.nodeType=="number"&&t...
  function ch (line 14) | function ch(r){return r.colorStops!=null}
  function PR (line 14) | function PR(r){return r.image!=null}
  function RR (line 14) | function RR(r){return xo.call(r)==="[object RegExp]"}
  function Ws (line 14) | function Ws(r){return r!==r}
  function le (line 14) | function le(){for(var r=[],e=0;e<arguments.length;e++)r[e]=arguments[e];...
  function ft (line 14) | function ft(r,e){return r!=null?r:e}
  function Ur (line 14) | function Ur(r,e,t){return r!=null?r:e!=null?e:t}
  function Sg (line 14) | function Sg(r){for(var e=[],t=1;t<arguments.length;t++)e[t-1]=arguments[...
  function xg (line 14) | function xg(r){if(typeof r=="number")return[r,r,r,r];var e=r.length;retu...
  function Me (line 14) | function Me(r,e){if(!r)throw new Error(e)}
  function Sr (line 14) | function Sr(r){return r==null?null:typeof r.trim=="function"?r.trim():r....
  function pf (line 14) | function pf(r){r[Gb]=!0}
  function Ts (line 14) | function Ts(r){return r[Gb]}
  function r (line 14) | function r(){this.data={}}
  function kR (line 14) | function kR(){return Hb?new Map:new ER}
  function r (line 14) | function r(e){var t=F(e);this.data=kR();var a=this;e instanceof r?e.each...
  function q (line 14) | function q(r){return new OR(r)}
  function gf (line 14) | function gf(r,e){for(var t=new r.constructor(r.length+e.length),a=0;a<r....
  function dh (line 14) | function dh(r,e){var t;if(Object.create)t=Object.create(r);else{var a=fu...
  function Wb (line 14) | function Wb(r){var e=r.style;e.webkitUserSelect="none",e.userSelect="non...
  function Z (line 14) | function Z(r,e){return r.hasOwnProperty(e)}
  function Kt (line 14) | function Kt(){}
  function wi (line 14) | function wi(r,e){return r==null&&(r=0),e==null&&(e=0),[r,e]}
  function Ce (line 14) | function Ce(r,e){return r[0]=e[0],r[1]=e[1],r}
  function fa (line 14) | function fa(r){return[r[0],r[1]]}
  function BR (line 14) | function BR(r,e,t){return r[0]=e,r[1]=t,r}
  function km (line 14) | function km(r,e,t){return r[0]=e[0]+t[0],r[1]=e[1]+t[1],r}
  function Dd (line 14) | function Dd(r,e,t,a){return r[0]=e[0]+t[0]*a,r[1]=e[1]+t[1]*a,r}
  function qn (line 14) | function qn(r,e,t){return r[0]=e[0]-t[0],r[1]=e[1]-t[1],r}
  function Md (line 14) | function Md(r){return Math.sqrt(NR(r))}
  function NR (line 14) | function NR(r){return r[0]*r[0]+r[1]*r[1]}
  function Zu (line 14) | function Zu(r,e,t){return r[0]=e[0]*t,r[1]=e[1]*t,r}
  function wo (line 14) | function wo(r,e){var t=Md(e);return t===0?(r[0]=0,r[1]=0):(r[0]=e[0]/t,r...
  function Ld (line 14) | function Ld(r,e){return Math.sqrt((r[0]-e[0])*(r[0]-e[0])+(r[1]-e[1])*(r...
  function VR (line 14) | function VR(r,e){return(r[0]-e[0])*(r[0]-e[0])+(r[1]-e[1])*(r[1]-e[1])}
  function Xu (line 14) | function Xu(r,e,t,a){return r[0]=e[0]+a*(t[0]-e[0]),r[1]=e[1]+a*(t[1]-e[...
  function he (line 14) | function he(r,e,t){var a=e[0],n=e[1];return r[0]=t[0]*a+t[2]*n+t[4],r[1]...
  function Ha (line 14) | function Ha(r,e,t){return r[0]=Math.min(e[0],t[0]),r[1]=Math.min(e[1],t[...
  function Wa (line 14) | function Wa(r,e,t){return r[0]=Math.max(e[0],t[0]),r[1]=Math.max(e[1],t[...
  function r (line 14) | function r(e,t){this.target=e,this.topTarget=t&&t.topTarget}
  function r (line 14) | function r(e){this.handler=e,e.on("mousedown",this._dragStart,this),e.on...
  function r (line 14) | function r(e){e&&(this._$eventProcessor=e)}
  function Id (line 14) | function Id(r,e,t,a,n,i){var o=a+"-"+n,s=r.length;if(i.hasOwnProperty(o)...
  function Om (line 14) | function Om(r,e){var t=[[r[0],r[1],1,0,0,0,-e[0]*r[0],-e[0]*r[1]],[0,0,0...
  function WR (line 14) | function WR(r,e,t,a,n){return Pd(jh,e,a,n,!0)&&Pd(r,t,jh[0],jh[1])}
  function Pd (line 14) | function Pd(r,e,t,a,n){if(e.getBoundingClientRect&&At.domSupported&&!$b(...
  function $R (line 14) | function $R(r,e){var t=e.markers;if(t)return t;t=e.markers=[];for(var a=...
  function UR (line 14) | function UR(r,e,t){for(var a=t?"invTrans":"trans",n=e[a],i=e.srcCoords,o...
  function $b (line 14) | function $b(r){return r.nodeName.toUpperCase()==="CANVAS"}
  function ke (line 14) | function ke(r){return r==null?"":(r+"").replace(YR,function(e,t){return ...
  function Rd (line 14) | function Rd(r,e,t,a){return t=t||{},a?Nm(r,e,t):qR&&e.layerX!=null&&e.la...
  function Nm (line 14) | function Nm(r,e,t){if(At.domSupported&&r.getBoundingClientRect){var a=e....
  function wg (line 14) | function wg(r){return r||window.event}
  function Je (line 14) | function Je(r,e,t){if(e=wg(e),e.zrX!=null)return e;var a=e.type,n=a&&a.i...
  function KR (line 14) | function KR(r){var e=r.wheelDelta;if(e)return e;var t=r.deltaX,a=r.delta...
  function Ed (line 14) | function Ed(r,e,t,a){r.addEventListener(e,t,a)}
  function JR (line 14) | function JR(r,e,t,a){r.removeEventListener(e,t,a)}
  function Vm (line 14) | function Vm(r){return r.which===2||r.which===3}
  function r (line 14) | function r(){this._track=[]}
  function zm (line 14) | function zm(r){var e=r[1][0]-r[0][0],t=r[1][1]-r[0][1];return Math.sqrt(...
  function jR (line 14) | function jR(r){return[(r[0][0]+r[1][0])/2,(r[0][1]+r[1][1])/2]}
  function ur (line 14) | function ur(){return[1,0,0,1,0,0]}
  function ph (line 14) | function ph(r){return r[0]=1,r[1]=0,r[2]=0,r[3]=1,r[4]=0,r[5]=0,r}
  function bg (line 14) | function bg(r,e){return r[0]=e[0],r[1]=e[1],r[2]=e[2],r[3]=e[3],r[4]=e[4...
  function ha (line 14) | function ha(r,e,t){var a=e[0]*t[0]+e[2]*t[1],n=e[1]*t[0]+e[3]*t[1],i=e[0...
  function Xr (line 14) | function Xr(r,e,t){return r[0]=e[0],r[1]=e[1],r[2]=e[2],r[3]=e[3],r[4]=e...
  function bi (line 14) | function bi(r,e,t){var a=e[0],n=e[2],i=e[4],o=e[1],s=e[3],l=e[5],u=Math....
  function Cg (line 14) | function Cg(r,e,t){var a=t[0],n=t[1];return r[0]=e[0]*a,r[1]=e[1]*n,r[2]...
  function bo (line 14) | function bo(r,e){var t=e[0],a=e[2],n=e[4],i=e[1],o=e[3],s=e[5],l=t*o-i*a...
  function tE (line 14) | function tE(r){var e=ur();return bg(e,r),e}
  function r (line 14) | function r(e,t){this.x=e||0,this.y=t||0}
  function r (line 14) | function r(e,t,a,n){a<0&&(e=e+a,a=-a),n<0&&(t=t+n,n=-n),this.x=e,this.y=...
  function aE (line 14) | function aE(r,e,t){return{type:r,event:t,target:e.target,topTarget:e.top...
  function nE (line 14) | function nE(){ya(this.event)}
  function e (line 14) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.hand...
  function r (line 14) | function r(e,t){this.x=e,this.y=t}
  function e (line 14) | function e(t,a,n,i,o){var s=r.call(this)||this;return s._hovered=new Fo(...
  function sE (line 14) | function sE(r,e,t){if(r[r.rectHover?"rectContain":"contain"](e,t)){for(v...
  function Fm (line 14) | function Fm(r,e,t,a,n){for(var i=r.length-1;i>=0;i--){var o=r[i],s=void ...
  function Zb (line 14) | function Zb(r,e,t){var a=r.painter;return e<0||e>a.getWidth()||t<0||t>a....
  function uE (line 14) | function uE(r){for(var e=0;r>=Xb;)e|=r&1,r>>=1;return r+e}
  function Gm (line 14) | function Gm(r,e,t,a){var n=e+1;if(n===t)return 1;if(a(r[n++],r[e])<0){fo...
  function fE (line 14) | function fE(r,e,t){for(t--;e<t;){var a=r[e];r[e++]=r[t],r[t--]=a}}
  function Hm (line 14) | function Hm(r,e,t,a,n){for(a===e&&a++;a<t;a++){for(var i=r[a],o=e,s=a,l;...
  function av (line 14) | function av(r,e,t,a,n,i){var o=0,s=0,l=1;if(i(r,e[t+n])>0){for(s=a-n;l<s...
  function nv (line 14) | function nv(r,e,t,a,n,i){var o=0,s=0,l=1;if(i(r,e[t+n])<0){for(s=n+1;l<s...
  function hE (line 14) | function hE(r,e){var t=Go,a,n,i=0;r.length;var o=[];a=[],n=[];function s...
  function qu (line 14) | function qu(r,e,t,a){t||(t=0),a||(a=r.length);var n=a-t;if(!(n<2)){var i...
  function iv (line 14) | function iv(){Wm||(Wm=!0,console.warn("z / z2 / zlevel of displayable is...
  function $m (line 14) | function $m(r,e){return r.zlevel===e.zlevel?r.z===e.z?r.z2-e.z2:r.z-e.z:...
  function r (line 14) | function r(){this._roots=[],this._displayList=[],this._displayListLen=0,...
  function $a (line 14) | function $a(r){return r>-yf&&r<yf}
  function Qb (line 14) | function Qb(r){return r>yf||r<-yf}
  function ae (line 14) | function ae(r,e,t,a,n){var i=1-n;return i*i*(i*r+3*n*e)+n*n*(n*a+3*i*t)}
  function Ym (line 14) | function Ym(r,e,t,a,n){var i=1-n;return 3*(((e-r)*i+2*(t-e)*n)*i+(a-t)*n...
  function mf (line 14) | function mf(r,e,t,a,n,i){var o=a+3*(e-t)-r,s=3*(t-e*2+r),l=3*(e-r),u=r-n...
  function jb (line 14) | function jb(r,e,t,a,n){var i=6*t-12*e+6*r,o=9*e+3*a-3*r-9*t,s=3*e-3*r,l=...
  function en (line 14) | function en(r,e,t,a,n,i){var o=(e-r)*n+r,s=(t-e)*n+e,l=(a-t)*n+t,u=(s-o)...
  function t2 (line 14) | function t2(r,e,t,a,n,i,o,s,l,u,f){var h,v=.005,c=1/0,d,p,g,y;Nr[0]=l,Nr...
  function dE (line 14) | function dE(r,e,t,a,n,i,o,s,l){for(var u=r,f=e,h=0,v=1/l,c=1;c<=l;c++){v...
  function se (line 14) | function se(r,e,t,a){var n=1-a;return n*(n*r+2*a*e)+a*a*t}
  function Od (line 14) | function Od(r,e,t,a){return 2*((1-a)*(e-r)+a*(t-e))}
  function pE (line 14) | function pE(r,e,t,a,n){var i=r-2*e+t,o=2*(e-r),s=r-a,l=0;if($a(i)){if(Qb...
  function e2 (line 14) | function e2(r,e,t){var a=r+t-2*e;return a===0?.5:(r-e)/a}
  function $s (line 14) | function $s(r,e,t,a,n){var i=(e-r)*a+r,o=(t-e)*a+e,s=(o-i)*a+i;n[0]=r,n[...
  function r2 (line 14) | function r2(r,e,t,a,n,i,o,s,l){var u,f=.005,h=1/0;Nr[0]=o,Nr[1]=s;for(va...
  function gE (line 14) | function gE(r,e,t,a,n,i,o){for(var s=r,l=e,u=0,f=1/o,h=1;h<=o;h++){var v...
  function Tg (line 14) | function Tg(r){var e=r&&yE.exec(r);if(e){var t=e[1].split(","),a=+Sr(t[0...
  function r (line 14) | function r(e){this._inited=!1,this._startTime=0,this._pausedTime=0,this....
  function r (line 14) | function r(e){this.value=e}
  function r (line 14) | function r(){this._len=0}
  function r (line 14) | function r(e){this._list=new SE,this._maxSize=10,this._map={},this._maxS...
  function br (line 14) | function br(r){return r=Math.round(r),r<0?0:r>255?255:r}
  function wE (line 14) | function wE(r){return r=Math.round(r),r<0?0:r>360?360:r}
  function Us (line 14) | function Us(r){return r<0?0:r>1?1:r}
  function ov (line 14) | function ov(r){var e=r;return e.length&&e.charAt(e.length-1)==="%"?br(pa...
  function ni (line 14) | function ni(r){var e=r;return e.length&&e.charAt(e.length-1)==="%"?Us(pa...
  function sv (line 14) | function sv(r,e,t){return t<0?t+=1:t>1&&(t-=1),t*6<1?r+(e-r)*t*6:t*2<1?e...
  function Ua (line 14) | function Ua(r,e,t){return r+(e-r)*t}
  function Ke (line 14) | function Ke(r,e,t,a,n){return r[0]=e,r[1]=t,r[2]=a,r[3]=n,r}
  function Bd (line 14) | function Bd(r,e){return r[0]=e[0],r[1]=e[1],r[2]=e[2],r[3]=e[3],r}
  function Pi (line 14) | function Pi(r,e){Zl&&Bd(Zl,e),Zl=n2.put(r,Zl||e.slice())}
  function We (line 14) | function We(r,e){if(!!r){e=e||[];var t=n2.get(r);if(t)return Bd(e,t);r=r...
  function Nd (line 14) | function Nd(r,e){var t=(parseFloat(r[0])%360+360)%360/360,a=ni(r[1]),n=n...
  function bE (line 14) | function bE(r){if(!!r){var e=r[0]/255,t=r[1]/255,a=r[2]/255,n=Math.min(e...
  function Vd (line 14) | function Vd(r,e){var t=We(r);if(t){for(var a=0;a<3;a++)e<0?t[a]=t[a]*(1-...
  function lv (line 14) | function lv(r,e,t){if(!(!(e&&e.length)||!(r>=0&&r<=1))){t=t||[];var a=r*...
  function CE (line 14) | function CE(r,e,t){if(!(!(e&&e.length)||!(r>=0&&r<=1))){var a=r*(e.lengt...
  function As (line 14) | function As(r,e,t,a){var n=We(r);if(r)return n=bE(n),e!=null&&(n[0]=wE(e...
  function _f (line 14) | function _f(r,e){var t=We(r);if(t&&e!=null)return t[3]=Us(e),va(t,"rgba")}
  function va (line 14) | function va(r,e){if(!(!r||!r.length)){var t=r[0]+","+r[1]+","+r[2];retur...
  function Sf (line 14) | function Sf(r,e){var t=We(r);return t?(.299*t[0]+.587*t[1]+.114*t[2])*t[...
  function Ys (line 14) | function Ys(r){var e;if(!r||r==="transparent")r="none";else if(typeof r=...
  function Ya (line 14) | function Ya(r){return r<Xm&&r>-Xm}
  function Xl (line 14) | function Xl(r){return xf(r*1e3)/1e3}
  function zd (line 14) | function zd(r){return xf(r*1e4)/1e4}
  function TE (line 14) | function TE(r){return"matrix("+Xl(r[0])+","+Xl(r[1])+","+Xl(r[2])+","+Xl...
  function DE (line 14) | function DE(r,e,t){return t==="top"?r+=e/2:t==="bottom"&&(r-=e/2),r}
  function ME (line 14) | function ME(r){return r&&(r.shadowBlur||r.shadowOffsetX||r.shadowOffsetY)}
  function LE (line 14) | function LE(r){var e=r.style,t=r.getGlobalScale();return[e.shadowColor,(...
  function i2 (line 14) | function i2(r){return r&&!!r.image}
  function IE (line 14) | function IE(r){return r&&!!r.svgElement}
  function Ag (line 14) | function Ag(r){return i2(r)||IE(r)}
  function o2 (line 14) | function o2(r){return r.type==="linear"}
  function s2 (line 14) | function s2(r){return r.type==="radial"}
  function l2 (line 14) | function l2(r){return r&&(r.type==="linear"||r.type==="radial")}
  function gh (line 14) | function gh(r){return"url(#"+r+")"}
  function u2 (line 14) | function u2(r){var e=r.getGlobalScale(),t=Math.max(e[0],e[1]);return Mat...
  function f2 (line 14) | function f2(r){var e=r.x||0,t=r.y||0,a=(r.rotation||0)*Yu,n=ft(r.scaleX,...
  function oa (line 14) | function oa(r,e,t){return(e-r)*t+r}
  function uv (line 14) | function uv(r,e,t,a){for(var n=e.length,i=0;i<n;i++)r[i]=oa(e[i],t[i],a)...
  function RE (line 14) | function RE(r,e,t,a){for(var n=e.length,i=n&&e[0].length,o=0;o<n;o++){r[...
  function ql (line 14) | function ql(r,e,t,a){for(var n=e.length,i=0;i<n;i++)r[i]=e[i]+t[i]*a;ret...
  function qm (line 14) | function qm(r,e,t,a){for(var n=e.length,i=n&&e[0].length,o=0;o<n;o++){r[...
  function EE (line 14) | function EE(r,e){for(var t=r.length,a=e.length,n=t>a?e:r,i=Math.min(t,a)...
  function kE (line 14) | function kE(r,e,t){var a=r,n=e;if(!(!a.push||!n.push)){var i=a.length,o=...
  function Ds (line 14) | function Ds(r){if(Se(r)){var e=r.length;if(Se(r[0])){for(var t=[],a=0;a<...
  function Ju (line 14) | function Ju(r){return r[0]=Math.floor(r[0])||0,r[1]=Math.floor(r[1])||0,...
  function OE (line 14) | function OE(r){return Se(r&&r[0])?2:1}
  function Jm (line 14) | function Jm(r){return r===Gd||r===Hd}
  function Jl (line 14) | function Jl(r){return r===Qu||r===h2}
  function r (line 14) | function r(e){this.keyframes=[],this.discrete=!1,this._invalid=!1,this._...
  function r (line 14) | function r(e,t,a,n){if(this._tracks={},this._trackKeys=[],this._maxTime=...
  function ro (line 14) | function ro(){return new Date().getTime()}
  function e (line 14) | function e(t){var a=r.call(this)||this;return a._running=!1,a._time=0,a....
  function a (line 14) | function a(){t._running&&(kd(a),!t._paused&&t.update())}
  function Wd (line 14) | function Wd(r){var e=r.pointerType;return e==="pen"||e==="touch"}
  function FE (line 14) | function FE(r){r.touching=!0,r.touchTimer!=null&&(clearTimeout(r.touchTi...
  function vv (line 14) | function vv(r){r&&(r.zrByTouch=!0)}
  function GE (line 14) | function GE(r,e){return Je(r.dom,new HE(r,e),!0)}
  function v2 (line 14) | function v2(r,e){for(var t=e,a=!1;t&&t.nodeType!==9&&!(a=t.domBelongToZr...
  function r (line 14) | function r(e,t){this.stopPropagation=Kt,this.stopImmediatePropagation=Kt...
  function WE (line 14) | function WE(r,e){var t=e.domHandlers;At.pointerEventsSupported?A(hv.poin...
  function $E (line 14) | function $E(r,e){At.pointerEventsSupported?A(Qm.pointer,t):At.touchEvent...
  function ju (line 14) | function ju(r,e,t,a){r.mounted[e]=t,r.listenerOpts[e]=a,Ed(r.domTarget,e...
  function cv (line 14) | function cv(r){var e=r.mounted;for(var t in e)e.hasOwnProperty(t)&&JR(r....
  function r (line 14) | function r(e,t){this.mounted={},this.listenerOpts={},this.touching=!1,th...
  function e (line 14) | function e(t,a){var n=r.call(this)||this;return n.__pointerCapturing=!1,...
  function mn (line 14) | function mn(r){return r>r0||r<-r0}
  function r (line 14) | function r(){}
  function d2 (line 14) | function d2(r,e){for(var t=0;t<qr.length;t++){var a=qr[t];r[a]=e[a]}}
  function $e (line 14) | function $e(r,e){e=e||tn;var t=a0[e];t||(t=a0[e]=new Sl(500));var a=t.ge...
  function n0 (line 14) | function n0(r,e,t,a){var n=$e(r,e),i=yh(e),o=ps(0,n,t),s=Qi(0,i,a),l=new...
  function xl (line 14) | function xl(r,e,t,a){var n=((r||"")+"").split(`
  function ps (line 15) | function ps(r,e,t){return t==="right"?r-=e:t==="center"&&(r-=e/2),r}
  function Qi (line 15) | function Qi(r,e,t){return t==="middle"?r-=e/2:t==="bottom"&&(r-=e),r}
  function yh (line 15) | function yh(r){return $e("\u56FD",r)}
  function Tr (line 15) | function Tr(r,e){return typeof r=="string"?r.lastIndexOf("%")>=0?parseFl...
  function bf (line 15) | function bf(r,e,t){var a=e.position||"inside",n=e.distance!=null?e.dista...
  function r (line 15) | function r(e){this.id=Fb(),this.animators=[],this.currentStates=[],this....
  function t (line 15) | function t(a,n,i,o){Object.defineProperty(e,a,{get:function(){if(!this[n...
  function mv (line 15) | function mv(r,e,t,a,n){t=t||{};var i=[];p2(r,"",r,e,t,a,i,n);var o=i.len...
  function _v (line 15) | function _v(r,e,t){for(var a=0;a<t;a++)r[a]=e[a]}
  function JE (line 15) | function JE(r){return Se(r[0])}
  function QE (line 15) | function QE(r,e,t){if(Se(e[t]))if(Se(r[t])||(r[t]=[]),Ue(e[t])){var a=e[...
  function jE (line 15) | function jE(r,e){return r===e||Se(r)&&Se(e)&&tk(r,e)}
  function tk (line 15) | function tk(r,e){var t=r.length;if(t!==e.length)return!1;for(var a=0;a<t...
  function p2 (line 15) | function p2(r,e,t,a,n,i,o,s){for(var l=St(a),u=n.duration,f=n.delay,h=n....
  function e (line 15) | function e(t){var a=r.call(this)||this;return a.isGroup=!0,a._children=[...
  function ek (line 23) | function ek(r){delete m2[r]}
  function rk (line 23) | function rk(r){if(!r)return!1;if(typeof r=="string")return Sf(r,1)<Ud;if...
  function r (line 23) | function r(e,t,a){var n=this;this._sleepAfterStill=10,this._stillFrameAc...
  function i0 (line 23) | function i0(r,e){var t=new ak(Fb(),r,e);return m2[t.id]=t,t}
  function nk (line 23) | function nk(r,e){tf[r]=e}
  function ik (line 23) | function ik(r){return r.replace(/^\s+|\s+$/g,"")}
  function Rt (line 23) | function Rt(r,e,t,a){var n=e[0],i=e[1],o=t[0],s=t[1],l=i-n,u=s-o;if(l===...
  function W (line 23) | function W(r,e){switch(r){case"center":case"middle":r="50%";break;case"l...
  function Zt (line 23) | function Zt(r,e,t){return e==null&&(e=10),e=Math.min(Math.max(0,e),_2),r...
  function or (line 23) | function or(r){return r.sort(function(e,t){return e-t}),r}
  function Gr (line 23) | function Gr(r){if(r=+r,isNaN(r))return 0;if(r>1e-14){for(var e=1,t=0;t<1...
  function ok (line 23) | function ok(r){var e=r.toString().toLowerCase(),t=e.indexOf("e"),a=t>0?+...
  function S2 (line 23) | function S2(r,e){var t=Math.log,a=Math.LN10,n=Math.floor(t(r[1]-r[0])/a)...
  function sk (line 23) | function sk(r,e){var t=Zr(r,function(c,d){return c+(isNaN(d)?0:d)},0);if...
  function lk (line 23) | function lk(r,e){var t=Math.max(Gr(r),Gr(e)),a=r+e;return t>_2?a:Zt(a,t)}
  function x2 (line 23) | function x2(r){var e=Math.PI*2;return(r%e+e)%e}
  function Cf (line 23) | function Cf(r){return r>-o0&&r<o0}
  function Kr (line 23) | function Kr(r){if(r instanceof Date)return r;if(U(r)){var e=uk.exec(r);i...
  function fk (line 23) | function fk(r){return Math.pow(10,Lg(r))}
  function Lg (line 23) | function Lg(r){if(r===0)return 0;var e=Math.floor(Math.log(r)/Math.LN10)...
  function w2 (line 23) | function w2(r,e){var t=Lg(r),a=Math.pow(10,t),n=r/a,i;return e?n<1.5?i=1...
  function Sv (line 23) | function Sv(r,e){var t=(r.length-1)*e+1,a=Math.floor(t),n=+r[a-1],i=t-a;...
  function l0 (line 23) | function l0(r){r.sort(function(l,u){return s(l,u,0)?-1:1});for(var e=-1/...
  function ma (line 23) | function ma(r){var e=parseFloat(r);return e==r&&(e!==0||!U(r)||r.indexOf...
  function b2 (line 23) | function b2(r){return!isNaN(ma(r))}
  function C2 (line 23) | function C2(){return Math.round(Math.random()*9)}
  function T2 (line 23) | function T2(r,e){return e===0?r:T2(e,r%e)}
  function u0 (line 23) | function u0(r,e){return r==null?e:e==null?r:r*e/T2(r,e)}
  function Pt (line 23) | function Pt(r){throw new Error(r)}
  function f0 (line 23) | function f0(r,e,t){return(e-r)*t+r}
  function kt (line 23) | function kt(r){return r instanceof Array?r:r==null?[]:[r]}
  function ci (line 23) | function ci(r,e,t){if(r){r[e]=r[e]||{},r.emphasis=r.emphasis||{},r.empha...
  function Co (line 23) | function Co(r){return et(r)&&!F(r)&&!(r instanceof Date)?r.value:r}
  function hk (line 23) | function hk(r){return et(r)&&!(r instanceof Array)}
  function M2 (line 23) | function M2(r,e,t){var a=t==="normalMerge",n=t==="replaceMerge",i=t==="r...
  function vk (line 23) | function vk(r,e,t){var a=[];if(t==="replaceAll")return a;for(var n=0;n<r...
  function ck (line 23) | function ck(r,e,t,a){A(a,function(n,i){if(!(!n||n.id==null)){var o=Ms(n....
  function dk (line 23) | function dk(r,e){A(e,function(t,a){if(!(!t||t.name==null))for(var n=0;n<...
  function pk (line 23) | function pk(r,e,t){A(e,function(a){if(!!a){for(var n,i=0;(n=r[i])&&(n.ne...
  function gk (line 23) | function gk(r,e){A(e,function(t){r.push({newOption:t,brandNew:!0,existin...
  function yk (line 23) | function yk(r){var e=q();A(r,function(t){var a=t.existing;a&&e.set(a.id,...
  function L2 (line 23) | function L2(r,e,t){var a=ee(e[r],null),n=ee(t[r],null);return a!=null&&n...
  function Ms (line 23) | function Ms(r){return ee(r,"")}
  function ee (line 23) | function ee(r,e){return r==null?e:U(r)?r:Mt(r)||Ad(r)?r+"":e}
  function Ig (line 23) | function Ig(r){var e=r.name;return!!(e&&e.indexOf(A2))}
  function Zs (line 23) | function Zs(r){return r&&r.id!=null&&Ms(r.id).indexOf(D2)===0}
  function mk (line 23) | function mk(r){return D2+r}
  function _k (line 23) | function _k(r,e,t){A(r,function(a){var n=a.newOption;et(n)&&(a.keyInfo.m...
  function Sk (line 23) | function Sk(r,e,t,a){var n=e.type?e.type:t?t.subType:a.determineSubType(...
  function xk (line 23) | function xk(r,e){var t={},a={};return n(r||[],t),n(e||[],a,t),[i(t),i(a)...
  function di (line 23) | function di(r,e){if(e.dataIndexInside!=null)return e.dataIndexInside;if(...
  function Ct (line 23) | function Ct(){var r="__ec_inner_"+wk++;return function(e){return e[r]||(...
  function Ls (line 23) | function Ls(r,e,t){var a=Pg(e,t),n=a.mainTypeSpecified,i=a.queryOptionMa...
  function Pg (line 23) | function Pg(r,e){var t;if(U(r)){var a={};a[r+"Index"]=0,t=a}else t=r;var...
  function wl (line 23) | function wl(r,e,t,a){a=a||Qt;var n=t.index,i=t.id,o=t.name,s={models:nul...
  function I2 (line 23) | function I2(r,e,t){r.setAttribute?r.setAttribute(e,t):r[e]=t}
  function Ck (line 23) | function Ck(r,e){return r.getAttribute?r.getAttribute(e):r[e]}
  function Tk (line 23) | function Tk(r){return r==="auto"?At.domSupported?"html":"richText":r||"h...
  function Xd (line 23) | function Xd(r,e){var t=q(),a=[];return A(r,function(n){var i=e(n);(t.get...
  function P2 (line 23) | function P2(r,e,t,a,n){var i=e==null||e==="auto";if(a==null)return a;if(...
  function Hr (line 23) | function Hr(r){var e={main:"",sub:""};if(r){var t=r.split(Ak);e.main=t[0...
  function Dk (line 23) | function Dk(r){Me(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(r),'componen...
  function Mk (line 23) | function Mk(r){return!!(r&&r[R2])}
  function Rg (line 23) | function Rg(r,e){r.$constructor=r,r.extend=function(t){var a=this,n;retu...
  function Lk (line 23) | function Lk(r){return J(r)&&/^class\s/.test(Function.prototype.toString....
  function E2 (line 23) | function E2(r,e){r.extend=e.extend}
  function Pk (line 23) | function Pk(r){var e=["__\0is_clz",Ik++].join("_");r.prototype[e]=!0,r.i...
  function Rk (line 23) | function Rk(r,e){for(var t=[],a=2;a<arguments.length;a++)t[a-2]=argument...
  function Ek (line 23) | function Ek(r,e,t){return this.superClass.prototype[e].apply(r,t)}
  function mh (line 23) | function mh(r){var e={};r.registerClass=function(a){var n=a.type||a.prot...
  function pi (line 23) | function pi(r,e){for(var t=0;t<r.length;t++)r[t][1]||(r[t][1]=r[t][0]);r...
  function r (line 23) | function r(){}
  function Nk (line 23) | function Nk(r){if(typeof r=="string"){var e=qd.get(r);return e&&e.image}...
  function Eg (line 23) | function Eg(r,e,t,a,n){if(r)if(typeof r=="string"){if(e&&e.__zrImageSrc=...
  function v0 (line 23) | function v0(){var r=this.__cachedImgObj;this.onload=this.onerror=this.__...
  function _h (line 23) | function _h(r){return r&&r.width&&r.height}
  function Vk (line 23) | function Vk(r,e,t,a,n){if(!e)return"";var i=(r+"").split(`
  function k2 (line 25) | function k2(r,e,t,a){a=a||{};var n=V({},a);n.font=e,t=ft(t,"..."),n.maxI...
  function O2 (line 25) | function O2(r,e){var t=e.containerWidth,a=e.font,n=e.contentWidth;if(!t)...
  function zk (line 25) | function zk(r,e,t,a){for(var n=0,i=0,o=r.length;i<o&&n<e;i++){var s=r.ch...
  function Fk (line 25) | function Fk(r,e){r!=null&&(r+="");var t=e.overflow,a=e.padding,n=e.font,...
  function r (line 26) | function r(){}
  function r (line 26) | function r(e){this.tokens=[],e&&(this.tokens=e)}
  function r (line 26) | function r(){this.width=0,this.height=0,this.contentWidth=0,this.content...
  function Wk (line 26) | function Wk(r,e){var t=new Hk;if(r!=null&&(r+=""),!r)return t;for(var a=...
  function wv (line 26) | function wv(r,e,t,a,n){var i=e==="",o=n&&t.rich[n]||{},s=r.lines,l=o.fon...
  function $k (line 28) | function $k(r){var e=r.charCodeAt(0);return e>=32&&e<=591||e>=880&&e<=43...
  function Yk (line 28) | function Yk(r){return $k(r)?!!Uk[r]:!0}
  function B2 (line 28) | function B2(r,e,t,a,n){for(var i=[],o=[],s="",l="",u=0,f=0,h=0;h<r.lengt...
  function e (line 29) | function e(t){return r.call(this,t)||this}
  function qk (line 29) | function qk(r,e,t){return bv.copy(r.getBoundingRect()),r.transform&&bv.a...
  function xh (line 29) | function xh(r,e,t){if(r.length!==0){for(var a=r[0],n=a[0],i=a[0],o=a[1],...
  function p0 (line 29) | function p0(r,e,t,a,n,i){n[0]=Oe(r,t),n[1]=Oe(e,a),i[0]=Be(r,t),i[1]=Be(...
  function Kk (line 29) | function Kk(r,e,t,a,n,i,o,s,l,u){var f=jb,h=ae,v=f(r,t,n,o,g0);l[0]=1/0,...
  function Jk (line 29) | function Jk(r,e,t,a,n,i,o,s){var l=e2,u=se,f=Be(Oe(l(r,t,n),1),0),h=Be(O...
  function Qk (line 29) | function Qk(r,e,t,a,n,i,o,s,l){var u=Ha,f=Wa,h=Math.abs(n-i);if(h%xn<1e-...
  function Iv (line 29) | function Iv(r){var e=Math.round(r/Jd*1e8)/1e8;return e%2*Jd}
  function N2 (line 29) | function N2(r,e){var t=Iv(r[0]);t<0&&(t+=Na);var a=t-r[0],n=r[1];n+=a,!e...
  function r (line 29) | function r(e){this.dpr=1,this._xi=0,this._yi=0,this._x0=0,this._y0=0,thi...
  function za (line 29) | function za(r,e,t,a,n,i,o){if(n===0)return!1;var s=n,l=0,u=r;if(o>e+s&&o...
  function jk (line 29) | function jk(r,e,t,a,n,i,o,s,l,u,f){if(l===0)return!1;var h=l;if(f>e+h&&f...
  function V2 (line 29) | function V2(r,e,t,a,n,i,o,s,l){if(o===0)return!1;var u=o;if(l>e+u&&l>a+u...
  function xr (line 29) | function xr(r){return r%=m0,r<0&&(r+=m0),r}
  function t5 (line 29) | function t5(r,e,t,a,n,i,o,s,l){if(o===0)return!1;var u=o;s-=r,l-=e;var f...
  function sa (line 29) | function sa(r,e,t,a,n,i){if(i>e&&i>a||i<e&&i<a||a===e)return 0;var o=(i-...
  function r5 (line 29) | function r5(r,e){return Math.abs(r-e)<e5}
  function a5 (line 29) | function a5(){var r=je[0];je[0]=je[1],je[1]=r}
  function n5 (line 29) | function n5(r,e,t,a,n,i,o,s,l,u){if(u>e&&u>a&&u>i&&u>s||u<e&&u<a&&u<i&&u...
  function i5 (line 29) | function i5(r,e,t,a,n,i,o,s){if(s>e&&s>a&&s>i||s<e&&s<a&&s<i)return 0;va...
  function o5 (line 29) | function o5(r,e,t,a,n,i,o,s){if(s-=e,s>t||s<-t)return 0;var l=Math.sqrt(...
  function z2 (line 29) | function z2(r,e,t,a,n){for(var i=r.data,o=r.len(),s=0,l=0,u=0,f=0,h=0,v,...
  function s5 (line 29) | function s5(r,e,t){return z2(r,0,!1,e,t)}
  function l5 (line 29) | function l5(r,e,t,a){return z2(r,e,!0,t,a)}
  function e (line 29) | function e(t){return r.call(this,t)||this}
  function o (line 29) | function o(s){var l=i.call(this,s)||this;return t.init&&t.init.call(l,s),l}
  function e (line 29) | function e(){return r!==null&&r.apply(this,arguments)||this}
  function d5 (line 29) | function d5(r){return!!(r&&typeof r!="string"&&r.width&&r.height)}
  function e (line 29) | function e(){return r!==null&&r.apply(this,arguments)||this}
  function p5 (line 29) | function p5(r,e){var t=e.x,a=e.y,n=e.width,i=e.height,o=e.r,s,l,u,f;n<0&...
  function H2 (line 29) | function H2(r,e,t){if(!!e){var a=e.x1,n=e.x2,i=e.y1,o=e.y2;r.x1=a,r.x2=n...
  function W2 (line 29) | function W2(r,e,t){if(!!e){var a=e.x,n=e.y,i=e.width,o=e.height;r.x=a,r....
  function Kn (line 29) | function Kn(r,e,t){if(!e)return r;var a=ao(r*2);return(a+ao(e))%2===0?a/...
  function r (line 29) | function r(){this.x=0,this.y=0,this.width=0,this.height=0}
  function e (line 29) | function e(t){return r.call(this,t)||this}
  function e (line 29) | function e(t){var a=r.call(this)||this;return a.type="text",a._children=...
  function Y2 (line 29) | function Y2(r){return typeof r=="string"&&(r.indexOf("px")!==-1||r.index...
  function w0 (line 29) | function w0(r,e){for(var t=0;t<x0.length;t++){var a=x0[t],n=e[a];n!=null...
  function Z2 (line 29) | function Z2(r){return r.fontSize!=null||r.fontFamily||r.fontWeight}
  function x5 (line 29) | function x5(r){return b0(r),A(r.rich,b0),r}
  function b0 (line 29) | function b0(r){if(r){r.font=U2.makeFont(r);var e=r.align;e==="middle"&&(...
  function C0 (line 29) | function C0(r,e){return r==null||e<=0||r==="transparent"||r==="none"?nul...
  function T0 (line 29) | function T0(r){return r==null||r==="none"?null:r.image||r.colorStops?"#0...
  function A0 (line 29) | function A0(r,e,t){return e==="right"?r-t[1]:e==="center"?r+t[3]/2-t[1]/...
  function D0 (line 29) | function D0(r){var e=r.text;return e!=null&&(e+=""),e}
  function Rv (line 29) | function Rv(r){return!!(r.backgroundColor||r.lineHeight||r.borderWidth&&...
  function ki (line 29) | function ki(r){return r!=null&&r!=="none"}
  function P0 (line 29) | function P0(r){if(U(r)){var e=I0.get(r);return e||(e=Vd(r,-.1),I0.put(r,...
  function bh (line 29) | function bh(r,e,t){r.onHoverStateChange&&(r.hoverState||0)!==t&&r.onHove...
  function q2 (line 29) | function q2(r){bh(r,"emphasis",wh)}
  function K2 (line 29) | function K2(r){r.hoverState===wh&&bh(r,"normal",Og)}
  function Bg (line 29) | function Bg(r){bh(r,"blur",bl)}
  function J2 (line 29) | function J2(r){r.hoverState===bl&&bh(r,"normal",Og)}
  function b5 (line 29) | function b5(r){r.selected=!0}
  function C5 (line 29) | function C5(r){r.selected=!1}
  function R0 (line 29) | function R0(r,e,t){e(r,t)}
  function Ca (line 29) | function Ca(r,e,t){R0(r,e,t),r.isGroup&&r.traverse(function(a){R0(a,e,t)})}
  function Af (line 29) | function Af(r,e){switch(e){case"emphasis":r.hoverState=wh;break;case"nor...
  function T5 (line 29) | function T5(r,e,t,a){for(var n=r.style,i={},o=0;o<e.length;o++){var s=e[...
  function A5 (line 29) | function A5(r,e,t,a){var n=t&&dt(t,"select")>=0,i=!1;if(r instanceof mt)...
  function D5 (line 29) | function D5(r,e,t){if(t&&t.z2==null){t=V({},t);var a=r.z2SelectLift;t.z2...
  function M5 (line 29) | function M5(r,e,t){var a=dt(r.currentStates,e)>=0,n=r.style.opacity,i=a?...
  function Ev (line 29) | function Ev(r,e){var t=this.states[r];if(this.style){if(r==="emphasis")r...
  function gi (line 29) | function gi(r){r.stateProxy=Ev;var e=r.getTextContent(),t=r.getTextGuide...
  function E0 (line 29) | function E0(r,e){!eC(r,e)&&!r.__highByOuter&&Ca(r,q2)}
  function k0 (line 29) | function k0(r,e){!eC(r,e)&&!r.__highByOuter&&Ca(r,K2)}
  function _a (line 29) | function _a(r,e){r.__highByOuter|=1<<(e||0),Ca(r,q2)}
  function Sa (line 29) | function Sa(r,e){!(r.__highByOuter&=~(1<<(e||0)))&&Ca(r,K2)}
  function Q2 (line 29) | function Q2(r){Ca(r,Bg)}
  function Ng (line 29) | function Ng(r){Ca(r,J2)}
  function j2 (line 29) | function j2(r){Ca(r,b5)}
  function tC (line 29) | function tC(r){Ca(r,C5)}
  function eC (line 29) | function eC(r,e){return r.__highDownSilentOnTouch&&e.zrByTouch}
  function rC (line 29) | function rC(r){var e=r.getModel(),t=[],a=[];e.eachComponent(function(n,i...
  function jd (line 29) | function jd(r,e,t,a){var n=a.getModel();t=t||"coordinateSystem";function...
  function tp (line 29) | function tp(r,e,t){if(!(r==null||e==null)){var a=t.getModel().getCompone...
  function L5 (line 29) | function L5(r,e,t){var a=r.seriesIndex,n=r.getData(e.dataType);if(!!n){v...
  function Vg (line 29) | function Vg(r,e,t,a){var n={focusSelf:!1,dispatchers:null};if(r==null||r...
  function I5 (line 29) | function I5(r,e,t){var a=it(r),n=Vg(a.componentMainType,a.componentIndex...
  function P5 (line 29) | function P5(r,e,t){rC(t);var a=it(r),n=Vg(a.componentMainType,a.componen...
  function R5 (line 29) | function R5(r,e,t){if(!!rp(e)){var a=e.dataType,n=r.getData(a),i=di(n,e)...
  function O0 (line 29) | function O0(r){var e=r.getAllData();A(e,function(t){var a=t.data,n=t.typ...
  function E5 (line 29) | function E5(r){var e=[];return r.eachSeries(function(t){var a=t.getAllDa...
  function si (line 29) | function si(r,e,t){Jn(r,!0),Ca(r,gi),ep(r,e,t)}
  function k5 (line 29) | function k5(r){Jn(r,!1)}
  function $t (line 29) | function $t(r,e,t,a){a?k5(r):si(r,e,t)}
  function ep (line 29) | function ep(r,e,t){var a=it(r);e!=null?(a.focus=e,a.blurScope=t):a.focus...
  function ce (line 29) | function ce(r,e,t,a){t=t||"itemStyle";for(var n=0;n<B0.length;n++){var i...
  function Jn (line 29) | function Jn(r,e){var t=e===!1,a=r;r.highDownSilentOnTouch&&(a.__highDown...
  function Ks (line 29) | function Ks(r){return!!(r&&r.__highDownDispatcher)}
  function B5 (line 29) | function B5(r,e,t){var a=it(r);a.componentMainType=e.mainType,a.componen...
  function N5 (line 29) | function N5(r){var e=L0[r];return e==null&&M0<=32&&(e=L0[r]=M0++),e}
  function rp (line 29) | function rp(r){var e=r.type;return e===Is||e===rf||e===Ps}
  function N0 (line 29) | function N0(r){var e=r.type;return e===oi||e===ef}
  function V5 (line 29) | function V5(r){var e=X2(r);e.normalFill=r.style.fill,e.normalStroke=r.st...
  function aC (line 29) | function aC(r,e){if(!!e){var t=r.data,a=r.len(),n,i,o,s,l,u,f=Oi.M,h=Oi....
  function z0 (line 29) | function z0(r){return Math.sqrt(r[0]*r[0]+r[1]*r[1])}
  function ap (line 29) | function ap(r,e){return(r[0]*e[0]+r[1]*e[1])/(z0(r)*z0(e))}
  function F0 (line 29) | function F0(r,e){return(r[0]*e[1]<r[1]*e[0]?-1:1)*Math.acos(ap(r,e))}
  function G0 (line 29) | function G0(r,e,t,a,n,i,o,s,l,u,f){var h=l*(Uo/180),v=ru(h)*(r-t)/2+eu(h...
  function W5 (line 29) | function W5(r){var e=new Jr;if(!r)return e;var t=0,a=0,n=t,i=a,o,s=Jr.CM...
  function e (line 29) | function e(){return r!==null&&r.apply(this,arguments)||this}
  function iC (line 29) | function iC(r){return r.setData!=null}
  function oC (line 29) | function oC(r,e){var t=W5(r),a=V({},e);return a.buildPath=function(n){if...
  function sC (line 29) | function sC(r,e){return new nC(oC(r,e))}
  function $5 (line 29) | function $5(r,e){var t=oC(r,e),a=function(n){k(i,n);function i(o){var s=...
  function U5 (line 29) | function U5(r,e){for(var t=[],a=r.length,n=0;n<a;n++){var i=r[n];t.push(...
  function zg (line 29) | function zg(r,e){e=e||{};var t=new mt;return r.shape&&t.setShape(r.shape...
  function r (line 29) | function r(){this.cx=0,this.cy=0,this.r=0}
  function e (line 29) | function e(t){return r.call(this,t)||this}
  function r (line 29) | function r(){this.cx=0,this.cy=0,this.rx=0,this.ry=0}
  function e (line 29) | function e(t){return r.call(this,t)||this}
  function q5 (line 29) | function q5(r,e,t,a,n,i,o,s){var l=t-r,u=a-e,f=o-n,h=s-i,v=h*l-f*u;if(!(...
  function au (line 29) | function au(r,e,t,a,n,i,o){var s=r-t,l=e-a,u=(o?i:-i)/Rs(s*s+l*l),f=u*l,...
  function K5 (line 29) | function K5(r){var e;if(F(r)){var t=r.length;if(!t)return r;t===1?e=[r[0...
  function J5 (line 29) | function J5(r,e){var t,a=gs(e.r,0),n=gs(e.r0||0,0),i=a>0,o=n>0;if(!(!i&&...
  function r (line 29) | function r(){this.cx=0,this.cy=0,this.r0=0,this.r=0,this.startAngle=0,th...
  function e (line 29) | function e(t){return r.call(this,t)||this}
  function r (line 29) | function r(){this.cx=0,this.cy=0,this.r=0,this.r0=0}
  function e (line 29) | function e(t){return r.call(this,t)||this}
  function t3 (line 29) | function t3(r,e,t,a){var n=[],i=[],o=[],s=[],l,u,f,h;if(a){f=[1/0,1/0],h...
  function cC (line 29) | function cC(r,e,t){var a=e.smooth,n=e.points;if(n&&n.length>=2){if(a){va...
  function r (line 29) | function r(){this.points=null,this.smooth=0,this.smoothConstraint=null}
  function e (line 29) | function e(t){return r.call(this,t)||this}
  function r (line 29) | function r(){this.points=null,this.percent=1,this.smooth=0,this.smoothCo...
  function e (line 29) | function e(t){return r.call(this,t)||this}
  function r (line 29) | function r(){this.x1=0,this.y1=0,this.x2=0,this.y2=0,this.percent=1}
  function e (line 29) | function e(t){return r.call(this,t)||this}
  function r (line 29) | function r(){this.x1=0,this.y1=0,this.x2=0,this.y2=0,this.cpx1=0,this.cp...
  function W0 (line 29) | function W0(r,e,t){var a=r.cpx2,n=r.cpy2;return a!=null||n!=null?[(t?Ym:...
  function e (line 29) | function e(t){return r.call(this,t)||this}
  function r (line 29) | function r(){this.cx=0,this.cy=0,this.r=0,this.startAngle=0,this.endAngl...
  function e (line 29) | function e(t){return r.call(this,t)||this}
  function e (line 29) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function r (line 29) | function r(e){this.colorStops=e||[]}
  function e (line 29) | function e(t,a,n,i,o,s){var l=r.call(this,o)||this;return l.x=t==null?0:...
  function e (line 29) | function e(t,a,n,i,o){var s=r.call(this,i)||this;return s.x=t==null?.5:t...
  function r (line 29) | function r(e,t){this._corners=[],this._axes=[],this._origin=[0,0];for(va...
  function e (line 29) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.notC...
  function Ao (line 29) | function Ao(r,e,t,a,n){var i;if(e&&e.ecModel){var o=e.ecModel.getUpdateP...
  function Wg (line 29) | function Wg(r,e,t,a,n,i,o){var s=!1,l;J(n)?(o=i,i=n,n=null):et(n)&&(i=n....
  function Lt (line 29) | function Lt(r,e,t,a,n,i){Wg("update",r,e,t,a,n,i)}
  function Ft (line 29) | function Ft(r,e,t,a,n,i){Wg("enter",r,e,t,a,n,i)}
  function so (line 29) | function so(r){if(!r.__zr)return!0;for(var e=0;e<r.animators.length;e++)...
  function rn (line 29) | function rn(r,e,t,a,n,i){so(r)||Wg("leave",r,e,t,a,n,i)}
  function $0 (line 29) | function $0(r,e,t,a){r.removeTextContent(),r.removeTextGuideLine(),rn(r,...
  function Js (line 29) | function Js(r,e,t){function a(){r.parent&&r.parent.remove(r)}r.isGroup?r...
  function Ar (line 29) | function Ar(r){xC(r).oldStyle=r.style}
  function p3 (line 29) | function p3(r){return xC(r).oldStyle}
  function g3 (line 29) | function g3(r){return mt.extend(r)}
  function m3 (line 29) | function m3(r,e){return y3(r,e)}
  function Dr (line 29) | function Dr(r,e){np[r]=e}
  function $g (line 29) | function $g(r){if(np.hasOwnProperty(r))return np[r]}
  function Ah (line 29) | function Ah(r,e,t,a){var n=sC(r,e);return t&&(a==="center"&&(t=bC(t,n.ge...
  function wC (line 29) | function wC(r,e,t){var a=new pe({style:{image:r,x:e.x,y:e.y,width:e.widt...
  function bC (line 29) | function bC(r,e){var t=e.width/e.height,a=r.height*t,n;a<=r.width?n=r.he...
  function CC (line 29) | function CC(r,e){if(!!r.applyTransform){var t=r.getBoundingRect(),a=t.ca...
  function ho (line 29) | function ho(r,e){return H2(r,r,{lineWidth:e}),r}
  function _3 (line 29) | function _3(r){return W2(r.shape,r.shape,r.style),r}
  function li (line 29) | function li(r,e){for(var t=ph([]);r&&r!==e;)ha(t,r.getLocalTransform(),t...
  function Cr (line 29) | function Cr(r,e,t){return e&&!Se(e)&&(e=la.getLocalTransform(e)),t&&(e=b...
  function Dh (line 29) | function Dh(r,e,t){var a=e[4]===0||e[5]===0||e[0]===0?1:Math.abs(2*e[4]/...
  function U0 (line 29) | function U0(r){return!r.isGroup}
  function S3 (line 29) | function S3(r){return r.shape!=null}
  function Tl (line 29) | function Tl(r,e,t){if(!r||!e)return;function a(o){var s={};return o.trav...
  function TC (line 29) | function TC(r,e){return G(r,function(t){var a=t[0];a=Mf(a,e.x),a=Lf(a,e....
  function x3 (line 29) | function x3(r,e){var t=Mf(r.x,e.x),a=Lf(r.x+r.width,e.x+e.width),n=Mf(r....
  function Al (line 29) | function Al(r,e,t){var a=V({rectHover:!0},e),n=a.style={strokeNoScale:!0...
  function ys (line 29) | function ys(r,e,t,a,n){for(var i=0,o=n[n.length-1];i<n.length;i++){var s...
  function AC (line 29) | function AC(r,e,t,a,n,i,o,s){var l=t-r,u=a-e,f=o-n,h=s-i,v=Bv(f,h,l,u);i...
  function Bv (line 29) | function Bv(r,e,t,a){return r*a-t*e}
  function w3 (line 29) | function w3(r){return r<=1e-6&&r>=-1e-6}
  function Do (line 29) | function Do(r){var e=r.itemTooltipOption,t=r.componentModel,a=r.itemName...
  function Y0 (line 29) | function Y0(r,e){var t;r.isGroup&&(t=e(r)),t||r.traverse(e)}
  function vn (line 29) | function vn(r,e){if(r)if(F(r))for(var t=0;t<r.length;t++)Y0(r[t],e);else...
  function DC (line 29) | function DC(r,e){for(var t=0;t<Le.length;t++){var a=Le[t],n=e[a],i=r.ens...
  function ip (line 29) | function ip(r,e,t){var a=r.labelFetcher,n=r.labelDataIndex,i=r.labelDimI...
  function de (line 29) | function de(r,e,t,a){t=t||Mh;for(var n=r instanceof Dt,i=!1,o=0;o<qs.len...
  function ie (line 29) | function ie(r,e){e=e||"label";for(var t={normal:r.getModel(e)},a=0;a<Le....
  function Nt (line 29) | function Nt(r,e,t,a,n){var i={};return b3(i,r,t,a,n),e&&V(i,e),i}
  function If (line 29) | function If(r,e,t){e=e||{};var a={},n,i=r.getShallow("rotate"),o=ft(r.ge...
  function b3 (line 29) | function b3(r,e,t,a,n){t=t||Mh;var i=e.ecModel,o=i&&i.option.textStyle,s...
  function C3 (line 29) | function C3(r){for(var e;r&&r!==r.ecModel;){var t=(r.option||Mh).rich;if...
  function K0 (line 29) | function K0(r,e,t,a,n,i,o,s){t=!n&&t||Mh;var l=a&&a.inheritColor,u=e.get...
  function MC (line 29) | function MC(r,e){var t=e&&e.getModel("textStyle");return Sr([r.fontStyle...
  function LC (line 29) | function LC(r,e,t,a){if(!!r){var n=Mo(r);n.prevValue=n.value,n.value=t;v...
  function IC (line 29) | function IC(r,e,t,a,n){var i=Mo(r);if(!i.valueAnimation||i.prevValue===i...
  function r (line 29) | function r(){}
  function r (line 29) | function r(){}
  function r (line 29) | function r(){}
  function r (line 29) | function r(e,t,a){this.parentModel=t,this.ecModel=a,this.option=e}
  function Lo (line 29) | function Lo(r){return[r||"",R3++].join("_")}
  function E3 (line 29) | function E3(r){var e={};r.registerSubTypeDefaulter=function(t,a){var n=H...
  function k3 (line 29) | function k3(r,e){r.topologicalTravel=function(i,o,s,l){if(!i.length)retu...
  function cn (line 29) | function cn(r,e){return ht(ht({},r,!0),e,!0)}
  function kC (line 29) | function kC(r,e){r=r.toUpperCase(),Yg[r]=new Vt(e),nf[r]=e}
  function N3 (line 29) | function N3(r){if(U(r)){var e=nf[r.toUpperCase()]||{};return r===Pf||r==...
  function op (line 29) | function op(r){return Yg[r]}
  function V3 (line 29) | function V3(){return Yg[Qs]}
  function Ia (line 29) | function Ia(r,e){return r+="","0000".substr(0,e-r.length)+r}
  function lo (line 29) | function lo(r){switch(r){case"half-year":case"quarter":return"month";cas...
  function z3 (line 29) | function z3(r){return r===lo(r)}
  function F3 (line 29) | function F3(r){switch(r){case"year":case"month":return"day";case"millise...
  function Lh (line 29) | function Lh(r,e,t,a){var n=Kr(r),i=n[qg(t)](),o=n[uo(t)]()+1,s=Math.floo...
  function G3 (line 29) | function G3(r,e,t,a,n){var i=null;if(U(t))i=t;else if(J(t))i=t(r.value,e...
  function BC (line 29) | function BC(r,e){var t=Kr(r),a=t[uo(e)]()+1,n=t[Ih(e)](),i=t[js(e)](),o=...
  function j0 (line 29) | function j0(r,e,t){var a=Mt(r)?Kr(r):r;switch(e=e||BC(r,t),e){case"year"...
  function qg (line 29) | function qg(r){return r?"getUTCFullYear":"getFullYear"}
  function uo (line 29) | function uo(r){return r?"getUTCMonth":"getMonth"}
  function Ih (line 29) | function Ih(r){return r?"getUTCDate":"getDate"}
  function js (line 29) | function js(r){return r?"getUTCHours":"getHours"}
  function Ph (line 29) | function Ph(r){return r?"getUTCMinutes":"getMinutes"}
  function Rh (line 29) | function Rh(r){return r?"getUTCSeconds":"getSeconds"}
  function Eh (line 29) | function Eh(r){return r?"getUTCMilliseconds":"getMilliseconds"}
  function H3 (line 29) | function H3(r){return r?"setUTCFullYear":"setFullYear"}
  function NC (line 29) | function NC(r){return r?"setUTCMonth":"setMonth"}
  function VC (line 29) | function VC(r){return r?"setUTCDate":"setDate"}
  function zC (line 29) | function zC(r){return r?"setUTCHours":"setHours"}
  function FC (line 29) | function FC(r){return r?"setUTCMinutes":"setMinutes"}
  function GC (line 29) | function GC(r){return r?"setUTCSeconds":"setSeconds"}
  function HC (line 29) | function HC(r){return r?"setUTCMilliseconds":"setMilliseconds"}
  function WC (line 29) | function WC(r){if(!b2(r))return U(r)?r:"-";var e=(r+"").split(".");retur...
  function $C (line 29) | function $C(r,e){return r=(r||"").toLowerCase().replace(/-(.)/g,function...
  function sp (line 29) | function sp(r,e,t){var a="{yyyy}-{MM}-{dd} {HH}:{mm}:{ss}";function n(f)...
  function UC (line 29) | function UC(r,e,t){F(e)||(e=[e]);var a=e.length;if(!a)return"";for(var n...
  function W3 (line 29) | function W3(r,e,t){return A(e,function(a,n){r=r.replace("{"+n+"}",t?ke(a...
  function $3 (line 29) | function $3(r,e){var t=U(r)?{color:r,extraCssText:e}:r||{},a=t.color,n=t...
  function yi (line 29) | function yi(r,e){return e=e||"transparent",U(r)?r:et(r)&&r.colorStops&&(...
  function Rf (line 29) | function Rf(r,e){if(e==="_blank"||e==="blank"){var t=window.open();t.ope...
  function Kg (line 29) | function Kg(r,e,t,a,n){var i=0,o=0;a==null&&(a=1/0),n==null&&(n=1/0);var...
  function U3 (line 29) | function U3(r,e,t){var a=e.width,n=e.height,i=W(r.left,a),o=W(r.top,n),s...
  function re (line 29) | function re(r,e,t){t=Io(t||0);var a=e.width,n=e.height,i=W(r.left,a),o=W...
  function kh (line 29) | function kh(r,e,t,a,n,i){var o=!n||!n.hv||n.hv[0],s=!n||!n.hv||n.hv[1],l...
  function Y3 (line 29) | function Y3(r,e){return r[Qn[e][0]]!=null||r[Qn[e][1]]!=null&&r[Qn[e][2]...
  function tl (line 29) | function tl(r){var e=r.layoutMode||r.constructor.layoutMode;return et(e)...
  function an (line 29) | function an(r,e,t){var a=t&&t.ignoreSize;!F(a)&&(a=[a,a]);var n=o(Qn[0],...
  function Po (line 29) | function Po(r){return ZC({},r)}
  function ZC (line 29) | function ZC(r,e){return e&&r&&of(YC,function(t){e.hasOwnProperty(t)&&(r[...
  function e (line 29) | function e(t,a,n){var i=r.call(this,t,a,n)||this;return i.uid=Lo("ec_cpt...
  function X3 (line 29) | function X3(r){var e=[];return A(Ro.getClassesByMainType(r),function(t){...
  function K3 (line 29) | function K3(r){JC(r).datasetMap=q()}
  function QC (line 29) | function QC(r,e,t){var a={},n=Qg(e);if(!n||!r)return a;var i=[],o=[],s=e...
  function Jg (line 29) | function Jg(r,e,t){var a={},n=Qg(r);if(!n)return a;var i=e.sourceFormat,...
  function Qg (line 29) | function Qg(r){var e=r.get("data",!0);if(!e)return wl(r.ecModel,"dataset...
  function J3 (line 29) | function J3(r){return!r.get("transform",!0)&&!r.get("fromTransformResult...
  function jC (line 29) | function jC(r,e){return tT(r.data,r.sourceFormat,r.seriesLayoutBy,r.dime...
  function tT (line 29) | function tT(r,e,t,a,n,i){var o,s=5;if(Ue(r))return fe.Not;var l,u;if(a){...
  function Q3 (line 29) | function Q3(r,e){Me(lp.get(r)==null&&e),lp.set(r,e)}
  function j3 (line 29) | function j3(r,e,t){var a=lp.get(e);if(!a)return t;var n=a(r);return n?t....
  function r (line 29) | function r(){}
  function up (line 29) | function up(r,e,t,a){var n=kt(r.get(["aria","decal","decals"]));return e...
  function eO (line 29) | function eO(r,e){for(var t=r.length,a=0;a<t;a++)if(r[a].length>e)return ...
  function eT (line 29) | function eT(r,e,t,a,n,i,o){i=i||r;var s=e(i),l=s.paletteIdx||0,u=s.palet...
  function rO (line 29) | function rO(r,e){e(r).paletteIdx=0,e(r).paletteNameMap={}}
  function e (line 29) | function e(){return r!==null&&r.apply(this,arguments)||this}
  function f (line 29) | function f(h){var v=j3(this,h,kt(t[h])),c=i.get(h),d=c?u&&u.get(h)?"repl...
  function s (line 29) | function s(u){var f=n+"Index",h=n+"Id",v=n+"Name";return u&&(u[f]!=null|...
  function l (line 29) | function l(u){return t.filter?Et(u,t.filter):u}
  function nO (line 29) | function nO(r,e){if(e){var t=e.seriesIndex,a=e.seriesId,n=e.seriesName;r...
  function iO (line 29) | function iO(r,e){var t=r.color&&!r.colorLayer;A(e,function(a,n){n==="col...
  function n1 (line 29) | function n1(r,e,t){if(F(e)){var a=q();return A(e,function(i){if(i!=null)...
  function i1 (line 29) | function i1(r,e){return e.hasOwnProperty("subType")?Et(r,function(t){ret...
  function o1 (line 29) | function o1(r){var e=q();return r&&A(kt(r.replaceMerge),function(t){e.se...
  function r (line 29) | function r(e){A(oO,function(t){this[t]=Y(e[t],e)},this)}
  function r (line 29) | function r(){this._coordinateSystems=[]}
  function r (line 29) | function r(e){this._timelineOptions=[],this._mediaList=[],this._currentM...
  function hO (line 29) | function hO(r,e,t){var a=[],n,i,o=r.baseOption,s=r.timeline,l=r.options,...
  function vO (line 29) | function vO(r,e,t){var a={width:e,height:t,aspectratio:e/t},n=!0;return ...
  function cO (line 29) | function cO(r,e,t){return t==="min"?r>=e:t==="max"?r<=e:r===e}
  function dO (line 29) | function dO(r,e){return r.join(",")===e.join(",")}
  function Hv (line 29) | function Hv(r){var e=r&&r.itemStyle;if(!!e)for(var t=0,a=s1.length;t<a;t...
  function _e (line 29) | function _e(r,e,t){if(r&&r[e]&&(r[e].normal||r[e].emphasis)){var a=r[e]....
  function _s (line 29) | function _s(r){_e(r,"itemStyle"),_e(r,"lineStyle"),_e(r,"areaStyle"),_e(...
  function Jt (line 29) | function Jt(r,e){var t=el(r)&&r[e],a=el(t)&&t.textStyle;if(a)for(var n=0...
  function Qe (line 29) | function Qe(r){r&&(_s(r),Jt(r,"label"),r.emphasis&&Jt(r.emphasis,"label"))}
  function gO (line 29) | function gO(r){if(!!el(r)){Hv(r),_s(r),Jt(r,"label"),Jt(r,"upperLabel"),...
  function na (line 29) | function na(r){return F(r)?r:r?[r]:[]}
  function l1 (line 29) | function l1(r){return(F(r)?r[0]:r)||{}}
  function yO (line 29) | function yO(r,e){dr(na(r.series),function(a){el(a)&&gO(a)});var t=["xAxi...
  function mO (line 29) | function mO(r,e){for(var t=e.split(","),a=r,n=0;n<t.length&&(a=a&&a[t[n]...
  function _O (line 29) | function _O(r,e,t,a){for(var n=e.split(","),i=r,o,s=0;s<n.length-1;s++)o...
  function u1 (line 29) | function u1(r){r&&A(SO,function(e){e[0]in r&&!(e[1]in r)&&(r[e[1]]=r[e[0...
  function Zo (line 29) | function Zo(r){var e=r&&r.itemStyle;if(e)for(var t=0;t<Wv.length;t++){va...
  function f1 (line 29) | function f1(r){!r||r.alignTo==="edge"&&r.margin!=null&&r.edgeDistance==n...
  function h1 (line 29) | function h1(r){!r||r.downplay&&!r.blur&&(r.blur=r.downplay)}
  function wO (line 29) | function wO(r){!r||r.focusNodeAdjacency!=null&&(r.emphasis=r.emphasis||{...
  function iT (line 29) | function iT(r,e){if(r)for(var t=0;t<r.length;t++)e(r[t]),r[t]&&iT(r[t].c...
  function oT (line 29) | function oT(r,e){yO(r,e),r.series=kt(r.series),A(r.series,function(t){if...
  function bO (line 29) | function bO(r){var e=q();r.eachSeries(function(t){var a=t.get("stack");i...
  function CO (line 29) | function CO(r){A(r,function(e,t){var a=[],n=[NaN,NaN],i=[e.stackResultDi...
  function r (line 29) | function r(e){this.data=e.data||(e.sourceFormat===jr?{}:[]),this.sourceF...
  function ty (line 29) | function ty(r){return r instanceof Oh}
  function fp (line 29) | function fp(r,e,t){t=t||sT(r);var a=e.seriesLayoutBy,n=AO(r,t,a,e.source...
  function ey (line 29) | function ey(r){return new Oh({data:r,sourceFormat:Ue(r)?Ja:vr})}
  function TO (line 29) | function TO(r){return new Oh({data:r.data,sourceFormat:r.sourceFormat,se...
  function sT (line 29) | function sT(r){var e=KC;if(Ue(r))e=Ja;else if(F(r)){r.length===0&&(e=xe)...
  function AO (line 29) | function AO(r,e,t,a,n){var i,o;if(!r)return{dimensionsDefine:v1(n),start...
  function DO (line 29) | function DO(r){for(var e=0,t;e<r.length&&!(t=r[e++]););if(t)return St(t)}
  function v1 (line 29) | function v1(r){if(!!r){var e=q();return G(r,function(t,a){t=et(t)?t:{nam...
  function c1 (line 29) | function c1(r,e,t,a){if(e===Eo)for(var n=0;n<t.length&&n<a;n++)r(t[n]?t[...
  function lT (line 29) | function lT(r){var e=r.sourceFormat;return e===cr||e===jr}
  function r (line 29) | function r(e,t){var a=ty(e)?e:ey(e);this._source=a;var n=this._data=a.da...
  function i (line 29) | function i(o){for(var s=0;s<o.length;s++)this._data.push(o[s])}
  function fT (line 29) | function fT(r,e){var t=MO[ry(r,e)];return t}
  function hT (line 29) | function hT(r,e){var t=LO[ry(r,e)];return t}
  function vT (line 29) | function vT(r){var e=IO[r];return e}
  function ry (line 29) | function ry(r,e){return r===xe?r+"_"+e:r}
  function vo (line 29) | function vo(r,e,t){if(!!r){var a=r.getRawDataItem(e);if(a!=null){var n=r...
  function r (line 29) | function r(){}
  function m1 (line 29) | function m1(r){var e,t;return et(r)?r.type&&(t=r):e=r,{text:e,frag:t}}
  function ks (line 29) | function ks(r){return new RO(r)}
  function r (line 29) | function r(e){e=e||{},this._reset=e.reset,this._plan=e.plan,this._count=...
  function f (line 29) | function f(m){return!(m>=1)&&(m=1),m}
  function o (line 29) | function o(){return e<r?e++:null}
  function s (line 29) | function s(){var l=e%n*t+Math.ceil(e/n),u=e>=r?null:l<a?l:e;return e++,u}
  function Qa (line 29) | function Qa(r,e){var t=e&&e.type;return t==="ordinal"?r:(t==="time"&&!Mt...
  function cT (line 29) | function cT(r){return EO.get(r)}
  function r (line 29) | function r(e,t){if(!Mt(t)){var a="";Pt(a)}this._opFn=dT[e],this._rvalFlo...
  function r (line 29) | function r(e,t){var a=e==="desc";this._resultLT=a?1:-1,t==null&&(t=a?"mi...
  function r (line 29) | function r(e,t){this._rval=t,this._isEQ=e,this._rvalTypeof=typeof t,this...
  function BO (line 29) | function BO(r,e){return r==="eq"||r==="ne"?new OO(r==="eq",e):Z(dT,r)?ne...
  function r (line 29) | function r(){}
  function VO (line 29) | function VO(r,e){var t=new NO,a=r.data,n=t.sourceFormat=r.sourceFormat,i...
  function zO (line 29) | function zO(r){var e=r.sourceFormat;if(!ny(e)){var t="";Pt(t)}return r.d...
  function FO (line 29) | function FO(r){var e=r.sourceFormat,t=r.data;if(!ny(e)){var a="";Pt(a)}i...
  function GO (line 29) | function GO(r,e,t){if(t!=null){if(Mt(t)||!isNaN(t)&&!Z(e,t))return r[t];...
  function HO (line 29) | function HO(r){return at(r)}
  function WO (line 29) | function WO(r){r=at(r);var e=r.type,t="";e||Pt(t);var a=e.split(":");a.l...
  function $O (line 29) | function $O(r,e,t){var a=kt(r),n=a.length,i="";n||Pt(i);for(var o=0,s=n;...
  function UO (line 29) | function UO(r,e,t,a){var n="";e.length||Pt(n),et(r)||Pt(n);var i=r.type,...
  function ny (line 29) | function ny(r){return r===xe||r===cr}
  function Xo (line 29) | function Xo(r){return r>65535?YO:ZO}
  function Vi (line 29) | function Vi(){return[1/0,-1/0]}
  function XO (line 29) | function XO(r){var e=r.constructor;return e===Array?r.slice():new e(r)}
  function x1 (line 29) | function x1(r,e,t,a,n){var i=mT[t||"float"];if(n){var o=r[e],s=o&&o.leng...
  function r (line 29) | function r(){this._chunks=[],this._rawExtent=[],this._extent=[],this._co...
  function e (line 29) | function e(t,a,n,i){return Qa(t[i],this._dimensions[i])}
  function r (line 29) | function r(e){this._sourceList=[],this._storeList=[],this._upstreamSignL...
  function w1 (line 29) | function w1(r){var e=r.option.transform;e&&pf(r.option.transform)}
  function lu (line 29) | function lu(r){return r.mainType==="series"}
  function b1 (line 29) | function b1(r){throw new Error(r)}
  function xT (line 29) | function xT(r,e){var t=r.color||"#6e7079",a=r.fontSize||12,n=r.fontWeigh...
  function oe (line 35) | function oe(r,e){return e.type=r,e}
  function vp (line 35) | function vp(r){return r.type==="section"}
  function wT (line 35) | function wT(r){return vp(r)?JO:QO}
  function bT (line 35) | function bT(r){if(vp(r)){var e=0,t=r.blocks.length,a=t>1||t>0&&!r.noHead...
  function JO (line 35) | function JO(r,e,t,a){var n=e.noHeader,i=jO(bT(e)),o=[],s=e.blocks||[];Me...
  function QO (line 35) | function QO(r,e,t,a){var n=r.renderMode,i=e.noName,o=e.noValue,s=!e.mark...
  function C1 (line 35) | function C1(r,e,t,a,n,i){if(!!r){var o=wT(r),s={useUTC:n,renderMode:t,or...
  function jO (line 35) | function jO(r){return{html:qO[r],richText:KO[r]}}
  function cp (line 35) | function cp(r,e){var t='<div style="clear:both"></div>',a="margin: "+e+"...
  function t4 (line 35) | function t4(r,e,t){var a=e?"margin-left:2px":"";return'<span style="'+t+...
  function e4 (line 35) | function e4(r,e,t,a){var n=t?"10px":"20px",i=e?"float:right;margin-left:...
  function CT (line 35) | function CT(r,e,t){return r.markupStyleCreator.wrapRichTextStyle(e,t)}
  function r4 (line 35) | function r4(r,e,t,a,n){var i=[n],o=a?10:20;return t&&i.push({padding:[0,...
  function TT (line 35) | function TT(r,e){var t=r.getData().getItemVisual(e,"style"),a=t[r.visual...
  function AT (line 35) | function AT(r,e){var t=r.get("padding");return t!=null?t:e==="richText"?...
  function r (line 35) | function r(){this.richTextStyles={},this._nextStyleNameId=C2()}
  function DT (line 35) | function DT(r){var e=r.series,t=r.dataIndex,a=r.multipleSeries,n=e.getDa...
  function a4 (line 35) | function a4(r,e,t,a,n){var i=e.getData(),o=Zr(r,function(h,v,c){var d=i....
  function uu (line 35) | function uu(r,e){return r.getName(e)||r.getId(e)}
  function e (line 35) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t._sel...
  function T1 (line 35) | function T1(r){var e=r.name;Ig(r)||(r.name=n4(r)||e)}
  function n4 (line 35) | function n4(r){var e=r.getRawData(),t=e.mapDimensionsAll("seriesName"),a...
  function i4 (line 35) | function i4(r){return r.model.getRawData().count()}
  function o4 (line 35) | function o4(r){var e=r.model;return e.setData(e.getRawData().cloneShallo...
  function s4 (line 35) | function s4(r,e){e.outputData&&r.end>e.outputData.count()&&e.model.getRa...
  function A1 (line 35) | function A1(r,e){A(gf(r.CHANGABLE_METHODS,r.DOWNSAMPLE_METHODS),function...
  function l4 (line 35) | function l4(r,e){var t=dp(r);return t&&t.setOutputEnd((e||this).count()),e}
  function dp (line 35) | function dp(r){var e=(r.ecModel||{}).scheduler,t=e&&e.getPipeline(r.uid)...
  function r (line 35) | function r(){this.group=new nt,this.uid=Lo("viewComponent")}
  function ko (line 35) | function ko(){var r=Ct();return function(e){var t=r(e),a=e.pipelineConte...
  function r (line 35) | function r(){this.group=new nt,this.uid=Lo("viewChart"),this.renderTask=...
  function D1 (line 35) | function D1(r,e,t){r&&Ks(r)&&(e==="emphasis"?_a:Sa)(r,t)}
  function M1 (line 35) | function M1(r,e,t){var a=di(r,e),n=e&&e.highlightKey!=null?N5(e.highligh...
  function f4 (line 35) | function f4(r){return u4(r.model)}
  function h4 (line 35) | function h4(r){var e=r.model,t=r.ecModel,a=r.api,n=r.payload,i=e.pipelin...
  function sy (line 35) | function sy(r,e,t){var a,n=0,i=0,o=null,s,l,u,f;e=e||0;function h(){i=ne...
  function Oo (line 35) | function Oo(r,e,t,a){var n=r[e];if(!!n){var i=n[Ef]||n,o=n[I1],s=n[L1];i...
  function rl (line 35) | function rl(r,e){var t=r[e];t&&t[Ef]&&(t.clear&&t.clear(),r[e]=t[Ef])}
  function LT (line 35) | function LT(r,e){var t=r.visualStyleMapper||R1[e];return t||(console.war...
  function IT (line 35) | function IT(r,e){var t=r.visualDrawType||c4[e];return t||(console.warn("...
  function y4 (line 35) | function y4(r,e){e=e||{},tt(e,{text:"loading",textColor:"#000",fontSize:...
  function r (line 35) | function r(e,t,a,n){this._stageTaskMap=q(),this.ecInstance=e,this.api=t,...
  function s (line 35) | function s(l,u){return l.setDirty&&(!l.dirtyMap||l.dirtyMap.get(u.__pipe...
  function f (line 35) | function f(h){var v=h.uid,c=s.set(v,o&&o.get(v)||ks({plan:b4,reset:C4,co...
  function d (line 35) | function d(p){var g=p.uid,y=l.set(g,s&&s.get(g)||(v=!0,ks({reset:S4,onDi...
  function _4 (line 35) | function _4(r){r.overallReset(r.ecModel,r.api,r.payload)}
  function S4 (line 35) | function S4(r){return r.overallProgress&&x4}
  function x4 (line 35) | function x4(){this.agent.dirty(),this.getDownstream().dirty()}
  function w4 (line 35) | function w4(){this.agent&&this.agent.dirty()}
  function b4 (line 35) | function b4(r){return r.plan?r.plan(r.model,r.ecModel,r.api,r.payload):n...
  function C4 (line 35) | function C4(r){r.useClearVisual&&r.data.clearAllVisual();var e=r.resetDe...
  function PT (line 35) | function PT(r){return function(e,t){var a=t.data,n=t.resetDefines[r];if(...
  function A4 (line 35) | function A4(r){return r.data.count()}
  function D4 (line 35) | function D4(r){kf=null;try{r(al,RT)}catch(e){}return kf}
  function ET (line 35) | function ET(r,e){for(var t in e.prototype)r[t]=Kt}
  function r (line 35) | function r(){}
  function f (line 35) | function f(h,v,c,d){return h[c]==null||v[d||c]===h[c]}
  function f (line 35) | function f(h,v){for(var c=r.getRawValue(v),d=r.getDataParams(v),p=0;p<u....
  function a (line 35) | function a(n,i){for(var o=n.getItemModel(i),s=0;s<B1.length;s++){var l=B...
  function ly (line 35) | function ly(r,e,t){switch(t){case"color":var a=r.getItemVisual(e,"style"...
  function Ll (line 35) | function Ll(r,e){switch(e){case"color":var t=r.getVisual("style");return...
  function BT (line 35) | function BT(r,e,t,a){switch(t){case"color":var n=r.ensureUniqueItemVisua...
  function NT (line 35) | function NT(r,e){function t(a,n){var i=[];return a.eachComponent({mainTy...
  function zi (line 35) | function zi(r,e,t,a,n){var i=r+e;t.isSilent(i)||a.eachComponent({mainTyp...
  function E4 (line 35) | function E4(r,e,t){r.on("selectchanged",function(a){var n=t.getModel();a...
  function jn (line 35) | function jn(r,e,t){for(var a;r&&!(e(r)&&(a=r,t));)r=r.__hostTarget||r.pa...
  function r (line 35) | function r(){this._id="__ec_inner_"+k4++}
  function U4 (line 35) | function U4(r,e){if(this.type!=="image"){var t=this.style;this.__isEmpty...
  function jt (line 35) | function jt(r,e,t,a,n,i,o){var s=r.indexOf("empty")===0;s&&(r=r.substr(5...
  function Bo (line 35) | function Bo(r){return F(r)||(r=[+r,+r]),[r[0]||0,r[1]||0]}
  function Ti (line 35) | function Ti(r,e){if(r!=null)return F(r)||(r=[r,r]),[W(r[0],e[0])||0,W(ft...
  function ti (line 35) | function ti(r){return isFinite(r)}
  function Y4 (line 35) | function Y4(r,e,t){var a=e.x==null?0:e.x,n=e.x2==null?1:e.x2,i=e.y==null...
  function Z4 (line 35) | function Z4(r,e,t){var a=t.width,n=t.height,i=Math.min(a,n),o=e.x==null?...
  function gp (line 35) | function gp(r,e,t){for(var a=e.type==="radial"?Z4(r,e,t):Y4(r,e,t),n=e.c...
  function X4 (line 35) | function X4(r,e){if(r===e||!r&&!e)return!1;if(!r||!e||r.length!==e.lengt...
  function vu (line 35) | function vu(r){return parseInt(r,10)}
  function no (line 35) | function no(r,e,t){var a=["width","height"][e],n=["clientWidth","clientH...
  function q4 (line 35) | function q4(r,e){return!r||r==="solid"||!(e>0)?null:r==="dashed"?[4*e,2*...
  function uy (line 35) | function uy(r){var e=r.style,t=e.lineDash&&e.lineWidth>0&&q4(e.lineDash,...
  function Bf (line 35) | function Bf(r){var e=r.stroke;return!(e==null||e==="none"||!(r.lineWidth...
  function N1 (line 35) | function N1(r){return typeof r=="string"&&r!=="none"}
  function Nf (line 35) | function Nf(r){var e=r.fill;return e!=null&&e!=="none"}
  function V1 (line 35) | function V1(r,e){if(e.fillOpacity!=null&&e.fillOpacity!==1){var t=r.glob...
  function z1 (line 35) | function z1(r,e){if(e.strokeOpacity!=null&&e.strokeOpacity!==1){var t=r....
  function yp (line 35) | function yp(r,e,t){var a=Eg(e.image,e.__image,t);if(_h(a)){var n=r.creat...
  function J4 (line 35) | function J4(r,e,t,a){var n,i=Bf(t),o=Nf(t),s=t.strokePercent,l=s<1,u=!e....
  function Q4 (line 35) | function Q4(r,e,t){var a=e.__image=Eg(t.image,e.__image,e,e.onload);if(!...
  function j4 (line 35) | function j4(r,e,t){var a,n=t.text;if(n!=null&&(n+=""),n){r.font=t.font||...
  function VT (line 35) | function VT(r,e,t,a,n){var i=!1;if(!a&&(t=t||{},e===t))return!1;if(a||e....
  function H1 (line 35) | function H1(r,e,t,a,n){var i=nl(e,n.inHover),o=a?null:t&&nl(t,n.inHover)...
  function tB (line 35) | function tB(r,e,t,a,n){return VT(r,nl(e,n.inHover),t&&nl(t,n.inHover),a,n)}
  function zT (line 35) | function zT(r,e){var t=e.transform,a=r.dpr||1;t?r.setTransform(a*t[0],a*...
  function eB (line 35) | function eB(r,e,t){for(var a=!1,n=0;n<r.length;n++){var i=r[n];a=a||i.is...
  function rB (line 35) | function rB(r,e){return r&&e?r[0]!==e[0]||r[1]!==e[1]||r[2]!==e[2]||r[3]...
  function aB (line 35) | function aB(r){var e=Nf(r),t=Bf(r);return!(r.lineDash||!(+e^+t)||e&&type...
  function Ne (line 35) | function Ne(r,e){e.batchFill&&r.fill(),e.batchStroke&&r.stroke(),e.batch...
  function nl (line 35) | function nl(r,e){return e&&r.__hoverStyle||r.style}
  function FT (line 35) | function FT(r,e){ei(r,e,{inHover:!1,viewWidth:0,viewHeight:0},!0)}
  function ei (line 35) | function ei(r,e,t,a){var n=e.transform;if(!e.shouldBePainted(t.viewWidth...
  function nB (line 35) | function nB(r,e,t){var a=e.getDisplayables(),n=e.getTemporalDisplayables...
  function co (line 35) | function co(r,e){if(r==="none")return null;var t=e.getDevicePixelRatio()...
  function GT (line 35) | function GT(r){if(!r||r.length===0)return[["rect"]];if(U(r))return[[r]];...
  function HT (line 35) | function HT(r){if(!r||r.length===0)return[[0,0]];if(Mt(r)){var e=Math.ce...
  function iB (line 35) | function iB(r){if(!r||typeof r=="object"&&r.length===0)return[0,0];if(Mt...
  function oB (line 35) | function oB(r){return G(r,function(e){return WT(e)})}
  function WT (line 35) | function WT(r){for(var e=0,t=0;t<r.length;++t)e+=r[t];return r.length%2=...
  function sB (line 35) | function sB(r,e){r.eachRawSeries(function(t){if(!r.isSeriesFiltered(t)){...
  function uB (line 35) | function uB(r,e){$T[r]=e}
  function fB (line 35) | function fB(r){return $T[r]}
  function XT (line 35) | function XT(r){return function(){for(var e=[],t=0;t<arguments.length;t++...
  function qT (line 35) | function qT(r){return function(){for(var e=[],t=0;t<arguments.length;t++...
  function KT (line 35) | function KT(r,e,t){return t[0]=t[0]&&t[0].toLowerCase(),hr.prototype[e]....
  function e (line 35) | function e(){return r!==null&&r.apply(this,arguments)||this}
  function e (line 35) | function e(t,a,n){var i=r.call(this,new I4)||this;i._chartsViews=[],i._c...
  function S (line 35) | function S(x){var b=x.__requireNewView;x.__requireNewView=!1;var C="_ec_...
  function w (line 35) | function w(x){x&&x.__alive&&x[v]&&x[v](x.__model,g,h._api,c)}
  function t (line 35) | function t(h){h.clearColorPalette(),h.eachSeries(function(v){v.clearColo...
  function a (line 35) | function a(h){var v=[],c=[],d=!1;if(h.eachComponent(function(m,_){var S=...
  function n (line 35) | function n(h){for(var v=[],c=h.currentStates,d=0;d<c.length;d++){var p=c...
  function i (line 35) | function i(h,v){var c=h._zr,d=c.storage,p=0;d.traverse(function(g){g.isG...
  function o (line 35) | function o(h,v){var c=h.get("blendMode")||null;v.eachRendered(function(d...
  function s (line 35) | function s(h,v){if(!h.preventAutoZ){var c=h.get("z")||0,d=h.get("zlevel"...
  function l (line 35) | function l(h,v,c,d){var p=h.getTextContent(),g=h.getTextGuideLine(),y=h....
  function u (line 35) | function u(h,v){v.eachRendered(function(c){if(!so(c)){var d=c.getTextCon...
  function f (line 35) | function f(h,v){var c=h.getModel("stateAnimation"),d=h.isAnimationEnable...
  function c (line 35) | function c(){return v!==null&&v.apply(this,arguments)||this}
  function v (line 35) | function v(c,d){for(var p=0;p<c.length;p++){var g=c[p];g[qv]=d}}
  function n (line 35) | function n(){for(var i=[],o=0;o<arguments.length;o++)i[o]=arguments[o];e...
  function DB (line 35) | function DB(r,e,t){var a=!(t&&t.ssr);if(a){var n=MB(r);if(n)return n}var...
  function MB (line 35) | function MB(r){return Bs[Ck(r,vy)]}
  function rA (line 35) | function rA(r,e){eA[r]=e}
  function aA (line 35) | function aA(r){dt(_p,r)<0&&_p.push(r)}
  function nA (line 35) | function nA(r,e){dy(mp,r,e,pB)}
  function LB (line 35) | function LB(r){cy("afterinit",r)}
  function IB (line 35) | function IB(r){cy("afterupdate",r)}
  function cy (line 35) | function cy(r,e){mr.on(r,e)}
  function ta (line 35) | function ta(r,e,t){J(e)&&(t=e,e="");var a=et(r)?r.type:[r,r={event:e}][0...
  function PB (line 35) | function PB(r,e){Ml.register(r,e)}
  function RB (line 35) | function RB(r,e){dy(zf,r,e,UT,"layout")}
  function Ai (line 35) | function Ai(r,e){dy(zf,r,e,YT,"visual")}
  function dy (line 35) | function dy(r,e,t,a,n){if((J(e)||et(e))&&(t=e,e=a),!(dt(a_,t)>=0)){a_.pu...
  function iA (line 35) | function iA(r,e){Sp[r]=e}
  function EB (line 35) | function EB(r,e,t){var a=fB("registerMap");a&&a(r,e,t)}
  function Qo (line 35) | function Qo(r){return r==null?0:r.length||1}
  function n_ (line 35) | function n_(r){return r}
  function r (line 35) | function r(e,t,a,n,i,o){this._old=e,this._new=t,this._oldKeyGetter=a||n_...
  function r (line 35) | function r(e,t){this._encode=e,this._schema=t}
  function NB (line 35) | function NB(r,e){var t={},a=t.encode={},n=q(),i=[],o=[],s={};A(r.dimensi...
  function ec (line 35) | function ec(r,e){return r.hasOwnProperty(e)||(r[e]=[]),r[e]}
  function Ff (line 35) | function Ff(r){return r==="category"?"ordinal":r==="time"?"time":"float"}
  function VB (line 35) | function VB(r){return!(r==="ordinal"||r==="time")}
  function r (line 35) | function r(e){this.otherDims={},e!=null&&V(this,e)}
  function r (line 35) | function r(e){this.dimensions=e.dimensions,this._dimOmitted=e.dimensionO...
  function sA (line 35) | function sA(r){return r instanceof oA}
  function lA (line 35) | function lA(r){for(var e=q(),t=0;t<(r||[]).length;t++){var a=r[t],n=et(a...
  function uA (line 35) | function uA(r){var e=FB(r);return e.dimNameMap||(e.dimNameMap=lA(r.dimen...
  function fA (line 35) | function fA(r){return r>30}
  function r (line 35) | function r(e,t){this.type="list",this._dimOmitted=!1,this._nameList=[],t...
  function Il (line 35) | function Il(r,e){ty(r)||(r=ey(r)),e=e||{};var t=e.coordDimensions||[],a=...
  function ZB (line 35) | function ZB(r){for(var e=q(),t=0;t<r.length;t++){var a=r[t],n=a.name,i=e...
  function XB (line 35) | function XB(r,e,t,a){var n=Math.max(r.dimensionsDetectedCount||1,e.lengt...
  function qB (line 35) | function qB(r,e,t){if(t||e.hasKey(r)){for(var a=0;e.hasKey(r+a);)a++;r+=...
  function r (line 35) | function r(e){this.coordSysDims=[],this.axisMap=q(),this.categoryAxisMap...
  function JB (line 35) | function JB(r){var e=r.get("coordinateSystem"),t=new KB(e),a=QB[e];if(a)...
  function Gi (line 35) | function Gi(r){return r.get("type")==="category"}
  function jB (line 35) | function jB(r,e,t){t=t||{};var a=t.byIndex,n=t.stackedCoordDimension,i,o...
  function tN (line 35) | function tN(r){return!sA(r.schema)}
  function nn (line 35) | function nn(r,e){return!!e&&e===r.getCalculationInfo("stackedDimension")}
  function hA (line 35) | function hA(r,e){return nn(r,e)?r.getCalculationInfo("stackResultDimensi...
  function eN (line 35) | function eN(r,e){var t=r.get("coordinateSystem"),a=Ml.get(t),n;return e&...
  function rN (line 35) | function rN(r,e,t){var a,n;return t&&A(r,function(i,o){var s=i.coordDim,...
  function Ta (line 35) | function Ta(r,e,t){t=t||{};var a=e.getSourceManager(),n,i=!1;r?(i=!0,n=e...
  function aN (line 35) | function aN(r){if(r.sourceFormat===vr){var e=nN(r.data||[]);return!F(Co(...
  function nN (line 35) | function nN(r){for(var e=0;e<r.length&&r[e]==null;)e++;return r[e]}
  function r (line 35) | function r(e){this._setting=e||{},this._extent=[1/0,-1/0]}
  function r (line 35) | function r(e){this.categories=e.categories||[],this._needCollect=e.needC...
  function sN (line 35) | function sN(r){return et(r)&&r.value!=null?r.value:r+""}
  function wp (line 35) | function wp(r){return r.type==="interval"||r.type==="log"}
  function lN (line 35) | function lN(r,e,t,a){var n={},i=r[1]-r[0],o=n.interval=w2(i/e,!0);t!=nul...
  function nc (line 35) | function nc(r){var e=Math.pow(10,Lg(r)),t=r/e;return t?t===2?t=3:t===3?t...
  function cA (line 35) | function cA(r){return Gr(r)+2}
  function s_ (line 35) | function s_(r,e,t){r[e]=Math.max(Math.min(r[e],t[1]),t[0])}
  function uN (line 35) | function uN(r,e){!isFinite(r[0])&&(r[0]=e[0]),!isFinite(r[1])&&(r[1]=e[1...
  function zh (line 35) | function zh(r,e){return r>=e[0]&&r<=e[1]}
  function Fh (line 35) | function Fh(r,e){return e[1]===e[0]?.5:(r-e[0])/(e[1]-e[0])}
  function Gh (line 35) | function Gh(r,e){return r*(e[1]-e[0])+e[0]}
  function e (line 35) | function e(t){var a=r.call(this,t)||this;a.type="ordinal";var n=a.getSet...
  function e (line 35) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function Wr (line 35) | function Wr(r){return F(r)?gA?new Float32Array(r):r:new fN(r)}
  function gy (line 35) | function gy(r){return r.get("stack")||bp+r.seriesIndex}
  function yy (line 35) | function yy(r){return r.dim+r.index}
  function hN (line 35) | function hN(r){var e=[],t=r.axis,a="axis0";if(t.type==="category"){for(v...
  function yA (line 35) | function yA(r,e){var t=[];return e.eachSeriesByType(r,function(a){wA(a)&...
  function vN (line 35) | function vN(r){var e={};A(r,function(l){var u=l.coordinateSystem,f=u.get...
  function mA (line 35) | function mA(r){var e=vN(r),t=[];return A(r,function(a){var n=a.coordinat...
  function _A (line 35) | function _A(r){var e={};A(r,function(a,n){var i=a.axisKey,o=a.bandWidth,...
  function cN (line 35) | function cN(r,e,t){if(r&&e){var a=r[yy(e)];return a!=null&&t!=null?a[gy(...
  function SA (line 35) | function SA(r,e){var t=yA(r,e),a=mA(t);A(t,function(n){var i=n.getData()...
  function xA (line 35) | function xA(r){return{seriesType:r,plan:ko(),reset:function(e){if(!!wA(e...
  function wA (line 35) | function wA(r){return r.coordinateSystem&&r.coordinateSystem.type==="car...
  function bA (line 35) | function bA(r){return r.pipelineContext&&r.pipelineContext.large}
  function dN (line 35) | function dN(r,e){return e.toGlobalCoord(e.dataToCoord(e.type==="log"?1:0))}
  function e (line 35) | function e(t){var a=r.call(this,t)||this;return a.type="time",a}
  function gN (line 35) | function gN(r,e,t,a){var n=Kr(e),i=Kr(t),o=function(d){return j0(n,d,a)=...
  function yN (line 35) | function yN(r,e){return r/=ir,r>16?16:r>7.5?7:r>3.5?4:r>1.5?2:1}
  function mN (line 35) | function mN(r){var e=30*ir;return r/=e,r>6?6:r>3?3:r>2?2:1}
  function _N (line 35) | function _N(r){return r/=Es,r>12?12:r>6?6:r>3.5?4:r>2?2:1}
  function l_ (line 35) | function l_(r,e){return r/=e?Xg:Zg,r>30?30:r>20?20:r>15?15:r>10?10:r>5?5...
  function SN (line 35) | function SN(r){return w2(r,!0)}
  function xN (line 35) | function xN(r,e,t){var a=new Date(r);switch(lo(e)){case"year":case"month...
  function wN (line 35) | function wN(r,e,t,a){var n=1e4,i=OC,o=0;function s(D,M,L,I,P,R,E){for(va...
  function e (line 35) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function _u (line 35) | function _u(r,e){return bN(r,Gr(e))}
  function r (line 35) | function r(e,t,a){this._prepareParams(e,t,a)}
  function DA (line 35) | function DA(r,e,t){var a=r.rawExtentInfo;return a||(a=new DN(r,e,t),r.ra...
  function Su (line 35) | function Su(r,e){return e==null?null:Ws(e)?NaN:r.parse(e)}
  function MA (line 35) | function MA(r,e){var t=r.type,a=DA(r,e,r.getExtent()).calculate();r.setB...
  function IN (line 35) | function IN(r,e,t,a){var n=t.axis.getExtent(),i=n[1]-n[0],o=cN(a,t.axis)...
  function po (line 35) | function po(r,e){var t=e,a=MA(r,t),n=a.extent,i=t.get("splitNumber");r i...
  function Hh (line 35) | function Hh(r,e){if(e=e||r.get("type"),e)switch(e){case"category":return...
  function PN (line 35) | function PN(r){var e=r.scale.getExtent(),t=e[0],a=e[1];return!(t>0&&a>0|...
  function Pl (line 35) | function Pl(r){var e=r.getLabelModel().get("formatter"),t=r.type==="cate...
  function _y (line 35) | function _y(r,e){return r.type==="category"?r.scale.getLabel(e):e.value}
  function RN (line 35) | function RN(r){var e=r.model,t=r.scale;if(!(!e.get(["axisLabel","show"])...
  function EN (line 35) | function EN(r,e){var t=e*Math.PI/180,a=r.width,n=r.height,i=a*Math.abs(M...
  function Sy (line 35) | function Sy(r){var e=r.get("interval");return e==null?"auto":e}
  function LA (line 35) | function LA(r){return r.type==="category"&&Sy(r.getLabelModel())===0}
  function Gf (line 35) | function Gf(r,e){var t={};return A(r.mapDimensionsAll(e),function(a){t[h...
  function kN (line 35) | function kN(r,e,t){e&&A(Gf(e,t),function(a){var n=e.getApproximateExtent...
  function r (line 35) | function r(){}
  function ct (line 35) | function ct(r){if(F(r)){A(r,function(e){ct(e)});return}dt(f_,r)>=0||(f_....
  function h_ (line 35) | function h_(r,e){return Math.abs(r-e)<BN}
  function Un (line 35) | function Un(r,e,t){var a=0,n=r[0];if(!n)return!1;for(var i=1;i<r.length;...
  function ic (line 35) | function ic(r,e){for(var t=0;t<r.length;t++)he(r[t],r[t],e)}
  function v_ (line 35) | function v_(r,e,t,a){for(var n=0;n<r.length;n++){var i=r[n];a&&(i=a.proj...
  function VN (line 35) | function VN(r){for(var e=0,t=0,a=0,n=r.length,i=r[n-1][0],o=r[n-1][1],s=...
  function r (line 35) | function r(e){this.name=e}
  function r (line 35) | function r(e,t){this.type="polygon",this.exterior=e,this.interiors=t}
  function r (line 35) | function r(e){this.type="linestring",this.points=e}
  function e (line 35) | function e(t,a,n){var i=r.call(this,t)||this;return i.type="geoJSON",i.g...
  function e (line 35) | function e(t,a){var n=r.call(this,t)||this;return n.type="geoSVG",n._elO...
  function FN (line 35) | function FN(r){if(!r.UTF8Encoding)return r;var e=r,t=e.UTF8Scale;t==null...
  function oc (line 35) | function oc(r,e,t){for(var a=0;a<r.length;a++)r[a]=RA(r[a],e[a],t)}
  function RA (line 35) | function RA(r,e,t){for(var a=[],n=e[0],i=e[1],o=0;o<r.length;o+=2){var s...
  function GN (line 35) | function GN(r,e){return r=FN(r),G(Et(r.features,function(t){return t.geo...
  function HN (line 35) | function HN(r){return r.type==="category"?$N(r):YN(r)}
  function WN (line 35) | function WN(r,e){return r.type==="category"?UN(r,e):{ticks:G(r.scale.get...
  function $N (line 35) | function $N(r){var e=r.getLabelModel(),t=EA(r,e);return!e.get("show")||r...
  function EA (line 35) | function EA(r,e){var t=kA(r,"labels"),a=Sy(e),n=OA(t,a);if(n)return n;va...
  function UN (line 35) | function UN(r,e){var t=kA(r,"ticks"),a=Sy(e),n=OA(t,a);if(n)return n;var...
  function YN (line 35) | function YN(r){var e=r.scale.getTicks(),t=Pl(r);return{labels:G(e,functi...
  function kA (line 35) | function kA(r,e){return il(r)[e]||(il(r)[e]=[])}
  function OA (line 35) | function OA(r,e){for(var t=0;t<r.length;t++)if(r[t].key===e)return r[t]....
  function BA (line 35) | function BA(r,e,t){return r.push({key:e,value:t}),t}
  function ZN (line 35) | function ZN(r){var e=il(r).autoInterval;return e!=null?e:il(r).autoInter...
  function XN (line 35) | function XN(r){var e=qN(r),t=Pl(r),a=(e.axisRotate-e.labelRotate)/180*Ma...
  function qN (line 35) | function qN(r){var e=r.getLabelModel();return{axisRotate:r.getRotate?r.g...
  function NA (line 35) | function NA(r,e,t){var a=Pl(r),n=r.scale,i=n.getExtent(),o=r.getLabelMod...
  function VA (line 35) | function VA(r,e,t){var a=r.scale,n=Pl(r),i=[];return A(a.getTicks(),func...
  function r (line 35) | function r(e,t,a){this.onBand=!1,this.inverse=!1,this.dim=e,this.scale=t...
  function g_ (line 35) | function g_(r,e){var t=r[1]-r[0],a=e,n=t/a/2;r[0]+=n,r[1]-=n}
  function JN (line 35) | function JN(r,e,t,a){var n=e.length;if(!r.onBand||t||!n)return;var i=r.g...
  function jN (line 35) | function jN(r,e,t,a,n){var i=t.width,o=t.height;switch(r){case"top":a.se...
  function t6 (line 35) | function t6(r,e,t,a,n,i,o,s,l){o-=r,s-=e;var u=Math.sqrt(o*o+s*s);o/=u,s...
  function Hf (line 35) | function Hf(r,e,t,a,n,i,o,s){var l=n-r,u=i-e,f=t-r,h=a-e,v=Math.sqrt(f*f...
  function zA (line 35) | function zA(r,e,t,a,n,i,o){t<0&&(r=r+t,t=-t),a<0&&(e=e+a,a=-a);var s=r+t...
  function e6 (line 35) | function e6(r,e,t){var a=zA(e.x,e.y,e.width,e.height,r.x,r.y,_r);return ...
  function r6 (line 35) | function r6(r,e,t){for(var a=0,n=0,i=0,o=0,s,l,u=1/0,f=e.data,h=r.x,v=r....
  function y_ (line 35) | function y_(r,e){if(!!r){var t=r.getTextGuideLine(),a=r.getTextContent()...
  function FA (line 35) | function FA(r,e){if(e<=180&&e>0){e=e/180*Math.PI,wr.fromArray(r[0]),Bt.f...
  function a6 (line 35) | function a6(r,e,t){if(t<=180&&t>0){t=t/180*Math.PI,wr.fromArray(r[0]),Bt...
  function m_ (line 35) | function m_(r,e,t,a){var n=t==="normal",i=n?r:r.ensureState(t);i.ignore=...
  function n6 (line 35) | function n6(r,e){var t=e.smooth,a=e.points;if(!!a)if(r.moveTo(a[0][0],a[...
  function xy (line 35) | function xy(r,e,t){var a=r.getTextGuideLine(),n=r.getTextContent();if(!n...
  function wy (line 35) | function wy(r,e){e=e||"labelLine";for(var t={normal:r.getModel(e)},a=0;a...
  function GA (line 35) | function GA(r){for(var e=[],t=0;t<r.length;t++){var a=r[t];if(!a.default...
  function HA (line 35) | function HA(r,e,t,a,n,i){var o=r.length;if(o<2)return;r.sort(function(C,...
  function i6 (line 35) | function i6(r,e,t,a){return HA(r,"x","width",e,t,a)}
  function WA (line 35) | function WA(r,e,t,a){return HA(r,"y","height",e,t,a)}
  function $A (line 35) | function $A(r){var e=[];r.sort(function(p,g){return g.priority-p.priorit...
  function o6 (line 35) | function o6(r){if(r){for(var e=[],t=0;t<r.length;t++)e.push(r[t].slice()...
  function s6 (line 35) | function s6(r,e){var t=r.label,a=e&&e.getTextGuideLine();return{dataInde...
  function xu (line 35) | function xu(r,e,t){for(var a=0;a<t.length;a++){var n=t[a];e[n]!=null&&(r...
  function r (line 35) | function r(){this._labelList=[],this._chartViewList=[]}
  function n (line 35) | function n(_,S){return function(){y_(_,S)}}
  function h6 (line 35) | function h6(r){r.registerUpdateLifecycle("series:beforeupdate",function(...
  function e (line 35) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function go (line 35) | function go(r,e){var t=r.mapDimensionsAll("defaultedLabel"),a=t.length;i...
  function UA (line 35) | function UA(r,e){var t=r.mapDimensionsAll("defaultedLabel");if(!F(e))ret...
  function e (line 35) | function e(t,a,n,i){var o=r.call(this)||this;return o.updateData(t,a,n,i...
  function L (line 35) | function L(R){return M?t.getName(R):go(t,R)}
  function p6 (line 35) | function p6(r,e){this.parent.drift(r,e)}
  function uc (line 35) | function uc(r,e,t,a){return e&&!isNaN(e[0])&&!isNaN(e[1])&&!(a.isIgnore&...
  function S_ (line 35) | function S_(r){return r!=null&&!et(r)&&(r={isIgnore:r}),r||{}}
  function x_ (line 35) | function x_(r){var e=r.hostModel,t=e.getModel("emphasis");return{emphasi...
  function r (line 35) | function r(e){this.group=new nt,this._SymbolCtor=e||El}
  function n (line 35) | function n(l){l.isGroup||(l.incremental=!0,l.ensureState("emphasis").hov...
  function YA (line 35) | function YA(r,e,t){var a=r.getBaseAxis(),n=r.getOtherAxis(a),i=y6(n,t),o...
  function y6 (line 35) | function y6(r,e){var t=0,a=r.scale.getExtent();return e==="start"?t=a[0]...
  function ZA (line 35) | function ZA(r,e,t,a){var n=NaN;r.stacked&&(n=t.get(t.getCalculationInfo(...
  function m6 (line 35) | function m6(r,e){var t=[];return e.diff(r).add(function(a){t.push({cmd:"...
  function _6 (line 35) | function _6(r,e,t,a,n,i,o,s){for(var l=m6(r,e),u=[],f=[],h=[],v=[],c=[],...
  function fi (line 35) | function fi(r,e){return isNaN(r)||isNaN(e)}
  function Cp (line 35) | function Cp(r,e,t,a,n,i,o,s,l){for(var u,f,h,v,c,d,p=t,g=0;g<a;g++){var ...
  function r (line 35) | function r(){this.smooth=0,this.smoothConstraint=!0}
  function e (line 35) | function e(t){var a=r.call(this,t)||this;return a.type="ec-polyline",a}
  function e (line 35) | function e(){return r!==null&&r.apply(this,arguments)||this}
  function e (line 35) | function e(t){var a=r.call(this,t)||this;return a.type="ec-polygon",a}
  function KA (line 35) | function KA(r,e,t,a,n){var i=r.getArea(),o=i.x,s=i.y,l=i.width,u=i.heigh...
  function JA (line 35) | function JA(r,e,t){var a=r.getArea(),n=Zt(a.r0,1),i=Zt(a.r,1),o=new Ve({...
  function Wh (line 35) | function Wh(r,e,t,a,n){if(r){if(r.type==="polar")return JA(r,e,t);if(r.t...
  function Di (line 35) | function Di(r,e){return r.type===e}
  function w_ (line 35) | function w_(r,e){if(r.length===e.length){for(var t=0;t<r.length;t++)if(r...
  function b_ (line 35) | function b_(r){for(var e=1/0,t=1/0,a=-1/0,n=-1/0,i=0;i<r.length;){var o=...
  function C_ (line 35) | function C_(r,e){var t=b_(r),a=t[0],n=t[1],i=b_(e),o=i[0],s=i[1];return ...
  function T_ (line 35) | function T_(r){return Mt(r)?r:r?.5:0}
  function w6 (line 35) | function w6(r,e,t){if(!t.valueDim)return[];for(var a=e.count(),n=Wr(a*2)...
  function Ba (line 35) | function Ba(r,e,t,a){var n=e.getBaseAxis(),i=n.dim==="x"||n.dim==="radiu...
  function b6 (line 35) | function b6(r,e){var t=[],a=r.length,n,i;function o(f,h,v){var c=f.coord...
  function C6 (line 35) | function C6(r,e,t){var a=r.getVisual("visualMeta");if(!(!a||!a.length||!...
  function T6 (line 35) | function T6(r,e,t){var a=r.get("showAllSymbol"),n=a==="auto";if(!(a&&!n)...
  function A6 (line 35) | function A6(r,e){var t=r.getExtent(),a=Math.abs(t[1]-t[0])/r.scale.count...
  function D6 (line 35) | function D6(r,e){return isNaN(r)||isNaN(e)}
  function M6 (line 35) | function M6(r){for(var e=r.length/2;e>0&&D6(r[e*2-2],r[e*2-1]);e--);retu...
  function A_ (line 35) | function A_(r,e){return[r[e*2],r[e*2+1]]}
  function L6 (line 35) | function L6(r,e,t){for(var a=r.length/2,n=t==="x"?0:1,i,o,s=0,l=-1,u=0;u...
  function QA (line 35) | function QA(r){if(r.get(["endLabel","show"]))return!0;for(var e=0;e<Le.l...
  function fc (line 35) | function fc(r,e,t,a){if(Di(e,"cartesian2d")){var n=a.getModel("endLabel"...
  function I6 (line 35) | function I6(r,e){var t=e.getBaseAxis(),a=t.isHorizontal(),n=t.inverse,i=...
  function e (line 35) | function e(){return r!==null&&r.apply(this,arguments)||this}
  function Ol (line 35) | function Ol(r,e){return{seriesType:r,plan:ko(),reset:function(t){var a=t...
  function jA (line 35) | function jA(r){return{seriesType:r,reset:function(e,t,a){var n=e.getData...
  function tD (line 35) | function tD(r){r.registerChartView(R6),r.registerSeriesModel(c6),r.regis...
  function e (line 35) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function e (line 35) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function r (line 35) | function r(){this.cx=0,this.cy=0,this.r0=0,this.r=0,this.startAngle=0,th...
  function e (line 35) | function e(t){var a=r.call(this,t)||this;return a.type="sausage",a}
  function z6 (line 35) | function z6(r,e){e=e||{};var t=e.isRoundCap;return function(a,n,i){var o...
  function F6 (line 35) | function F6(r,e,t,a){if(Mt(a)){r.setTextConfig({rotation:a});return}else...
  function bu (line 35) | function bu(r,e,t){return e*Math.sin(r)*(t?-1:1)}
  function Cu (line 35) | function Cu(r,e,t){return e*Math.cos(r)*(t?1:-1)}
  function ri (line 35) | function ri(r,e,t){var a=r.get("borderRadius");if(a==null)return t?{corn...
  function G6 (line 35) | function G6(r,e){var t=r.getArea&&r.getArea();if(Di(r,"cartesian2d")){va...
  function e (line 35) | function e(){var t=r.call(this)||this;return t.type=e.type,t._isFirstFra...
  function C (line 35) | function C(M){var L=Tu[u.type](s,M),I=K6(u,h,L);return I.useStyle(m.getI...
  function W6 (line 35) | function W6(r,e){var t=r.get("realtimeSort",!0),a=e.getBaseAxis();if(t&&...
  function L_ (line 35) | function L_(r,e,t,a,n,i,o,s){var l,u;i?(u={x:a.x,width:a.width},l={y:a.y...
  function I_ (line 35) | function I_(r,e){for(var t=0;t<e.length;t++)if(!isFinite(r[e[t]]))return...
  function Y6 (line 35) | function Y6(r){return r.startAngle!=null&&r.endAngle!=null&&r.startAngle...
  function rD (line 35) | function rD(r){return function(e){var t=e?"Arc":"Angle";return function(...
  function R_ (line 35) | function R_(r,e,t,a,n,i,o,s){var l=e.getItemVisual(t,"style");if(s){if(!...
  function Z6 (line 35) | function Z6(r,e){var t=r.get(["itemStyle","borderColor"]);if(!t||t==="no...
  function r (line 35) | function r(){}
  function e (line 35) | function e(t){var a=r.call(this,t)||this;return a.type="largeBar",a}
  function k_ (line 35) | function k_(r,e,t,a){var n=r.getData(),i=n.getLayout("valueAxisHorizonta...
  function q6 (line 35) | function q6(r,e,t){for(var a=r.baseDimIdx,n=1-a,i=r.shape.points,o=r.lar...
  function aD (line 35) | function aD(r,e,t){if(Di(t,"cartesian2d")){var a=e,n=t.getArea();return{...
  function K6 (line 35) | function K6(r,e,t){var a=r.type==="polar"?Ve:bt;return new a({shape:aD(e...
  function Q6 (line 35) | function Q6(r){r.registerChartView(J6),r.registerSeriesModel(B6),r.regis...
  function nD (line 35) | function nD(r,e){return re(r.getBoxLayoutParams(),{width:e.getWidth(),he...
  function iD (line 35) | function iD(r,e){var t=nD(r,e),a=r.get("center"),n=r.get("radius");F(n)|...
  function j6 (line 35) | function j6(r,e,t){e.eachSeriesByType(r,function(a){var n=a.getData(),i=...
  function Bl (line 35) | function Bl(r){return{seriesType:r,reset:function(e,t){var a=t.findCompo...
  function N_ (line 35) | function N_(r,e,t,a,n,i,o,s,l,u){if(r.length<2)return;function f(p){for(...
  function eV (line 35) | function eV(r,e,t,a,n,i,o,s){for(var l=[],u=[],f=Number.MAX_VALUE,h=-Num...
  function oD (line 35) | function oD(r,e,t){if(t===void 0&&(t=!1),r.labelStyleWidth==null){var a=...
  function cc (line 35) | function cc(r){return r.position==="center"}
  function rV (line 35) | function rV(r){var e=r.getData(),t=[],a,n,i=!1,o=(r.get("minShowLabelAng...
  function e (line 35) | function e(t,a,n){var i=r.call(this)||this;i.z2=2;var o=new Dt;return i....
  function e (line 35) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.igno...
  function No (line 35) | function No(r,e,t){e=F(e)&&{coordDimensions:e}||V({encodeDefine:r.getEnc...
  function r (line 35) | function r(e,t){this._getDataWithEncodedVisual=e,this._getRawData=t}
  function e (line 35) | function e(){return r!==null&&r.apply(this,arguments)||this}
  function fV (line 35) | function fV(r){return{seriesType:r,reset:function(e,t){var a=e.getData()...
  function hV (line 35) | function hV(r){r.registerChartView(iV),r.registerSeriesModel(uV),NT("pie...
  function e (line 35) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function r (line 35) | function r(){}
  function e (line 35) | function e(t){var a=r.call(this,t)||this;return a._off=0,a.hoverDataIdx=...
  function r (line 35) | function r(){this.group=new nt}
  function e (line 35) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function e (line 35) | function e(){return r!==null&&r.apply(this,arguments)||this}
  function e (line 35) | function e(){return r!==null&&r.apply(this,arguments)||this}
  function yo (line 35) | function yo(r,e,t,a){A(TV,function(n,i){var o=ht(ht({},uD[i],!0),a,!0),s...
  function V_ (line 35) | function V_(r){return r.type||(r.data?"category":"value")}
  function r (line 35) | function r(e){this.type="cartesian",this._dimList=[],this._axes={},this....
  function z_ (line 35) | function z_(r){return r.type==="interval"||r.type==="time"}
  function e (line 35) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function e (line 35) | function e(t,a,n,i,o){var s=r.call(this,t,a,n)||this;return s.index=0,s....
  function Dp (line 35) | function Dp(r,e,t){t=t||{};var a=r.coordinateSystem,n=e.axis,i={},o=n.ge...
  function F_ (line 35) | function F_(r){return r.get("coordinateSystem")==="cartesian2d"}
  function G_ (line 35) | function G_(r){var e={xAxisModel:null,yAxisModel:null};return A(e,functi...
  function fD (line 35) | function fD(r,e,t){var a=on.prototype,n=a.getTicks.call(t),i=a.getTicks....
  function r (line 35) | function r(e,t,a){this.type="grid",this._coordsMap={},this._coordsList=[...
  function n (line 35) | function n(o){var s,l=St(o),u=l.length;if(!!u){for(var f=[],h=u-1;h>=0;h...
  function l (line 35) | function l(){A(s,function(u){var f=u.isHorizontal(),h=f?[0,o.width]:[0,o...
  function u (line 35) | function u(f){return function(h,v){if(!!pc(h,e)){var c=h.get("position")...
  function a (line 35) | function a(n,i){A(Gf(n,i.dim),function(o){i.scale.unionExtentFromData(n,...
  function pc (line 35) | function pc(r,e){return r.getCoordSysModel()===e}
  function H_ (line 35) | function H_(r,e,t,a){t.getAxesOnZeroOf=function(){return i?[i]:[]};var n...
  function W_ (line 35) | function W_(r){return r&&r.type!=="category"&&r.type!=="time"&&PN(r)}
  function RV (line 35) | function RV(r,e){var t=r.getExtent(),a=t[0]+t[1];r.toGlobalCoord=r.dim==...
  function r (line 35) | function r(e,t){this.group=new nt,this.opt=t,this.axisModel=e,tt(t,{labe...
  function kV (line 35) | function kV(r,e,t,a){var n=x2(t-r),i,o,s=a[0]>a[1],l=e==="start"&&!s||e!...
  function OV (line 35) | function OV(r,e,t){if(!LA(r.axis)){var a=r.get(["axisLabel","showMinLabe...
  function Ze (line 35) | function Ze(r){r&&(r.ignore=!0)}
  function U_ (line 35) | function U_(r,e){var t=r&&r.getBoundingRect().clone(),a=e&&e.getBounding...
  function Y_ (line 35) | function Y_(r){return r==="middle"||r==="center"}
  function hD (line 35) | function hD(r,e,t,a,n){for(var i=[],o=[],s=[],l=0;l<r.length;l++){var u=...
  function BV (line 35) | function BV(r,e,t,a){var n=t.axis,i=t.getModel("axisTick"),o=i.get("show...
  function NV (line 35) | function NV(r,e,t,a){var n=t.axis,i=t.getModel("minorTick");if(!(!i.get(...
  function VV (line 35) | function VV(r,e,t,a){var n=t.axis,i=le(a.axisLabelShow,t.get(["axisLabel...
  function zV (line 35) | function zV(r,e){var t={axesInfo:{},seriesInvolved:!1,coordSysAxesInfo:{...
  function FV (line 35) | function FV(r,e,t){var a=e.getComponent("tooltip"),n=e.getComponent("axi...
  function GV (line 35) | function GV(r,e,t,a,n,i){var o=e.getModel("axisPointer"),s=["type","snap...
  function HV (line 35) | function HV(r,e){e.eachSeries(function(t){var a=t.coordinateSystem,n=t.g...
  function WV (line 35) | function WV(r,e){for(var t=e.model,a=e.dim,n=0;n<r.length;n++){var i=r[n...
  function gc (line 35) | function gc(r,e){return r==="all"||F(r)&&dt(r,e)>=0||r===e}
  function $V (line 35) | function $V(r){var e=Cy(r);if(!!e){var t=e.axisPointerModel,a=e.axis.sca...
  function Cy (line 35) | function Cy(r){var e=(r.ecModel.getComponent("axisPointer")||{}).coordSy...
  function UV (line 35) | function UV(r){var e=Cy(r);return e&&e.axisPointerModel}
  function Mp (line 35) | function Mp(r){return!!r.get(["handle","show"])}
  function ol (line 35) | function ol(r){return r.type+"||"+r.id}
  function e (line 35) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function vD (line 35) | function vD(r,e,t,a){var n=t.axis;if(!n.scale.isBlank()){var i=t.getMode...
  function cD (line 35) | function cD(r){Lp(r).splitAreaColors=null}
  function e (line 35) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function e (line 35) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function e (line 35) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function e (line 35) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function gD (line 35) | function gD(r){r.registerComponentView(JV),r.registerComponentModel(xV),...
  function QV (line 35) | function QV(r){ct(gD),r.registerSeriesModel(cV),r.registerChartView(_V),...
  function jV (line 35) | function jV(r){r.eachSeriesByType("radar",function(e){var t=e.getData(),...
  function q_ (line 35) | function q_(r){return!isNaN(r[0])&&!isNaN(r[1])}
  function K_ (line 35) | function K_(r){return[r.cx,r.cy]}
  function tz (line 35) | function tz(r){var e=r.polar;if(e){F(e)||(e=[e]);var t=[];A(e,function(a...
  function e (line 35) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function u (line 35) | function u(v,c){var d=v.getItemVisual(c,"symbol")||"circle";if(d!=="none...
  function f (line 35) | function f(v,c,d,p,g,y){d.removeAll();for(var m=0;m<c.length-1;m++){var ...
  function h (line 35) | function h(v){return G(v,function(c){return[i.cx,i.cy]})}
  function e (line 35) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function Du (line 35) | function Du(r,e){return tt({show:e},r)}
  function e (line 35) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function e (line 35) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function m (line 35) | function m(R,E,B){var O=B%E.length;return R[O]=R[O]||[],O}
  function e (line 35) | function e(t,a,n){var i=r.call(this,t,a,n)||this;return i.type="value",i...
  function r (line 35) | function r(e,t,a){this.dimensions=[],this._model=e,this._indicatorAxes=G...
  function dz (line 35) | function dz(r){r.registerCoordinateSystem("radar",cz),r.registerComponen...
  function pz (line 35) | function pz(r){ct(dz),r.registerChartView(rz),r.registerSeriesModel(nz),...
  function gz (line 35) | function gz(r,e,t){var a=Ty(r);a[e]=t}
  function yz (line 35) | function yz(r,e,t){var a=Ty(r),n=a[e];n===t&&(a[e]=null)}
  function Q_ (line 35) | function Q_(r,e){return!!Ty(r)[e]}
  function Ty (line 35) | function Ty(r){return r[J_]||(r[J_]={})}
  function e (line 35) | function e(t){var a=r.call(this)||this;a._zr=t;var n=Y(a._mousedownHandl...
  function yc (line 35) | function yc(r,e,t,a,n){r.pointerChecker&&r.pointerChecker(a,n.originX,n....
  function yD (line 35) | function yD(r,e,t,a,n){n.isAvailableBehavior=Y(uf,null,t,a),r.trigger(e,n)}
  function uf (line 35) | function uf(r,e,t){var a=t[r];return!r||a&&(!U(a)||e.event[a+"Key"])}
  function Ay (line 35) | function Ay(r,e,t){var a=r.target;a.x+=e,a.y+=t,a.dirty()}
  function Dy (line 35) | function Dy(r,e,t,a){var n=r.target,i=r.zoomLimit,o=r.zoom=r.zoom||1;if(...
  function $h (line 35) | function $h(r,e,t){var a=e.getComponentByElement(r.topTarget),n=a&&a.coo...
  function mD (line 35) | function mD(r){if(U(r)){var e=new DOMParser;r=e.parseFromString(r,"text/...
  function r (line 35) | function r(){this._defs={},this._root=null}
  function rS (line 35) | function rS(r,e){var t=r.getAttribute("gradientUnits");t==="userSpaceOnU...
  function aS (line 35) | function aS(r,e){for(var t=r.firstChild;t;){if(t.nodeType===1&&t.nodeNam...
  function Xe (line 35) | function Xe(r,e){r&&r.__inheritedStyle&&(e.__inheritedStyle||(e.__inheri...
  function nS (line 35) | function nS(r){for(var e=Uh(r),t=[],a=0;a<e.length;a+=2){var n=parseFloa...
  function Ge (line 35) | function Ge(r,e,t,a,n){var i=e,o=i.__inheritedStyle=i.__inheritedStyle||...
  function xz (line 35) | function xz(r,e){var t=e.__selfStyle;if(t){var a=t.textBaseline,n=a;!a||...
  function iS (line 35) | function iS(r,e,t,a){var n=t&&t.match(wz);if(n){var i=Sr(n[1]);a.push([r...
  function bz (line 35) | function bz(r,e){for(var t=0;t<e.length;t++){var a=e[t];a[0].style[a[1]]...
  function Uh (line 35) | function Uh(r){return r.match(Cz)||[]}
  function Az (line 35) | function Az(r,e){var t=r.getAttribute("transform");if(t){t=t.replace(/,/...
  function _D (line 35) | function _D(r,e,t){var a=r.getAttribute("style");if(!!a){oS.lastIndex=0;...
  function Dz (line 35) | function Dz(r,e,t){for(var a=0;a<j_.length;a++){var n=j_[a],i=r.getAttri...
  function SD (line 35) | function SD(r,e){var t=e.width/r.width,a=e.height/r.height,n=Math.min(t,...
  function Mz (line 35) | function Mz(r,e){var t=new Sz;return t.parse(r,e)}
  function r (line 35) | function r(e,t){this.type="geoSVG",this._usedGraphicMap=q(),this._freedG...
  function Pz (line 36) | function Pz(r){r.silent=!1,r.isGroup&&r.traverse(function(e){e.silent=!1})}
  function Rz (line 36) | function Rz(r){var e=[],t=q();return A(r,function(a){if(a.namedFrom==nul...
  function Ez (line 36) | function Ez(r,e){if(r==="china"){for(var t=0;t<e.length;t++)if(e[t].name...
  function Oz (line 36) | function Oz(r,e){if(r==="china"){var t=kz[e.name];if(t){var a=e.getCente...
  function Nz (line 36) | function Nz(r,e){r==="china"&&e.name==="\u53F0\u6E7E"&&e.geometries.push...
  function r (line 36) | function r(e,t,a){this.type="geoJSON",this._parsedMap=q(),this._mapName=...
  function Fz (line 37) | function Fz(r){for(var e,t=0;t<r.length;t++){var a=r[t].getBoundingRect(...
  function Gz (line 37) | function Gz(r){return U(r)?typeof JSON!="undefined"&&JSON.parse?JSON.par...
  function Mu (line 37) | function Mu(r){var e=r.getItemStyle(),t=r.get("areaColor");return t!=nul...
  function lS (line 37) | function lS(r){var e=r.style;e&&(e.stroke=e.stroke||e.fill,e.fill=null)}
  function r (line 37) | function r(e){var t=new nt;this.uid=Lo("ec_map_draw"),this._controller=n...
  function f (line 37) | function f(c,d){return d&&(c=d(c)),c&&[c[0]*i.scaleX+i.x,c[1]*i.scaleY+i...
  function h (line 37) | function h(c){for(var d=[],p=!u&&l&&l.project,g=0;g<c.length;++g){var y=...
  function v (line 37) | function v(c){return{shape:{points:h(c)}}}
  function x (line 37) | function x(b,C){if(!!b.length){var T=new Hg({culling:!0,segmentIgnoreThr...
  function l (line 37) | function l(){var u={type:"geoRoam",componentType:s};return u[s+"Id"]=e.i...
  function uS (line 37) | function uS(r,e,t,a){var n=a.getModel("itemStyle"),i=a.getModel(["emphas...
  function fS (line 37) | function fS(r,e,t,a,n,i,o){var s=r.data,l=r.isGeo,u=s&&isNaN(s.get(s.map...
  function hS (line 37) | function hS(r,e,t,a,n,i){r.data?r.data.setItemGraphicEl(i,e):it(e).event...
  function vS (line 37) | function vS(r,e,t,a,n){r.data||Do({el:e,componentModel:n,itemName:t,item...
  function cS (line 37) | function cS(r,e,t,a,n){e.highDownSilentOnTouch=!!n.get("selectedMode");v...
  function dS (line 37) | function dS(r,e,t){var a=[],n;function i(){n=[]}function o(){n.length&&(...
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function Kz (line 37) | function Kz(r,e){var t={};return A(r,function(a){a.each(a.mapDimension("...
  function Jz (line 37) | function Jz(r){var e={};r.eachSeriesByType("map",function(t){var a=t.get...
  function Qz (line 37) | function Qz(r){var e={};r.eachSeriesByType("map",function(t){var a=t.get...
  function e (line 37) | function e(t){var a=r.call(this)||this;return a.type="view",a.dimensions...
  function gS (line 37) | function gS(r){var e=r.seriesModel;return e?e.coordinateSystem:null}
  function e (line 37) | function e(t,a,n){var i=r.call(this,t)||this;i.dimensions=bD,i.type="geo...
  function yS (line 37) | function yS(r){var e=r.geoModel,t=r.seriesModel;return e?e.coordinateSys...
  function _S (line 37) | function _S(r,e){var t=r.get("boundingCoords");if(t!=null){var a=t[0],n=...
  function e7 (line 37) | function e7(r,e){A(e.get("geoCoord"),function(t,a){r.addGeoCoord(a,t)})}
  function r (line 37) | function r(){this.dimensions=bD}
  function n (line 37) | function n(o){return{nameProperty:o.get("nameProperty"),aspectScale:o.ge...
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function SS (line 37) | function SS(r,e){return r.pointToProjected?r.pointToProjected(e):r.point...
  function Ly (line 37) | function Ly(r,e,t,a){var n=r.getZoom(),i=r.getCenter(),o=e.zoom,s=r.proj...
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function l7 (line 37) | function l7(r,e,t){ba.registerMap(r,e,t)}
  function AD (line 37) | function AD(r){r.registerCoordinateSystem("geo",TD),r.registerComponentM...
  function u7 (line 37) | function u7(r){ct(AD),r.registerChartView(Zz),r.registerSeriesModel(qz),...
  function f7 (line 37) | function f7(r){var e=r;e.hierNode={defaultAncestor:null,ancestor:e,preli...
  function h7 (line 37) | function h7(r,e){var t=r.isExpand?r.children:[],a=r.parentNode.children,...
  function v7 (line 37) | function v7(r){var e=r.hierNode.prelim+r.parentNode.hierNode.modifier;r....
  function xS (line 37) | function xS(r){return arguments.length?r:m7}
  function Ss (line 37) | function Ss(r,e){return r-=Math.PI/2,{x:e*Math.cos(r),y:e*Math.sin(r)}}
  function c7 (line 37) | function c7(r,e){return re(r.getBoxLayoutParams(),{width:e.getWidth(),he...
  function d7 (line 37) | function d7(r){for(var e=r.children,t=e.length,a=0,n=0;--t>=0;){var i=e[...
  function p7 (line 37) | function p7(r,e,t,a){if(e){for(var n=r,i=r,o=i.parentNode.children[0],s=...
  function Sc (line 37) | function Sc(r){var e=r.children;return e.length&&r.isExpand?e[e.length-1...
  function xc (line 37) | function xc(r){var e=r.children;return e.length&&r.isExpand?e[0]:r.hierN...
  function g7 (line 37) | function g7(r,e,t){return r.hierNode.ancestor.parentNode===e.parentNode?...
  function y7 (line 37) | function y7(r,e,t){var a=t/(e.hierNode.i-r.hierNode.i);e.hierNode.change...
  function m7 (line 37) | function m7(r,e){return r.parentNode===e.parentNode?1:2}
  function r (line 37) | function r(){this.parentPoint=[],this.childPoints=[]}
  function e (line 37) | function e(t){return r.call(this,t)||this}
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function wS (line 37) | function wS(r,e){var t=r.getItemLayout(e);return t&&!isNaN(t.x)&&!isNaN(...
  function bS (line 37) | function bS(r,e,t,a,n){var i=!t,o=r.tree.getNodeByDataIndex(e),s=o.getMo...
  function w7 (line 37) | function w7(r,e,t,a,n,i,o,s){var l=e.getModel(),u=r.get("edgeShape"),f=r...
  function CS (line 37) | function CS(r,e,t,a,n){var i=e.tree.root,o=DD(i,r),s=o.source,l=o.source...
  function DD (line 37) | function DD(r,e){for(var t=e.parentNode===r?e:e.parentNode||e,a;a=t.getL...
  function TS (line 37) | function TS(r,e,t,a,n){var i=r.tree.getNodeByDataIndex(e),o=r.tree.root,...
  function Pp (line 37) | function Pp(r,e,t,a,n){var i,o,s,l,u,f,h,v;if(r==="radial"){u=a.rawX,h=a...
  function MD (line 37) | function MD(r){var e=r.mainData,t=r.datas;t||(t={main:e},r.datasAttr={ma...
  function C7 (line 37) | function C7(r,e){if(L7(this)){var t=V({},sr(this).datas);t[this.dataType...
  function T7 (line 37) | function T7(r,e){return r.struct&&r.struct.update(),e}
  function A7 (line 37) | function A7(r,e){return A(sr(e).datas,function(t,a){t!==e&&Iy(t.cloneSha...
  function D7 (line 37) | function D7(r){var e=sr(this).mainData;return r==null||e==null?e:sr(e).d...
  function M7 (line 37) | function M7(){var r=sr(this).mainData;return r==null?[{data:r}]:G(St(sr(...
  function L7 (line 37) | function L7(r){return sr(r).mainData===r}
  function LD (line 37) | function LD(r,e,t){sr(r).datas={},A(e,function(a,n){Iy(a,n,r,t)})}
  function Iy (line 37) | function Iy(r,e,t,a){sr(t).datas[e]=r,sr(r).mainData=t,r.dataType=e,a.st...
  function r (line 37) | function r(e,t){this.depth=0,this.height=0,this.dataIndex=-1,this.childr...
  function r (line 37) | function r(e){this.type="tree",this._nodes=[],this.hostModel=e}
  function s (line 37) | function s(f,h){var v=f.value;o=Math.max(o,F(v)?v.length:1),i.push(f);va...
  function R7 (line 37) | function R7(r,e){var t=e.children;r.parentNode!==e&&(t.push(r),r.parentN...
  function sl (line 37) | function sl(r,e,t){if(r&&dt(e,r.type)>=0){var a=t.getData().tree.root,n=...
  function ID (line 37) | function ID(r){for(var e=[];r;)r=r.parentNode,r&&e.push(r);return e.reve...
  function Ry (line 37) | function Ry(r,e){var t=ID(r);return dt(t,e)>=0}
  function Yh (line 37) | function Yh(r,e){for(var t=[];r;){var a=r.dataIndex;t.push({name:r.name,...
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.hasS...
  function s (line 37) | function s(h){h.wrapMethod("getItemModel",function(v,c){var d=o.getNodeB...
  function O7 (line 37) | function O7(r,e,t){for(var a=[r],n=[],i;i=a.pop();)if(n.push(i),i.isExpa...
  function is (line 37) | function is(r,e){for(var t=[r],a;a=t.pop();)if(e(a),a.isExpand){var n=a....
  function B7 (line 37) | function B7(r,e){r.eachSeriesByType("tree",function(t){N7(t,e)})}
  function N7 (line 37) | function N7(r,e){var t=c7(r,e);r.layoutInfo=t;var a=r.get("layout"),n=0,...
  function V7 (line 37) | function V7(r){r.eachSeriesByType("tree",function(e){var t=e.getData(),a...
  function z7 (line 37) | function z7(r){r.registerAction({type:"treeExpandAndCollapse",event:"tre...
  function F7 (line 37) | function F7(r){r.registerChartView(b7),r.registerSeriesModel(k7),r.regis...
  function G7 (line 37) | function G7(r){for(var e=0;e<AS.length;e++)r.registerAction({type:AS[e],...
  function PD (line 37) | function PD(r){var e=r.getData(),t=e.tree,a={};t.eachNode(function(n){fo...
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function f (line 37) | function f(h){h.wrapMethod("getItemModel",function(v,c){var d=u.getNodeB...
  function RD (line 37) | function RD(r){var e=0;A(r.children,function(a){RD(a);var n=a.value;F(n)...
  function W7 (line 37) | function W7(r,e){var t=kt(e.get("color")),a=kt(e.get(["aria","decal","de...
  function r (line 37) | function r(e){this.group=new nt,e.add(this.group)}
  function Z7 (line 37) | function Z7(r,e,t,a,n,i){var o=[[n?r:r-wc,e],[r+t,e],[r+t,e+a],[n?r:r-wc...
  function X7 (line 37) | function X7(r,e,t){it(r).eventData={componentType:"series",componentSubT...
  function r (line 37) | function r(){this._storage=[],this._elExistsMap={}}
  function J7 (line 37) | function J7(){return new K7}
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function h (line 37) | function h(g,y,m,_){return r8(a,l,u,n,s,f,g,y,m,_)}
  function c (line 37) | function c(g,y,m,_,S){_?(y=g,A(g,function(b,C){!b.isRemoved()&&x(C,C)}))...
  function d (line 37) | function d(g){var y=os();return g&&A(g,function(m,_){var S=y[_];A(m,func...
  function p (line 37) | function p(){A(v,function(g){A(g,function(y){y.parent&&y.parent.remove(y...
  function os (line 37) | function os(){return{nodeGroup:[],background:[],content:[]}}
  function r8 (line 37) | function r8(r,e,t,a,n,i,o,s,l,u){if(!o)return;var f=o.getLayout(),h=r.ge...
  function a8 (line 37) | function a8(r,e){return r*Q7+e}
  function r (line 37) | function r(e){var t=e.mappingMethod,a=e.type,n=this.option=at(e);this.ty...
  function v (line 37) | function v(c,d){var p=Math.abs(c-e);p<i&&(i=p,n=d)}
  function o8 (line 37) | function o8(r){var e=r.pieceList;r.hasSpecialVisual=!1,A(e,function(t,a)...
  function s8 (line 37) | function s8(r){var e=r.categories,t=r.categoryMap={},a=r.visual;if(ll(e,...
  function bc (line 37) | function bc(r,e){var t=r.visual,a=[];et(t)?ll(t,function(i){a.push(i)}):...
  function Lu (line 37) | function Lu(r){return{applyVisual:function(e,t,a){var n=this.mapValueToV...
  function ES (line 37) | function ES(r){var e=this.option.visual;return e[Math.round(Rt(r,[0,1],[...
  function ss (line 37) | function ss(r){return function(e,t,a){a(r,this.mapValueToVisual(e))}}
  function xs (line 37) | function xs(r){var e=this.option.visual;return e[this.option.loop&&r!==q...
  function Gn (line 37) | function Gn(){return this.option.visual[0]}
  function Ep (line 37) | function Ep(r){return{linear:function(e){return Rt(e,r,this.option.visua...
  function kp (line 37) | function kp(r){var e=this.option,t=e.pieceList;if(e.hasSpecialVisual){va...
  function ED (line 37) | function ED(r,e){return r.visual=e,r.type==="color"&&(r.parsedVisual=G(e...
  function Iu (line 37) | function Iu(r,e,t){return r?e<=t:e<t}
  function OD (line 37) | function OD(r,e,t,a){var n=r.getModel(),i=r.getLayout(),o=r.hostTree.dat...
  function h8 (line 37) | function h8(r,e,t){var a=V({},e),n=t.designatedVisualItemStyle;return A(...
  function kS (line 37) | function kS(r){var e=Cc(r,"color");if(e){var t=Cc(r,"colorAlpha"),a=Cc(r...
  function v8 (line 37) | function v8(r,e){return e!=null?As(e,null,null,r):null}
  function Cc (line 37) | function Cc(r,e){var t=r[e];if(t!=null&&t!=="none")return t}
  function c8 (line 37) | function c8(r,e,t,a,n,i){if(!(!i||!i.length)){var o=Tc(e,"color")||n.col...
  function Tc (line 37) | function Tc(r,e){var t=r.get(e);return F(t)&&t.length?{name:e,range:t}:n...
  function d8 (line 37) | function d8(r,e,t,a,n,i){var o=V({},e);if(n){var s=n.type,l=s==="color"&...
  function ND (line 37) | function ND(r,e,t,a){var n,i;if(!r.isRemoved()){var o=r.getLayout();n=o....
  function _8 (line 37) | function _8(r,e,t,a,n,i){var o=r.children||[],s=a.sort;s!=="asc"&&s!=="d...
  function S8 (line 37) | function S8(r,e,t,a,n){if(!a)return t;for(var i=r.get("visibleMin"),o=n....
  function x8 (line 37) | function x8(r,e){return e&&r.sort(function(t,a){var n=e==="asc"?t.getVal...
  function w8 (line 37) | function w8(r,e,t){for(var a=0,n=0,i=e.length;n<i;n++)a+=e[n].getValue()...
  function b8 (line 37) | function b8(r,e,t){for(var a=0,n=1/0,i=0,o=void 0,s=r.length;i<s;i++)o=r...
  function BS (line 37) | function BS(r,e,t,a,n){var i=e===t.width?0:1,o=1-i,s=["x","y"],l=["width...
  function C8 (line 37) | function C8(r,e,t,a,n){var i=(e||{}).node,o=[a,n];if(!i||i===t)return o;...
  function T8 (line 37) | function T8(r,e,t){if(e)return{x:e.x,y:e.y};var a={x:0,y:0};if(!t)return...
  function VD (line 37) | function VD(r,e,t,a,n){var i=r.getLayout(),o=t[n],s=o&&o===r;if(!(o&&!s|...
  function zD (line 37) | function zD(r){return r.get(g8)?r.get(y8):0}
  function A8 (line 37) | function A8(r){r.registerSeriesModel($7),r.registerChartView(n8),r.regis...
  function D8 (line 37) | function D8(r){var e=r.findComponents({mainType:"legend"});!e||!e.length...
  function M8 (line 37) | function M8(r){var e={};r.eachSeriesByType("graph",function(t){var a=t.g...
  function Pu (line 37) | function Pu(r){return r instanceof Array||(r=[r,r]),r}
  function L8 (line 37) | function L8(r){r.eachSeriesByType("graph",function(e){var t=e.getGraph()...
  function R8 (line 37) | function R8(r){!Zh(r)||(r.__curvenessList=[],r.__edgeMap={},FD(r))}
  function E8 (line 37) | function E8(r,e,t,a){if(!!Zh(t)){var n=fl(r,e,t),i=t.__edgeMap,o=i[GD(n)...
  function Oy (line 37) | function Oy(r,e,t,a){var n=Zh(e),i=F(n);if(!n)return null;var o=I8(r,e);...
  function HD (line 37) | function HD(r){var e=r.coordinateSystem;if(!(e&&e.type!=="view")){var t=...
  function By (line 37) | function By(r,e){r.eachEdge(function(t,a){var n=Ur(t.getModel().get(["li...
  function k8 (line 37) | function k8(r,e){r.eachSeriesByType("graph",function(t){var a=t.get("lay...
  function ws (line 37) | function ws(r){var e=r.coordinateSystem;if(e.type!=="view")return 1;var ...
  function bs (line 37) | function bs(r){var e=r.getVisual("symbolSize");return e instanceof Array...
  function Ny (line 37) | function Ny(r,e,t,a){var n=r.coordinateSystem;if(!(n&&n.type!=="view")){...
  function WD (line 37) | function WD(r,e,t,a){var n=r.getGraphicEl();if(!!n){var i=r.getModel(),o...
  function B8 (line 37) | function B8(r){r.eachSeriesByType("graph",function(e){e.get("layout")===...
  function N8 (line 37) | function N8(r,e,t){for(var a=r,n=e,i=t.rect,o=i.width,s=i.height,l=[i.x+...
  function V8 (line 37) | function V8(r){r.eachSeriesByType("graph",function(e){var t=e.coordinate...
  function z8 (line 37) | function z8(r,e,t){var a=V(r.getBoxLayoutParams(),{aspect:t});return re(...
  function F8 (line 37) | function F8(r,e){var t=[];return r.eachSeriesByType("graph",function(a){...
  function r (line 37) | function r(){this.x1=0,this.y1=0,this.x2=0,this.y2=0,this.percent=1}
  function e (line 37) | function e(){return r!==null&&r.apply(this,arguments)||this}
  function Mc (line 37) | function Mc(r){return isNaN(+r.cpx1)||isNaN(+r.cpy1)}
  function e (line 37) | function e(t){var a=r.call(this,t)||this;return a.type="ec-line",a}
  function zS (line 37) | function zS(r){return"_"+r+"Type"}
  function FS (line 37) | function FS(r,e,t){var a=e.getItemVisual(t,r);if(!a||a==="none")return a...
  function GS (line 37) | function GS(r,e,t){var a=e.getItemVisual(t,r);if(!(!a||a==="none")){var ...
  function W8 (line 37) | function W8(r){var e=new H8({name:"line",subPixelOptimize:!0});return Np...
  function Np (line 37) | function Np(r,e){r.x1=e[0][0],r.y1=e[0][1],r.x2=e[1][0],r.y2=e[1][1],r.p...
  function e (line 37) | function e(t,a,n){var i=r.call(this)||this;return i._createLine(t,a,n),i}
  function c (line 37) | function c(D,M){var L=D.__specifiedRotation;if(L==null){var I=l.tangentA...
  function r (line 37) | function r(e){this.group=new nt,this._LineCtor=e||Vy}
  function a (line 37) | function a(s){!s.isGroup&&!Y8(s)&&(s.incremental=!0,s.ensureState("empha...
  function Y8 (line 37) | function Y8(r){return r.animators&&r.animators.length>0}
  function HS (line 37) | function HS(r){var e=r.hostModel,t=e.getModel("emphasis");return{lineSty...
  function WS (line 37) | function WS(r){return isNaN(r[0])||isNaN(r[1])}
  function Ic (line 37) | function Ic(r){return r&&!WS(r[0])&&!WS(r[1])}
  function US (line 37) | function US(r,e,t){for(var a=r[0],n=r[1],i=r[2],o=1/0,s,l=t*t,u=.1,f=.1;...
  function Oc (line 37) | function Oc(r,e){var t=[],a=$s,n=[[],[],[]],i=[[],[]],o=[];e/=2,r.eachEd...
  function YS (line 37) | function YS(r){return r.type==="view"}
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function Ui (line 37) | function Ui(r){return"_EC_"+r}
  function r (line 37) | function r(e){this.type="graph",this.nodes=[],this.edges=[],this._nodesM...
  function r (line 37) | function r(e,t){this.inEdges=[],this.outEdges=[],this.edges=[],this.data...
  function r (line 37) | function r(e,t,a){this.dataIndex=-1,this.node1=e,this.node2=t,this.dataI...
  function YD (line 37) | function YD(r,e){return{getValue:function(t){var a=this[r][e];return a.g...
  function ZD (line 37) | function ZD(r,e,t,a,n){for(var i=new K8(a),o=0;o<r.length;o++)i.addNode(...
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function n (line 37) | function n(){return a._categoriesData}
  function l (line 37) | function l(u,f){u.wrapMethod("getItemModel",function(d){var p=o._categor...
  function tF (line 37) | function tF(r){r.registerChartView(X8),r.registerSeriesModel(Q8),r.regis...
  function r (line 37) | function r(){this.angle=0,this.width=10,this.r=10,this.x=0,this.y=0}
  function e (line 37) | function e(t){var a=r.call(this,t)||this;return a.type="pointer",a}
  function nF (line 37) | function nF(r,e){var t=r.get("center"),a=e.getWidth(),n=e.getHeight(),i=...
  function Ru (line 37) | function Ru(r,e){var t=r==null?"":r+"";return e&&(U(e)?t=e.replace("{val...
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function C (line 37) | function C(D,M){var L=m.getItemModel(D),I=L.getModel("pointer"),P=W(I.ge...
  function T (line 37) | function T(D,M){var L=g.get("roundCap"),I=L?Uf:Ve,P=g.get("overlap"),R=P...
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function XD (line 37) | function XD(r){r.registerChartView(oF),r.registerSeriesModel(lF)}
  function e (line 37) | function e(t,a){var n=r.call(this)||this,i=n,o=new Fe,s=new Dt;return i....
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function pF (line 37) | function pF(r,e){return re(r.getBoxLayoutParams(),{width:e.getWidth(),he...
  function gF (line 37) | function gF(r,e){for(var t=r.mapDimension("value"),a=r.mapArray(t,functi...
  function yF (line 37) | function yF(r){var e=r.hostModel,t=e.get("orient");r.each(function(a){va...
  function mF (line 37) | function mF(r,e){r.eachSeriesByType("funnel",function(t){var a=t.getData...
  function _F (line 37) | function _F(r){r.registerChartView(vF),r.registerSeriesModel(dF),r.regis...
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function v (line 37) | function v(g){var y=ZS(s,o,g,f,u);Bc(y,s,g,h)}
  function c (line 37) | function c(g,y){var m=l.getItemGraphicEl(y),_=qD(s,g,f,u);s.setItemGraph...
  function d (line 37) | function d(g){var y=l.getItemGraphicEl(g);o.remove(y)}
  function wF (line 37) | function wF(r,e,t){var a=r.model,n=r.getRect(),i=new bt({shape:{x:n.x,y:...
  function qD (line 37) | function qD(r,e,t,a){for(var n=[],i=0;i<t.length;i++){var o=t[i],s=r.get...
  function ZS (line 37) | function ZS(r,e,t,a,n){var i=qD(r,t,a,n),o=new Fe({shape:{points:i},z2:1...
  function XS (line 37) | function XS(r){var e=r.get("smooth",!0);return e===!0&&(e=SF),e=ma(e),Ws...
  function Bc (line 37) | function Bc(r,e,t,a){r.useStyle(e.getItemVisual(t,"style")),r.style.fill...
  function bF (line 37) | function bF(r,e){return e==="category"?r==null:r==null||isNaN(r)}
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function AF (line 37) | function AF(r){var e=r.ecModel.getComponent("parallel",r.get("parallelIn...
  function DF (line 37) | function DF(r){return+r.replace("dim","")}
  function RF (line 37) | function RF(r){EF(r),kF(r)}
  function EF (line 37) | function EF(r){if(!r.parallel){var e=!1;A(r.series,function(t){t&&t.type...
  function kF (line 37) | function kF(r){var e=kt(r.parallelAxis);A(e,function(t){if(!!et(t)){var ...
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function Nc (line 37) | function Nc(r,e){var t=r._model;return t.get("axisExpandable")&&t.get("a...
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function e (line 37) | function e(t,a,n,i,o){var s=r.call(this,t,a,n)||this;return s.type=i||"v...
  function Li (line 37) | function Li(r,e,t,a,n,i){r=r||0;var o=t[1]-t[0];if(n!=null&&(n=Yi(n,[0,o...
  function Vc (line 37) | function Vc(r,e){var t=r[e]-r[1-e];return{span:Math.abs(t),sign:t>0?-1:t...
  function Yi (line 37) | function Yi(r,e){return Math.min(e[1]!=null?e[1]:1/0,Math.max(e[0]!=null...
  function r (line 37) | function r(e,t,a){this.type="parallel",this._axesMap=q(),this._axesLayou...
  function Eu (line 37) | function Eu(r,e){return KD(JD(r,e[0]),e[1])}
  function YF (line 37) | function YF(r,e){var t=e.layoutLength/(e.axisCount-1);return{position:t*...
  function ZF (line 37) | function ZF(r,e){var t=e.layoutLength,a=e.axisExpandWidth,n=e.axisCount,...
  function qF (line 37) | function qF(r,e){var t=[];return r.eachComponent("parallel",function(a,n...
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function e (line 37) | function e(t){var a=r.call(this)||this;return a._track=[],a._covers=[],a...
  function l (line 37) | function l(v,c){return(v.id!=null?v.id:a+c)+"-"+v.brushType}
  function u (line 37) | function u(v,c){return l(v.__brushOption,c)}
  function f (line 37) | function f(v,c){var d=t[v];if(c!=null&&n[c]===s)i[v]=n[c];else{var p=i[v...
  function h (line 37) | function h(v){n[v]!==s&&o.group.remove(n[v])}
  function jD (line 37) | function jD(r,e){var t=Xh[e.brushType].createCover(r,e);return t.__brush...
  function tM (line 37) | function tM(r,e){var t=Gy(e);return t.endCreating&&(t.endCreating(r,e),r...
  function eM (line 37) | function eM(r,e){var t=e.__brushOption;Gy(e).updateCoverShape(r,e,t.rang...
  function rM (line 37) | function rM(r,e){var t=e.z;t==null&&(t=jF),r.traverse(function(a){a.z=t,...
  function Fy (line 37) | function Fy(r,e){Gy(e).updateCommon(r,e),eM(r,e)}
  function Gy (line 37) | function Gy(r){return Xh[r.__brushOption.brushType]}
  function Hy (line 37) | function Hy(r,e,t){var a=r._panels;if(!a)return mi;var n,i=r._transform;...
  function aM (line 37) | function aM(r,e){var t=r._panels;if(!t)return mi;var a=e.__brushOption.p...
  function Vp (line 37) | function Vp(r){var e=r._covers,t=e.length;return A(e,function(a){r.group...
  function _i (line 37) | function _i(r,e){var t=G(r._covers,function(a){var n=a.__brushOption,i=a...
  function o9 (line 37) | function o9(r){var e=r._track;if(!e.length)return!1;var t=e[e.length-1],...
  function nM (line 37) | function nM(r){var e=r.length-1;return e<0&&(e=0),[r[0],r[e]]}
  function iM (line 37) | function iM(r,e,t,a){var n=new nt;return n.add(new bt({name:"main",style...
  function oM (line 37) | function oM(r,e,t,a){var n=a.brushStyle.lineWidth||0,i=mo(n,e9),o=t[0][0...
  function zp (line 37) | function zp(r,e){var t=e.__brushOption,a=t.transformable,n=e.childAt(0);...
  function ia (line 37) | function ia(r,e,t,a,n,i,o){var s=e.childOfName(t);s&&s.setShape(f9($y(r,...
  function Wy (line 37) | function Wy(r){return tt({strokeNoScale:!0},r.brushStyle)}
  function sM (line 37) | function sM(r,e,t,a){var n=[hl(r,t),hl(e,a)],i=[mo(r,t),mo(e,a)];return[...
  function s9 (line 37) | function s9(r){return li(r.group)}
  function Fp (line 37) | function Fp(r,e){var t={w:"left",e:"right",n:"top",s:"bottom"},a={left:"...
  function l9 (line 37) | function l9(r,e){var t=[Fp(r,e[0]),Fp(r,e[1])];return(t[0]==="e"||t[0]==...
  function tx (line 37) | function tx(r,e,t,a,n,i){var o=t.__brushOption,s=r.toRectRange(o.range),...
  function u9 (line 37) | function u9(r,e,t,a){var n=e.__brushOption.range,i=lM(r,t,a);A(n,functio...
  function lM (line 37) | function lM(r,e,t){var a=r.group,n=a.transformCoordToLocal(e,t),i=a.tran...
  function $y (line 37) | function $y(r,e,t){var a=aM(r,e);return a&&a!==mi?a.clipPath(t,r._transf...
  function f9 (line 37) | function f9(r){var e=hl(r[0][0],r[1][0]),t=hl(r[0][1],r[1][1]),a=mo(r[0]...
  function h9 (line 37) | function h9(r,e,t){if(!(!r._brushType||c9(r,e.offsetX,e.offsetY))){var a...
  function Gp (line 37) | function Gp(r){var e=r.event;e.preventDefault&&e.preventDefault()}
  function Hp (line 37) | function Hp(r,e,t){return r.childOfName("main").contain(e,t)}
  function uM (line 37) | function uM(r,e,t,a){var n=r._creatingCover,i=r._creatingPanel,o=r._brus...
  function ex (line 37) | function ex(r,e){return r==="auto"?e.defaultBrushType:r}
  function rx (line 37) | function rx(r,e){if(r._dragging){Gp(e);var t=e.offsetX,a=e.offsetY,n=r.g...
  function c9 (line 37) | function c9(r,e,t){var a=r._zr;return e<0||e>a.getWidth()||t<0||t>a.getH...
  function t (line 37) | function t(a){return a}
  function ax (line 37) | function ax(r){return{createCover:function(e,t){return iM({toRectRange:f...
  function fM (line 37) | function fM(r){return r=Yy(r),function(e){return TC(e,r)}}
  function hM (line 37) | function hM(r,e){return r=Yy(r),function(t){var a=e!=null?e:t,n=a?r.widt...
  function vM (line 37) | function vM(r,e,t){var a=Yy(r);return function(n,i){return a.contain(i[0...
  function Yy (line 37) | function Yy(r){return vt.create(r)}
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function g9 (line 37) | function g9(r,e,t){return t&&t.type==="axisAreaSelect"&&e.findComponents...
  function y9 (line 37) | function y9(r){var e=r.axis;return G(r.activeIntervals,function(t){retur...
  function m9 (line 37) | function m9(r,e){return e.getComponent("parallel",r.get("parallelIndex"))}
  function x9 (line 37) | function x9(r){r.registerAction(S9,function(e,t){t.eachComponent({mainTy...
  function cM (line 37) | function cM(r){r.registerComponentView(VF),r.registerComponentModel(FF),...
  function b9 (line 37) | function b9(r){ct(cM),r.registerChartView(CF),r.registerSeriesModel(MF),...
  function r (line 37) | function r(){this.x1=0,this.y1=0,this.x2=0,this.y2=0,this.cpx1=0,this.cp...
  function e (line 37) | function e(t){return r.call(this,t)||this}
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function nx (line 37) | function nx(r,e,t){switch(r.fill){case"source":r.fill=t.node1.getVisual(...
  function D9 (line 37) | function D9(r,e,t){var a=new bt({shape:{x:r.x-10,y:r.y-10,width:0,height...
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function f (line 37) | function f(h,v){h.wrapMethod("getItemModel",function(c,d){var p=c.parent...
  function i (line 37) | function i(c){return isNaN(c)||c==null}
  function P9 (line 37) | function P9(r,e){r.eachSeriesByType("sankey",function(t){var a=t.get("no...
  function R9 (line 37) | function R9(r,e){return re(r.getBoxLayoutParams(),{width:e.getWidth(),he...
  function E9 (line 37) | function E9(r,e,t,a,n,i,o,s,l){O9(r,e,t,n,i,s,l),z9(r,e,i,n,a,o,s),X9(r,s)}
  function k9 (line 37) | function k9(r){A(r,function(e){var t=ja(e.outEdges,Jf),a=ja(e.inEdges,Jf...
  function O9 (line 37) | function O9(r,e,t,a,n,i,o){for(var s=[],l=[],u=[],f=[],h=0,v=0;v<e.lengt...
  function dM (line 37) | function dM(r){var e=r.hostGraph.data.getRawDataItem(r.dataIndex);return...
  function B9 (line 37) | function B9(r,e,t,a){if(e==="right"){for(var n=[],i=r,o=0;i.length;){for...
  function N9 (line 37) | function N9(r,e){A(r,function(t){!dM(t)&&!t.outEdges.length&&t.setLayout...
  function V9 (line 37) | function V9(r,e,t){A(r,function(a){var n=a.getLayout().depth*e;t==="vert...
  function z9 (line 37) | function z9(r,e,t,a,n,i,o){var s=F9(r,o);G9(s,e,t,a,n,o),Fc(s,n,t,a,o);f...
  function F9 (line 37) | function F9(r,e){var t=[],a=e==="vertical"?"y":"x",n=Xd(r,function(i){re...
  function G9 (line 37) | function G9(r,e,t,a,n,i){var o=1/0;A(r,function(s){var l=s.length,u=0;A(...
  function Fc (line 37) | function Fc(r,e,t,a,n){var i=n==="vertical"?"x":"y";A(r,function(o){o.so...
  function H9 (line 37) | function H9(r,e,t){A(r.slice().reverse(),function(a){A(a,function(n){if(...
  function W9 (line 37) | function W9(r,e){return sn(r.node2,e)*r.getValue()}
  function $9 (line 37) | function $9(r,e){return sn(r.node2,e)}
  function U9 (line 37) | function U9(r,e){return sn(r.node1,e)*r.getValue()}
  function Y9 (line 37) | function Y9(r,e){return sn(r.node1,e)}
  function sn (line 37) | function sn(r,e){return e==="vertical"?r.getLayout().x+r.getLayout().dx/...
  function Jf (line 37) | function Jf(r){return r.getValue()}
  function ja (line 37) | function ja(r,e,t){for(var a=0,n=r.length,i=-1;++i<n;){var o=+e(r[i],t);...
  function Z9 (line 37) | function Z9(r,e,t){A(r,function(a){A(a,function(n){if(n.inEdges.length){...
  function X9 (line 37) | function X9(r,e){var t=e==="vertical"?"x":"y";A(r,function(a){a.outEdges...
  function q9 (line 37) | function q9(r){r.eachSeriesByType("sankey",function(e){var t=e.getGraph(...
  function K9 (line 37) | function K9(r){r.registerChartView(M9),r.registerSeriesModel(I9),r.regis...
  function r (line 37) | function r(){}
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function r (line 37) | function r(){}
  function e (line 37) | function e(t){var a=r.call(this,t)||this;return a.type="boxplotBoxPath",a}
  function ix (line 37) | function ix(r,e,t,a,n){var i=r.ends,o=new tG({shape:{points:n?eG(i,a,r):...
  function yM (line 37) | function yM(r,e,t,a,n){var i=t.hostModel,o=Dl[n?"initProps":"updateProps...
  function eG (line 37) | function eG(r,e,t){return G(r,function(a){return a=a.slice(),a[e]=t.init...
  function aG (line 37) | function aG(r){var e=nG(r);Vs(e,function(t){var a=t.seriesModels;!a.leng...
  function nG (line 37) | function nG(r){var e=[],t=[];return r.eachSeriesByType("boxplot",functio...
  function iG (line 37) | function iG(r){var e=r.axis,t=r.seriesModels,a=t.length,n=r.boxWidthList...
  function oG (line 37) | function oG(r,e,t){var a=r.coordinateSystem,n=r.getData(),i=t/2,o=r.get(...
  function sG (line 37) | function sG(r,e){e=e||{};for(var t=[],a=[],n=e.boundIQR,i=n==="none"||n=...
  function uG (line 37) | function uG(r){r.registerSeriesModel(J9),r.registerChartView(rG),r.regis...
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function r (line 37) | function r(){}
  function e (line 37) | function e(t){var a=r.call(this,t)||this;return a.type="normalCandlestic...
  function Gc (line 37) | function Gc(r,e,t){var a=r.ends;return new cG({shape:{points:t?dG(a,r):a...
  function ox (line 37) | function ox(r,e){for(var t=!0,a=0;a<e.ends.length;a++)if(r.contain(e.end...
  function Hc (line 37) | function Hc(r,e,t,a){var n=e.getItemModel(t);r.useStyle(e.getItemVisual(...
  function dG (line 37) | function dG(r,e){return G(r,function(t){return t=t.slice(),t[1]=e.initBa...
  function r (line 37) | function r(){}
  function e (line 37) | function e(t){var a=r.call(this,t)||this;return a.type="largeCandlestick...
  function sx (line 37) | function sx(r,e,t,a){var n=r.getData(),i=n.getLayout("largePoints"),o=ne...
  function $c (line 37) | function $c(r,e,t,a){var n=t.get(["itemStyle",r>0?"borderColor":"borderC...
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function mG (line 37) | function mG(r){!r||!F(r.series)||A(r.series,function(e){et(e)&&e.type===...
  function t (line 37) | function t(i,o){return o.get(i>0?wG:bG)}
  function a (line 37) | function a(i,o){return o.get(i===0?xG:i>0?_G:SG)}
  function c (line 37) | function c(p,g){for(var y,m=g.getStore();(y=p.next())!=null;){var _=m.ge...
  function d (line 37) | function d(p,g){for(var y=Wr(p.count*4),m=0,_,S=[],w=[],x,b=g.getStore()...
  function lx (line 37) | function lx(r,e,t,a,n,i){var o;return t>a?o=-1:t<a?o=1:o=i?0:e>0?r.get(n...
  function DG (line 37) | function DG(r,e){var t=r.getBaseAxis(),a,n=t.type==="category"?t.getBand...
  function LG (line 37) | function LG(r){r.registerChartView(gG),r.registerSeriesModel(yG),r.regis...
  function ux (line 37) | function ux(r,e){var t=e.rippleEffectColor||e.color;r.eachChild(function...
  function e (line 37) | function e(t,a){var n=r.call(this)||this,i=new El(t,a),o=new nt;return n...
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function BG (line 37) | function BG(r){r.registerChartView(EG),r.registerSeriesModel(OG),r.regis...
  function e (line 37) | function e(t,a,n){var i=r.call(this)||this;return i.add(i.createLine(t,a...
  function e (line 37) | function e(t,a,n){var i=r.call(this)||this;return i._createPolyline(t,a,...
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t._las...
  function r (line 37) | function r(){this.polyline=!1,this.curveness=0,this.segs=[]}
  function e (line 37) | function e(t){var a=r.call(this,t)||this;return a._off=0,a.hoverDataIdx=...
  function r (line 37) | function r(){this.group=new nt}
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function fx (line 37) | function fx(r){var e=r.data;e&&e[0]&&e[0][0]&&e[0][0].coord&&(r.data=G(e...
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function ku (line 37) | function ku(r){return r instanceof Array||(r=[r,r]),r}
  function n (line 37) | function n(i,o){var s=i.getItemModel(o),l=ku(s.getShallow("symbol",!0)),...
  function tH (line 37) | function tH(r){r.registerChartView(ZG),r.registerSeriesModel(JG),r.regis...
  function r (line 37) | function r(){this.blurSize=30,this.pointSize=20,this.maxOpacity=1,this.m...
  function nH (line 37) | function nH(r,e,t){var a=r[1]-r[0];e=G(e,function(o){return{interval:[(o...
  function iH (line 37) | function iH(r,e){var t=r[1]-r[0];return e=[(e[0]-r[0])/t,(e[1]-r[0])/t],...
  function hx (line 37) | function hx(r){var e=r.dimensions;return e[0]==="lng"&&e[1]==="lat"}
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function fH (line 37) | function fH(r){r.registerChartView(sH),r.registerSeriesModel(uH)}
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function cx (line 37) | function cx(r,e,t,a){var n=r.getItemLayout(e),i=t.get("symbolRepeat"),o=...
  function cH (line 37) | function cH(r,e,t,a,n){var i=a.valueDim,o=r.get("symbolBoundingData"),s=...
  function Yc (line 37) | function Yc(r,e){return r.toGlobalCoord(r.dataToCoord(r.scale.parse(e)))}
  function dH (line 37) | function dH(r,e,t,a,n,i,o,s,l,u){var f=l.valueDim,h=l.categoryDim,v=Math...
  function pH (line 37) | function pH(r,e,t,a,n){var i=r.get(hH)||0;i&&(Uc.attr({scaleX:e[0],scale...
  function gH (line 37) | function gH(r,e,t,a,n,i,o,s,l,u,f,h){var v=f.categoryDim,c=f.valueDim,d=...
  function wM (line 37) | function wM(r){var e=r.symbolPatternSize,t=jt(r.symbolType,-e/2,-e/2,e,e...
  function bM (line 37) | function bM(r,e,t,a){var n=r.__pictorialBundle,i=t.symbolSize,o=t.valueL...
  function CM (line 37) | function CM(r,e,t,a){var n=r.__pictorialBundle,i=r.__pictorialMainPath;i...
  function TM (line 37) | function TM(r,e,t){var a=V({},e.barRectShape),n=r.__pictorialBarRect;n?f...
  function AM (line 37) | function AM(r,e,t,a){if(t.symbolClip){var n=r.__pictorialClipPath,i=V({}...
  function dx (line 37) | function dx(r,e){var t=r.getItemModel(e);return t.getAnimationDelayParam...
  function yH (line 37) | function yH(r){return{index:r.__pictorialAnimationIndex,count:r.__pictor...
  function mH (line 37) | function mH(){return this.parentModel.isAnimationEnabled()&&!!this.getSh...
  function px (line 37) | function px(r,e,t,a){var n=new nt,i=new nt;return n.add(i),n.__pictorial...
  function _H (line 37) | function _H(r,e,t){var a=t.animationModel,n=t.dataIndex,i=r.__pictorialB...
  function gx (line 37) | function gx(r,e,t,a){var n=a.__pictorialBarRect;n&&n.removeTextContent()...
  function DM (line 37) | function DM(r,e){return[r.getItemVisual(e.dataIndex,"symbol")||"none",!!...
  function Zy (line 37) | function Zy(r,e,t){A(r.__pictorialBundle.children(),function(a){a!==r.__...
  function fo (line 37) | function fo(r,e,t,a,n,i){e&&r.attr(e),a.symbolClip&&!n?t&&r.attr(t):t&&D...
  function yx (line 37) | function yx(r,e,t){var a=t.dataIndex,n=t.itemModel,i=n.getModel("emphasi...
  function mx (line 37) | function mx(r){var e=Math.round(r);return Math.abs(r-e)<1e-4?e:Math.ceil...
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function bH (line 37) | function bH(r){r.registerChartView(SH),r.registerSeriesModel(wH),r.regis...
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function v (line 37) | function v(g){return g.name}
  function p (line 37) | function p(g,y,m){var _=o._layers;if(g==="remove"){s.remove(_[y]);return...
  function TH (line 37) | function TH(r,e,t){var a=new bt({shape:{x:r.x-10,y:r.y-10,width:0,height...
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function LH (line 37) | function LH(r,e){r.eachSeriesByType("themeRiver",function(t){var a=t.get...
  function _x (line 37) | function _x(r,e,t){if(!!r.count())for(var a=e.coordinateSystem,n=e.getLa...
  function IH (line 37) | function IH(r){for(var e=r.length,t=r[0].length,a=[],n=[],i=0,o=0;o<t;++...
  function PH (line 37) | function PH(r){r.registerChartView(AH),r.registerSeriesModel(MH),r.regis...
  function e (line 37) | function e(t,a,n,i){var o=r.call(this)||this;o.z2=RH,o.textConfig={insid...
  function g (line 37) | function g(y,m){var _=y.get(m);return _==null?i.get(m):_}
  function BH (line 37) | function BH(r){r.registerAction({type:Wp,update:"updateView"},function(e...
  function e (line 37) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type...
  function d (line 37) | function d(m,_){if(m.length===0&&_.length===0)return;new xa(_,m,S,S).add...
  function p (line 37) | function p(m,_){if(!h&&m&&!m.getValue()&&(m=null),m!==l&&_!==l){if(_&&_....
  function g (line 37) | fun
Copy disabled (too large) Download .json
Condensed preview — 3035 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (47,813K chars).
[
  {
    "path": "LICENSE",
    "chars": 35149,
    "preview": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
  },
  {
    "path": "README.md",
    "chars": 60,
    "preview": "- [个人脚本专用配套插件包](https://github.com/281677160/build-actions)\n"
  },
  {
    "path": "luci-app-adguardhome/Makefile",
    "chars": 1667,
    "preview": "# This is free software, licensed under the Apache License, Version 2.0 .\n#\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=luci-"
  },
  {
    "path": "luci-app-adguardhome/luasrc/controller/AdGuardHome.lua",
    "chars": 4714,
    "preview": "module(\"luci.controller.AdGuardHome\", package.seeall)\nlocal fs = require \"nixio.fs\"\nlocal http = require \"luci.http\"\nloc"
  },
  {
    "path": "luci-app-adguardhome/luasrc/model/cbi/AdGuardHome/base.lua",
    "chars": 11544,
    "preview": "require(\"luci.sys\")\nrequire(\"luci.util\")\nrequire(\"io\")\nlocal m, s, o, o1\nlocal fs = require \"nixio.fs\"\nlocal uci = requi"
  },
  {
    "path": "luci-app-adguardhome/luasrc/model/cbi/AdGuardHome/log.lua",
    "chars": 465,
    "preview": "local fs = require \"nixio.fs\"\nlocal uci = require\"luci.model.uci\".cursor()\nlocal f, t\nf = SimpleForm(\"logview\")\nf.reset "
  },
  {
    "path": "luci-app-adguardhome/luasrc/model/cbi/AdGuardHome/manual.lua",
    "chars": 2992,
    "preview": "local m, s, o\nlocal fs = require \"nixio.fs\"\nlocal uci = require\"luci.model.uci\".cursor()\nlocal sys = require \"luci.sys\"\n"
  },
  {
    "path": "luci-app-adguardhome/luasrc/view/AdGuardHome/AdGuardHome_check.htm",
    "chars": 2944,
    "preview": "<%+cbi/valueheader%>\n<%local fs=require\"nixio.fs\"%>\n<input type=\"button\" class=\"cbi-button cbi-button-apply\" id=\"apply_u"
  },
  {
    "path": "luci-app-adguardhome/luasrc/view/AdGuardHome/AdGuardHome_chpass.htm",
    "chars": 2075,
    "preview": "<%+cbi/valueheader%>\n<script type=\"text/javascript\">//<![CDATA[\nfunction chpass(btn)\n\t{\n\t\tbtn.disabled = true;\n\t\tbtn.val"
  },
  {
    "path": "luci-app-adguardhome/luasrc/view/AdGuardHome/AdGuardHome_status.htm",
    "chars": 845,
    "preview": "<script type=\"text/javascript\">//<![CDATA[\nXHR.poll(3, '<%=url([[admin]], [[services]], [[AdGuardHome]], [[status]])%>',"
  },
  {
    "path": "luci-app-adguardhome/luasrc/view/AdGuardHome/log.htm",
    "chars": 3797,
    "preview": "<%+cbi/valueheader%>\n<input type=\"checkbox\" name=\"NAME\" value=\"reverse\" onclick=\" return reverselog()\" style=\"vertical-a"
  },
  {
    "path": "luci-app-adguardhome/luasrc/view/AdGuardHome/yamleditor.htm",
    "chars": 1756,
    "preview": "<%+cbi/valueheader%>\n<script src=\"/luci-static/resources/codemirror/lib/codemirror.js\"></script>\n<link rel=\"stylesheet\" "
  },
  {
    "path": "luci-app-adguardhome/po/zh_Hans/AdGuardHome.po",
    "chars": 4688,
    "preview": "#/cgi-bin/luci/admin/services/AdGuardHome\nmsgid \"Base Setting\"\nmsgstr \"基础设置\"\n\nmsgid \"Log\"\nmsgstr \"日志\"\n\nmsgid \"Manual Con"
  },
  {
    "path": "luci-app-adguardhome/root/etc/config/AdGuardHome",
    "chars": 375,
    "preview": "config AdGuardHome 'AdGuardHome'\n\toption enabled '0'\n\toption httpport '3000'\n\toption configpath '/etc/config/AdGuardHome"
  },
  {
    "path": "luci-app-adguardhome/root/etc/config/AdGuardHome.yaml",
    "chars": 5917,
    "preview": "http:\n  address: 0.0.0.0:3000\n  session_ttl: 720h\nusers:\n  - name: admin\n    password: $2y$10$vHRcARdPCieYG3RXWomV5evDYN"
  },
  {
    "path": "luci-app-adguardhome/root/etc/init.d/AdGuardHome",
    "chars": 18475,
    "preview": "#!/bin/sh /etc/rc.common\n\nUSE_PROCD=1\n\nSTART=95\nSTOP=01\n\nCONFIGURATION=AdGuardHome\nCRON_FILE=/etc/crontabs/root\nEXTRA_CO"
  },
  {
    "path": "luci-app-adguardhome/root/etc/uci-defaults/40_luci-AdGuardHome",
    "chars": 256,
    "preview": "#!/bin/sh\n\nuci -q batch <<-EOF >/dev/null 2>&1\n\tdelete ucitrack.@AdGuardHome[-1]\n\tadd ucitrack AdGuardHome\n\tset ucitrack"
  },
  {
    "path": "luci-app-adguardhome/root/usr/share/AdGuardHome/AdGuardHome_template.yaml",
    "chars": 2811,
    "preview": "bind_host: 0.0.0.0\nbind_port: 3000\nbeta_bind_port: 0\nusers:\n  - name: admin\n    password: $2y$10$vHRcARdPCieYG3RXWomV5ev"
  },
  {
    "path": "luci-app-adguardhome/root/usr/share/AdGuardHome/addhost.sh",
    "chars": 973,
    "preview": "#!/bin/sh\ncheckmd5(){\nlocal nowmd5=$(md5sum /etc/hosts)\nnowmd5=${nowmd5%% *}\nlocal lastmd5=$(uci get AdGuardHome.AdGuard"
  },
  {
    "path": "luci-app-adguardhome/root/usr/share/AdGuardHome/firewall.start",
    "chars": 237,
    "preview": "#!/bin/sh\n\nAdGuardHome_enable=$(uci get AdGuardHome.AdGuardHome.enabled)\nredirect=$(uci get AdGuardHome.AdGuardHome.redi"
  },
  {
    "path": "luci-app-adguardhome/root/usr/share/AdGuardHome/getsyslog.sh",
    "chars": 431,
    "preview": "#!/bin/sh\nPATH=\"/usr/sbin:/usr/bin:/sbin:/bin\"\nlogread -e AdGuardHome > /tmp/AdGuardHometmp.log\nlogread -e AdGuardHome -"
  },
  {
    "path": "luci-app-adguardhome/root/usr/share/AdGuardHome/gfw2adg.sh",
    "chars": 2359,
    "preview": "#!/bin/sh\nPATH=\"/usr/sbin:/usr/bin:/sbin:/bin\"\ncheckmd5(){\nlocal nowmd5=$(md5sum /tmp/adguard.list 2>/dev/null)\nnowmd5=$"
  },
  {
    "path": "luci-app-adguardhome/root/usr/share/AdGuardHome/links.txt",
    "chars": 266,
    "preview": "https://static.adguard.com/adguardhome/release/AdGuardHome_linux_${Arch}.tar.gz\n#https://github.com/AdguardTeam/AdGuardH"
  },
  {
    "path": "luci-app-adguardhome/root/usr/share/AdGuardHome/tailto.sh",
    "chars": 92,
    "preview": "#!/bin/sh\ntail -n $1 \"$2\" > /var/run/tailtmp\ncat /var/run/tailtmp > \"$2\"\nrm /var/run/tailtmp"
  },
  {
    "path": "luci-app-adguardhome/root/usr/share/AdGuardHome/update_core.sh",
    "chars": 6598,
    "preview": "#!/bin/bash\nPATH=\"/usr/sbin:/usr/bin:/sbin:/bin\"\nbinpath=$(uci get AdGuardHome.AdGuardHome.binpath)\nif [ -z \"$binpath\" ]"
  },
  {
    "path": "luci-app-adguardhome/root/usr/share/AdGuardHome/waitnet.sh",
    "chars": 698,
    "preview": "#!/bin/sh\nPATH=\"/usr/sbin:/usr/bin:/sbin:/bin\"\ncount=0\nwhile :\ndo\n\tping -c 1 -W 1 -q www.baidu.com 1>/dev/null 2>&1\n\tif "
  },
  {
    "path": "luci-app-adguardhome/root/usr/share/AdGuardHome/watchconfig.sh",
    "chars": 221,
    "preview": "#!/bin/sh\nPATH=\"/usr/sbin:/usr/bin:/sbin:/bin\"\nconfigpath=$(uci get AdGuardHome.AdGuardHome.configpath)\nwhile :\ndo\n\tslee"
  },
  {
    "path": "luci-app-adguardhome/root/usr/share/rpcd/acl.d/luci-app-adguardhome.json",
    "chars": 186,
    "preview": "{\n\t\"luci-app-adguardhome\": {\n\t\t\"description\": \"Grant UCI access for luci-app-adguardhome\",\n\t\t\"read\": {\n\t\t\t\"uci\": [ \"AdGu"
  },
  {
    "path": "luci-app-adguardhome/root/www/luci-static/resources/codemirror/addon/fold/foldcode.js",
    "chars": 2504,
    "preview": "!function(n){\"object\"==typeof exports&&\"object\"==typeof module?n(require(\"../../lib/codemirror\")):\"function\"==typeof def"
  },
  {
    "path": "luci-app-adguardhome/root/www/luci-static/resources/codemirror/addon/fold/foldgutter.css",
    "chars": 376,
    "preview": ".CodeMirror-foldmarker{color:blue;text-shadow:#b9f 1px 1px 2px,#b9f -1px -1px 2px,#b9f 1px -1px 2px,#b9f -1px 1px 2px;fo"
  },
  {
    "path": "luci-app-adguardhome/root/www/luci-static/resources/codemirror/addon/fold/foldgutter.js",
    "chars": 2726,
    "preview": "!function(t){\"object\"==typeof exports&&\"object\"==typeof module?t(require(\"../../lib/codemirror\"),require(\"./foldcode\")):"
  },
  {
    "path": "luci-app-adguardhome/root/www/luci-static/resources/codemirror/addon/fold/indent-fold.js",
    "chars": 650,
    "preview": "!function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof def"
  },
  {
    "path": "luci-app-adguardhome/root/www/luci-static/resources/codemirror/lib/codemirror.css",
    "chars": 6048,
    "preview": ".CodeMirror{font-family:monospace;height:500px;color:black;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre"
  },
  {
    "path": "luci-app-adguardhome/root/www/luci-static/resources/codemirror/lib/codemirror.js",
    "chars": 169494,
    "preview": "!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define"
  },
  {
    "path": "luci-app-adguardhome/root/www/luci-static/resources/codemirror/mode/yaml/yaml.js",
    "chars": 1823,
    "preview": "!function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof def"
  },
  {
    "path": "luci-app-adguardhome/root/www/luci-static/resources/codemirror/theme/dracula.css",
    "chars": 1656,
    "preview": ".cm-s-dracula.CodeMirror,.cm-s-dracula .CodeMirror-gutters{background-color:#282a36 !important;color:#f8f8f2 !important;"
  },
  {
    "path": "luci-app-amlogic/Makefile",
    "chars": 1327,
    "preview": "#=====================================================================================================\n# This file is li"
  },
  {
    "path": "luci-app-amlogic/luasrc/controller/amlogic.lua",
    "chars": 26017,
    "preview": "module(\"luci.controller.amlogic\", package.seeall)\n\nlocal sys = require \"luci.sys\"\nlocal PKG_NAME = \"luci-app-amlogic\"\n\nf"
  },
  {
    "path": "luci-app-amlogic/luasrc/model/cbi/amlogic/amlogic_armcpu.lua",
    "chars": 3568,
    "preview": "--Copyright: https://github.com/coolsnowwolf/luci/tree/master/applications/luci-app-cpufreq\n--Planner: https://github.co"
  },
  {
    "path": "luci-app-amlogic/luasrc/model/cbi/amlogic/amlogic_backup.lua",
    "chars": 4802,
    "preview": "--Copyright: https://github.com/coolsnowwolf/luci/tree/master/applications/luci-app-filetransfer\n--Extended support: htt"
  },
  {
    "path": "luci-app-amlogic/luasrc/model/cbi/amlogic/amlogic_backuplist.lua",
    "chars": 1404,
    "preview": "local fs = require \"nixio.fs\"\nlocal backup_list_conf = \"/etc/amlogic_backup_list.conf\"\n\n-- Delete all spaces and tabs at"
  },
  {
    "path": "luci-app-amlogic/luasrc/model/cbi/amlogic/amlogic_check.lua",
    "chars": 743,
    "preview": "local b, c\n\n--SimpleForm for Check\nb             = SimpleForm(\"amlogic\", nil)\nb.title       = translate(\"Check Update\")\n"
  },
  {
    "path": "luci-app-amlogic/luasrc/model/cbi/amlogic/amlogic_config.lua",
    "chars": 8098,
    "preview": "--Remove the spaces in the string\nfunction trim(str)\n    --return (string.gsub(str, \"^%s*(.-)%s*$\", \"%1\"))\n    return (s"
  },
  {
    "path": "luci-app-amlogic/luasrc/model/cbi/amlogic/amlogic_info.lua",
    "chars": 374,
    "preview": "local b\n\n--SimpleForm for Info\nb             = SimpleForm(\"amlogic\", nil)\nb.title       = translate(\"Amlogic Service\")\nb"
  },
  {
    "path": "luci-app-amlogic/luasrc/model/cbi/amlogic/amlogic_install.lua",
    "chars": 383,
    "preview": "local b\n\n--SimpleForm for Install OpenWrt to Amlogic EMMC\nb             = SimpleForm(\"amlogic_install\", nil)\nb.title    "
  },
  {
    "path": "luci-app-amlogic/luasrc/model/cbi/amlogic/amlogic_log.lua",
    "chars": 333,
    "preview": "local b\n\n--SimpleForm for Server Logs\nb = SimpleForm(\"amlogic_log\", nil)\nb.title = translate(\"Server Logs\")\nb.descriptio"
  },
  {
    "path": "luci-app-amlogic/luasrc/model/cbi/amlogic/amlogic_poweroff.lua",
    "chars": 292,
    "preview": "local b\n\n--SimpleForm for PowerOff\nb             = SimpleForm(\"poweroff\", nil)\nb.title       = translate(\"PowerOff\")\nb.d"
  },
  {
    "path": "luci-app-amlogic/luasrc/model/cbi/amlogic/amlogic_upload.lua",
    "chars": 9879,
    "preview": "--Copyright: https://github.com/coolsnowwolf/luci/tree/master/applications/luci-app-filetransfer\n--Extended support: htt"
  },
  {
    "path": "luci-app-amlogic/luasrc/view/amlogic/other_button.htm",
    "chars": 331,
    "preview": "<%+cbi/valueheader%>\n\t<% if self:cfgvalue(section) ~= false then %>\n\t\t<input class=\"cbi-button cbi-button-<%=self.inputs"
  },
  {
    "path": "luci-app-amlogic/luasrc/view/amlogic/other_check.htm",
    "chars": 7803,
    "preview": "<style>\n.NewsTdHeight{ line-height: 20px; }\n</style>\n<fieldset class=\"cbi-section\">\n\t<table width=\"100%\" class=\"NewsTdHe"
  },
  {
    "path": "luci-app-amlogic/luasrc/view/amlogic/other_dvalue.htm",
    "chars": 160,
    "preview": "<%+cbi/valueheader%>\n<span style=\"color: red\">\n<%\n\tlocal val = self:cfgvalue(section) or self.default or \"\"\n\twrite(pcdat"
  },
  {
    "path": "luci-app-amlogic/luasrc/view/amlogic/other_info.htm",
    "chars": 3571,
    "preview": "<style>\n.NewsTdHeight{ line-height:20px; }\n</style>\n<fieldset class=\"cbi-section\">\n\t<table width=\"100%\" class=\"NewsTdHei"
  },
  {
    "path": "luci-app-amlogic/luasrc/view/amlogic/other_install.htm",
    "chars": 5391,
    "preview": "<style>\n.NewsTdHeight{ line-height:20px; }\n</style>\n<fieldset class=\"cbi-section\">\n\t<table width=\"100%\" class=\"NewsTdHei"
  },
  {
    "path": "luci-app-amlogic/luasrc/view/amlogic/other_kvm.htm",
    "chars": 1757,
    "preview": "<style>\n.NewsTdHeight{ line-height:32px; }\n.imgLeft{ float:left; margin-right:10px; vertical-align:middle; }\n.contentRig"
  },
  {
    "path": "luci-app-amlogic/luasrc/view/amlogic/other_log.htm",
    "chars": 3736,
    "preview": "<%+cbi/valueheader%>\n<textarea id=\"amlogic.ophub.clog\" class=\"cbi-input-textarea\" style=\"width: 100%;display:inline\" dat"
  },
  {
    "path": "luci-app-amlogic/luasrc/view/amlogic/other_poweroff.htm",
    "chars": 1764,
    "preview": "<style>\n.NewsTdHeight{ line-height:32px; }\n.imgLeft{ float:left; margin-right:10px; vertical-align:middle; }\n.contentRig"
  },
  {
    "path": "luci-app-amlogic/luasrc/view/amlogic/other_rescue.htm",
    "chars": 2106,
    "preview": "<style>\n    .NewsTdHeight{ line-height: 20px; }\n</style>\n<fieldset class=\"cbi-section\">\n    <table width=\"100%\" class=\"N"
  },
  {
    "path": "luci-app-amlogic/luasrc/view/amlogic/other_snapshot.htm",
    "chars": 4475,
    "preview": "<style>\n.NewsTdHeight{ line-height:20px; }\n.SnapshotsTitHeight{ line-height:40px; text-align: center; }\n.list{\n    displ"
  },
  {
    "path": "luci-app-amlogic/luasrc/view/amlogic/other_upfiles.htm",
    "chars": 4749,
    "preview": "<style>\n.NewsTdHeight{ line-height:20px; }\n</style>\n\n<fieldset class=\"cbi-section\">\n\t<table width=\"100%\" class=\"NewsTdHe"
  },
  {
    "path": "luci-app-amlogic/luasrc/view/amlogic/other_upload.htm",
    "chars": 343,
    "preview": "<%+cbi/valueheader%>\n\t<label class=\"cbi-value\" style=\"display:inline-block; width: 150px\" for=\"ulfile\"><%:Choose local f"
  },
  {
    "path": "luci-app-amlogic/po/ru/amlogic.po",
    "chars": 19422,
    "preview": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Project-Id-Version: \\n\"\n\"POT-Creation-Date: \\n\"\n\"PO-Revi"
  },
  {
    "path": "luci-app-amlogic/po/zh_Hans/amlogic.po",
    "chars": 15057,
    "preview": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Project-Id-Version: \\n\"\n\"POT-Creation-Date: \\n\"\n\"PO-Revi"
  },
  {
    "path": "luci-app-amlogic/root/etc/config/amlogic",
    "chars": 579,
    "preview": "\nconfig amlogic 'config'\n\toption enable '1'\n\toption amlogic_firmware_repo 'https://github.com/breakingbadboy/OpenWrt'\n\to"
  },
  {
    "path": "luci-app-amlogic/root/etc/init.d/amlogic",
    "chars": 2508,
    "preview": "#!/bin/sh /etc/rc.common\nSTART=60\n\nNAME=amlogic\n\nuci_get_by_type() {\n    local ret=$(uci get $NAME.@$1[0].$2 2>/dev/null"
  },
  {
    "path": "luci-app-amlogic/root/etc/uci-defaults/luci-amlogic",
    "chars": 272,
    "preview": "#!/bin/sh\n\nsed -i 's/cbi.submit\\\"] = true/cbi.submit\\\"] = \\\"1\\\"/g' /usr/lib/lua/luci/dispatcher.lua\n\nuci -q batch <<-EOF"
  },
  {
    "path": "luci-app-amlogic/root/usr/sbin/fixcpufreq.pl",
    "chars": 3947,
    "preview": "#!/usr/bin/perl\n\nuse strict;\nuse File::Basename;\n\nmy $uci_config_name;\nif(-f \"/etc/config/amlogic\") {\n\t$uci_config_name="
  },
  {
    "path": "luci-app-amlogic/root/usr/sbin/openwrt-backup",
    "chars": 22459,
    "preview": "#!/bin/bash\n#======================================================================\n# Function: Backup and restore confi"
  },
  {
    "path": "luci-app-amlogic/root/usr/sbin/openwrt-ddbr",
    "chars": 5742,
    "preview": "#!/bin/bash\n#===========================================================================\n#\n# This file is licensed under"
  },
  {
    "path": "luci-app-amlogic/root/usr/sbin/openwrt-install-amlogic",
    "chars": 21817,
    "preview": "#!/bin/bash\n#======================================================================================\n# Function: Install "
  },
  {
    "path": "luci-app-amlogic/root/usr/sbin/openwrt-kernel",
    "chars": 20077,
    "preview": "#!/bin/bash\n#====================================================================================\n#\n# Function: Update t"
  },
  {
    "path": "luci-app-amlogic/root/usr/sbin/openwrt-update-allwinner",
    "chars": 20459,
    "preview": "#!/bin/bash\n#======================================================================================\n# Function: Update o"
  },
  {
    "path": "luci-app-amlogic/root/usr/sbin/openwrt-update-amlogic",
    "chars": 28085,
    "preview": "#!/bin/bash\n#======================================================================================\n# Function: Update o"
  },
  {
    "path": "luci-app-amlogic/root/usr/sbin/openwrt-update-kvm",
    "chars": 21236,
    "preview": "#!/bin/bash\n#======================================================================================\n# Function: Update t"
  },
  {
    "path": "luci-app-amlogic/root/usr/sbin/openwrt-update-rockchip",
    "chars": 26869,
    "preview": "#!/bin/bash\n#======================================================================================\n# Function: Update o"
  },
  {
    "path": "luci-app-amlogic/root/usr/share/amlogic/amlogic_check_firmware.sh",
    "chars": 11745,
    "preview": "#!/bin/bash\n#==================================================================\n# This file is licensed under the terms "
  },
  {
    "path": "luci-app-amlogic/root/usr/share/amlogic/amlogic_check_kernel.sh",
    "chars": 10455,
    "preview": "#!/bin/bash\n#==================================================================\n# This file is licensed under the terms "
  },
  {
    "path": "luci-app-amlogic/root/usr/share/amlogic/amlogic_check_plugin.sh",
    "chars": 9771,
    "preview": "#!/bin/bash\n#==================================================================\n# This file is licensed under the terms "
  },
  {
    "path": "luci-app-amlogic/root/usr/share/rpcd/acl.d/luci-app-amlogic.json",
    "chars": 170,
    "preview": "{\n\t\"luci-app-amlogic\": {\n\t\t\"description\": \"Grant UCI access for luci-app-amlogic\",\n\t\t\"read\": {\n\t\t\t\"uci\": [ \"amlogic\" ]\n\t"
  },
  {
    "path": "luci-app-autoipsetadder/Makefile",
    "chars": 1331,
    "preview": "# Copyright (C) 2018-2019 Lienol\n#\n# This is free software, licensed under the Apache License, Version 2.0 .\n#\n\ninclude "
  },
  {
    "path": "luci-app-autoipsetadder/luasrc/controller/autoipsetadder.lua",
    "chars": 1919,
    "preview": "module(\"luci.controller.autoipsetadder\",package.seeall)\nlocal io     = require \"io\"\nlocal fs=require\"nixio.fs\"\nlocal sys"
  },
  {
    "path": "luci-app-autoipsetadder/luasrc/model/cbi/autoipsetadder.lua",
    "chars": 2782,
    "preview": "require(\"luci.sys\")\nrequire(\"luci.util\")\nlocal fs=require\"nixio.fs\"\nlocal uci=require\"luci.model.uci\".cursor()\nlocal m,s"
  },
  {
    "path": "luci-app-autoipsetadder/luasrc/view/autoipsetadder/check.htm",
    "chars": 2190,
    "preview": "<%+cbi/valueheader%>\n<%uci=require\"luci.model.uci\".cursor()%>\n<%nixio=require\"nixio\"%>\n\n<%if uci:get(\"autoipsetadder\",\"a"
  },
  {
    "path": "luci-app-autoipsetadder/luasrc/view/autoipsetadder/status.htm",
    "chars": 684,
    "preview": "<script type=\"text/javascript\">//<![CDATA[\nXHR.poll(3, '<%=url([[admin]], [[services]], [[autoipsetadder]], [[status]])%"
  },
  {
    "path": "luci-app-autoipsetadder/root/etc/config/autoipsetadder",
    "chars": 59,
    "preview": "config autoipsetadder 'autoipsetadder'\n\toption enabled '0'\n"
  },
  {
    "path": "luci-app-autoipsetadder/root/etc/init.d/autoipsetadder",
    "chars": 4061,
    "preview": "#!/bin/sh /etc/rc.common\n \nUSE_PROCD=1\n \nSTART=99\nSTOP=01\nCRON_FILE=/etc/crontabs/root\nCONFIGURATION=autoipsetadder\nEXTR"
  },
  {
    "path": "luci-app-autoipsetadder/root/etc/uci-defaults/40_luci-autoipsetadder",
    "chars": 218,
    "preview": "#!/bin/sh\n\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@autoipsetadder[-1]\n\tadd ucitrack autoipsetadder\n\tset ucitrac"
  },
  {
    "path": "luci-app-autoipsetadder/root/usr/bin/autoipsetadder/autoaddlist.sh",
    "chars": 4185,
    "preview": "#!/bin/sh\nPATH=\"/usr/sbin:/usr/bin:/sbin:/bin\"\nlogfile=$(uci get autoipsetadder.autoipsetadder.logfile)\n[ -z \"$logfile\" "
  },
  {
    "path": "luci-app-autoipsetadder/root/usr/bin/autoipsetadder/debugip.sh",
    "chars": 1311,
    "preview": "#!/bin/sh\nPATH=\"/usr/sbin:/usr/bin:/sbin:/bin\"\ndlchina=$1;\nlogfile=$(uci get autoipsetadder.autoipsetadder.logfile)\n[ -z"
  },
  {
    "path": "luci-app-autoipsetadder/root/usr/bin/autoipsetadder/tailto.sh",
    "chars": 92,
    "preview": "#!/bin/sh\ntail -n $1 \"$2\" > /var/run/tailtmp\ncat /var/run/tailtmp > \"$2\"\nrm /var/run/tailtmp"
  },
  {
    "path": "luci-app-autoipsetadder/root/usr/bin/autoipsetadder/testip.sh",
    "chars": 4205,
    "preview": "#!/bin/sh\nconfig=$(uci get autoipsetadder.autoipsetadder.config 2>/dev/null)\n[ \"${config//pingadd/}\" == \"$config\" ] && p"
  },
  {
    "path": "luci-app-beardropper/Makefile",
    "chars": 460,
    "preview": "#\n# Copyright (C) 2020 Nate Ding\n#\n# This is free software, licensed under the GNU General Public License v3.\n# See /LIC"
  },
  {
    "path": "luci-app-beardropper/luasrc/controller/beardropper.lua",
    "chars": 847,
    "preview": "module(\"luci.controller.beardropper\", package.seeall)\n\nfunction index()\n\tif not nixio.fs.access(\"/etc/config/beardropper"
  },
  {
    "path": "luci-app-beardropper/luasrc/model/cbi/beardropper/log.lua",
    "chars": 322,
    "preview": "f = SimpleForm(\"logview\")\nf.reset = false\nf.submit = false\n\nt = f:field(TextValue, \"conf\")\nt.rmempty = true\nt.rows = 20\n"
  },
  {
    "path": "luci-app-beardropper/luasrc/model/cbi/beardropper/setting.lua",
    "chars": 2091,
    "preview": "\nm = Map(\"beardropper\", translate(\"BearDropper\"), \ntranslate(\"luci-app-beardropper, the LuCI app built with the elegant "
  },
  {
    "path": "luci-app-beardropper/luasrc/view/beardropper/beardropper_status.htm",
    "chars": 670,
    "preview": "<script type=\"text/javascript\">//<![CDATA[\nXHR.poll(3, '<%=url([[admin]], [[services]], [[beardropper]], [[status]])%>',"
  },
  {
    "path": "luci-app-beardropper/po/zh_Hans/beardropper.po",
    "chars": 3862,
    "preview": "bearDropper#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:36\nmsgid \"Attempt C"
  },
  {
    "path": "luci-app-beardropper/po/zh_Hant/beardropper.po",
    "chars": 3862,
    "preview": "bearDropper#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:36\nmsgid \"Attempt C"
  },
  {
    "path": "luci-app-beardropper/root/etc/config/beardropper",
    "chars": 705,
    "preview": "config beardropper\n\toption attemptCount '5'\n\toption attemptPeriod '12h'\n\toption banLength '1w'\n\toption logFacility 'auth"
  },
  {
    "path": "luci-app-beardropper/root/etc/init.d/beardropper",
    "chars": 784,
    "preview": "#!/bin/sh /etc/rc.common\nSTART=98\n\nPROG=/usr/sbin/beardropper\nSERVICE_DAEMONIZE=1\nSERVICE_WRITE_PID=1\n\ngetKids() { \n egr"
  },
  {
    "path": "luci-app-beardropper/root/etc/uci-defaults/luci-beardropper",
    "chars": 226,
    "preview": "#!/bin/sh\n\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@beardropper[-1]\n\tadd ucitrack beardropper\n\tset ucitrack.@bea"
  },
  {
    "path": "luci-app-beardropper/root/usr/sbin/beardropper",
    "chars": 19149,
    "preview": "#!/bin/ash\n#\n# beardropper - dropbear log parsing ban agent for OpenWRT (Chaos Calmer rewrite of dropBrute.sh)\n#   http:"
  },
  {
    "path": "luci-app-beardropper/root/usr/share/rpcd/acl.d/luci-app-beardropper.json",
    "chars": 180,
    "preview": "{\n\t\"luci-app-beardropper\": {\n\t\"description\": \"Grant UCI access for luci-app-beardropper\",\n\t\"read\": {\n\t\t\"uci\": [ \"beardro"
  },
  {
    "path": "luci-app-cloudflarespeedtest/Makefile",
    "chars": 496,
    "preview": "# Author: mingxiaoyu (fengying0347@163.com)\n#\n# Licensed to the public under the GNU General Public License v3.\n#\n\ninclu"
  },
  {
    "path": "luci-app-cloudflarespeedtest/luasrc/controller/cloudflarespeedtest.lua",
    "chars": 1853,
    "preview": "-- Copyright (C) 2020 mingxiaoyu <fengying0347@163.com>\n-- Licensed to the public under the GNU General Public License v"
  },
  {
    "path": "luci-app-cloudflarespeedtest/luasrc/model/cbi/cloudflarespeedtest/cloudflarespeedtest.lua",
    "chars": 9674,
    "preview": "require(\"luci.sys\")\n\nlocal uci = luci.model.uci.cursor()\n\nm = Map('cloudflarespeedtest')\nm.title = translate('Cloudflare"
  },
  {
    "path": "luci-app-cloudflarespeedtest/luasrc/model/cbi/cloudflarespeedtest/logread.lua",
    "chars": 172,
    "preview": "log = SimpleForm(\"logview\")\nlog.submit = false\nlog.reset = false\n\nt = log:field(DummyValue, '', '')\nt.rawhtml = true\nt.t"
  },
  {
    "path": "luci-app-cloudflarespeedtest/luasrc/view/cloudflarespeedtest/actions.htm",
    "chars": 2439,
    "preview": "<%+cbi/valueheader%>\n<script type=\"text/javascript\">//<![CDATA[\n    const STATUS_URL = '<%=luci.dispatcher.build_url(\"ad"
  },
  {
    "path": "luci-app-cloudflarespeedtest/luasrc/view/cloudflarespeedtest/logread.htm",
    "chars": 824,
    "preview": "<%+cbi/valueheader%>\n<input type=\"checkbox\" id=\"checkbox1\" checked><%:Auto refresh%></input>\n<textarea id=\"logview\" clas"
  },
  {
    "path": "luci-app-cloudflarespeedtest/po/zh_Hans/cloudflarespeedtest.po",
    "chars": 3844,
    "preview": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: \\n\"\n\"POT-Creation-Date: \\n\"\n\"PO-Revision-Date: 2022-02-10 20:44+0000\\n\"\n\"Last-Tr"
  },
  {
    "path": "luci-app-cloudflarespeedtest/root/etc/config/cloudflarespeedtest",
    "chars": 462,
    "preview": "\nconfig global 'global'\n\toption hour '5'\n\toption minute '0'\n\toption enabled '0'\n\toption ipv6_enabled '0'\n\toption advance"
  },
  {
    "path": "luci-app-cloudflarespeedtest/root/etc/init.d/cloudflarespeedtest",
    "chars": 1107,
    "preview": "#!/bin/sh /etc/rc.common\n\nSTART=99\n\nUSE_PROCD=1\n\nCRON_FILE=/etc/crontabs/root\n\nservice_triggers() {\n\tprocd_add_reload_tr"
  },
  {
    "path": "luci-app-cloudflarespeedtest/root/usr/bin/cloudflarespeedtest/aliddns.sh",
    "chars": 2098,
    "preview": "#!/bin/sh\nLOG_FILE='/var/log/cloudflarespeedtest.log'\n\necholog() {\n\tlocal d=\"$(date \"+%Y-%m-%d %H:%M:%S\")\"\n\techo -e \"$d:"
  },
  {
    "path": "luci-app-cloudflarespeedtest/root/usr/bin/cloudflarespeedtest/cloudflarespeedtest.sh",
    "chars": 8916,
    "preview": "#!/bin/sh\n\nLOG_FILE='/var/log/cloudflarespeedtest.log'\nIP_FILE='/usr/share/cloudflarespeedtestresult.txt'\nIPV4_TXT='/usr"
  },
  {
    "path": "luci-app-cloudflarespeedtest/root/usr/share/rpcd/acl.d/luci-app-cloudflarespeedtest.json",
    "chars": 229,
    "preview": "{\r\n\t\"luci-app-cloudflarespeedtest\": {\r\n\t\t\"description\": \"Grant UCI access for luci-app-cloudflarespeedtest\",\r\n\t\t\"read\": "
  },
  {
    "path": "luci-app-control-timewol/Makefile",
    "chars": 341,
    "preview": "# Copyright (C) 2016 Openwrt.org\n#\n# This is free software, licensed under the Apache License, Version 2.0 .\n#\n\ninclude "
  },
  {
    "path": "luci-app-control-timewol/luasrc/controller/timewol.lua",
    "chars": 600,
    "preview": "module(\"luci.controller.timewol\", package.seeall)\n\nfunction index()\n\tif not nixio.fs.access(\"/etc/config/luci-app-contro"
  },
  {
    "path": "luci-app-control-timewol/luasrc/model/cbi/timewol.lua",
    "chars": 1159,
    "preview": "local i = require \"luci.sys\"\n\nt = Map(\"luci-app-control-timewol\", translate(\"Timed network wake-up\"), translate(\"Wake up"
  },
  {
    "path": "luci-app-control-timewol/luasrc/view/timewol/index.htm",
    "chars": 604,
    "preview": "<%#\n Copyright 2016 Chen RuiWei <crwbak@gmail.com>\n Licensed to the public under the Apache License 2.0.\n-%>\n\n<% include"
  },
  {
    "path": "luci-app-control-timewol/luasrc/view/timewol/timewol.htm",
    "chars": 136,
    "preview": "<%+cbi/valueheader%>\n<font class=\"timewol_status\"><%=pcdata(self:cfgvalue(section) or self.default or \"\")%></font>\n<%+cb"
  },
  {
    "path": "luci-app-control-timewol/po/zh_Hans/timewol.po",
    "chars": 638,
    "preview": "msgid \"Control\"\nmsgstr \"管控\"\n\nmsgid \"Running Status\"\nmsgstr \"运行状态\"\n\nmsgid \"Collecting data...\"\nmsgstr \"正在收集数据...\"\n\nmsgid "
  },
  {
    "path": "luci-app-control-timewol/root/etc/config/luci-app-control-timewol",
    "chars": 33,
    "preview": "\nconfig basic\n\toption enable '0'\n"
  },
  {
    "path": "luci-app-control-timewol/root/etc/init.d/luci-app-control-timewol",
    "chars": 1629,
    "preview": "#!/bin/sh /etc/rc.common\n#\n# Copyright (C) 2015 OpenWrt-dist\n# Copyright (C) 2016 fw867 <ffkykzs@gmail.com>\n#\n# This is "
  },
  {
    "path": "luci-app-control-timewol/root/etc/uci-defaults/luci-app-control-timewol",
    "chars": 255,
    "preview": "#!/bin/sh\n\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@luci_app_control_timewol[-1]\n\tadd ucitrack luci_app_control_"
  },
  {
    "path": "luci-app-control-timewol/root/usr/share/rpcd/acl.d/luci-app-control-timewol.json",
    "chars": 220,
    "preview": "{\n\t\"luci-app-control-timewol\": {\n\t\t\"description\": \"Grant UCI access for luci-app-control-timewol\",\n\t\t\"read\": {\n\t\t\t\"uci\":"
  },
  {
    "path": "luci-app-control-timewol/root/usr/share/ucitrack/luci-app-control-timewol.json",
    "chars": 79,
    "preview": "{\n\t\"config\": \"luci-app-control-timewol\",\n\t\"init\": \"luci-app-control-timewol\"\n}\n"
  },
  {
    "path": "luci-app-control-webrestriction/Makefile",
    "chars": 323,
    "preview": "# Copyright (C) 2016 Openwrt.org\n#\n# This is free software, licensed under the Apache License, Version 2.0 .\n#\n\ninclude "
  },
  {
    "path": "luci-app-control-webrestriction/luasrc/controller/webrestriction.lua",
    "chars": 643,
    "preview": "module(\"luci.controller.webrestriction\", package.seeall)\n\nfunction index()\n\tif not nixio.fs.access(\"/etc/config/luci-app"
  },
  {
    "path": "luci-app-control-webrestriction/luasrc/model/cbi/webrestriction.lua",
    "chars": 1384,
    "preview": "local o = require \"luci.sys\"\n\na = Map(\"luci-app-control-webrestriction\", translate(\"Access Control\"), translate(\n\t\"Use t"
  },
  {
    "path": "luci-app-control-webrestriction/luasrc/view/webrestriction/index.htm",
    "chars": 618,
    "preview": "<%#\n Copyright 2016 Chen RuiWei <crwbak@gmail.com>\n Licensed to the public under the Apache License 2.0.\n-%>\n\n<% include"
  },
  {
    "path": "luci-app-control-webrestriction/luasrc/view/webrestriction/webrestriction.htm",
    "chars": 143,
    "preview": "<%+cbi/valueheader%>\n<font class=\"webrestriction_status\"><%=pcdata(self:cfgvalue(section) or self.default or \"\")%></font"
  },
  {
    "path": "luci-app-control-webrestriction/po/zh_Hans/webrestriction.po",
    "chars": 845,
    "preview": "msgid \"Control\"\nmsgstr \"管控\"\n\nmsgid \"Running Status\"\nmsgstr \"运行状态\"\n\nmsgid \"Collecting data...\"\nmsgstr \"正在收集数据...\"\n\nmsgid "
  },
  {
    "path": "luci-app-control-webrestriction/root/etc/config/luci-app-control-webrestriction",
    "chars": 65,
    "preview": "\nconfig basic\n\toption enable '0'\n\toption limit_type 'blacklist'\n\n"
  },
  {
    "path": "luci-app-control-webrestriction/root/etc/init.d/luci-app-control-webrestriction",
    "chars": 2286,
    "preview": "#!/bin/sh /etc/rc.common\n# Copyright (C) 2016 fw867 <ffkykzs@gmail.com>\n# Copyright (C) 2024 Lienol\n\nSTART=99\n\nCONFIG=\"l"
  },
  {
    "path": "luci-app-control-webrestriction/root/etc/uci-defaults/luci-app-control-webrestriction",
    "chars": 283,
    "preview": "#!/bin/sh\n\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@luci_app_control_webrestriction[-1]\n\tadd ucitrack luci_app_c"
  },
  {
    "path": "luci-app-control-webrestriction/root/usr/share/rpcd/acl.d/luci-app-control-webrestriction.json",
    "chars": 248,
    "preview": "{\n\t\"luci-app-control-webrestriction\": {\n\t\t\"description\": \"Grant UCI access for luci-app-control-webrestriction\",\n\t\t\"read"
  },
  {
    "path": "luci-app-control-webrestriction/root/usr/share/ucitrack/luci-app-control-webrestriction.json",
    "chars": 93,
    "preview": "{\n\t\"config\": \"luci-app-control-webrestriction\",\n\t\"init\": \"luci-app-control-webrestriction\"\n}\n"
  },
  {
    "path": "luci-app-control-weburl/Makefile",
    "chars": 367,
    "preview": "# Copyright (C) 2016 Openwrt.org\n#\n# This is free software, licensed under the Apache License, Version 2.0 .\n#\n\ninclude "
  },
  {
    "path": "luci-app-control-weburl/luasrc/controller/weburl.lua",
    "chars": 590,
    "preview": "module(\"luci.controller.weburl\", package.seeall)\n\nfunction index()\n\tif not nixio.fs.access(\"/etc/config/luci-app-control"
  },
  {
    "path": "luci-app-control-weburl/luasrc/model/cbi/weburl.lua",
    "chars": 1615,
    "preview": "local o = require \"luci.sys\"\n\na = Map(\"luci-app-control-weburl\", translate(\"URL Filter\"), translate(\n\t\"Set keyword filte"
  },
  {
    "path": "luci-app-control-weburl/luasrc/view/weburl/index.htm",
    "chars": 602,
    "preview": "<%#\n Copyright 2016 Chen RuiWei <crwbak@gmail.com>\n Licensed to the public under the Apache License 2.0.\n-%>\n\n<% include"
  },
  {
    "path": "luci-app-control-weburl/luasrc/view/weburl/weburl.htm",
    "chars": 135,
    "preview": "<%+cbi/valueheader%>\n<font class=\"weburl_status\"><%=pcdata(self:cfgvalue(section) or self.default or \"\")%></font>\n<%+cbi"
  },
  {
    "path": "luci-app-control-weburl/po/zh_Hans/weburl.po",
    "chars": 1027,
    "preview": "msgid \"Control\"\nmsgstr \"管控\"\n\nmsgid \"Running Status\"\nmsgstr \"运行状态\"\n\nmsgid \"Collecting data...\"\nmsgstr \"正在收集数据...\"\n\nmsgid "
  },
  {
    "path": "luci-app-control-weburl/root/etc/config/luci-app-control-weburl",
    "chars": 332,
    "preview": "\nconfig basic\n\toption enable '0'\n\toption algos '0'\n\nconfig macbind\n\toption keyword 'qq.com'\n\toption enable '0'\n\toption m"
  },
  {
    "path": "luci-app-control-weburl/root/etc/init.d/luci-app-control-weburl",
    "chars": 2389,
    "preview": "#!/bin/sh /etc/rc.common\n# Copyright (C) 2016 fw867 <ffkykzs@gmail.com>\n# Copyright (C) 2024 Lienol\n\nSTART=99\n\nCONFIG=\"l"
  },
  {
    "path": "luci-app-control-weburl/root/etc/uci-defaults/luci-app-control-weburl",
    "chars": 251,
    "preview": "#!/bin/sh\n\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@luci_app_control_weburl[-1]\n\tadd ucitrack luci_app_control_w"
  },
  {
    "path": "luci-app-control-weburl/root/usr/share/rpcd/acl.d/luci-app-control-weburl.json",
    "chars": 216,
    "preview": "{\n\t\"luci-app-control-weburl\": {\n\t\t\"description\": \"Grant UCI access for luci-app-control-weburl\",\n\t\t\"read\": {\n\t\t\t\"uci\": ["
  },
  {
    "path": "luci-app-control-weburl/root/usr/share/ucitrack/luci-app-control-weburl.json",
    "chars": 77,
    "preview": "{\n\t\"config\": \"luci-app-control-weburl\",\n\t\"init\": \"luci-app-control-weburl\"\n}\n"
  },
  {
    "path": "luci-app-cpulimit/Makefile",
    "chars": 331,
    "preview": "#\n# Copyright (C) 2008-2014 The LuCI Team <luci@lists.subsignal.org>\n#\n# This is free software, licensed under the Apach"
  },
  {
    "path": "luci-app-cpulimit/luasrc/controller/cpulimit.lua",
    "chars": 297,
    "preview": "module(\"luci.controller.cpulimit\", package.seeall)\n\nfunction index()\n\tif not nixio.fs.access(\"/etc/config/cpulimit\") the"
  },
  {
    "path": "luci-app-cpulimit/luasrc/model/cbi/cpulimit.lua",
    "chars": 1158,
    "preview": "m = Map(\"cpulimit\", translate(\"cpulimit\"))\nm.description = translate(\"cpulimit  \")\n\ns = m:section(TypedSection, \"list\", "
  },
  {
    "path": "luci-app-cpulimit/po/zh_Hans/cpulimit.po",
    "chars": 683,
    "preview": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2014-06-28\\n\"\n"
  },
  {
    "path": "luci-app-cpulimit/root/etc/config/cpulimit",
    "chars": 108,
    "preview": "\nconfig 'list'\n\toption 'exename' '/usr/bin/transmission-daemon'\n\toption 'limit' '50'\n\toption 'enabled' '0'\n\n"
  },
  {
    "path": "luci-app-cpulimit/root/etc/init.d/cpulimit",
    "chars": 202,
    "preview": "#!/bin/sh /etc/rc.common\n# Copyright (C) 2006-2011 OpenWrt.org\n. /lib/functions.sh\n\nSTART=50\n\nDEFAULT=/etc/default/cpuli"
  },
  {
    "path": "luci-app-cpulimit/root/etc/uci-defaults/luci-cpulimit",
    "chars": 259,
    "preview": "#!/bin/sh\n\nuci -q batch <<-EOF >/dev/null\n          delete ucitrack.@cpulimit[-1]\n          add ucitrack cpulimit\n      "
  },
  {
    "path": "luci-app-cpulimit/root/usr/bin/cpulimit.sh",
    "chars": 562,
    "preview": "#!/bin/sh\n\n. /lib/functions.sh\n\ncpulimit_get(){\n\techo cpulimit_get\n\tconfig_get enabled $1 enabled\n\t[ $enabled -gt 0 ] ||"
  },
  {
    "path": "luci-app-cpulimit/root/usr/share/rpcd/acl.d/luci-app-cpulimit.json",
    "chars": 174,
    "preview": "{\n\t\"luci-app-cpulimit\": {\n\t\t\"description\": \"Grant UCI access for luci-app-cpulimit\",\n\t\t\"read\": {\n\t\t\t\"uci\": [ \"cpulimit\" "
  },
  {
    "path": "luci-app-ddns-go/ddns-go/Makefile",
    "chars": 1656,
    "preview": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2021-2026 sirpdboy  <herboy2008@gmail.com>\n# \n\ninclude $(TOPDI"
  },
  {
    "path": "luci-app-ddns-go/ddns-go/files/ddns-go.conf",
    "chars": 240,
    "preview": "config basic 'config'\n        option enabled '0'\n        option logger '1'\n        option port '9876'\n        option tim"
  },
  {
    "path": "luci-app-ddns-go/ddns-go/files/ddns-go.init",
    "chars": 1892,
    "preview": "#!/bin/sh /etc/rc.common\n#\n# Copyright (C) 2021-2026  sirpdboy  <herboy2008@gmail.com> \n#\n# This file is part of ddns-go"
  },
  {
    "path": "luci-app-ddns-go/luci-app-ddns-go/Makefile",
    "chars": 533,
    "preview": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2021-2026  sirpdboy  <herboy2008@gmail.com> \n#\n# This is free "
  },
  {
    "path": "luci-app-ddns-go/luci-app-ddns-go/htdocs/luci-static/resources/view/ddns-go/config.js",
    "chars": 14593,
    "preview": "/*   Copyright (C) 2022-2026 sirpdboy herboy2008@gmail.com*/\n'use strict';\n'require view';\n'require fs';\n'require ui';\n'"
  },
  {
    "path": "luci-app-ddns-go/luci-app-ddns-go/htdocs/luci-static/resources/view/ddns-go/ddns-go.js",
    "chars": 4338,
    "preview": "/*   Copyright (C) 2022-2026 sirpdboy herboy2008@gmail.com */\n\n'use strict';\n'require view';\n'require fs';\n'require ui';"
  },
  {
    "path": "luci-app-ddns-go/luci-app-ddns-go/htdocs/luci-static/resources/view/ddns-go/log.js",
    "chars": 6596,
    "preview": "// SPDX-License-Identifier: Apache-2.0\n/*\n * Copyright (C) 2022-2026 sirpdboy <herboy2008@gmail.com>\n */\n'use strict';\n'"
  },
  {
    "path": "luci-app-ddns-go/luci-app-ddns-go/po/templates/ddns-go.pot",
    "chars": 2772,
    "preview": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Project-Id-Version: ddns-go\\n\"\n\nmsgid \"DDNS-GO\"\nmsgstr \""
  },
  {
    "path": "luci-app-ddns-go/luci-app-ddns-go/po/zh_Hans/ddns-go.po",
    "chars": 3576,
    "preview": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Project-Id-Version: ddns-go\\n\"\n\nmsgid \"DDNS-GO\"\nmsgstr \""
  },
  {
    "path": "luci-app-ddns-go/luci-app-ddns-go/root/etc/uci-defaults/99-luci-ddns-go",
    "chars": 196,
    "preview": "#!/bin/sh\n\nchmod +x /usr/share/rpcd/ucode/luci.ddns-go\nchown root:www-data /usr/libexec/ddns-go-call\nchmod 750 /usr/libe"
  },
  {
    "path": "luci-app-ddns-go/luci-app-ddns-go/root/usr/libexec/ddns-go-call",
    "chars": 242,
    "preview": "#!/bin/sh\ncase \"$1\" in\n    \"get_logs\")\n        logread -l 200 2>/dev/null | grep ddns-go || echo \"No ddns-go logs found\""
  },
  {
    "path": "luci-app-ddns-go/luci-app-ddns-go/root/usr/share/luci/menu.d/luci-app-ddns-go.json",
    "chars": 848,
    "preview": "{\n    \"admin/services/ddns-go\": {\n\t\t\"title\": \"DDNS-GO\",\n\t\t\"order\": 58,\n\t\t\"action\": {\n\t\t     \"type\": \"firstchild\"\n\t\t},\n\t\t"
  },
  {
    "path": "luci-app-ddns-go/luci-app-ddns-go/root/usr/share/rpcd/acl.d/luci-app-ddns-go.json",
    "chars": 801,
    "preview": "{\n\t\"luci-app-ddns-go\": {\n\t\t\"description\": \"Grant UCI access for luci-app-ddns-go\",\n\t\t\"read\": {\n\t\t\t\"uci\": [ \"ddns-go\" ],\n"
  },
  {
    "path": "luci-app-ddns-go/luci-app-ddns-go/root/usr/share/rpcd/ucode/luci.ddns-go",
    "chars": 3889,
    "preview": "#!/usr/bin/ucode\n/*\n * SPDX-License-Identifier: GPL-2.0-only\n *\n * Copyright (C) 2022-2026  sirpdboy  <herboy2008@gmail."
  },
  {
    "path": "luci-app-ddnsto/Makefile",
    "chars": 355,
    "preview": "# Copyright (C) 2016 Openwrt.org\n#\n# This is free software, licensed under the Apache License, Version 2.0 .\n#\n\ninclude "
  },
  {
    "path": "luci-app-ddnsto/luasrc/controller/ddnsto.lua",
    "chars": 19762,
    "preview": "--[[\nDDNSTO LuCI Controller + JSON API\n=================================\n \n----\n为 ddnsto 的 LuCI 页面(可用原生 JS/React/Vue)提供稳"
  },
  {
    "path": "luci-app-ddnsto/luasrc/model/cbi/ddnsto.lua",
    "chars": 594,
    "preview": "--wulishui <wulishui@gmail.com> ,20200911\n--jjm2473 <jjm2473@gmail.com> ,20210127\n\nlocal m, s\n\nm = Map(\"ddnsto\", transla"
  },
  {
    "path": "luci-app-ddnsto/luasrc/view/ddnsto/main.htm",
    "chars": 523,
    "preview": "<%+header%>\n<script>\n  (function () {\n    window.ddnstoConfig = {\n      token: \"<%=token or ''%>\",\n      prefix: \"<%=pre"
  },
  {
    "path": "luci-app-ddnsto/po/zh_Hans/ddnsto.po",
    "chars": 516,
    "preview": "msgid \"DDNS.to\"\nmsgstr \"DDNS.to内网穿透\"\n\nmsgid \"Running state\"\nmsgstr \"运行状态\"\n\nmsgid \"Click to open DDNS.to\"\nmsgstr \"点击打开DDN"
  },
  {
    "path": "luci-app-ddnsto/root/etc/uci-defaults/50_luci-ddnsto",
    "chars": 68,
    "preview": "#!/bin/sh\n\nrm -f /tmp/luci-indexcache /tmp/luci-indexcache.*\nexit 0\n"
  },
  {
    "path": "luci-app-ddnsto/root/www/luci-static/ddnsto/index.js",
    "chars": 197304,
    "preview": "(function(){const E=document.createElement(\"link\").relList;if(E&&E.supports&&E.supports(\"modulepreload\"))return;for(cons"
  },
  {
    "path": "luci-app-eqosplus/Makefile",
    "chars": 909,
    "preview": "#\n# Copyright (C) 2006-2017 OpenWrt.org#\n# Copyright (C) 2022-2025 sirpdboy herboy2008@gmail.com https://github.com/sirp"
  },
  {
    "path": "luci-app-eqosplus/luasrc/controller/eqosplus.lua",
    "chars": 769,
    "preview": "module(\"luci.controller.eqosplus\", package.seeall)\n-- Copyright 2022-2023 sirpdboy <herboy2008@gmail.com>\nfunction index"
  },
  {
    "path": "luci-app-eqosplus/luasrc/model/cbi/eqosplus.lua",
    "chars": 6194,
    "preview": "-- Copyright 2022-2023 sirpdboy <herboy2008@gmail.com>\n-- Licensed to the public under the Apache License 2.0.\nlocal sys"
  },
  {
    "path": "luci-app-eqosplus/luasrc/view/eqosplus/eqosplus.htm",
    "chars": 136,
    "preview": "<%+cbi/valueheader%>\n<font class=\"eqosplus_status\"><%=pcdata(self:cfgvalue(section) or self.default or \"\")%></font>\n<%+c"
  },
  {
    "path": "luci-app-eqosplus/luasrc/view/eqosplus/index.htm",
    "chars": 503,
    "preview": "<% include(\"cbi/map\") %>\n<script type=\"text/javascript\">//<![CDATA[\n\tXHR.poll(2, '<%=luci.dispatcher.build_url(\"admin\", "
  },
  {
    "path": "luci-app-eqosplus/po/templates/eqosplus.pot",
    "chars": 946,
    "preview": "\nmsgid \"Eqosplus\"\nmsgstr \"\"\n\nmsgid \"Network speed limit\"\nmsgstr \"\"\n\nmsgid \"Running state\"\nmsgstr \"\"\n\nmsgid \"Not running\""
  },
  {
    "path": "luci-app-eqosplus/po/zh_Hans/eqosplus.po",
    "chars": 1176,
    "preview": "\nmsgid \"Eqosplus\"\nmsgstr \"定时限速\"\n\nmsgid \"Network speed limit\"\nmsgstr \"定时网速限制\"\n\nmsgid \"Running state\"\nmsgstr \"运行状态\"\n\nmsgid"
  },
  {
    "path": "luci-app-eqosplus/root/etc/config/eqosplus",
    "chars": 458,
    "preview": "\nconfig eqosplus\n\toption enabled '0'\n\toption download '1000'\n\toption upload '30'\n\toption ifname '1'\n\nconfig device\n\topti"
  },
  {
    "path": "luci-app-eqosplus/root/etc/hotplug.d/iface/10-eqosplus",
    "chars": 112,
    "preview": "#!/bin/sh\n[ \"$ACTION\" = \"ifup\" ] && [ \"$INTERFACE\" = \"wan\" ] && {\n    sleep 5\n    /etc/init.d/eqosplus restart\n}"
  },
  {
    "path": "luci-app-eqosplus/root/etc/init.d/eqosplus",
    "chars": 1316,
    "preview": "#!/bin/sh /etc/rc.common\n#\n# Copyright (C) 2025 sirpdboy herboy2008@gmail.com https://github.com/sirpdboy/luci-app-eqosp"
  },
  {
    "path": "luci-app-eqosplus/root/etc/uci-defaults/luci-eqosplus",
    "chars": 321,
    "preview": "#!/bin/sh\nchmod +x  /etc/init.d/eqosplus /usr/bin/eqosplus*\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@eqosplus[-1"
  },
  {
    "path": "luci-app-eqosplus/root/usr/bin/eqosplus",
    "chars": 14216,
    "preview": "#!/bin/bash\n\n# Copyright (C) 2006 OpenWrt.org\n# Copyright 2022-2025 sirpdboy <herboy2008@gmail.com>\n\ncrrun=$1\ncrid=$2\nNA"
  },
  {
    "path": "luci-app-eqosplus/root/usr/bin/eqosplusctrl",
    "chars": 1784,
    "preview": "#!/bin/sh\n\n# Copyright (C) 2006 OpenWrt.org\n# Copyright 2022-2025 sirpdboy <herboy2008@gmail.com>\nNAME=eqosplus\nIDLIST=\""
  },
  {
    "path": "luci-app-eqosplus/root/usr/share/rpcd/acl.d/luci-app-eqosplus.json",
    "chars": 174,
    "preview": "{\n\t\"luci-app-eqosplus\": {\n\t\t\"description\": \"Grant UCI access for luci-app-eqosplus\",\n\t\t\"read\": {\n\t\t\t\"uci\": [ \"eqosplus\" "
  },
  {
    "path": "luci-app-fastnet/Makefile",
    "chars": 421,
    "preview": "# Copyright (C) 2016 Openwrt.org\n#\n# This is free software, licensed under the Apache License, Version 2.0 .\n#\n\ninclude "
  },
  {
    "path": "luci-app-fastnet/luasrc/controller/fastnet.lua",
    "chars": 1236,
    "preview": "module(\"luci.controller.fastnet\", package.seeall)\n\nfunction index()\n\tlocal fs = require \"nixio.fs\"\n\tif not fs.access(\"/e"
  },
  {
    "path": "luci-app-fastnet/luasrc/model/cbi/fastnet.lua",
    "chars": 1469,
    "preview": "local sys = require \"luci.sys\"\nlocal uci = require \"luci.model.uci\".cursor()\nlocal http = require \"luci.http\"\n\nlocal m ="
  },
  {
    "path": "luci-app-fastnet/luasrc/view/fastnet/status.htm",
    "chars": 666,
    "preview": "<fieldset class=\"cbi-section\">\n\t<legend><%:Status%></legend>\n\t<div class=\"cbi-section-node\">\n\t\t<div class=\"cbi-value\">\n\t"
  },
  {
    "path": "luci-app-fastnet/po/zh_Hans/fastnet.po",
    "chars": 525,
    "preview": "msgid \"\"\nmsgstr \"Content-Type: text/plain; charset=UTF-8\"\n\nmsgid \"FastNet\"\nmsgstr \"FastNet\"\n\nmsgid \"FastNet provides net"
  },
  {
    "path": "luci-app-fastnet/root/etc/uci-defaults/50_luci-fastnet",
    "chars": 46,
    "preview": "#!/bin/sh\n\nrm -f /tmp/luci-indexcache\nexit 0\n\n"
  },
  {
    "path": "luci-app-fileassistant/Makefile",
    "chars": 434,
    "preview": "# From https://github.com/DarkDean89/luci-app-filebrowser\n# From https://github.com/stuarthua/oh-my-openwrt/tree/master/"
  },
  {
    "path": "luci-app-fileassistant/htdocs/luci-static/resources/fileassistant/fb.css",
    "chars": 1567,
    "preview": ".fb-container {\n    margin-top: 1rem;\n}\n.fb-container .cbi-button {\n    height: 1.8rem;\n}\n.fb-container .cbi-input-text "
  },
  {
    "path": "luci-app-fileassistant/htdocs/luci-static/resources/fileassistant/fb.js",
    "chars": 11822,
    "preview": "String.prototype.replaceAll = function(search, replacement) {\n  var target = this;\n  return target.replace(new RegExp(se"
  }
]

// ... and 2835 more files (download for full content)

About this extraction

This page contains the full source code of the 281677160/openwrt-package GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 3035 files (42.1 MB), approximately 11.2M tokens, and a symbol index with 29484 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!