commit 5c957adccf54a2832219784c8cdcf80f5f024a02 Author: root Date: Fri Feb 16 23:37:45 2024 +0200 1 diff --git a/ad/ad.go b/ad/ad.go new file mode 100755 index 0000000..bc5f64b --- /dev/null +++ b/ad/ad.go @@ -0,0 +1,95 @@ +package ad + +import ( + "fmt" + "github.com/go-ldap/ldap/v3" + "github.com/techoner/gophp" + "handlers" + "log" + "strconv" + "strings" +) + +var ( + SelfADLdapServer string + SelfADLdapPort int + SelfADLdapIsSSL bool + SelfADLdapSSL string + SelfADLdapFQDN string + SelfADLdapUsername string + SelfADLdapSuffix string + SelfADLdapPassword string + SelfADConnections []interface{} + DebugAD bool +) + +func init() { + activeDirectoryConnectionsData := handlers.GetSocketInfoString("ActiveDirectoryConnections") + if len(activeDirectoryConnectionsData) == 0 { + if DebugAD { + log.Printf("ActiveDirectoryConnections Len=0") + } + } + out, err := gophp.Unserialize([]byte(activeDirectoryConnectionsData)) + if err != nil { + if DebugAD { + log.Printf("error Unserialize itcharts.ids: ", err) + } + } + SelfADConnections = out.([]interface{}) +} + +func LoadConnection(connID int) bool { + for d, data := range SelfADConnections { + if d == connID { + for k, v := range data.(map[string]interface{}) { + if k == "LDAP_SUFFIX" { + SelfADLdapSuffix = v.(string) + } + if k == "LDAP_PASSWORD" { + SelfADLdapPassword = v.(string) + } + if k == "LDAP_SERVER" { + SelfADLdapServer = v.(string) + } + if k == "LDAP_PORT" { + SelfADLdapPort, _ = strconv.Atoi(v.(string)) + } + if k == "LDAP_DN" { + SelfADLdapUsername = v.(string) + } + if k == "LDAP_SSL" { + SelfADLdapSSL = v.(string) + } + } + } + + ldapSuffix = strings.ToLower(activeDirectoryConnections["LDAP_SUFFIX"].(string)) + ldapPassword = activeDirectoryConnections["LDAP_PASSWORD"].(string) + ldapServer = activeDirectoryConnections["LDAP_SERVER"].(string) + ldapPort = activeDirectoryConnections["LDAP_PORT"].(int) + ldapUsername = activeDirectoryConnections["LDAP_DN"].(string) + if _, ok := activeDirectoryConnections["LDAP_SSL"]; ok { + ldapSSL = activeDirectoryConnections["LDAP_SSL"].(string) + } + if ldapPort == 636 { + ldapIsSSL = true + } +} + +func Connect() (*ldap.Conn, error) { + proto := "ldap" + if ldapIsSSL { + proto = "ldaps" + } + // You can also use IP instead of FQDN + l, err := ldap.DialURL(fmt.Sprintf("%s://%s:%d", proto, ldapServer, ldapPort)) + if err != nil { + if isDebug { + log.Printf("Failed to connect to ldap %s://%s:%d with error %s", proto, ldapServer, ldapPort, err) + } + return nil, err + } + + return l, nil +} diff --git a/ad/go.mod b/ad/go.mod new file mode 100755 index 0000000..a5f382d --- /dev/null +++ b/ad/go.mod @@ -0,0 +1,19 @@ +module ad + +go 1.18 + +replace handlers => ../handlers + +require ( + github.com/go-ldap/ldap/v3 v3.4.3 + github.com/techoner/gophp v0.2.0 + handlers v0.0.0-00010101000000-000000000000 +) + +require ( + github.com/Azure/go-ntlmssp v0.0.0-20211209120228-48547f28849e // indirect + github.com/go-asn1-ber/asn1-ber v1.5.4 // indirect + github.com/leekchan/timeutil v0.0.0-20150802142658-28917288c48d // indirect + github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 // indirect + golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29 // indirect +) diff --git a/ad/go.sum b/ad/go.sum new file mode 100755 index 0000000..a6baa30 --- /dev/null +++ b/ad/go.sum @@ -0,0 +1,21 @@ +github.com/Azure/go-ntlmssp v0.0.0-20211209120228-48547f28849e h1:ZU22z/2YRFLyf/P4ZwUYSdNCWsMEI0VeyrFoI2rAhJQ= +github.com/Azure/go-ntlmssp v0.0.0-20211209120228-48547f28849e/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= +github.com/go-asn1-ber/asn1-ber v1.5.4 h1:vXT6d/FNDiELJnLb6hGNa309LMsrCoYFvpwHDF0+Y1A= +github.com/go-asn1-ber/asn1-ber v1.5.4/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= +github.com/go-ldap/ldap/v3 v3.4.3 h1:JCKUtJPIcyOuG7ctGabLKMgIlKnGumD/iGjuWeEruDI= +github.com/go-ldap/ldap/v3 v3.4.3/go.mod h1:7LdHfVt6iIOESVEe3Bs4Jp2sHEKgDeduAhgM1/f9qmo= +github.com/leekchan/timeutil v0.0.0-20150802142658-28917288c48d h1:2puqoOQwi3Ai1oznMOsFIbifm6kIfJaLLyYzWD4IzTs= +github.com/leekchan/timeutil v0.0.0-20150802142658-28917288c48d/go.mod h1:hO90vCP2x3exaSH58BIAowSKvV+0OsY21TtzuFGHON4= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/techoner/gophp v0.2.0 h1:vVFoS2XC/NZariagUOhAGqC8p/Ws8R8ARYpj/9lTIAo= +github.com/techoner/gophp v0.2.0/go.mod h1:NOxB/qoTl4+G82CkQp60T18Az5rOTufCqm83x9i/u7M= +golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29 h1:tkVvjkPTB7pnW3jnid7kNyAMPVWllTNOf/qKDze4p9o= +golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/client/external_acl_first/.idea/.gitignore b/client/external_acl_first/.idea/.gitignore new file mode 100755 index 0000000..1c2fda5 --- /dev/null +++ b/client/external_acl_first/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/client/external_acl_first/.idea/deployment.xml b/client/external_acl_first/.idea/deployment.xml new file mode 100755 index 0000000..27c2015 --- /dev/null +++ b/client/external_acl_first/.idea/deployment.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/client/external_acl_first/.idea/external_acl_first.iml b/client/external_acl_first/.idea/external_acl_first.iml new file mode 100755 index 0000000..338a266 --- /dev/null +++ b/client/external_acl_first/.idea/external_acl_first.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/client/external_acl_first/.idea/modules.xml b/client/external_acl_first/.idea/modules.xml new file mode 100755 index 0000000..f206823 --- /dev/null +++ b/client/external_acl_first/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/client/external_acl_first/.idea/sshConfigs.xml b/client/external_acl_first/.idea/sshConfigs.xml new file mode 100755 index 0000000..e13fb09 --- /dev/null +++ b/client/external_acl_first/.idea/sshConfigs.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/client/external_acl_first/.idea/vcs.xml b/client/external_acl_first/.idea/vcs.xml new file mode 100755 index 0000000..c8ade07 --- /dev/null +++ b/client/external_acl_first/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/client/external_acl_first/.idea/webServers.xml b/client/external_acl_first/.idea/webServers.xml new file mode 100755 index 0000000..cb00d47 --- /dev/null +++ b/client/external_acl_first/.idea/webServers.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/client/external_acl_first/bin/go-shield-connector b/client/external_acl_first/bin/go-shield-connector new file mode 100755 index 0000000..aac8551 Binary files /dev/null and b/client/external_acl_first/bin/go-shield-connector differ diff --git a/client/external_acl_first/go.mod b/client/external_acl_first/go.mod new file mode 100755 index 0000000..dc4a288 --- /dev/null +++ b/client/external_acl_first/go.mod @@ -0,0 +1,27 @@ +module external_acl_first + +go 1.18 + +replace handlers => ../../handlers + +replace storage => ../../storage + +require ( + github.com/bradfitz/gomemcache v0.0.0-20220106215444-fb4bf637b56d + github.com/techoner/gophp v0.2.0 + github.com/valyala/fasthttp v1.34.0 + handlers v0.0.0-00010101000000-000000000000 + storage v0.0.0-00010101000000-000000000000 +) + +require ( + github.com/allegro/bigcache/v3 v3.0.2 // indirect + github.com/andybalholm/brotli v1.0.4 // indirect + github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/go-redis/redis/v8 v8.11.5 // indirect + github.com/klauspost/compress v1.15.0 // indirect + github.com/leekchan/timeutil v0.0.0-20150802142658-28917288c48d // indirect + github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect +) diff --git a/client/external_acl_first/go.sum b/client/external_acl_first/go.sum new file mode 100755 index 0000000..5cdc71a --- /dev/null +++ b/client/external_acl_first/go.sum @@ -0,0 +1,47 @@ +github.com/allegro/bigcache/v3 v3.0.2 h1:AKZCw+5eAaVyNTBmI2fgyPVJhHkdWder3O9IrprcQfI= +github.com/allegro/bigcache/v3 v3.0.2/go.mod h1:aPyh7jEvrog9zAwx5N7+JUQX5dZTSGpxF1LAR4dr35I= +github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/bradfitz/gomemcache v0.0.0-20220106215444-fb4bf637b56d h1:pVrfxiGfwelyab6n21ZBkbkmbevaf+WvMIiR7sr97hw= +github.com/bradfitz/gomemcache v0.0.0-20220106215444-fb4bf637b56d/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= +github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= +github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= +github.com/klauspost/compress v1.15.0 h1:xqfchp4whNFxn5A4XFyyYtitiWI8Hy5EW59jEwcyL6U= +github.com/klauspost/compress v1.15.0/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/leekchan/timeutil v0.0.0-20150802142658-28917288c48d h1:2puqoOQwi3Ai1oznMOsFIbifm6kIfJaLLyYzWD4IzTs= +github.com/leekchan/timeutil v0.0.0-20150802142658-28917288c48d/go.mod h1:hO90vCP2x3exaSH58BIAowSKvV+0OsY21TtzuFGHON4= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/techoner/gophp v0.2.0 h1:vVFoS2XC/NZariagUOhAGqC8p/Ws8R8ARYpj/9lTIAo= +github.com/techoner/gophp v0.2.0/go.mod h1:NOxB/qoTl4+G82CkQp60T18Az5rOTufCqm83x9i/u7M= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.34.0 h1:d3AAQJ2DRcxJYHm7OXNXtXt2as1vMDfxeIcFvhmGGm4= +github.com/valyala/fasthttp v1.34.0/go.mod h1:epZA5N+7pY6ZaEKRmstzOuYJx9HI8DI1oaCGZpdH4h0= +github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9 h1:nhht2DYV/Sn3qOayu8lM+cU1ii9sTLUeBQwQQfUHtrs= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= diff --git a/client/external_acl_first/internal/handlers.go b/client/external_acl_first/internal/handlers.go new file mode 100755 index 0000000..e960df5 --- /dev/null +++ b/client/external_acl_first/internal/handlers.go @@ -0,0 +1,130 @@ +package internal + +import ( + "bufio" + "encoding/base64" + "errors" + "github.com/techoner/gophp" + "io/ioutil" + "log" + "os" + "strconv" + "strings" +) + +func GetSocketInfoInt(token string) int { + if _, err := os.Stat("/etc/artica-postfix/settings/Daemons/" + token); errors.Is(err, os.ErrNotExist) { + return 0 + } + tk, err := os.ReadFile("/etc/artica-postfix/settings/Daemons/" + token) + if err != nil { + return 0 + } + + tkint, _ := strconv.Atoi(string(tk)) + + return tkint +} + +func GetSocketInfoBool(token string) bool { + if _, err := os.Stat("/etc/artica-postfix/settings/Daemons/" + token); errors.Is(err, os.ErrNotExist) { + return false + } + tk, err := os.ReadFile("/etc/artica-postfix/settings/Daemons/" + token) + if err != nil { + return false + } + + boolValue, err := strconv.ParseBool(string(tk)) + if err == nil { + return boolValue + } + + return false +} + +func GetSocketInfoString(token string) string { + if _, err := os.Stat("/etc/artica-postfix/settings/Daemons/" + token); errors.Is(err, os.ErrNotExist) { + return "" + } + tk, err := os.ReadFile("/etc/artica-postfix/settings/Daemons/" + token) + if err != nil { + return "" + } + + return string(tk) +} + +func SetSocketInfo(token string, value string) { + _, err := os.OpenFile("/etc/artica-postfix/settings/Daemons/"+token, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0755) + if err != nil { + log.Fatal(err) + } + err1 := ioutil.WriteFile("/etc/artica-postfix/settings/Daemons/"+token, []byte(value+"\n"), 0755) + if err1 != nil { + log.Fatal(err1) + } + +} + +func GetArticaLicense() bool { + //Check Gold License + gold, _ := os.Open("/usr/local/share/artica/.GOLD") + + defer gold.Close() + + scannerGold := bufio.NewScanner(gold) + + for scannerGold.Scan() { + fdata := strings.TrimSpace(scannerGold.Text()) + if len(fdata) == 0 { + return false + } + if fdata == "TRUE" { + return true + } + str := "YTo2MDU6e3M6Mjc6IjJPWlRBWi1INU9HRzItWEQyRFJBLVlNN0lOWSI7YjoxO3M6Mjc6IldVRkhUNi1aT1VYTDktU00xWFFSLU9RTUVVQSI7YjoxO3M6Mjc6IktBRVFFMi1ZRUROUzEtSU5TSU9YLUJYNVdLNCI7YjoxO3M6Mjc6IlBQUEFUSi0ySDlWUkEtQTFMVktGLTlKTVZNMiI7YjoxO3M6Mjc6Ik9PVUk5TS1DN0RFUEEtSEdDRzFELUw2NEhKSSI7YjoxO3M6Mjc6IkNFUExGQi1GTjVMMTMtWFFVM1NBLVVWTEpLSiI7YjoxO3M6Mjc6Ik41NVlIUi1MQUYwQ1QtM0lWSlY5LTM5WllJQyI7YjoxO3M6Mjc6IkIxSklPSy1HWFNMUVMtRUFaMVhHLUxZOFNFUyI7YjoxO3M6Mjc6Ik9IVDZQVS00UElFUFgtOUZDTkJJLTlTREVWRiI7YjoxO3M6Mjc6Ikk5WEE2RC0yTk5BRjItNk1VQ0pPLTU5UFA4TCI7YjoxO3M6Mjc6IkU0TENXWi1WQlRKUVotTkFLWE5TLVNRT1JQMiI7YjoxO3M6Mjc6IlBaWE5LVS1VMkREQ1ktTUZPM0ZVLVFSRzhHTiI7YjoxO3M6Mjc6IlFETDVPRS0yMEhVOVctSlkyV05GLVpFR0JGRiI7YjoxO3M6Mjc6IlRBUk9EQS1TSkdRM0stR1lNRjBULThaSTlPVyI7YjoxO3M6Mjc6IlFBMUJBSy1YRFNWWFItWVUyRDdCLUNYNDdDWSI7YjoxO3M6Mjc6IkUwWlRZTi1PNlJSRkEtVDlNVTlaLUdaOFFBRCI7YjoxO3M6Mjc6IjhUM09OMS0xQTU5Qk0tR1dZRThULVRGR0ZXUyI7YjoxO3M6Mjc6IkZQWFZEMy1ORkMwR1YtVlFJVko5LVlJSFVMSyI7YjoxO3M6Mjc6IkJWUlRTSC1CSVdMVEUtQlJCMFhDLVJIV0RGQiI7YjoxO3M6Mjc6IkwxVlpJMC1VSlRTUU8tT1pFTkFHLVRVUVdPQiI7YjoxO3M6Mjc6IkhaVVFQRS1LV0VPRFctUUlDRE5SLUREV0pYNiI7YjoxO3M6Mjc6IklRRjUyRS1aTUZVOEUtMFdHQzdLLURRMktBQSI7YjoxO3M6Mjc6IjhEU1ZQWi03WTg2RUUtVUgxQTlULTVKSUhLQyI7YjoxO3M6Mjc6IlFRRElLUC1EOE5VSkYtOURGRFpaLUZJUk9QTyI7YjoxO3M6Mjc6IlpaUjg4OC1VRFdHVUgtRDhGTkxaLVNIT0ZHMyI7YjoxO3M6Mjc6IklEUDdTTS1INkJTUEotRlVSUUNMLUhBRjlNNCI7YjoxO3M6Mjc6IlJNR1VCVi1ESlJCTlMtWE1FVDlQLU5ISUlDUyI7YjoxO3M6Mjc6IlZOUFlOVS1RN1ZFWkItME5VOFBULUNaWEJEUCI7YjoxO3M6Mjc6IlBGREk2Uy1PQUVOV1UtNTFaNDFOLTI1TEk5WSI7YjoxO3M6Mjc6IjlLRUlCSC1FUkxIWUQtRkdDWk9VLVRVWEdWWSI7YjoxO3M6Mjc6IjNEOE5INy1IRzNMREktQkdSQU0yLTlGNUw1TiI7YjoxO3M6Mjc6Ikg4SVNVUS04T0dZTjktSUZPVU5OLVpOTVVPVSI7YjoxO3M6Mjc6IlpIVUhIUi00S05MNVotM0lZQVAwLVNCOVJENSI7YjoxO3M6Mjc6IlNWNVNQUi1JOU5VVFAtTkFMRE5JLUJOMkpVTiI7YjoxO3M6Mjc6IktOVU5HNC1OVktXQ04tWVI0WEk5LVZGRjYwRiI7YjoxO3M6Mjc6IllMTEtERi1KT0VYSTAtSUFTQTVaLVk1Q1BFRyI7YjoxO3M6Mjc6IklVWkhCRS1FUUZPUkEtT0xaUUI2LTFCQjNINCI7YjoxO3M6Mjc6Ik4ySzBaTi02SzhLSjAtOUpCRkZWLUY5VVNEVyI7YjoxO3M6Mjc6IlhGOFpROC1PRlpXUVgtV0xRQUZYLVNUVVNXTiI7YjoxO3M6Mjc6IkpTUlo1Vi1FRVBYU1gtMlNIRUhHLU5DOUlITyI7YjoxO3M6Mjc6IkVaUktQVS1FT1FVS0gtU1BTWEIxLVdTS1BQQSI7YjoxO3M6Mjc6IkZQRkUyQS02OUtGNkwtUEdOTFowLUlTMFlJQyI7YjoxO3M6Mjc6IjdCTU5UWC1FRUpWQUwtWUIzM0pLLUtOQlpGMSI7YjoxO3M6Mjc6IkJPOU5JSy1QUUJCNFotRkpLTVE0LVhTSzhERCI7YjoxO3M6Mjc6Ilg2UzZMRC01U1JYWlctUUhBNVFELVNCSDhBWSI7YjoxO3M6Mjc6IkdBVEE0Ui1SWDBJSkItRDFQV0ZFLTJUUDNVUCI7YjoxO3M6Mjc6IkJLMkdaTy1FQ0tXQU8tSFhBWU9RLTZYWUk3NiI7YjoxO3M6Mjc6IlZOVzBJVy1CTUs5VE4tWTkzR0FKLVdQUk1NUyI7YjoxO3M6Mjc6IkxaR0dPMC1COURITVItTTBQUDNCLU1ZRVlIVCI7YjoxO3M6Mjc6IjJVTzVMVC0yNkhXS0stNDVMR0RILU9BVlVWUyI7YjoxO3M6Mjc6Ik81SlAxVS1BRzlNUTQtWjlWRjVCLU1GTEFDUiI7YjoxO3M6Mjc6IjZYRFlDVy1LNFBISUEtNEYwVjVCLThXTVpRUCI7YjoxO3M6Mjc6Ik5UMVFOTC03WlVFTDQtOFBYSVdXLU1EWFRFUiI7YjoxO3M6Mjc6IlFENzhCVS01UklaU04tMTVHTEVCLVZIQVk4SCI7YjoxO3M6Mjc6IlRVSk1LRS1ZQ0hFRUwtRUZMTk1LLVhSVExQVyI7YjoxO3M6Mjc6IldIU0sxTC00VlhSV0YtTElQQ1dNLUFQUlhGUSI7YjoxO3M6Mjc6IkZBM1hQMi1USzgyRFItUFpXWUlELTgwVlA5TSI7YjoxO3M6Mjc6IklDQjZXSC1EU1hNWVEtTzJIMUVaLTVKSFpTViI7YjoxO3M6Mjc6IkhYRDlGRS01WFVBRFItQzROSFRJLUZXTE5aNSI7YjoxO3M6Mjc6IklXRk5FRi1OQUcyUDUtVU0yWFdTLVBFN1RTSyI7YjoxO3M6Mjc6IjE3TFpaQi00NDVYSFMtUElMVlhTLVQ3Nk9CRCI7YjoxO3M6Mjc6Iko2V1JUVy1NWVJOOEgtWFBCVzZNLUdVQ09ZTiI7YjoxO3M6Mjc6IlZCRUtXRi1OM1NEWUEtTjJZMU45LUxVTElOSCI7YjoxO3M6Mjc6IkJQS0RPSC1PRktKOU4tWUpRSE9ZLU1XRVdQWiI7YjoxO3M6Mjc6Ik9CR1o5US1SWUZCUlgtV1FQWEVQLVowRkJGUSI7YjoxO3M6Mjc6IlVZOU9RRS1CTTA0Q0wtVUNYTEhQLTZYQUQ0TiI7YjoxO3M6Mjc6IkFXR1lOUy1VQ1A4SEItQVcxRTJQLU9CR1hMWCI7YjoxO3M6Mjc6IksxQ0U0UC1JUTJGWTEtR1ZIVUJBLTFLTktGNCI7YjoxO3M6Mjc6IkFMU1lIUy1PRjk5TDktR1JWMlYwLVNIMkdaWSI7YjoxO3M6Mjc6IkFZSkM5TC1DT0lKRlItUElFWUpJLVcxVUxFUiI7YjoxO3M6Mjc6IkhXV0hKMS1WREZIUkYtTTJRUU1XLTNUU1ZHVSI7YjoxO3M6Mjc6Ikw5UUhPVS01OTU1OUwtTVhaWVc0LVpLUEpaTiI7YjoxO3M6Mjc6IldXQVhaTS1KM0oyTVEtMlI3SENJLTBDWkpPSyI7YjoxO3M6Mjc6IkRHWU1DMC0wR0dVRkctN0RPQVE0LU1XQ0ZZQyI7YjoxO3M6Mjc6IjlZQUk0Ri1XSUIxMUYtUFBTRENDLVM4N0dEOCI7YjoxO3M6Mjc6IlRIVkZWTS1BS1JXTk4tQkpQME1WLVpQWUVTMCI7YjoxO3M6Mjc6Ik9YRUM1Vi01S1NNRFQtWUpUVTA5LUpRUTcyRiI7YjoxO3M6Mjc6IlU4VFFPVS1ZQjFZM0otVUxSVVNDLVhWSVpCWSI7YjoxO3M6Mjc6IkVRTk9UNC1KS0cySzctRFAzUE5ULTdMUU5STyI7YjoxO3M6Mjc6IlRUVVI2Si1LTzNENDQtSUlXQUE5LVVKS1RNTiI7YjoxO3M6Mjc6IkVBRERUSy1MN0paTlUtWUdKSk1aLThBUDFaTSI7YjoxO3M6Mjc6IlZBUlhSVi05SVNUUTUtQUc0S09CLVgyTkM0QyI7YjoxO3M6Mjc6IlRVREdRMC1XS09TMlMtTEVESFdRLVVOQVdDViI7YjoxO3M6Mjc6IlBKS0c0VC1aUERNSFctV0JDUk9FLUhJSzhWVSI7YjoxO3M6Mjc6IlkyRUhFSi1RQVFRUU0tV1MzQk0yLUxZSFBLSSI7YjoxO3M6Mjc6IkpMRlBaOC1WOUdETkwtVDZJMVg5LUZYWjNZMyI7YjoxO3M6Mjc6IlhHVkNVQy1FTjROSkctMFdaWFVJLVhGSEJCVyI7YjoxO3M6Mjc6IlBEUzFKVS1UTkNXUFAtUU5CQTVMLUI3QktKSSI7YjoxO3M6Mjc6IkFEUDZJRS1XTU5JWUMtTFZSTk5LLTVITVhXTyI7YjoxO3M6Mjc6IkJTT1lNUC1DVDBGWVctSTRNTDVaLVQyQlE4UiI7YjoxO3M6Mjc6IlNBUk9FWi1LSUJUUEctUU5TSTk0LUE4QUNFUiI7YjoxO3M6Mjc6IkhMT1lUUC04VVNVS0stWldZNk1LLUpKOE8yTiI7YjoxO3M6Mjc6Ik80VkFZVy01SlQwSEYtTExVWEhYLVlZQzdKQiI7YjoxO3M6Mjc6IkxQRjNQVy1PNVBCR1UtMFA1RUtOLVhTQ09PWSI7YjoxO3M6Mjc6IlI5UE40Qi1JWFc4RVMtOUJJT0xHLThURFA0UiI7YjoxO3M6Mjc6IjhGVU5DVi1YVlNPMVQtTDNWUUdELUFKUEtQUCI7YjoxO3M6Mjc6IlJFUTJOSi0wWlRXWkwtNk9FUTlJLUpUWUFQRSI7YjoxO3M6Mjc6IkhGU0lBQy1NVElZTFQtWUlGUUlELVVKS1hHMiI7YjoxO3M6Mjc6IkxZQjFXVC1WVzNMNVktUEJMUExJLUdIRUNaUyI7YjoxO3M6Mjc6Ik1JSkdCMS1MTlQyRDItUk0wS0RKLVRaRVFMNyI7YjoxO3M6Mjc6IkJUV0VPTi0zWTNESVctVEdDV1NYLUtPRUhSTCI7YjoxO3M6Mjc6IlRPUEJBSS1QQ0tUUEctN0pSSlVKLUVTQU5HMSI7YjoxO3M6Mjc6IkY0QTNCTS1KTkZPUVktVFhOTUtTLTFMVjlHTiI7YjoxO3M6Mjc6IlM2Uk1QRS1GQ0I2Tk0tUkVDSVoyLTJOSlBNRCI7YjoxO3M6Mjc6IldUSU5YUS1BMVFCS0QtSVVQQ0swLUhTS1dDVyI7YjoxO3M6Mjc6IjJYSUJHMy1TVEJRSjgtTzRVQllYLVlTQ1hHQyI7YjoxO3M6Mjc6Ik4wVVVUNC1DUFgyOUQtT0VNQ0pMLURJOFdPOCI7YjoxO3M6Mjc6IkM5SkJLVS1MSFpXQVQtV0Y0WVhWLTMzNlhNUSI7YjoxO3M6Mjc6IjAyTkFIUS1FWTA3V1YtSk9NVEhULUxKVk1FOSI7YjoxO3M6Mjc6IjBZMUZMMi1NSDZKRUMtSlpDR05ILVpST0VUTiI7YjoxO3M6Mjc6Ikk1Sk5YTi1UQk5ITkstR1JBVDk2LUpRTzZJMSI7YjoxO3M6Mjc6IjU4V0pNTi1US1NUQkotSkdMWkcwLUVPU0NDMyI7YjoxO3M6Mjc6IjhGT0RXTy1SRk5GWDEtSFNLRldYLUZVS05QUCI7YjoxO3M6Mjc6Ik5aQ1pFWi1PRlUzWTItVzYwN0hELVVaUFlGVCI7YjoxO3M6Mjc6IlRBQ0dPSS01VEJQM1ktM1pCUk9PLUdCT1lTUCI7YjoxO3M6Mjc6IlEyUVVSQi1KMERBWUEtMTNWU1lRLTBKMEpVWSI7YjoxO3M6Mjc6IkhYUkNBWS00Q0owVk0tQlJJWVpTLVVWR04wRSI7YjoxO3M6Mjc6IkE4T1ZHNi1QWVNNTEEtTEJSWFZNLUpISTVJOCI7YjoxO3M6Mjc6IkFZOThaRi1WQ1ZEVU8tVjdDREVPLVRTTVZRNyI7YjoxO3M6Mjc6IlJZSkgzWC1IUUMwTU4tWkkyNjBKLUNTSUY2TSI7YjoxO3M6Mjc6IkUxRkNOWC1OV0NSMUQtTFlVNVRGLU8xREJBWCI7YjoxO3M6Mjc6IjRBTVNRVC1YQlowOEYtWU45WkVELTM4UkhIUSI7YjoxO3M6Mjc6Ik9URUZCSy1SSlBLN0wtOEVPRFg0LTlCTVZaMSI7YjoxO3M6Mjc6IkQxOUhYWC1SUEFaWkEtV1dVRUFXLVBTTjhBVyI7YjoxO3M6Mjc6Ik9LT0xLQy05Q0hKTkgtTE1BSEtFLVVISlpTRiI7YjoxO3M6Mjc6IlZXWlpWQy1VS1RaRlAtRU83MFFFLVpHTThDNiI7YjoxO3M6Mjc6IjJBRk4xUy1IREkySU8tSjRGWVhNLVVaMkdMRyI7YjoxO3M6Mjc6IllYRUJFSi1OMEhKVUMtWkJPWllRLVNEOUFXVCI7YjoxO3M6Mjc6IlJTVFlBRS1SUEVJU1MtVE9aQlFPLVBaUFE2QiI7YjoxO3M6Mjc6IjhCQVhGUi1LSVNJQUYtNVFVN0RYLTZPUlBYNCI7YjoxO3M6Mjc6IllWT1hLWi1UQ0EwWFItV0NWUk5YLVVFSVdYWSI7YjoxO3M6Mjc6IjBPQkxSVC1PTExBWkotQTlPMldILVhMQklNTyI7YjoxO3M6Mjc6IkROS1pSQS04MDNLSk4tVVU3WTRYLTg2RUdPNiI7YjoxO3M6Mjc6IkVSUUhZRi1HQkdDTkUtSk5QTEtLLVdWUENCVCI7YjoxO3M6Mjc6IlRHQ0ROSS1aVk1TRDktVzlKQlg0LTYwMEJQTCI7YjoxO3M6Mjc6Ik5FVUxRQi1YUk1VRlAtWEhMRE1JLVlJMFpaSSI7YjoxO3M6Mjc6Ikw1VjcxRy0wSEpUWlMtWUxNOU9OLUFaSExNOSI7YjoxO3M6Mjc6IjVFQ0dNRS1ZTktUQ0ktSkxYR0VILU5WWFJJTSI7YjoxO3M6Mjc6Ik5RQVVUTC1PREtHVTQtRVdQSVcyLUNHRU9YUSI7YjoxO3M6Mjc6IlFOSkRHOC1JRVRTSkotWFUwT1Q3LUJSNVlaRCI7YjoxO3M6Mjc6IlNFRkFIQy1ZUU9EQjAtUVFORUdPLVBTSEdFUyI7YjoxO3M6Mjc6IkxKUjhTUi1CSk1OQUMtWE04V0wzLUNZQ0dGRSI7YjoxO3M6Mjc6IkdPN1JORC1HSkk4RkYtQ1UzMUJQLUpETzdZSiI7YjoxO3M6Mjc6IkxGSkNLQy1USkdKMjAtTDlOSTI3LU9ONFVCSyI7YjoxO3M6Mjc6IkZCV0VCVS1CQ05NUEItQ1RQR0NULVNUUkdPViI7YjoxO3M6Mjc6IkFZVU5TUy1GVFpPQjUtWFJGSzQxLVBGR0ZIVCI7YjoxO3M6Mjc6Ik5MQU40Sy1KWEpEUU4tSU9XMk5ELVExN1JTUCI7YjoxO3M6Mjc6IldCVFhFTC1VTVhMUlotSENLRTdZLVhIMDVDRSI7YjoxO3M6Mjc6IjlIQ1NOMy1GU1M0UVctRElVNUFMLUEzT0dZUiI7YjoxO3M6Mjc6IkRBWEFSWi1UNEJaVVYtUEFNUkpJLVFKUDJPNyI7YjoxO3M6Mjc6IkpYMkNDWS1MNlZGWEEtQUJBS0hQLVpOMVBKQiI7YjoxO3M6Mjc6IktEWVVDTC1WUTJLWjgtM1FQWkhWLUFHV1NaMCI7YjoxO3M6Mjc6IlFYMkxOUi1RRVBHSFgtQ0lIUEdSLVg4WUNVSyI7YjoxO3M6Mjc6IlNLV1Q2TS1JR0FGNUEtTVpFWk1VLVZQU1dJTSI7YjoxO3M6Mjc6IklSQ1hUUC1TWDFCMUotRlhEQVk1LUZQUFJFTSI7YjoxO3M6Mjc6IjRQQ0hMRi1VQk4zSFgtTVNPSlMxLUM4WUNJRCI7YjoxO3M6Mjc6IlJITUhOSC1NRFdZWTMtOVBHSURGLVRLWlNTNyI7YjoxO3M6Mjc6IkxaTlVPOC1WM0lWMTgtUjRURk5GLVk4SlRNQSI7YjoxO3M6Mjc6IlBFUFZYNi1BVFozRUktUzgwNkNPLUpJRzJSSiI7YjoxO3M6Mjc6IkdTT0xLRy1aUFFLVVQtWlA3WllCLUhSUEtDMCI7YjoxO3M6Mjc6IlBTUkJRUS1ZRURZVUotSUdVWkZZLTBIR09VUCI7YjoxO3M6Mjc6IkVQRTlMWi1LSU1ENFotMkJOSFo1LUNEVVdXMSI7YjoxO3M6Mjc6IklaUEZTWS1FTVVDVE4tTzczS0JMLU9FSkFMTiI7YjoxO3M6Mjc6IlBSRUNCMC1CMFBXV0ctUllKUEJILTI1U1pPVSI7YjoxO3M6Mjc6IjVENlpTRy1HWlpTVlktR0ZVRFNNLU5VQjlTRSI7YjoxO3M6Mjc6IlNMVlRNTy1RQkFEMEwtVzJGWDNKLUdWSUZRTCI7YjoxO3M6Mjc6IktSQVlNUC1RUUJFMUMtQktIVVBZLUY3U0hVQSI7YjoxO3M6Mjc6IkxST0NHRC1SRVFLT08tNUozWkVaLU1WWUhEVSI7YjoxO3M6Mjc6IkNRQ0VTTi1STDJVQkotQ1I1U0VJLVdBUFVRWCI7YjoxO3M6Mjc6IjBDWldOSC1EQUJHV0ItRlFTUlAyLUs5UlNHSiI7YjoxO3M6Mjc6Ik1BRVFKRy1PRVBKODgtNUdQSVkyLUI5ODNaRiI7YjoxO3M6Mjc6IlRGVUZJNy1UUE9VNTAtNVNCSjNDLUJZRVlYSCI7YjoxO3M6Mjc6IkhIR1pZNi1DVElMNUstQk9OVkNILTk1WU5BVCI7YjoxO3M6Mjc6IjlFODJLRy04RTBaTUMtODNCV0RBLVY5TVhIQiI7YjoxO3M6Mjc6IkEyOVpCVy1USENDSDEtTFlQTVRJLU01RFBaUiI7YjoxO3M6Mjc6Ikg4SEdBWS1HVVQ3VlQtTE41NDlWLUpTTzVBSiI7YjoxO3M6Mjc6IjlPS0JGSC1KTkxRQ0wtTlVER1c5LUROV0s3VyI7YjoxO3M6Mjc6IllXR1VTVy1KR1hXQkItVDVNOTYxLUtPUlNINCI7YjoxO3M6Mjc6IkhVWUJINi1DUU1MQVMtTTdWTkpULUpVQ1QwMiI7YjoxO3M6Mjc6IkI0MElMUC1GSjVCVFctNUxIMThTLTgyVjFXTCI7YjoxO3M6Mjc6IjdXRjhQVC1URU9JT1ctSVc5NlVSLVI2R1BCNSI7YjoxO3M6Mjc6IkU1U0VEWi01TUNLN1AtS1JRT1hQLVBTQVZONiI7YjoxO3M6Mjc6Ilg2RU1JUy1TTThXSEwtSTJURE5RLVdNV1VPVCI7YjoxO3M6Mjc6Ik9UMzFDTi1BWUFISkYtRUcwUDZPLUJBOVNXWCI7YjoxO3M6Mjc6IloxQVdDQi0xUzZNQVYtQkVJS1ZHLUlETUNUUyI7YjoxO3M6Mjc6IkdNWlVaWC1XR1VJR1MtRlJPSDBLLTJRRzYwTyI7YjoxO3M6Mjc6IlVETVRORi1LUTNRVlgtRUJKNlFOLVhZNlA0RSI7YjoxO3M6Mjc6Ik5HUE1HNS00VFpaQ0UtRUlJMUVQLUZVNFlVQyI7YjoxO3M6Mjc6IjI4VUlaRC00SEdBTlctUFVTVUVRLUxRVFhSMCI7YjoxO3M6Mjc6IkJRV1lMVi1QSkJBNU0tSEdWTVZKLVZOTkdQTyI7YjoxO3M6Mjc6IkNaUklFTi01Vk1LRUQtNkxPTU01LVpPWUE4NiI7YjoxO3M6Mjc6IjNNVVhQMC1KR1pISVUtVEJMWENaLTdYSUJBVyI7YjoxO3M6Mjc6Ik02TElGRi1SWElGMVAtSFE2VVFCLTQ2STRDTSI7YjoxO3M6Mjc6IkNFWUpURS1ORkFWU1ctQUNQR1VJLVVTUlpTOSI7YjoxO3M6Mjc6IjdaT0pZQi1HOE5VNVAtRVlFNlVBLUFDRjJTRyI7YjoxO3M6Mjc6IlhSTEhSTS1PT01JUEYtVVQ4UDdLLVJFNkgzVCI7YjoxO3M6Mjc6IkpOS1NHQS1XQ0VJV00tR05JV1JNLVZMUDY4NSI7YjoxO3M6Mjc6IlgwV0dFVi1WSUNFS0UtTkRPQkpSLUxLUFFTTiI7YjoxO3M6Mjc6Ik5BQzFEOS1QQlJXTEctOTlZU1lCLVJVQ09XSSI7YjoxO3M6Mjc6IllXV1FGTi1RSlVMQlYtRlVUNlBQLUFYTlRFUyI7YjoxO3M6Mjc6IkhQVlVURC1XVTk3VEotTU1VUk1aLUZLOE1TVSI7YjoxO3M6Mjc6IkdQOFRSVC1aU1JENUUtVURBVVRMLVU4NlBZUiI7YjoxO3M6Mjc6IkdVWVdXRi0wRDE0WDktNUNCVVNaLVZHWVlOSSI7YjoxO3M6Mjc6Ik5MTUlUNC1ONlE3RTUtNkZLWTRFLThMWTFLMSI7YjoxO3M6Mjc6IllCSUVNUy1LSDNPUFUtVlFSUVJHLVlSOFY0RiI7YjoxO3M6Mjc6IlBDRkZYVi1SUUJXWTctODU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlIVjJRQS1BV0JXWTctMzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlNEOERIVy1RSEJXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNHUFdNSC1WUUJXWTctNzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRYUUpOWS1QNkJXWTctNzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IlJEUjhWTC01TUJXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IktZOUVDVy1ZN0JXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlJTRDdNVS1MM0JXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6Iko0QUZLRC1HWkJXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ijc0UTdNSi1KVEJXWTctMzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJVRENRQS1OWkJXWTctNjVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjdMNzJXSy1MR0JXWTctMjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJVTUE4WC1VWUJXWTctNzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjdHVVUzOC1aM0JXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5RS0FVSC0yTEJXWTctNDU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjdRNExVNC1LQkJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJKOTNBQy1VMzhXODctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IjhMQ1Q1Ni1IWEJXWTctMzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IlpaQ0ZOUC1QNkJXWTctNzU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjkzVUY1OC1FV0JXWTctQjVZODY5LU5EVFRETiI7YjoxO3M6Mjc6IjlXSjgySy1VUUJXWTctNDU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZVRTU5NS00QTlXMjctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IjhHRlM1Qi04NTlXNjctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkJYWTJUTi0zTUJXWTctNTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZWTlFRSC1HSEJXWTctODU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjQ0VVM4RS1UUEJXWTctNDUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlE4UEZNSi0zMkJXWTctMjVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IlE2SE1NNS1XTEJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjhZWFZKNi02UEJXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5YVUFRSy1BVkJXWTctODUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlFEMlQ2US1GQUJXWTctMjU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZQWEdaVC1FRUJXWTctOTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IldVRFhMRC1SRkJXWTctODU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlpQQ001RC1DQUJXWTctMzU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZEOFpQMy1DQ0JXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlM3TTJQTS0zNEJXWTctQjVZODM5LU5EVFRETiI7YjoxO3M6Mjc6IlJCM0czNy1ZVEJXWTctMzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IlRZVVg1Ti1CVEJXWTctOTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ijk5SzhKVS1EOEJXWTctQjVZODY5LU5EVFRETiI7YjoxO3M6Mjc6IllGMktBNC1LVkJXWTctMzU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlI2R1dZQS1KU0JXWTctNzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkVQR1VKVi1DRUJXWTctNjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IktWSllLQi1ZOUJXWTctNzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlpTNjQySy01V0JXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZSSERZTC1NM0JXWTctNTUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkhYVjMyWC1IUUJXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjI5Q0gzVy1OREJXWTctQjVZOEI5LVlETlRUTiI7YjoxO3M6Mjc6IkZITjRLUC02SEJXWTctMjU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZQNVZGVy1aWDJXQTctWjU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRUNDRRSi1FMkJXWTctQTVaODI5LU5EVFRETiI7YjoxO3M6Mjc6Ilg0WE45Mi0zTEJXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRNRURUSi1TR0JXWTctNDU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkE4VzNYRi1VR0JXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhGNEY2VS1KN0JXWTctQTVaODQ5LU5EVFRETiI7YjoxO3M6Mjc6IjlXWEc0TS1OUkJXWTctNjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhXNkE3Vy0zVUJXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkhDTUc3Qy1VSEJXWTctMzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlMzWlhXVi1NVjJXQjctWTU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhQR1FQSi1BTUJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkozWlQ4Uy1HOUJXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlpBQlBCRi1XSkJXWTctNTU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkczTE5MUC1YRkJXWTctNTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkVONUdSTi1MWkJXWTctNjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlJMSzc1Qi00V0JXWTctMjU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ilk5QkhMSi1WSkJXWTctNjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IlA2U04yQy1CWUJXWTctNDVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjNRNFZTRC1UOEJXWTctNDUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IllaV0RQVi04R0JXWTctOTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkdaRDNIMi1ESEJXWTctQjVZODY5LU5EVFRETiI7YjoxO3M6Mjc6IlNCU0o5WC1SWUJXWTctODU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5CNjJQVy1ZUkJXWTctNjVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjI5Q1JDRS1XV0JXWTctNDVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IlozSDdBOC0yNThXNzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IllaNEg3My0zOUJXWTctQjVZODI5LU5EVFRETiI7YjoxO3M6Mjc6IlpMVkVDOS02REJXWTctNDVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjhQVEQyNS1EOEJXWTctQTVaODM5LU5EVFRETiI7YjoxO3M6Mjc6IkQyVTVKVi0yTEJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IllKWE1FUy1QRkJXWTctOTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkNVVzlBTi1FV0JXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJNWkpUOC1UUkJXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IlRFRTQ2TS1NTUJXWTctMzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjZGWFBaVi1IOUJXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjNOOEhRRC1GSkJXWTctMjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlE3UkhUSi03SEJXWTctNDU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlVXSkc2WS1UVUJXWTctOTU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IldCWk5VUi1TQUJXWTctOTU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjdZS1RCRC1ESEJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjZBRlBIRC1RTEJXWTctMzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlFGRVREOC1UUUJXWTctNjVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjJLTVZUNS1XV0JXWTctNzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkVUWkdRTi1MR0JXWTctODVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjQ3M0FVUi1LQkJXWTctQjVZODI5LU5EVFRETiI7YjoxO3M6Mjc6IjZFUzVINy1ZSkJXWTctMzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkJNMlozUy05UkJXWTctMzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZWVVhRWi1aNTJXQjctWTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjVVOEozQS0zSzlXODctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IjlOVU45Ny1BNUJXWTctQjVZODY5LU5EVFRETiI7YjoxO3M6Mjc6IlNITkhFTi01VkJXWTctNTU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkNKWkxISy0zV0JXWTctNTU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkM4REUyUi02VkJXWTctQjVZODM5LU5EVFRETiI7YjoxO3M6Mjc6IkRWUTM5VS1UTEJXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IllFNEgzQi1TQ0JXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkpWUjJLQS1MMkJXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBYNUhHSi1EUEJXWTctNTUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjZXTUhIRi1QS0JXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlQ0WFdUUi1SUDJXQTctWjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZRV1YyOC1ITUJXWTctNTUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkpXNVFHRS03UEJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhIUThYSi03R0JXWTctMzU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ilc3UDdFQi1DQ0JXWTctMjVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjRUVEJIVi05UUJXWTctNTU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IloyQUgyRy1CWEJXWTctMjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkFHM05HNS1RTEJXWTctMjVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkxHMjU4Ui1DUkJXWTctQjVZODg5LU5EVFRETiI7YjoxO3M6Mjc6IktIQUROQy1KM0JXWTctQjVZODc5LU5EVFRETiI7YjoxO3M6Mjc6IlBZQVAzNi1FV0JXWTctNDU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkFYUTNOOC1NTEJXWTctNDU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik41S1JEUi1CWkJXWTctNjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjZKODZRTS00QUJXWTctQTVaOEI5LVlETlRUTiI7YjoxO3M6Mjc6IkdHTkVZWC0zWkJXWTctNzU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ilo3QTdFUS00VkJXWTctMzU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ilo4Q1BWVC1TQ0JXWTctODVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IlpCVDlXQi1ERkJXWTctNTU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlSMllLUi00WUJXWTctNTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRTV1YyVi05RkJXWTctNTUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlRCOVM4Ry1GMkJXWTctQjVZODg5LU5EVFRETiI7YjoxO3M6Mjc6IkRIODJQTC0zWUJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJXRjRWMi1IWUJXWTctNDU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjZQU1E4Si1ONkJXWTctNDVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjVLNFNaRS1MS0JXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjVDTUtMUy0yREJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJTTlFQSC1MQ0JXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlKU1Q2QS1LNEJXWTctMjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkU0TVVUNy0zRUJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjZLUDRRUi1QTUJXWTctNTU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNUVFFXRi00RkJXWTctNTUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlpIRFlOOS0zQUJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ilg2WFUzRC1DVEJXWTctNTU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5HN0RZVy1KWEJXWTctNzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5NNTM1WS1LS0JXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlA0VUhSWS1FUUJXWTctNzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkxZUDJKVS1EUkJXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IksyVjVFVS03UkJXWTctMzU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlgyWUdRQy1HSkJXWTctNTU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlY2Mk04Ry1MNEJXWTctQjVZOEE5LVpETlRUTiI7YjoxO3M6Mjc6IjZLU05IWi1GVkJXWTctNzU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlRBR1NTNS1aN0JXWTctNTU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlhCRldMVC1IWEJXWTctOTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkhaREVQUy1LQkJXWTctNjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlVIS0o5UC1TUUJXWTctNzU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlFLRFlLSi1IV0JXWTctODVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6Iko1UlJZUy1aMkJXWTctNzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlQ3M1o3My1OR0JXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ilk1NjRHSC04TkJXWTctQjVZODM5LU5EVFRETiI7YjoxO3M6Mjc6IkJBNUFFMy1ZSkJXWTctQTVaODY5LU5EVFRETiI7YjoxO3M6Mjc6IkpYM1dKWS02QkJXWTctNTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlVWNVdVQS1QWUJXWTctOTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZVRDI0Mi02SDhXOTctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkhBRURLNC0zRDlXNDctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IlcyUU5SUS1VOEJXWTctNzU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkFRQks0OS1IV0JXWTctMjU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBEM0szRy1ZUEJXWTctMzU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5OOEFEUy1EWkJXWTctNTUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJITFFWSy1HU0JXWTctNjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjdUUkpYWS1SWDJXQTctWjU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBESEFMUy1XVEJXWTctNzU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik01WENHUS01R0JXWTctMzU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNNRFBSSC0yWkJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlUyQzhMVi1BOUJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IllQTUZKUC02N0JXWTctNTUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjU1RTk3WC1HWUJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IldNRzVUSi02WkJXWTctNjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5LQjVKRy1DM0JXWTctQTVaODk5LU5EVFRETiI7YjoxO3M6Mjc6IlU0SlZVVy1aOUJXWTctOTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjNKVkxLTi1ZUUJXWTctNzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkhEV0RTNC02SEJXWTctMzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkVHQlY2Ry1HRUJXWTctMjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkRSREdRTi1NMkJXWTctNDUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlXNTY2OS1KTEJXWTctQTVaODc5LU5EVFRETiI7YjoxO3M6Mjc6IjVQVEc1RS1WV0JXWTctNTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZUUzhQRy1ZQUJXWTctNjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJINkhMRS0zSEJXWTctQTVaODY5LU5EVFRETiI7YjoxO3M6Mjc6IkZXTE5VMi1YUUJXWTctODUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ilc2SEI0QS0yQjlXMzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkRZTFNONC1BVEJXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJCUjlYTC1BREJXWTctMzU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBIWVRBQi1RM0JXWTctNTU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ijk1VUQ0OS1WNEJXWTctQTVaODU5LU5EVFRETiI7YjoxO3M6Mjc6IlVZNjdXTS00U0JXWTctNjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6Iks5NEZLVi0yV0JXWTctMzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5ORzhGVi1BQ0JXWTctMzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkNLUVJaRC1NRkJXWTctNzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkxEQVBONS1YWkJXWTctNjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlE5Qk5ZNC1FVkJXWTctNTUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhTNTRDWi0zTEJXWTctQjVZODY5LU5EVFRETiI7YjoxO3M6Mjc6IlA0WkxWNC1IOUJXWTctNDU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlJGVkhMNi04QUJXWTctMzU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjQ5R0U1Qy1SOTlXNjctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6Ilo4RVNUVC03RkJXWTctNjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlNXVTZZQy02WkJXWTctODUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJBQUVCWi1TWUJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBFNUpOTi01RUJXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlJEOFZRMy1ISkJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkdHMzhFNi1QOTlXNzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IlE4TkNFOC1ESkJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhISk1URS0zS0JXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkRKN05FSi1FRUJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlU1VloyOC00OEJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ijg3WVIyVy03QkJXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJIOVVBUy1OWkJXWTctNjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkhIMzJWQi1URUJXWTctMjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5XUEpCVy1INkJXWTctNjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkE3WjlMNy1NWEJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkY4M0Y3VS1GNDlXNzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6Ik1FVlBVTC1QWjJXQTctWjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5LTVM3Ny1NREJXWTctNDUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNHS0dBUy1YU0JXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlA3RUZYOC1WVEJXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlFBV0E1NS1GVUJXWTctMzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNXRzRGWi0zS0JXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZVM0c0US1OTUJXWTctNTU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlLMkcyQS1GNTdXOTctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkFNS0tZRy01RUJXWTctNDVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IlhESFU1Ti1SWEJXWTctODVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6Ilc5VlhUMy1aWDJXQTctWjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkYyVFg5UC1UVUJXWTctNzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjZWVkM4Vy1QUEJXWTctNzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6Ik5QOEpWSC1BQUJXWTctNDUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkVLS0ZBNy0yUUJXWTctQjVZODQ5LU5EVFRETiI7YjoxO3M6Mjc6IkFDNUs2Ri1CQjlXQTctWjVOOFQ5LUREOVQ4TiI7YjoxO3M6Mjc6IjhVNVE0WC1EWUJXWTctNTUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlYWVRHWC1TSjJXQTctWjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjVSNDZETi1BNzlXNTctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IlBCOFlETS1VNEJXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlpQOVhFNC02S0JXWTctNDU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlNZNUFCWS1WOEJXWTctNjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6Ikc5TEpNNS0zMzlXODctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkxFSEpSWi1FMkJXWTctNDU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik1QVjU5Ni1DQkJXWTctMjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjlaVUtSVS0yS0JXWTctNzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ijg4SzM2Qy1CRjhXMzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IlVLS1BGOC1SNkJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjNQR040Ui1WTUJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjJEM0dXQi1YM0JXWTctQjVZODM5LU5EVFRETiI7YjoxO3M6Mjc6IkZRNVZBWS1CVUJXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlJGQ0dZOC1aWkJXWTctODUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkY3WkFYSC1KMkJXWTctMzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkVXSFUyMi1WTkJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjcyQjJIMi1XUkJXWTctQTVaOEE5LVpETlRUTiI7YjoxO3M6Mjc6IjJWU1M1Qi1ZV0JXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjZQR0VOSi1YOEJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZHM1lUQy1VWkJXWTctOTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkVaRExBUy1UVUJXWTctODVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IlRZUkFVTS1LSkJXWTctOTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkdDVTdQWS1XUEJXWTctODVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6Ilo2TFFVUi1GR0JXWTctNzU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNNTlBUQi01OEJXWTctMjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRDWllXQS1SNUJXWTctNTU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJRTEg2UC1RR0JXWTctNDU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkY3ODdNUC1OUUJXWTctMzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjZWM0E0Ui04UkJXWTctQjVZODY5LU5EVFRETiI7YjoxO3M6Mjc6IkRNR0JZRy0zQUJXWTctMjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlM2REJOUi04Q0JXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRRR0Q3Ny03SDlXNzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IlFWUlQ0RC1YV0JXWTctOTU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IldGTjJNNC1BQUJXWTctQjVZODg5LU5EVFRETiI7YjoxO3M6Mjc6IkdTWEFVNy1YRUJXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkRHN1ZERy1BVkJXWTctMzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlJLSk1UQi1TVEJXWTctODU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlpCMktONC1BS0JXWTctMjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkFCRjJTNy0zVEJXWTctQTVaODU5LU5EVFRETiI7YjoxO3M6Mjc6IkFGSFIyUC1HWUJXWTctNDU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJVNTJBSy1ER0JXWTctQTVaODc5LU5EVFRETiI7YjoxO3M6Mjc6IjlHTE5RWC1DVkJXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkE4WEFYNi00TEJXWTctMjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjdaRkxBVy1WQ0JXWTctNjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjdaQTVVVy0zVEJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkFOSENDOS1FR0JXWTctQjVZODM5LU5EVFRETiI7YjoxO3M6Mjc6IldUWEdNVS1MNUJXWTctODU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlVVjQ5Si1RMkJXWTctMzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IllKM1pTUy1QRUJXWTctODU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjY5VFFNUi1MNUJXWTctNDU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkdOM1paRi1GOUJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IlFVQktQTC1HVEJXWTctNzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IllOVkc5Ti1TRkJXWTctNzU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJFWU0zVC1RS0JXWTctNTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkY5SFlTWS1GS0JXWTctNzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkcySlFDVS01WUJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRWVVUzOS1FUkJXWTctNDU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkdEREhURy1WTkJXWTctNTU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkhaRE5FNC1QUkJXWTctNTU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJKOTU0Si1XNDlXNDctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IjVSQVpQWi1IV0JXWTctODU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ijk5SEJDVi1aQkJXWTctMzU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJINVBWVi1SUUJXWTctNjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlhQQlQ3Ry1RRUJXWTctNjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjVYNFIyNC0yUUJXWTctQTVaODM5LU5EVFRETiI7YjoxO3M6Mjc6IjY1WVhCNi1WRUJXWTctNDVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjVTWFVEVy1DS0JXWTctNzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkxROEhaWS1BS0JXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IllaOThCQi02WEJXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlE5QkpaVC1WREJXWTctNzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjVTTkJWVS0yWUJXWTctNjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IllZQkY0Vi1ISkJXWTctNjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBKUkQ4NC1LQUJXWTctMjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlRZNEI4My1TQkJXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkhGMlMzTS1OS0JXWTctMzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6Ikg4RjY4Qy1IQTlXMzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6Iks1N0I5Vy1ZNkJXWTctMjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkxKV1IzRi0yTUJXWTctNDVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IllFWk1IVC1RUDJXQTctWjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlU2N0JKOC1SREJXWTctMjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkhYUU1aOC1QSkJXWTctODU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjdQVktBMi1YU0JXWTctNTU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBES0tOWi1RTkJXWTctODU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkpBN1c4Sy1VREJXWTctMzU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjI1R1E3Ni1TWEJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlM1NE5GSi1CMkJXWTctQTVaODc5LU5EVFRETiI7YjoxO3M6Mjc6IlI3U0FWNy1ZSEJXWTctNjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IlNOWldKVy1STDJXQjctWTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlXRjhHQy1IRkJXWTctMjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJXWlY1VC1YTEJXWTctOTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlhCMkdUOS1FNEJXWTctQjVZODg5LU5EVFRETiI7YjoxO3M6Mjc6IjgzRVdXRS1TNUJXWTctMzU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhWWTVERS1STUJXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJMRFVSSy00WEJXWTctNTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6Ilo0RDdaWS02MkJXWTctMzU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkdRS1dIUC1BUEJXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IllMNURWSC1ROUJXWTctNTU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJBUVMzWS03S0JXWTctMzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkhOTkZUTC1WWkJXWTctOTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRVTkhFOC00RkJXWTctQjVZODU5LU5EVFRETiI7YjoxO3M6Mjc6IlFSS0tHUy02TkJXWTctNjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IllIRE5BNy1HOUJXWTctMjU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJWTjQ1Vi02Q0JXWTctQjVZODQ5LU5EVFRETiI7YjoxO3M6Mjc6IjI2Qko1Mi1DUDhXMjctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkJSVTlTOS1NTkJXWTctNTU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkxQSEVaWC1OQ0JXWTctODVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6Ik1VWkEzUS1VU0JXWTctODU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRRU0hBUy04UUJXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkhTNVE3Vy1ZVkJXWTctODVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkpQRFRaNC1DN0JXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkczV1pLMy1DUEJXWTctNDU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ikc2UTZVQi1NMkJXWTctQjVZODk5LU5EVFRETiI7YjoxO3M6Mjc6IkZFSzRENS1ONDlXODctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkRSOUdFQi1BWUJXWTctMzU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IktGOVdWTi1NU0JXWTctODVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkZOTDdWOS00TEJXWTctMzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjI0SksyQy1ORzlXODctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IlRINVU5NC1NV0JXWTctNDU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZGUE5EUy1aU0JXWTctOTU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkE0QURYRy1LNUJXWTctQjVZOEI5LVlETlRUTiI7YjoxO3M6Mjc6IjJKSDRGNC1NNDhXNzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkFEUjM2TS1VWUJXWTctNDU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlMzNjlGTS03WEJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkUzWFdKRS1MVkJXWTctNjU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjVNTDJVQy1DWUJXWTctMzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlhTUEFGWC1DTUJXWTctNzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlRSSlVFTi1WSkJXWTctOTUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlE1WFc5OC1TNkJXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZDTkYzUi1DUEJXWTctNDU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZGQVBYVC1XQ0JXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkI0RUxLMi1VUkJXWTctMjU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IllBNlhTNy00M0JXWTctMjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZQNlk5Uy1MV0JXWTctODU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjY3TVBKWC1XNkJXWTctNTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkZOUVU3SC1TOEJXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjdOUVM1Si1XOEJXWTctNDU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNRMzlKNC1LVEJXWTctQjVZODM5LU5EVFRETiI7YjoxO3M6Mjc6IlkzUVBFQy1LS0JXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5aNTk3Ry1HTEJXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNaRkM0TC1CR0JXWTctQjVZODc5LU5EVFRETiI7YjoxO3M6Mjc6Ik5XQTJBRS1ZTUJXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhCN1VBVS1MVkJXWTctNDU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlUyQkdTNi1URUJXWTctMzU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlBTkxHOC04QUJXWTctQTVaODU5LU5EVFRETiI7YjoxO3M6Mjc6IjQyQ1lKTC02NkJXWTctQTVaODQ5LU5EVFRETiI7YjoxO3M6Mjc6IlRONFRZVS03TkJXWTctNzU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRTM0pZTi1SWUJXWTctNzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkRWM0JBUS1VOEJXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlJYUVNDOS00NkJXWTctNDU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IllETVlWSi1GOUJXWTctNzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRIV0IzUS1UMkJXWTctMjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBFRjg3RC1NSkJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkNaNDlXOC1ZVEJXWTctNjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlRCWllBSC1QQ0JXWTctNzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJOSExHTS03WUJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkpBSFhQUi0yQ0JXWTctNDU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik1DNjZRSi1ENUJXWTctQTVaODk5LU5EVFRETiI7YjoxO3M6Mjc6IkcyTks4NC1DUkJXWTctQjVZODI5LU5EVFRETiI7YjoxO3M6Mjc6IldHSERMVC1HWUJXWTctNzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkwzQ1pHSi0yTEJXWTctMjU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRVTERUTS1KQ0JXWTctNTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6Ilc5TVIyTi0yUUJXWTctNDUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNMVlk3Ri1LWkJXWTctNjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlAyWFQ2OC1GVEJXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ikg1NFQ2TC1WRkJXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlNGUzNSSy0zV0JXWTctNTU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkxZWEpRTi1ZQzJXQTctWjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjVaVVFLUi1EQ0JXWTctNjU4OE45LVRERFQ5TiI7YjoxO30=" + base64decoded, _ := base64.StdEncoding.DecodeString(str) + out, _ := gophp.Unserialize([]byte(base64decoded)) + + if mout, ok := out.(map[string]interface{}); ok { + + if _, ok := mout[fdata].(map[string]interface{}); ok { + return true + } + return false + } + + } + + //Check Corporate License + isArticaLicense := GetSocketInfoInt("isArticaLicense") + if isArticaLicense == 1 { + return true + } + corp, _ := os.Open("/etc/artica-postfix/settings/Daemons/CORP_LICENSE") + + defer corp.Close() + + scannerCorp := bufio.NewScanner(corp) + + for scannerCorp.Scan() { + fdata := strings.TrimSpace(scannerCorp.Text()) + if len(fdata) == 0 { + return false + } + + if fdata == "VFJVRQ==" { + return true + } + return false + + } + + return false +} + +func IsInt(s string) bool { + _, err := strconv.Atoi(s) + return err == nil +} diff --git a/client/external_acl_first/internal/memcached.go b/client/external_acl_first/internal/memcached.go new file mode 100755 index 0000000..749bbe1 --- /dev/null +++ b/client/external_acl_first/internal/memcached.go @@ -0,0 +1,29 @@ +package internal + +import ( + "github.com/bradfitz/gomemcache/memcache" + "log" +) + +var MC = memcache.New("/var/run/memcached.sock") + +func Get(key string, isDebug bool) string { + val, err := MC.Get(key) + if err != nil { + if isDebug { + log.Printf("Memcached Get->Error: %s", err) + } + panic(err) + } + if string(val.Value) == "" { + return "" + } + return string(val.Value) +} + +func Set(key string, value []byte, ttl int32) { + err := MC.Set(&memcache.Item{Key: key, Value: value, Expiration: ttl}) + if err != nil { + panic(err) + } +} diff --git a/client/external_acl_first/main.go b/client/external_acl_first/main.go new file mode 100755 index 0000000..0d1b29a --- /dev/null +++ b/client/external_acl_first/main.go @@ -0,0 +1,181 @@ +package main + +import ( + "bufio" + b64 "encoding/base64" + "github.com/bradfitz/gomemcache/memcache" + "log/syslog" + "net" + "os/signal" + "runtime/debug" + "strings" + "syscall" + "time" + + //_ "expvar" + "fmt" + "github.com/valyala/fasthttp" + "handlers" + "log" + "os" + "storage" + "strconv" + "sync" +) + +var ( + rewriter_exit_chan chan int = make(chan int, 1) + response_chan chan string = make(chan string, 1024*10) + signal_hup_chan chan os.Signal = make(chan os.Signal, 1) + stdin_line_chan chan string = make(chan string, 200) + signalInterruptChan chan os.Signal = make(chan os.Signal, 1) +) + +var ( + addr = "127.0.0.1" + port int = 3333 + //CONN_TYPE = "tcp" + version = "1.0.11" + isDebug bool = false + timeOut int = 5 + SelfSquidUrgency bool + strContentType = []byte("Content-Type") + strApplicationJSON = []byte("application/json") +) + +type CategoriesResponse struct { + Category_id string + Category_name string +} + +//var answer *string +//var err error + +func init() { + log.SetFlags(log.LstdFlags | log.Lshortfile) + if _slog, err := syslog.New(syslog.LOG_DEBUG, "go-shield-connector"); err == nil { + log.SetOutput(_slog) + } + signal.Notify(signal_hup_chan, syscall.SIGHUP) + signal.Notify(signalInterruptChan, os.Interrupt, syscall.SIGTERM) +} + +func main() { + defer func() { + if r := recover(); r != nil { + log.Printf("Panic: %v,\n%s", r, debug.Stack()) + os.Exit(1) + } + }() + + addr = handlers.GetSocketInfoString("Go_Shield_Connector_Addr") + port = handlers.GetSocketInfoInt("Go_Shield_Connector_Port") + isDebug = handlers.GetSocketInfoBool("Go_Shield_Connector_Debug") + timeOut = handlers.GetSocketInfoInt("Go_Shield_Connector_TimeOut") + SelfSquidUrgency = handlers.GetSocketInfoBool("SquidUrgency") + if addr == "" { + addr = "127.0.0.1" + } + if port == 0 { + port = 3333 + } + if timeOut == 0 { + timeOut = 5 + } + //dns1_token_int, _ := strconv.Atoi(dns1_token) + //dns2_token_int, _ := strconv.Atoi(dns2_token) + //addr_token_int, _ := strconv.Atoi(addr_token) + //port_token_int, _ := strconv.Atoi(port_token) + + //internal.SetSocketInfo("Go_Shield_Connector_Version", version) + //addr_token_int, _ := strconv.Atoi(addr_token) + //port_token_int, _ := strconv.Atoi(port_token) + + //mc := memcache.New("/var/run/memcached.sock") + + storage.MC.Set(&memcache.Item{Key: "Go-Shield-Connector-Version", Value: []byte(version), Expiration: 2590000}) + isDebug = true + var wg sync.WaitGroup + + reader := bufio.NewReader(os.Stdin) + //http.ListenAndServe(":1234", nil) + for { + line, err := reader.ReadString('\n') + + if err != nil { + // You may check here if err == io.EOF + break + } + + wg.Add(1) + go ProcessRequest(line, &wg) + + } + wg.Wait() + +} + +func ProcessRequest(line string, wg *sync.WaitGroup) { + defer func() { + if r := recover(); r != nil { + log.Printf("Panic: %v,\n%s", r, debug.Stack()) + os.Exit(1) + } + }() + defer wg.Done() + start := time.Now() + lparts := strings.Split(strings.TrimRight(line, "\n"), " ") + id := lparts[0] + query := b64.URLEncoding.EncodeToString([]byte(line)) + + if SelfSquidUrgency { + if isDebug { + log.Printf("WARNING... Emergency Enabled") + } + defer wg.Done() + fmt.Println(id + "OK first=EMERGENCY webfilter=pass\n") + return + } + if isDebug { + log.Printf("Receive <%s> Query <%s>", line, query) + } + req := fasthttp.AcquireRequest() + defer fasthttp.ReleaseRequest(req) + log.Printf("http://" + addr + ":" + strconv.Itoa(port) + "/external-acl-first/" + query) + req.SetRequestURI("http://" + addr + ":" + strconv.Itoa(port) + "/external-acl-first/" + query) + + resp := fasthttp.AcquireResponse() + defer fasthttp.ReleaseResponse(resp) + client := &fasthttp.Client{ + ReadTimeout: time.Duration(timeOut) * time.Second, + MaxIdleConnDuration: time.Duration(10) * time.Second, + Dial: func(addr string) (net.Conn, error) { + return fasthttp.DialTimeout(addr, time.Duration(timeOut)*time.Second) + }, + //TLSConfig: &tls.Config{InsecureSkipVerify: true}, + } + //client.Do(req, resp) + if err := client.DoTimeout(req, resp, time.Duration(timeOut)*time.Second); err != nil { + fmt.Println(id + " OK first=ERROR") + return + } + + bodyBytes := resp.Body() + code := resp.StatusCode() + if code == 200 { + //defer wg.Done() + elapsed := time.Since(start).Microseconds() + if isDebug { + log.Printf("FINISH PARSING - Resp = %s | code = %d - took %d μs", bodyBytes, code, elapsed) + } + fmt.Print(string(bodyBytes)) + return + } + //defer wg.Done() + if isDebug { + log.Printf("Invalid - Resp = %s | code = %d", bodyBytes, code) + } + fmt.Print(id + "OK first=ERROR webfilter=pass exterr=invalid_code_%d\n") + return + +} diff --git a/client/external_acls_gc/bin/external_acls_ad_agent b/client/external_acls_gc/bin/external_acls_ad_agent new file mode 100755 index 0000000..0cd6717 Binary files /dev/null and b/client/external_acls_gc/bin/external_acls_ad_agent differ diff --git a/client/external_acls_ldap/bin/go-squid-auth b/client/external_acls_ldap/bin/go-squid-auth new file mode 100755 index 0000000..665159f Binary files /dev/null and b/client/external_acls_ldap/bin/go-squid-auth differ diff --git a/exec/go-exec b/exec/go-exec new file mode 100755 index 0000000..4a1887c Binary files /dev/null and b/exec/go-exec differ diff --git a/exec/go-forker b/exec/go-forker new file mode 100755 index 0000000..8e48e98 Binary files /dev/null and b/exec/go-forker differ diff --git a/fs-watcher/bin/go-shield-server-fs-watcher b/fs-watcher/bin/go-shield-server-fs-watcher new file mode 100755 index 0000000..393bb21 Binary files /dev/null and b/fs-watcher/bin/go-shield-server-fs-watcher differ diff --git a/go-failover-checker b/go-failover-checker new file mode 100755 index 0000000..868bbd5 Binary files /dev/null and b/go-failover-checker differ diff --git a/handlers/go.mod b/handlers/go.mod new file mode 100755 index 0000000..72479c1 --- /dev/null +++ b/handlers/go.mod @@ -0,0 +1,9 @@ +module handlers + +go 1.18 + +require ( + github.com/leekchan/timeutil v0.0.0-20150802142658-28917288c48d + github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 + github.com/techoner/gophp v0.2.0 +) diff --git a/handlers/go.sum b/handlers/go.sum new file mode 100755 index 0000000..c066891 --- /dev/null +++ b/handlers/go.sum @@ -0,0 +1,6 @@ +github.com/leekchan/timeutil v0.0.0-20150802142658-28917288c48d h1:2puqoOQwi3Ai1oznMOsFIbifm6kIfJaLLyYzWD4IzTs= +github.com/leekchan/timeutil v0.0.0-20150802142658-28917288c48d/go.mod h1:hO90vCP2x3exaSH58BIAowSKvV+0OsY21TtzuFGHON4= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/techoner/gophp v0.2.0 h1:vVFoS2XC/NZariagUOhAGqC8p/Ws8R8ARYpj/9lTIAo= +github.com/techoner/gophp v0.2.0/go.mod h1:NOxB/qoTl4+G82CkQp60T18Az5rOTufCqm83x9i/u7M= diff --git a/handlers/handlers.go b/handlers/handlers.go new file mode 100755 index 0000000..0564cde --- /dev/null +++ b/handlers/handlers.go @@ -0,0 +1,8 @@ +package handlers + +var isDebug bool + +func init() { + isDebug = GetSocketInfoBool("Go_Shield_Server_Debug") + +} diff --git a/handlers/license.go b/handlers/license.go new file mode 100755 index 0000000..1db1b1f --- /dev/null +++ b/handlers/license.go @@ -0,0 +1,97 @@ +package handlers + +import ( + "bufio" + "encoding/base64" + "github.com/techoner/gophp" + "os" + "strings" +) + +func GetArticaGoldLicense() bool { + //Check Gold License + gold, _ := os.Open("/usr/local/share/artica/.GOLD") + + defer gold.Close() + + scannerGold := bufio.NewScanner(gold) + + for scannerGold.Scan() { + fdata := strings.TrimSpace(scannerGold.Text()) + if len(fdata) == 0 { + return false + } + if fdata == "TRUE" { + return true + } + str := "YTo2MDU6e3M6Mjc6IjJPWlRBWi1INU9HRzItWEQyRFJBLVlNN0lOWSI7YjoxO3M6Mjc6IldVRkhUNi1aT1VYTDktU00xWFFSLU9RTUVVQSI7YjoxO3M6Mjc6IktBRVFFMi1ZRUROUzEtSU5TSU9YLUJYNVdLNCI7YjoxO3M6Mjc6IlBQUEFUSi0ySDlWUkEtQTFMVktGLTlKTVZNMiI7YjoxO3M6Mjc6Ik9PVUk5TS1DN0RFUEEtSEdDRzFELUw2NEhKSSI7YjoxO3M6Mjc6IkNFUExGQi1GTjVMMTMtWFFVM1NBLVVWTEpLSiI7YjoxO3M6Mjc6Ik41NVlIUi1MQUYwQ1QtM0lWSlY5LTM5WllJQyI7YjoxO3M6Mjc6IkIxSklPSy1HWFNMUVMtRUFaMVhHLUxZOFNFUyI7YjoxO3M6Mjc6Ik9IVDZQVS00UElFUFgtOUZDTkJJLTlTREVWRiI7YjoxO3M6Mjc6Ikk5WEE2RC0yTk5BRjItNk1VQ0pPLTU5UFA4TCI7YjoxO3M6Mjc6IkU0TENXWi1WQlRKUVotTkFLWE5TLVNRT1JQMiI7YjoxO3M6Mjc6IlBaWE5LVS1VMkREQ1ktTUZPM0ZVLVFSRzhHTiI7YjoxO3M6Mjc6IlFETDVPRS0yMEhVOVctSlkyV05GLVpFR0JGRiI7YjoxO3M6Mjc6IlRBUk9EQS1TSkdRM0stR1lNRjBULThaSTlPVyI7YjoxO3M6Mjc6IlFBMUJBSy1YRFNWWFItWVUyRDdCLUNYNDdDWSI7YjoxO3M6Mjc6IkUwWlRZTi1PNlJSRkEtVDlNVTlaLUdaOFFBRCI7YjoxO3M6Mjc6IjhUM09OMS0xQTU5Qk0tR1dZRThULVRGR0ZXUyI7YjoxO3M6Mjc6IkZQWFZEMy1ORkMwR1YtVlFJVko5LVlJSFVMSyI7YjoxO3M6Mjc6IkJWUlRTSC1CSVdMVEUtQlJCMFhDLVJIV0RGQiI7YjoxO3M6Mjc6IkwxVlpJMC1VSlRTUU8tT1pFTkFHLVRVUVdPQiI7YjoxO3M6Mjc6IkhaVVFQRS1LV0VPRFctUUlDRE5SLUREV0pYNiI7YjoxO3M6Mjc6IklRRjUyRS1aTUZVOEUtMFdHQzdLLURRMktBQSI7YjoxO3M6Mjc6IjhEU1ZQWi03WTg2RUUtVUgxQTlULTVKSUhLQyI7YjoxO3M6Mjc6IlFRRElLUC1EOE5VSkYtOURGRFpaLUZJUk9QTyI7YjoxO3M6Mjc6IlpaUjg4OC1VRFdHVUgtRDhGTkxaLVNIT0ZHMyI7YjoxO3M6Mjc6IklEUDdTTS1INkJTUEotRlVSUUNMLUhBRjlNNCI7YjoxO3M6Mjc6IlJNR1VCVi1ESlJCTlMtWE1FVDlQLU5ISUlDUyI7YjoxO3M6Mjc6IlZOUFlOVS1RN1ZFWkItME5VOFBULUNaWEJEUCI7YjoxO3M6Mjc6IlBGREk2Uy1PQUVOV1UtNTFaNDFOLTI1TEk5WSI7YjoxO3M6Mjc6IjlLRUlCSC1FUkxIWUQtRkdDWk9VLVRVWEdWWSI7YjoxO3M6Mjc6IjNEOE5INy1IRzNMREktQkdSQU0yLTlGNUw1TiI7YjoxO3M6Mjc6Ikg4SVNVUS04T0dZTjktSUZPVU5OLVpOTVVPVSI7YjoxO3M6Mjc6IlpIVUhIUi00S05MNVotM0lZQVAwLVNCOVJENSI7YjoxO3M6Mjc6IlNWNVNQUi1JOU5VVFAtTkFMRE5JLUJOMkpVTiI7YjoxO3M6Mjc6IktOVU5HNC1OVktXQ04tWVI0WEk5LVZGRjYwRiI7YjoxO3M6Mjc6IllMTEtERi1KT0VYSTAtSUFTQTVaLVk1Q1BFRyI7YjoxO3M6Mjc6IklVWkhCRS1FUUZPUkEtT0xaUUI2LTFCQjNINCI7YjoxO3M6Mjc6Ik4ySzBaTi02SzhLSjAtOUpCRkZWLUY5VVNEVyI7YjoxO3M6Mjc6IlhGOFpROC1PRlpXUVgtV0xRQUZYLVNUVVNXTiI7YjoxO3M6Mjc6IkpTUlo1Vi1FRVBYU1gtMlNIRUhHLU5DOUlITyI7YjoxO3M6Mjc6IkVaUktQVS1FT1FVS0gtU1BTWEIxLVdTS1BQQSI7YjoxO3M6Mjc6IkZQRkUyQS02OUtGNkwtUEdOTFowLUlTMFlJQyI7YjoxO3M6Mjc6IjdCTU5UWC1FRUpWQUwtWUIzM0pLLUtOQlpGMSI7YjoxO3M6Mjc6IkJPOU5JSy1QUUJCNFotRkpLTVE0LVhTSzhERCI7YjoxO3M6Mjc6Ilg2UzZMRC01U1JYWlctUUhBNVFELVNCSDhBWSI7YjoxO3M6Mjc6IkdBVEE0Ui1SWDBJSkItRDFQV0ZFLTJUUDNVUCI7YjoxO3M6Mjc6IkJLMkdaTy1FQ0tXQU8tSFhBWU9RLTZYWUk3NiI7YjoxO3M6Mjc6IlZOVzBJVy1CTUs5VE4tWTkzR0FKLVdQUk1NUyI7YjoxO3M6Mjc6IkxaR0dPMC1COURITVItTTBQUDNCLU1ZRVlIVCI7YjoxO3M6Mjc6IjJVTzVMVC0yNkhXS0stNDVMR0RILU9BVlVWUyI7YjoxO3M6Mjc6Ik81SlAxVS1BRzlNUTQtWjlWRjVCLU1GTEFDUiI7YjoxO3M6Mjc6IjZYRFlDVy1LNFBISUEtNEYwVjVCLThXTVpRUCI7YjoxO3M6Mjc6Ik5UMVFOTC03WlVFTDQtOFBYSVdXLU1EWFRFUiI7YjoxO3M6Mjc6IlFENzhCVS01UklaU04tMTVHTEVCLVZIQVk4SCI7YjoxO3M6Mjc6IlRVSk1LRS1ZQ0hFRUwtRUZMTk1LLVhSVExQVyI7YjoxO3M6Mjc6IldIU0sxTC00VlhSV0YtTElQQ1dNLUFQUlhGUSI7YjoxO3M6Mjc6IkZBM1hQMi1USzgyRFItUFpXWUlELTgwVlA5TSI7YjoxO3M6Mjc6IklDQjZXSC1EU1hNWVEtTzJIMUVaLTVKSFpTViI7YjoxO3M6Mjc6IkhYRDlGRS01WFVBRFItQzROSFRJLUZXTE5aNSI7YjoxO3M6Mjc6IklXRk5FRi1OQUcyUDUtVU0yWFdTLVBFN1RTSyI7YjoxO3M6Mjc6IjE3TFpaQi00NDVYSFMtUElMVlhTLVQ3Nk9CRCI7YjoxO3M6Mjc6Iko2V1JUVy1NWVJOOEgtWFBCVzZNLUdVQ09ZTiI7YjoxO3M6Mjc6IlZCRUtXRi1OM1NEWUEtTjJZMU45LUxVTElOSCI7YjoxO3M6Mjc6IkJQS0RPSC1PRktKOU4tWUpRSE9ZLU1XRVdQWiI7YjoxO3M6Mjc6Ik9CR1o5US1SWUZCUlgtV1FQWEVQLVowRkJGUSI7YjoxO3M6Mjc6IlVZOU9RRS1CTTA0Q0wtVUNYTEhQLTZYQUQ0TiI7YjoxO3M6Mjc6IkFXR1lOUy1VQ1A4SEItQVcxRTJQLU9CR1hMWCI7YjoxO3M6Mjc6IksxQ0U0UC1JUTJGWTEtR1ZIVUJBLTFLTktGNCI7YjoxO3M6Mjc6IkFMU1lIUy1PRjk5TDktR1JWMlYwLVNIMkdaWSI7YjoxO3M6Mjc6IkFZSkM5TC1DT0lKRlItUElFWUpJLVcxVUxFUiI7YjoxO3M6Mjc6IkhXV0hKMS1WREZIUkYtTTJRUU1XLTNUU1ZHVSI7YjoxO3M6Mjc6Ikw5UUhPVS01OTU1OUwtTVhaWVc0LVpLUEpaTiI7YjoxO3M6Mjc6IldXQVhaTS1KM0oyTVEtMlI3SENJLTBDWkpPSyI7YjoxO3M6Mjc6IkRHWU1DMC0wR0dVRkctN0RPQVE0LU1XQ0ZZQyI7YjoxO3M6Mjc6IjlZQUk0Ri1XSUIxMUYtUFBTRENDLVM4N0dEOCI7YjoxO3M6Mjc6IlRIVkZWTS1BS1JXTk4tQkpQME1WLVpQWUVTMCI7YjoxO3M6Mjc6Ik9YRUM1Vi01S1NNRFQtWUpUVTA5LUpRUTcyRiI7YjoxO3M6Mjc6IlU4VFFPVS1ZQjFZM0otVUxSVVNDLVhWSVpCWSI7YjoxO3M6Mjc6IkVRTk9UNC1KS0cySzctRFAzUE5ULTdMUU5STyI7YjoxO3M6Mjc6IlRUVVI2Si1LTzNENDQtSUlXQUE5LVVKS1RNTiI7YjoxO3M6Mjc6IkVBRERUSy1MN0paTlUtWUdKSk1aLThBUDFaTSI7YjoxO3M6Mjc6IlZBUlhSVi05SVNUUTUtQUc0S09CLVgyTkM0QyI7YjoxO3M6Mjc6IlRVREdRMC1XS09TMlMtTEVESFdRLVVOQVdDViI7YjoxO3M6Mjc6IlBKS0c0VC1aUERNSFctV0JDUk9FLUhJSzhWVSI7YjoxO3M6Mjc6IlkyRUhFSi1RQVFRUU0tV1MzQk0yLUxZSFBLSSI7YjoxO3M6Mjc6IkpMRlBaOC1WOUdETkwtVDZJMVg5LUZYWjNZMyI7YjoxO3M6Mjc6IlhHVkNVQy1FTjROSkctMFdaWFVJLVhGSEJCVyI7YjoxO3M6Mjc6IlBEUzFKVS1UTkNXUFAtUU5CQTVMLUI3QktKSSI7YjoxO3M6Mjc6IkFEUDZJRS1XTU5JWUMtTFZSTk5LLTVITVhXTyI7YjoxO3M6Mjc6IkJTT1lNUC1DVDBGWVctSTRNTDVaLVQyQlE4UiI7YjoxO3M6Mjc6IlNBUk9FWi1LSUJUUEctUU5TSTk0LUE4QUNFUiI7YjoxO3M6Mjc6IkhMT1lUUC04VVNVS0stWldZNk1LLUpKOE8yTiI7YjoxO3M6Mjc6Ik80VkFZVy01SlQwSEYtTExVWEhYLVlZQzdKQiI7YjoxO3M6Mjc6IkxQRjNQVy1PNVBCR1UtMFA1RUtOLVhTQ09PWSI7YjoxO3M6Mjc6IlI5UE40Qi1JWFc4RVMtOUJJT0xHLThURFA0UiI7YjoxO3M6Mjc6IjhGVU5DVi1YVlNPMVQtTDNWUUdELUFKUEtQUCI7YjoxO3M6Mjc6IlJFUTJOSi0wWlRXWkwtNk9FUTlJLUpUWUFQRSI7YjoxO3M6Mjc6IkhGU0lBQy1NVElZTFQtWUlGUUlELVVKS1hHMiI7YjoxO3M6Mjc6IkxZQjFXVC1WVzNMNVktUEJMUExJLUdIRUNaUyI7YjoxO3M6Mjc6Ik1JSkdCMS1MTlQyRDItUk0wS0RKLVRaRVFMNyI7YjoxO3M6Mjc6IkJUV0VPTi0zWTNESVctVEdDV1NYLUtPRUhSTCI7YjoxO3M6Mjc6IlRPUEJBSS1QQ0tUUEctN0pSSlVKLUVTQU5HMSI7YjoxO3M6Mjc6IkY0QTNCTS1KTkZPUVktVFhOTUtTLTFMVjlHTiI7YjoxO3M6Mjc6IlM2Uk1QRS1GQ0I2Tk0tUkVDSVoyLTJOSlBNRCI7YjoxO3M6Mjc6IldUSU5YUS1BMVFCS0QtSVVQQ0swLUhTS1dDVyI7YjoxO3M6Mjc6IjJYSUJHMy1TVEJRSjgtTzRVQllYLVlTQ1hHQyI7YjoxO3M6Mjc6Ik4wVVVUNC1DUFgyOUQtT0VNQ0pMLURJOFdPOCI7YjoxO3M6Mjc6IkM5SkJLVS1MSFpXQVQtV0Y0WVhWLTMzNlhNUSI7YjoxO3M6Mjc6IjAyTkFIUS1FWTA3V1YtSk9NVEhULUxKVk1FOSI7YjoxO3M6Mjc6IjBZMUZMMi1NSDZKRUMtSlpDR05ILVpST0VUTiI7YjoxO3M6Mjc6Ikk1Sk5YTi1UQk5ITkstR1JBVDk2LUpRTzZJMSI7YjoxO3M6Mjc6IjU4V0pNTi1US1NUQkotSkdMWkcwLUVPU0NDMyI7YjoxO3M6Mjc6IjhGT0RXTy1SRk5GWDEtSFNLRldYLUZVS05QUCI7YjoxO3M6Mjc6Ik5aQ1pFWi1PRlUzWTItVzYwN0hELVVaUFlGVCI7YjoxO3M6Mjc6IlRBQ0dPSS01VEJQM1ktM1pCUk9PLUdCT1lTUCI7YjoxO3M6Mjc6IlEyUVVSQi1KMERBWUEtMTNWU1lRLTBKMEpVWSI7YjoxO3M6Mjc6IkhYUkNBWS00Q0owVk0tQlJJWVpTLVVWR04wRSI7YjoxO3M6Mjc6IkE4T1ZHNi1QWVNNTEEtTEJSWFZNLUpISTVJOCI7YjoxO3M6Mjc6IkFZOThaRi1WQ1ZEVU8tVjdDREVPLVRTTVZRNyI7YjoxO3M6Mjc6IlJZSkgzWC1IUUMwTU4tWkkyNjBKLUNTSUY2TSI7YjoxO3M6Mjc6IkUxRkNOWC1OV0NSMUQtTFlVNVRGLU8xREJBWCI7YjoxO3M6Mjc6IjRBTVNRVC1YQlowOEYtWU45WkVELTM4UkhIUSI7YjoxO3M6Mjc6Ik9URUZCSy1SSlBLN0wtOEVPRFg0LTlCTVZaMSI7YjoxO3M6Mjc6IkQxOUhYWC1SUEFaWkEtV1dVRUFXLVBTTjhBVyI7YjoxO3M6Mjc6Ik9LT0xLQy05Q0hKTkgtTE1BSEtFLVVISlpTRiI7YjoxO3M6Mjc6IlZXWlpWQy1VS1RaRlAtRU83MFFFLVpHTThDNiI7YjoxO3M6Mjc6IjJBRk4xUy1IREkySU8tSjRGWVhNLVVaMkdMRyI7YjoxO3M6Mjc6IllYRUJFSi1OMEhKVUMtWkJPWllRLVNEOUFXVCI7YjoxO3M6Mjc6IlJTVFlBRS1SUEVJU1MtVE9aQlFPLVBaUFE2QiI7YjoxO3M6Mjc6IjhCQVhGUi1LSVNJQUYtNVFVN0RYLTZPUlBYNCI7YjoxO3M6Mjc6IllWT1hLWi1UQ0EwWFItV0NWUk5YLVVFSVdYWSI7YjoxO3M6Mjc6IjBPQkxSVC1PTExBWkotQTlPMldILVhMQklNTyI7YjoxO3M6Mjc6IkROS1pSQS04MDNLSk4tVVU3WTRYLTg2RUdPNiI7YjoxO3M6Mjc6IkVSUUhZRi1HQkdDTkUtSk5QTEtLLVdWUENCVCI7YjoxO3M6Mjc6IlRHQ0ROSS1aVk1TRDktVzlKQlg0LTYwMEJQTCI7YjoxO3M6Mjc6Ik5FVUxRQi1YUk1VRlAtWEhMRE1JLVlJMFpaSSI7YjoxO3M6Mjc6Ikw1VjcxRy0wSEpUWlMtWUxNOU9OLUFaSExNOSI7YjoxO3M6Mjc6IjVFQ0dNRS1ZTktUQ0ktSkxYR0VILU5WWFJJTSI7YjoxO3M6Mjc6Ik5RQVVUTC1PREtHVTQtRVdQSVcyLUNHRU9YUSI7YjoxO3M6Mjc6IlFOSkRHOC1JRVRTSkotWFUwT1Q3LUJSNVlaRCI7YjoxO3M6Mjc6IlNFRkFIQy1ZUU9EQjAtUVFORUdPLVBTSEdFUyI7YjoxO3M6Mjc6IkxKUjhTUi1CSk1OQUMtWE04V0wzLUNZQ0dGRSI7YjoxO3M6Mjc6IkdPN1JORC1HSkk4RkYtQ1UzMUJQLUpETzdZSiI7YjoxO3M6Mjc6IkxGSkNLQy1USkdKMjAtTDlOSTI3LU9ONFVCSyI7YjoxO3M6Mjc6IkZCV0VCVS1CQ05NUEItQ1RQR0NULVNUUkdPViI7YjoxO3M6Mjc6IkFZVU5TUy1GVFpPQjUtWFJGSzQxLVBGR0ZIVCI7YjoxO3M6Mjc6Ik5MQU40Sy1KWEpEUU4tSU9XMk5ELVExN1JTUCI7YjoxO3M6Mjc6IldCVFhFTC1VTVhMUlotSENLRTdZLVhIMDVDRSI7YjoxO3M6Mjc6IjlIQ1NOMy1GU1M0UVctRElVNUFMLUEzT0dZUiI7YjoxO3M6Mjc6IkRBWEFSWi1UNEJaVVYtUEFNUkpJLVFKUDJPNyI7YjoxO3M6Mjc6IkpYMkNDWS1MNlZGWEEtQUJBS0hQLVpOMVBKQiI7YjoxO3M6Mjc6IktEWVVDTC1WUTJLWjgtM1FQWkhWLUFHV1NaMCI7YjoxO3M6Mjc6IlFYMkxOUi1RRVBHSFgtQ0lIUEdSLVg4WUNVSyI7YjoxO3M6Mjc6IlNLV1Q2TS1JR0FGNUEtTVpFWk1VLVZQU1dJTSI7YjoxO3M6Mjc6IklSQ1hUUC1TWDFCMUotRlhEQVk1LUZQUFJFTSI7YjoxO3M6Mjc6IjRQQ0hMRi1VQk4zSFgtTVNPSlMxLUM4WUNJRCI7YjoxO3M6Mjc6IlJITUhOSC1NRFdZWTMtOVBHSURGLVRLWlNTNyI7YjoxO3M6Mjc6IkxaTlVPOC1WM0lWMTgtUjRURk5GLVk4SlRNQSI7YjoxO3M6Mjc6IlBFUFZYNi1BVFozRUktUzgwNkNPLUpJRzJSSiI7YjoxO3M6Mjc6IkdTT0xLRy1aUFFLVVQtWlA3WllCLUhSUEtDMCI7YjoxO3M6Mjc6IlBTUkJRUS1ZRURZVUotSUdVWkZZLTBIR09VUCI7YjoxO3M6Mjc6IkVQRTlMWi1LSU1ENFotMkJOSFo1LUNEVVdXMSI7YjoxO3M6Mjc6IklaUEZTWS1FTVVDVE4tTzczS0JMLU9FSkFMTiI7YjoxO3M6Mjc6IlBSRUNCMC1CMFBXV0ctUllKUEJILTI1U1pPVSI7YjoxO3M6Mjc6IjVENlpTRy1HWlpTVlktR0ZVRFNNLU5VQjlTRSI7YjoxO3M6Mjc6IlNMVlRNTy1RQkFEMEwtVzJGWDNKLUdWSUZRTCI7YjoxO3M6Mjc6IktSQVlNUC1RUUJFMUMtQktIVVBZLUY3U0hVQSI7YjoxO3M6Mjc6IkxST0NHRC1SRVFLT08tNUozWkVaLU1WWUhEVSI7YjoxO3M6Mjc6IkNRQ0VTTi1STDJVQkotQ1I1U0VJLVdBUFVRWCI7YjoxO3M6Mjc6IjBDWldOSC1EQUJHV0ItRlFTUlAyLUs5UlNHSiI7YjoxO3M6Mjc6Ik1BRVFKRy1PRVBKODgtNUdQSVkyLUI5ODNaRiI7YjoxO3M6Mjc6IlRGVUZJNy1UUE9VNTAtNVNCSjNDLUJZRVlYSCI7YjoxO3M6Mjc6IkhIR1pZNi1DVElMNUstQk9OVkNILTk1WU5BVCI7YjoxO3M6Mjc6IjlFODJLRy04RTBaTUMtODNCV0RBLVY5TVhIQiI7YjoxO3M6Mjc6IkEyOVpCVy1USENDSDEtTFlQTVRJLU01RFBaUiI7YjoxO3M6Mjc6Ikg4SEdBWS1HVVQ3VlQtTE41NDlWLUpTTzVBSiI7YjoxO3M6Mjc6IjlPS0JGSC1KTkxRQ0wtTlVER1c5LUROV0s3VyI7YjoxO3M6Mjc6IllXR1VTVy1KR1hXQkItVDVNOTYxLUtPUlNINCI7YjoxO3M6Mjc6IkhVWUJINi1DUU1MQVMtTTdWTkpULUpVQ1QwMiI7YjoxO3M6Mjc6IkI0MElMUC1GSjVCVFctNUxIMThTLTgyVjFXTCI7YjoxO3M6Mjc6IjdXRjhQVC1URU9JT1ctSVc5NlVSLVI2R1BCNSI7YjoxO3M6Mjc6IkU1U0VEWi01TUNLN1AtS1JRT1hQLVBTQVZONiI7YjoxO3M6Mjc6Ilg2RU1JUy1TTThXSEwtSTJURE5RLVdNV1VPVCI7YjoxO3M6Mjc6Ik9UMzFDTi1BWUFISkYtRUcwUDZPLUJBOVNXWCI7YjoxO3M6Mjc6IloxQVdDQi0xUzZNQVYtQkVJS1ZHLUlETUNUUyI7YjoxO3M6Mjc6IkdNWlVaWC1XR1VJR1MtRlJPSDBLLTJRRzYwTyI7YjoxO3M6Mjc6IlVETVRORi1LUTNRVlgtRUJKNlFOLVhZNlA0RSI7YjoxO3M6Mjc6Ik5HUE1HNS00VFpaQ0UtRUlJMUVQLUZVNFlVQyI7YjoxO3M6Mjc6IjI4VUlaRC00SEdBTlctUFVTVUVRLUxRVFhSMCI7YjoxO3M6Mjc6IkJRV1lMVi1QSkJBNU0tSEdWTVZKLVZOTkdQTyI7YjoxO3M6Mjc6IkNaUklFTi01Vk1LRUQtNkxPTU01LVpPWUE4NiI7YjoxO3M6Mjc6IjNNVVhQMC1KR1pISVUtVEJMWENaLTdYSUJBVyI7YjoxO3M6Mjc6Ik02TElGRi1SWElGMVAtSFE2VVFCLTQ2STRDTSI7YjoxO3M6Mjc6IkNFWUpURS1ORkFWU1ctQUNQR1VJLVVTUlpTOSI7YjoxO3M6Mjc6IjdaT0pZQi1HOE5VNVAtRVlFNlVBLUFDRjJTRyI7YjoxO3M6Mjc6IlhSTEhSTS1PT01JUEYtVVQ4UDdLLVJFNkgzVCI7YjoxO3M6Mjc6IkpOS1NHQS1XQ0VJV00tR05JV1JNLVZMUDY4NSI7YjoxO3M6Mjc6IlgwV0dFVi1WSUNFS0UtTkRPQkpSLUxLUFFTTiI7YjoxO3M6Mjc6Ik5BQzFEOS1QQlJXTEctOTlZU1lCLVJVQ09XSSI7YjoxO3M6Mjc6IllXV1FGTi1RSlVMQlYtRlVUNlBQLUFYTlRFUyI7YjoxO3M6Mjc6IkhQVlVURC1XVTk3VEotTU1VUk1aLUZLOE1TVSI7YjoxO3M6Mjc6IkdQOFRSVC1aU1JENUUtVURBVVRMLVU4NlBZUiI7YjoxO3M6Mjc6IkdVWVdXRi0wRDE0WDktNUNCVVNaLVZHWVlOSSI7YjoxO3M6Mjc6Ik5MTUlUNC1ONlE3RTUtNkZLWTRFLThMWTFLMSI7YjoxO3M6Mjc6IllCSUVNUy1LSDNPUFUtVlFSUVJHLVlSOFY0RiI7YjoxO3M6Mjc6IlBDRkZYVi1SUUJXWTctODU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlIVjJRQS1BV0JXWTctMzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlNEOERIVy1RSEJXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNHUFdNSC1WUUJXWTctNzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRYUUpOWS1QNkJXWTctNzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IlJEUjhWTC01TUJXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IktZOUVDVy1ZN0JXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlJTRDdNVS1MM0JXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6Iko0QUZLRC1HWkJXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ijc0UTdNSi1KVEJXWTctMzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJVRENRQS1OWkJXWTctNjVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjdMNzJXSy1MR0JXWTctMjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJVTUE4WC1VWUJXWTctNzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjdHVVUzOC1aM0JXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5RS0FVSC0yTEJXWTctNDU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjdRNExVNC1LQkJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJKOTNBQy1VMzhXODctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IjhMQ1Q1Ni1IWEJXWTctMzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IlpaQ0ZOUC1QNkJXWTctNzU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjkzVUY1OC1FV0JXWTctQjVZODY5LU5EVFRETiI7YjoxO3M6Mjc6IjlXSjgySy1VUUJXWTctNDU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZVRTU5NS00QTlXMjctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IjhHRlM1Qi04NTlXNjctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkJYWTJUTi0zTUJXWTctNTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZWTlFRSC1HSEJXWTctODU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjQ0VVM4RS1UUEJXWTctNDUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlE4UEZNSi0zMkJXWTctMjVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IlE2SE1NNS1XTEJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjhZWFZKNi02UEJXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5YVUFRSy1BVkJXWTctODUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlFEMlQ2US1GQUJXWTctMjU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZQWEdaVC1FRUJXWTctOTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IldVRFhMRC1SRkJXWTctODU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlpQQ001RC1DQUJXWTctMzU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZEOFpQMy1DQ0JXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlM3TTJQTS0zNEJXWTctQjVZODM5LU5EVFRETiI7YjoxO3M6Mjc6IlJCM0czNy1ZVEJXWTctMzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IlRZVVg1Ti1CVEJXWTctOTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ijk5SzhKVS1EOEJXWTctQjVZODY5LU5EVFRETiI7YjoxO3M6Mjc6IllGMktBNC1LVkJXWTctMzU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlI2R1dZQS1KU0JXWTctNzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkVQR1VKVi1DRUJXWTctNjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IktWSllLQi1ZOUJXWTctNzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlpTNjQySy01V0JXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZSSERZTC1NM0JXWTctNTUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkhYVjMyWC1IUUJXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjI5Q0gzVy1OREJXWTctQjVZOEI5LVlETlRUTiI7YjoxO3M6Mjc6IkZITjRLUC02SEJXWTctMjU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZQNVZGVy1aWDJXQTctWjU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRUNDRRSi1FMkJXWTctQTVaODI5LU5EVFRETiI7YjoxO3M6Mjc6Ilg0WE45Mi0zTEJXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRNRURUSi1TR0JXWTctNDU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkE4VzNYRi1VR0JXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhGNEY2VS1KN0JXWTctQTVaODQ5LU5EVFRETiI7YjoxO3M6Mjc6IjlXWEc0TS1OUkJXWTctNjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhXNkE3Vy0zVUJXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkhDTUc3Qy1VSEJXWTctMzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlMzWlhXVi1NVjJXQjctWTU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhQR1FQSi1BTUJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkozWlQ4Uy1HOUJXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlpBQlBCRi1XSkJXWTctNTU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkczTE5MUC1YRkJXWTctNTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkVONUdSTi1MWkJXWTctNjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlJMSzc1Qi00V0JXWTctMjU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ilk5QkhMSi1WSkJXWTctNjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IlA2U04yQy1CWUJXWTctNDVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjNRNFZTRC1UOEJXWTctNDUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IllaV0RQVi04R0JXWTctOTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkdaRDNIMi1ESEJXWTctQjVZODY5LU5EVFRETiI7YjoxO3M6Mjc6IlNCU0o5WC1SWUJXWTctODU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5CNjJQVy1ZUkJXWTctNjVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjI5Q1JDRS1XV0JXWTctNDVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IlozSDdBOC0yNThXNzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IllaNEg3My0zOUJXWTctQjVZODI5LU5EVFRETiI7YjoxO3M6Mjc6IlpMVkVDOS02REJXWTctNDVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjhQVEQyNS1EOEJXWTctQTVaODM5LU5EVFRETiI7YjoxO3M6Mjc6IkQyVTVKVi0yTEJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IllKWE1FUy1QRkJXWTctOTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkNVVzlBTi1FV0JXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJNWkpUOC1UUkJXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IlRFRTQ2TS1NTUJXWTctMzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjZGWFBaVi1IOUJXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjNOOEhRRC1GSkJXWTctMjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlE3UkhUSi03SEJXWTctNDU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlVXSkc2WS1UVUJXWTctOTU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IldCWk5VUi1TQUJXWTctOTU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjdZS1RCRC1ESEJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjZBRlBIRC1RTEJXWTctMzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlFGRVREOC1UUUJXWTctNjVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjJLTVZUNS1XV0JXWTctNzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkVUWkdRTi1MR0JXWTctODVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjQ3M0FVUi1LQkJXWTctQjVZODI5LU5EVFRETiI7YjoxO3M6Mjc6IjZFUzVINy1ZSkJXWTctMzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkJNMlozUy05UkJXWTctMzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZWVVhRWi1aNTJXQjctWTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjVVOEozQS0zSzlXODctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IjlOVU45Ny1BNUJXWTctQjVZODY5LU5EVFRETiI7YjoxO3M6Mjc6IlNITkhFTi01VkJXWTctNTU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkNKWkxISy0zV0JXWTctNTU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkM4REUyUi02VkJXWTctQjVZODM5LU5EVFRETiI7YjoxO3M6Mjc6IkRWUTM5VS1UTEJXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IllFNEgzQi1TQ0JXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkpWUjJLQS1MMkJXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBYNUhHSi1EUEJXWTctNTUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjZXTUhIRi1QS0JXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlQ0WFdUUi1SUDJXQTctWjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZRV1YyOC1ITUJXWTctNTUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkpXNVFHRS03UEJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhIUThYSi03R0JXWTctMzU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ilc3UDdFQi1DQ0JXWTctMjVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjRUVEJIVi05UUJXWTctNTU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IloyQUgyRy1CWEJXWTctMjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkFHM05HNS1RTEJXWTctMjVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkxHMjU4Ui1DUkJXWTctQjVZODg5LU5EVFRETiI7YjoxO3M6Mjc6IktIQUROQy1KM0JXWTctQjVZODc5LU5EVFRETiI7YjoxO3M6Mjc6IlBZQVAzNi1FV0JXWTctNDU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkFYUTNOOC1NTEJXWTctNDU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik41S1JEUi1CWkJXWTctNjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjZKODZRTS00QUJXWTctQTVaOEI5LVlETlRUTiI7YjoxO3M6Mjc6IkdHTkVZWC0zWkJXWTctNzU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ilo3QTdFUS00VkJXWTctMzU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ilo4Q1BWVC1TQ0JXWTctODVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IlpCVDlXQi1ERkJXWTctNTU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlSMllLUi00WUJXWTctNTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRTV1YyVi05RkJXWTctNTUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlRCOVM4Ry1GMkJXWTctQjVZODg5LU5EVFRETiI7YjoxO3M6Mjc6IkRIODJQTC0zWUJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJXRjRWMi1IWUJXWTctNDU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjZQU1E4Si1ONkJXWTctNDVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjVLNFNaRS1MS0JXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjVDTUtMUy0yREJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJTTlFQSC1MQ0JXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlKU1Q2QS1LNEJXWTctMjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkU0TVVUNy0zRUJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjZLUDRRUi1QTUJXWTctNTU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNUVFFXRi00RkJXWTctNTUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlpIRFlOOS0zQUJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ilg2WFUzRC1DVEJXWTctNTU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5HN0RZVy1KWEJXWTctNzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5NNTM1WS1LS0JXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlA0VUhSWS1FUUJXWTctNzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkxZUDJKVS1EUkJXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IksyVjVFVS03UkJXWTctMzU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlgyWUdRQy1HSkJXWTctNTU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlY2Mk04Ry1MNEJXWTctQjVZOEE5LVpETlRUTiI7YjoxO3M6Mjc6IjZLU05IWi1GVkJXWTctNzU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlRBR1NTNS1aN0JXWTctNTU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlhCRldMVC1IWEJXWTctOTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkhaREVQUy1LQkJXWTctNjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlVIS0o5UC1TUUJXWTctNzU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlFLRFlLSi1IV0JXWTctODVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6Iko1UlJZUy1aMkJXWTctNzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlQ3M1o3My1OR0JXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ilk1NjRHSC04TkJXWTctQjVZODM5LU5EVFRETiI7YjoxO3M6Mjc6IkJBNUFFMy1ZSkJXWTctQTVaODY5LU5EVFRETiI7YjoxO3M6Mjc6IkpYM1dKWS02QkJXWTctNTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlVWNVdVQS1QWUJXWTctOTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZVRDI0Mi02SDhXOTctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkhBRURLNC0zRDlXNDctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IlcyUU5SUS1VOEJXWTctNzU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkFRQks0OS1IV0JXWTctMjU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBEM0szRy1ZUEJXWTctMzU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5OOEFEUy1EWkJXWTctNTUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJITFFWSy1HU0JXWTctNjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjdUUkpYWS1SWDJXQTctWjU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBESEFMUy1XVEJXWTctNzU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik01WENHUS01R0JXWTctMzU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNNRFBSSC0yWkJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlUyQzhMVi1BOUJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IllQTUZKUC02N0JXWTctNTUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjU1RTk3WC1HWUJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IldNRzVUSi02WkJXWTctNjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5LQjVKRy1DM0JXWTctQTVaODk5LU5EVFRETiI7YjoxO3M6Mjc6IlU0SlZVVy1aOUJXWTctOTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjNKVkxLTi1ZUUJXWTctNzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkhEV0RTNC02SEJXWTctMzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkVHQlY2Ry1HRUJXWTctMjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkRSREdRTi1NMkJXWTctNDUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlXNTY2OS1KTEJXWTctQTVaODc5LU5EVFRETiI7YjoxO3M6Mjc6IjVQVEc1RS1WV0JXWTctNTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZUUzhQRy1ZQUJXWTctNjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJINkhMRS0zSEJXWTctQTVaODY5LU5EVFRETiI7YjoxO3M6Mjc6IkZXTE5VMi1YUUJXWTctODUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ilc2SEI0QS0yQjlXMzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkRZTFNONC1BVEJXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJCUjlYTC1BREJXWTctMzU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBIWVRBQi1RM0JXWTctNTU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ijk1VUQ0OS1WNEJXWTctQTVaODU5LU5EVFRETiI7YjoxO3M6Mjc6IlVZNjdXTS00U0JXWTctNjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6Iks5NEZLVi0yV0JXWTctMzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5ORzhGVi1BQ0JXWTctMzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkNLUVJaRC1NRkJXWTctNzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkxEQVBONS1YWkJXWTctNjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlE5Qk5ZNC1FVkJXWTctNTUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhTNTRDWi0zTEJXWTctQjVZODY5LU5EVFRETiI7YjoxO3M6Mjc6IlA0WkxWNC1IOUJXWTctNDU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlJGVkhMNi04QUJXWTctMzU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjQ5R0U1Qy1SOTlXNjctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6Ilo4RVNUVC03RkJXWTctNjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlNXVTZZQy02WkJXWTctODUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJBQUVCWi1TWUJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBFNUpOTi01RUJXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlJEOFZRMy1ISkJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkdHMzhFNi1QOTlXNzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IlE4TkNFOC1ESkJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhISk1URS0zS0JXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkRKN05FSi1FRUJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlU1VloyOC00OEJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ijg3WVIyVy03QkJXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJIOVVBUy1OWkJXWTctNjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkhIMzJWQi1URUJXWTctMjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5XUEpCVy1INkJXWTctNjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkE3WjlMNy1NWEJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkY4M0Y3VS1GNDlXNzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6Ik1FVlBVTC1QWjJXQTctWjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5LTVM3Ny1NREJXWTctNDUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNHS0dBUy1YU0JXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlA3RUZYOC1WVEJXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlFBV0E1NS1GVUJXWTctMzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNXRzRGWi0zS0JXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZVM0c0US1OTUJXWTctNTU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlLMkcyQS1GNTdXOTctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkFNS0tZRy01RUJXWTctNDVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IlhESFU1Ti1SWEJXWTctODVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6Ilc5VlhUMy1aWDJXQTctWjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkYyVFg5UC1UVUJXWTctNzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjZWVkM4Vy1QUEJXWTctNzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6Ik5QOEpWSC1BQUJXWTctNDUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkVLS0ZBNy0yUUJXWTctQjVZODQ5LU5EVFRETiI7YjoxO3M6Mjc6IkFDNUs2Ri1CQjlXQTctWjVOOFQ5LUREOVQ4TiI7YjoxO3M6Mjc6IjhVNVE0WC1EWUJXWTctNTUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlYWVRHWC1TSjJXQTctWjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjVSNDZETi1BNzlXNTctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IlBCOFlETS1VNEJXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlpQOVhFNC02S0JXWTctNDU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlNZNUFCWS1WOEJXWTctNjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6Ikc5TEpNNS0zMzlXODctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkxFSEpSWi1FMkJXWTctNDU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik1QVjU5Ni1DQkJXWTctMjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjlaVUtSVS0yS0JXWTctNzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ijg4SzM2Qy1CRjhXMzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IlVLS1BGOC1SNkJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjNQR040Ui1WTUJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjJEM0dXQi1YM0JXWTctQjVZODM5LU5EVFRETiI7YjoxO3M6Mjc6IkZRNVZBWS1CVUJXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlJGQ0dZOC1aWkJXWTctODUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkY3WkFYSC1KMkJXWTctMzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkVXSFUyMi1WTkJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjcyQjJIMi1XUkJXWTctQTVaOEE5LVpETlRUTiI7YjoxO3M6Mjc6IjJWU1M1Qi1ZV0JXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjZQR0VOSi1YOEJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZHM1lUQy1VWkJXWTctOTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkVaRExBUy1UVUJXWTctODVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IlRZUkFVTS1LSkJXWTctOTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkdDVTdQWS1XUEJXWTctODVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6Ilo2TFFVUi1GR0JXWTctNzU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNNTlBUQi01OEJXWTctMjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRDWllXQS1SNUJXWTctNTU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJRTEg2UC1RR0JXWTctNDU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkY3ODdNUC1OUUJXWTctMzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjZWM0E0Ui04UkJXWTctQjVZODY5LU5EVFRETiI7YjoxO3M6Mjc6IkRNR0JZRy0zQUJXWTctMjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlM2REJOUi04Q0JXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRRR0Q3Ny03SDlXNzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IlFWUlQ0RC1YV0JXWTctOTU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IldGTjJNNC1BQUJXWTctQjVZODg5LU5EVFRETiI7YjoxO3M6Mjc6IkdTWEFVNy1YRUJXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkRHN1ZERy1BVkJXWTctMzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlJLSk1UQi1TVEJXWTctODU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlpCMktONC1BS0JXWTctMjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkFCRjJTNy0zVEJXWTctQTVaODU5LU5EVFRETiI7YjoxO3M6Mjc6IkFGSFIyUC1HWUJXWTctNDU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJVNTJBSy1ER0JXWTctQTVaODc5LU5EVFRETiI7YjoxO3M6Mjc6IjlHTE5RWC1DVkJXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkE4WEFYNi00TEJXWTctMjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjdaRkxBVy1WQ0JXWTctNjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjdaQTVVVy0zVEJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkFOSENDOS1FR0JXWTctQjVZODM5LU5EVFRETiI7YjoxO3M6Mjc6IldUWEdNVS1MNUJXWTctODU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlVVjQ5Si1RMkJXWTctMzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IllKM1pTUy1QRUJXWTctODU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjY5VFFNUi1MNUJXWTctNDU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkdOM1paRi1GOUJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IlFVQktQTC1HVEJXWTctNzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IllOVkc5Ti1TRkJXWTctNzU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJFWU0zVC1RS0JXWTctNTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkY5SFlTWS1GS0JXWTctNzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkcySlFDVS01WUJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRWVVUzOS1FUkJXWTctNDU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkdEREhURy1WTkJXWTctNTU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkhaRE5FNC1QUkJXWTctNTU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJKOTU0Si1XNDlXNDctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IjVSQVpQWi1IV0JXWTctODU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ijk5SEJDVi1aQkJXWTctMzU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJINVBWVi1SUUJXWTctNjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlhQQlQ3Ry1RRUJXWTctNjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjVYNFIyNC0yUUJXWTctQTVaODM5LU5EVFRETiI7YjoxO3M6Mjc6IjY1WVhCNi1WRUJXWTctNDVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjVTWFVEVy1DS0JXWTctNzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkxROEhaWS1BS0JXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IllaOThCQi02WEJXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlE5QkpaVC1WREJXWTctNzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjVTTkJWVS0yWUJXWTctNjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IllZQkY0Vi1ISkJXWTctNjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBKUkQ4NC1LQUJXWTctMjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlRZNEI4My1TQkJXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkhGMlMzTS1OS0JXWTctMzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6Ikg4RjY4Qy1IQTlXMzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6Iks1N0I5Vy1ZNkJXWTctMjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkxKV1IzRi0yTUJXWTctNDVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IllFWk1IVC1RUDJXQTctWjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlU2N0JKOC1SREJXWTctMjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkhYUU1aOC1QSkJXWTctODU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjdQVktBMi1YU0JXWTctNTU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBES0tOWi1RTkJXWTctODU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkpBN1c4Sy1VREJXWTctMzU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjI1R1E3Ni1TWEJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlM1NE5GSi1CMkJXWTctQTVaODc5LU5EVFRETiI7YjoxO3M6Mjc6IlI3U0FWNy1ZSEJXWTctNjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IlNOWldKVy1STDJXQjctWTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlXRjhHQy1IRkJXWTctMjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJXWlY1VC1YTEJXWTctOTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlhCMkdUOS1FNEJXWTctQjVZODg5LU5EVFRETiI7YjoxO3M6Mjc6IjgzRVdXRS1TNUJXWTctMzU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhWWTVERS1STUJXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJMRFVSSy00WEJXWTctNTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6Ilo0RDdaWS02MkJXWTctMzU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkdRS1dIUC1BUEJXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IllMNURWSC1ROUJXWTctNTU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJBUVMzWS03S0JXWTctMzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkhOTkZUTC1WWkJXWTctOTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRVTkhFOC00RkJXWTctQjVZODU5LU5EVFRETiI7YjoxO3M6Mjc6IlFSS0tHUy02TkJXWTctNjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IllIRE5BNy1HOUJXWTctMjU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJWTjQ1Vi02Q0JXWTctQjVZODQ5LU5EVFRETiI7YjoxO3M6Mjc6IjI2Qko1Mi1DUDhXMjctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkJSVTlTOS1NTkJXWTctNTU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkxQSEVaWC1OQ0JXWTctODVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6Ik1VWkEzUS1VU0JXWTctODU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRRU0hBUy04UUJXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkhTNVE3Vy1ZVkJXWTctODVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkpQRFRaNC1DN0JXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkczV1pLMy1DUEJXWTctNDU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ikc2UTZVQi1NMkJXWTctQjVZODk5LU5EVFRETiI7YjoxO3M6Mjc6IkZFSzRENS1ONDlXODctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkRSOUdFQi1BWUJXWTctMzU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IktGOVdWTi1NU0JXWTctODVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkZOTDdWOS00TEJXWTctMzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjI0SksyQy1ORzlXODctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IlRINVU5NC1NV0JXWTctNDU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZGUE5EUy1aU0JXWTctOTU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkE0QURYRy1LNUJXWTctQjVZOEI5LVlETlRUTiI7YjoxO3M6Mjc6IjJKSDRGNC1NNDhXNzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkFEUjM2TS1VWUJXWTctNDU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlMzNjlGTS03WEJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkUzWFdKRS1MVkJXWTctNjU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjVNTDJVQy1DWUJXWTctMzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlhTUEFGWC1DTUJXWTctNzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlRSSlVFTi1WSkJXWTctOTUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlE1WFc5OC1TNkJXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZDTkYzUi1DUEJXWTctNDU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZGQVBYVC1XQ0JXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkI0RUxLMi1VUkJXWTctMjU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IllBNlhTNy00M0JXWTctMjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZQNlk5Uy1MV0JXWTctODU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjY3TVBKWC1XNkJXWTctNTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkZOUVU3SC1TOEJXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjdOUVM1Si1XOEJXWTctNDU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNRMzlKNC1LVEJXWTctQjVZODM5LU5EVFRETiI7YjoxO3M6Mjc6IlkzUVBFQy1LS0JXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5aNTk3Ry1HTEJXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNaRkM0TC1CR0JXWTctQjVZODc5LU5EVFRETiI7YjoxO3M6Mjc6Ik5XQTJBRS1ZTUJXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhCN1VBVS1MVkJXWTctNDU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlUyQkdTNi1URUJXWTctMzU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlBTkxHOC04QUJXWTctQTVaODU5LU5EVFRETiI7YjoxO3M6Mjc6IjQyQ1lKTC02NkJXWTctQTVaODQ5LU5EVFRETiI7YjoxO3M6Mjc6IlRONFRZVS03TkJXWTctNzU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRTM0pZTi1SWUJXWTctNzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkRWM0JBUS1VOEJXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlJYUVNDOS00NkJXWTctNDU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IllETVlWSi1GOUJXWTctNzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRIV0IzUS1UMkJXWTctMjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBFRjg3RC1NSkJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkNaNDlXOC1ZVEJXWTctNjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlRCWllBSC1QQ0JXWTctNzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJOSExHTS03WUJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkpBSFhQUi0yQ0JXWTctNDU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik1DNjZRSi1ENUJXWTctQTVaODk5LU5EVFRETiI7YjoxO3M6Mjc6IkcyTks4NC1DUkJXWTctQjVZODI5LU5EVFRETiI7YjoxO3M6Mjc6IldHSERMVC1HWUJXWTctNzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkwzQ1pHSi0yTEJXWTctMjU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRVTERUTS1KQ0JXWTctNTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6Ilc5TVIyTi0yUUJXWTctNDUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNMVlk3Ri1LWkJXWTctNjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlAyWFQ2OC1GVEJXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ikg1NFQ2TC1WRkJXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlNGUzNSSy0zV0JXWTctNTU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkxZWEpRTi1ZQzJXQTctWjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjVaVVFLUi1EQ0JXWTctNjU4OE45LVRERFQ5TiI7YjoxO30=" + base64decoded, _ := base64.StdEncoding.DecodeString(str) + out, _ := gophp.Unserialize([]byte(base64decoded)) + + if mout, ok := out.(map[string]interface{}); ok { + + if _, ok := mout[fdata].(map[string]interface{}); ok { + return true + } + return false + } + } + return false +} + +func GetArticaLicense() bool { + //Check Gold License + gold, _ := os.Open("/usr/local/share/artica/.GOLD") + + defer gold.Close() + + scannerGold := bufio.NewScanner(gold) + + for scannerGold.Scan() { + fdata := strings.TrimSpace(scannerGold.Text()) + if len(fdata) == 0 { + return false + } + if fdata == "TRUE" { + return true + } + str := "YTo2MDU6e3M6Mjc6IjJPWlRBWi1INU9HRzItWEQyRFJBLVlNN0lOWSI7YjoxO3M6Mjc6IldVRkhUNi1aT1VYTDktU00xWFFSLU9RTUVVQSI7YjoxO3M6Mjc6IktBRVFFMi1ZRUROUzEtSU5TSU9YLUJYNVdLNCI7YjoxO3M6Mjc6IlBQUEFUSi0ySDlWUkEtQTFMVktGLTlKTVZNMiI7YjoxO3M6Mjc6Ik9PVUk5TS1DN0RFUEEtSEdDRzFELUw2NEhKSSI7YjoxO3M6Mjc6IkNFUExGQi1GTjVMMTMtWFFVM1NBLVVWTEpLSiI7YjoxO3M6Mjc6Ik41NVlIUi1MQUYwQ1QtM0lWSlY5LTM5WllJQyI7YjoxO3M6Mjc6IkIxSklPSy1HWFNMUVMtRUFaMVhHLUxZOFNFUyI7YjoxO3M6Mjc6Ik9IVDZQVS00UElFUFgtOUZDTkJJLTlTREVWRiI7YjoxO3M6Mjc6Ikk5WEE2RC0yTk5BRjItNk1VQ0pPLTU5UFA4TCI7YjoxO3M6Mjc6IkU0TENXWi1WQlRKUVotTkFLWE5TLVNRT1JQMiI7YjoxO3M6Mjc6IlBaWE5LVS1VMkREQ1ktTUZPM0ZVLVFSRzhHTiI7YjoxO3M6Mjc6IlFETDVPRS0yMEhVOVctSlkyV05GLVpFR0JGRiI7YjoxO3M6Mjc6IlRBUk9EQS1TSkdRM0stR1lNRjBULThaSTlPVyI7YjoxO3M6Mjc6IlFBMUJBSy1YRFNWWFItWVUyRDdCLUNYNDdDWSI7YjoxO3M6Mjc6IkUwWlRZTi1PNlJSRkEtVDlNVTlaLUdaOFFBRCI7YjoxO3M6Mjc6IjhUM09OMS0xQTU5Qk0tR1dZRThULVRGR0ZXUyI7YjoxO3M6Mjc6IkZQWFZEMy1ORkMwR1YtVlFJVko5LVlJSFVMSyI7YjoxO3M6Mjc6IkJWUlRTSC1CSVdMVEUtQlJCMFhDLVJIV0RGQiI7YjoxO3M6Mjc6IkwxVlpJMC1VSlRTUU8tT1pFTkFHLVRVUVdPQiI7YjoxO3M6Mjc6IkhaVVFQRS1LV0VPRFctUUlDRE5SLUREV0pYNiI7YjoxO3M6Mjc6IklRRjUyRS1aTUZVOEUtMFdHQzdLLURRMktBQSI7YjoxO3M6Mjc6IjhEU1ZQWi03WTg2RUUtVUgxQTlULTVKSUhLQyI7YjoxO3M6Mjc6IlFRRElLUC1EOE5VSkYtOURGRFpaLUZJUk9QTyI7YjoxO3M6Mjc6IlpaUjg4OC1VRFdHVUgtRDhGTkxaLVNIT0ZHMyI7YjoxO3M6Mjc6IklEUDdTTS1INkJTUEotRlVSUUNMLUhBRjlNNCI7YjoxO3M6Mjc6IlJNR1VCVi1ESlJCTlMtWE1FVDlQLU5ISUlDUyI7YjoxO3M6Mjc6IlZOUFlOVS1RN1ZFWkItME5VOFBULUNaWEJEUCI7YjoxO3M6Mjc6IlBGREk2Uy1PQUVOV1UtNTFaNDFOLTI1TEk5WSI7YjoxO3M6Mjc6IjlLRUlCSC1FUkxIWUQtRkdDWk9VLVRVWEdWWSI7YjoxO3M6Mjc6IjNEOE5INy1IRzNMREktQkdSQU0yLTlGNUw1TiI7YjoxO3M6Mjc6Ikg4SVNVUS04T0dZTjktSUZPVU5OLVpOTVVPVSI7YjoxO3M6Mjc6IlpIVUhIUi00S05MNVotM0lZQVAwLVNCOVJENSI7YjoxO3M6Mjc6IlNWNVNQUi1JOU5VVFAtTkFMRE5JLUJOMkpVTiI7YjoxO3M6Mjc6IktOVU5HNC1OVktXQ04tWVI0WEk5LVZGRjYwRiI7YjoxO3M6Mjc6IllMTEtERi1KT0VYSTAtSUFTQTVaLVk1Q1BFRyI7YjoxO3M6Mjc6IklVWkhCRS1FUUZPUkEtT0xaUUI2LTFCQjNINCI7YjoxO3M6Mjc6Ik4ySzBaTi02SzhLSjAtOUpCRkZWLUY5VVNEVyI7YjoxO3M6Mjc6IlhGOFpROC1PRlpXUVgtV0xRQUZYLVNUVVNXTiI7YjoxO3M6Mjc6IkpTUlo1Vi1FRVBYU1gtMlNIRUhHLU5DOUlITyI7YjoxO3M6Mjc6IkVaUktQVS1FT1FVS0gtU1BTWEIxLVdTS1BQQSI7YjoxO3M6Mjc6IkZQRkUyQS02OUtGNkwtUEdOTFowLUlTMFlJQyI7YjoxO3M6Mjc6IjdCTU5UWC1FRUpWQUwtWUIzM0pLLUtOQlpGMSI7YjoxO3M6Mjc6IkJPOU5JSy1QUUJCNFotRkpLTVE0LVhTSzhERCI7YjoxO3M6Mjc6Ilg2UzZMRC01U1JYWlctUUhBNVFELVNCSDhBWSI7YjoxO3M6Mjc6IkdBVEE0Ui1SWDBJSkItRDFQV0ZFLTJUUDNVUCI7YjoxO3M6Mjc6IkJLMkdaTy1FQ0tXQU8tSFhBWU9RLTZYWUk3NiI7YjoxO3M6Mjc6IlZOVzBJVy1CTUs5VE4tWTkzR0FKLVdQUk1NUyI7YjoxO3M6Mjc6IkxaR0dPMC1COURITVItTTBQUDNCLU1ZRVlIVCI7YjoxO3M6Mjc6IjJVTzVMVC0yNkhXS0stNDVMR0RILU9BVlVWUyI7YjoxO3M6Mjc6Ik81SlAxVS1BRzlNUTQtWjlWRjVCLU1GTEFDUiI7YjoxO3M6Mjc6IjZYRFlDVy1LNFBISUEtNEYwVjVCLThXTVpRUCI7YjoxO3M6Mjc6Ik5UMVFOTC03WlVFTDQtOFBYSVdXLU1EWFRFUiI7YjoxO3M6Mjc6IlFENzhCVS01UklaU04tMTVHTEVCLVZIQVk4SCI7YjoxO3M6Mjc6IlRVSk1LRS1ZQ0hFRUwtRUZMTk1LLVhSVExQVyI7YjoxO3M6Mjc6IldIU0sxTC00VlhSV0YtTElQQ1dNLUFQUlhGUSI7YjoxO3M6Mjc6IkZBM1hQMi1USzgyRFItUFpXWUlELTgwVlA5TSI7YjoxO3M6Mjc6IklDQjZXSC1EU1hNWVEtTzJIMUVaLTVKSFpTViI7YjoxO3M6Mjc6IkhYRDlGRS01WFVBRFItQzROSFRJLUZXTE5aNSI7YjoxO3M6Mjc6IklXRk5FRi1OQUcyUDUtVU0yWFdTLVBFN1RTSyI7YjoxO3M6Mjc6IjE3TFpaQi00NDVYSFMtUElMVlhTLVQ3Nk9CRCI7YjoxO3M6Mjc6Iko2V1JUVy1NWVJOOEgtWFBCVzZNLUdVQ09ZTiI7YjoxO3M6Mjc6IlZCRUtXRi1OM1NEWUEtTjJZMU45LUxVTElOSCI7YjoxO3M6Mjc6IkJQS0RPSC1PRktKOU4tWUpRSE9ZLU1XRVdQWiI7YjoxO3M6Mjc6Ik9CR1o5US1SWUZCUlgtV1FQWEVQLVowRkJGUSI7YjoxO3M6Mjc6IlVZOU9RRS1CTTA0Q0wtVUNYTEhQLTZYQUQ0TiI7YjoxO3M6Mjc6IkFXR1lOUy1VQ1A4SEItQVcxRTJQLU9CR1hMWCI7YjoxO3M6Mjc6IksxQ0U0UC1JUTJGWTEtR1ZIVUJBLTFLTktGNCI7YjoxO3M6Mjc6IkFMU1lIUy1PRjk5TDktR1JWMlYwLVNIMkdaWSI7YjoxO3M6Mjc6IkFZSkM5TC1DT0lKRlItUElFWUpJLVcxVUxFUiI7YjoxO3M6Mjc6IkhXV0hKMS1WREZIUkYtTTJRUU1XLTNUU1ZHVSI7YjoxO3M6Mjc6Ikw5UUhPVS01OTU1OUwtTVhaWVc0LVpLUEpaTiI7YjoxO3M6Mjc6IldXQVhaTS1KM0oyTVEtMlI3SENJLTBDWkpPSyI7YjoxO3M6Mjc6IkRHWU1DMC0wR0dVRkctN0RPQVE0LU1XQ0ZZQyI7YjoxO3M6Mjc6IjlZQUk0Ri1XSUIxMUYtUFBTRENDLVM4N0dEOCI7YjoxO3M6Mjc6IlRIVkZWTS1BS1JXTk4tQkpQME1WLVpQWUVTMCI7YjoxO3M6Mjc6Ik9YRUM1Vi01S1NNRFQtWUpUVTA5LUpRUTcyRiI7YjoxO3M6Mjc6IlU4VFFPVS1ZQjFZM0otVUxSVVNDLVhWSVpCWSI7YjoxO3M6Mjc6IkVRTk9UNC1KS0cySzctRFAzUE5ULTdMUU5STyI7YjoxO3M6Mjc6IlRUVVI2Si1LTzNENDQtSUlXQUE5LVVKS1RNTiI7YjoxO3M6Mjc6IkVBRERUSy1MN0paTlUtWUdKSk1aLThBUDFaTSI7YjoxO3M6Mjc6IlZBUlhSVi05SVNUUTUtQUc0S09CLVgyTkM0QyI7YjoxO3M6Mjc6IlRVREdRMC1XS09TMlMtTEVESFdRLVVOQVdDViI7YjoxO3M6Mjc6IlBKS0c0VC1aUERNSFctV0JDUk9FLUhJSzhWVSI7YjoxO3M6Mjc6IlkyRUhFSi1RQVFRUU0tV1MzQk0yLUxZSFBLSSI7YjoxO3M6Mjc6IkpMRlBaOC1WOUdETkwtVDZJMVg5LUZYWjNZMyI7YjoxO3M6Mjc6IlhHVkNVQy1FTjROSkctMFdaWFVJLVhGSEJCVyI7YjoxO3M6Mjc6IlBEUzFKVS1UTkNXUFAtUU5CQTVMLUI3QktKSSI7YjoxO3M6Mjc6IkFEUDZJRS1XTU5JWUMtTFZSTk5LLTVITVhXTyI7YjoxO3M6Mjc6IkJTT1lNUC1DVDBGWVctSTRNTDVaLVQyQlE4UiI7YjoxO3M6Mjc6IlNBUk9FWi1LSUJUUEctUU5TSTk0LUE4QUNFUiI7YjoxO3M6Mjc6IkhMT1lUUC04VVNVS0stWldZNk1LLUpKOE8yTiI7YjoxO3M6Mjc6Ik80VkFZVy01SlQwSEYtTExVWEhYLVlZQzdKQiI7YjoxO3M6Mjc6IkxQRjNQVy1PNVBCR1UtMFA1RUtOLVhTQ09PWSI7YjoxO3M6Mjc6IlI5UE40Qi1JWFc4RVMtOUJJT0xHLThURFA0UiI7YjoxO3M6Mjc6IjhGVU5DVi1YVlNPMVQtTDNWUUdELUFKUEtQUCI7YjoxO3M6Mjc6IlJFUTJOSi0wWlRXWkwtNk9FUTlJLUpUWUFQRSI7YjoxO3M6Mjc6IkhGU0lBQy1NVElZTFQtWUlGUUlELVVKS1hHMiI7YjoxO3M6Mjc6IkxZQjFXVC1WVzNMNVktUEJMUExJLUdIRUNaUyI7YjoxO3M6Mjc6Ik1JSkdCMS1MTlQyRDItUk0wS0RKLVRaRVFMNyI7YjoxO3M6Mjc6IkJUV0VPTi0zWTNESVctVEdDV1NYLUtPRUhSTCI7YjoxO3M6Mjc6IlRPUEJBSS1QQ0tUUEctN0pSSlVKLUVTQU5HMSI7YjoxO3M6Mjc6IkY0QTNCTS1KTkZPUVktVFhOTUtTLTFMVjlHTiI7YjoxO3M6Mjc6IlM2Uk1QRS1GQ0I2Tk0tUkVDSVoyLTJOSlBNRCI7YjoxO3M6Mjc6IldUSU5YUS1BMVFCS0QtSVVQQ0swLUhTS1dDVyI7YjoxO3M6Mjc6IjJYSUJHMy1TVEJRSjgtTzRVQllYLVlTQ1hHQyI7YjoxO3M6Mjc6Ik4wVVVUNC1DUFgyOUQtT0VNQ0pMLURJOFdPOCI7YjoxO3M6Mjc6IkM5SkJLVS1MSFpXQVQtV0Y0WVhWLTMzNlhNUSI7YjoxO3M6Mjc6IjAyTkFIUS1FWTA3V1YtSk9NVEhULUxKVk1FOSI7YjoxO3M6Mjc6IjBZMUZMMi1NSDZKRUMtSlpDR05ILVpST0VUTiI7YjoxO3M6Mjc6Ikk1Sk5YTi1UQk5ITkstR1JBVDk2LUpRTzZJMSI7YjoxO3M6Mjc6IjU4V0pNTi1US1NUQkotSkdMWkcwLUVPU0NDMyI7YjoxO3M6Mjc6IjhGT0RXTy1SRk5GWDEtSFNLRldYLUZVS05QUCI7YjoxO3M6Mjc6Ik5aQ1pFWi1PRlUzWTItVzYwN0hELVVaUFlGVCI7YjoxO3M6Mjc6IlRBQ0dPSS01VEJQM1ktM1pCUk9PLUdCT1lTUCI7YjoxO3M6Mjc6IlEyUVVSQi1KMERBWUEtMTNWU1lRLTBKMEpVWSI7YjoxO3M6Mjc6IkhYUkNBWS00Q0owVk0tQlJJWVpTLVVWR04wRSI7YjoxO3M6Mjc6IkE4T1ZHNi1QWVNNTEEtTEJSWFZNLUpISTVJOCI7YjoxO3M6Mjc6IkFZOThaRi1WQ1ZEVU8tVjdDREVPLVRTTVZRNyI7YjoxO3M6Mjc6IlJZSkgzWC1IUUMwTU4tWkkyNjBKLUNTSUY2TSI7YjoxO3M6Mjc6IkUxRkNOWC1OV0NSMUQtTFlVNVRGLU8xREJBWCI7YjoxO3M6Mjc6IjRBTVNRVC1YQlowOEYtWU45WkVELTM4UkhIUSI7YjoxO3M6Mjc6Ik9URUZCSy1SSlBLN0wtOEVPRFg0LTlCTVZaMSI7YjoxO3M6Mjc6IkQxOUhYWC1SUEFaWkEtV1dVRUFXLVBTTjhBVyI7YjoxO3M6Mjc6Ik9LT0xLQy05Q0hKTkgtTE1BSEtFLVVISlpTRiI7YjoxO3M6Mjc6IlZXWlpWQy1VS1RaRlAtRU83MFFFLVpHTThDNiI7YjoxO3M6Mjc6IjJBRk4xUy1IREkySU8tSjRGWVhNLVVaMkdMRyI7YjoxO3M6Mjc6IllYRUJFSi1OMEhKVUMtWkJPWllRLVNEOUFXVCI7YjoxO3M6Mjc6IlJTVFlBRS1SUEVJU1MtVE9aQlFPLVBaUFE2QiI7YjoxO3M6Mjc6IjhCQVhGUi1LSVNJQUYtNVFVN0RYLTZPUlBYNCI7YjoxO3M6Mjc6IllWT1hLWi1UQ0EwWFItV0NWUk5YLVVFSVdYWSI7YjoxO3M6Mjc6IjBPQkxSVC1PTExBWkotQTlPMldILVhMQklNTyI7YjoxO3M6Mjc6IkROS1pSQS04MDNLSk4tVVU3WTRYLTg2RUdPNiI7YjoxO3M6Mjc6IkVSUUhZRi1HQkdDTkUtSk5QTEtLLVdWUENCVCI7YjoxO3M6Mjc6IlRHQ0ROSS1aVk1TRDktVzlKQlg0LTYwMEJQTCI7YjoxO3M6Mjc6Ik5FVUxRQi1YUk1VRlAtWEhMRE1JLVlJMFpaSSI7YjoxO3M6Mjc6Ikw1VjcxRy0wSEpUWlMtWUxNOU9OLUFaSExNOSI7YjoxO3M6Mjc6IjVFQ0dNRS1ZTktUQ0ktSkxYR0VILU5WWFJJTSI7YjoxO3M6Mjc6Ik5RQVVUTC1PREtHVTQtRVdQSVcyLUNHRU9YUSI7YjoxO3M6Mjc6IlFOSkRHOC1JRVRTSkotWFUwT1Q3LUJSNVlaRCI7YjoxO3M6Mjc6IlNFRkFIQy1ZUU9EQjAtUVFORUdPLVBTSEdFUyI7YjoxO3M6Mjc6IkxKUjhTUi1CSk1OQUMtWE04V0wzLUNZQ0dGRSI7YjoxO3M6Mjc6IkdPN1JORC1HSkk4RkYtQ1UzMUJQLUpETzdZSiI7YjoxO3M6Mjc6IkxGSkNLQy1USkdKMjAtTDlOSTI3LU9ONFVCSyI7YjoxO3M6Mjc6IkZCV0VCVS1CQ05NUEItQ1RQR0NULVNUUkdPViI7YjoxO3M6Mjc6IkFZVU5TUy1GVFpPQjUtWFJGSzQxLVBGR0ZIVCI7YjoxO3M6Mjc6Ik5MQU40Sy1KWEpEUU4tSU9XMk5ELVExN1JTUCI7YjoxO3M6Mjc6IldCVFhFTC1VTVhMUlotSENLRTdZLVhIMDVDRSI7YjoxO3M6Mjc6IjlIQ1NOMy1GU1M0UVctRElVNUFMLUEzT0dZUiI7YjoxO3M6Mjc6IkRBWEFSWi1UNEJaVVYtUEFNUkpJLVFKUDJPNyI7YjoxO3M6Mjc6IkpYMkNDWS1MNlZGWEEtQUJBS0hQLVpOMVBKQiI7YjoxO3M6Mjc6IktEWVVDTC1WUTJLWjgtM1FQWkhWLUFHV1NaMCI7YjoxO3M6Mjc6IlFYMkxOUi1RRVBHSFgtQ0lIUEdSLVg4WUNVSyI7YjoxO3M6Mjc6IlNLV1Q2TS1JR0FGNUEtTVpFWk1VLVZQU1dJTSI7YjoxO3M6Mjc6IklSQ1hUUC1TWDFCMUotRlhEQVk1LUZQUFJFTSI7YjoxO3M6Mjc6IjRQQ0hMRi1VQk4zSFgtTVNPSlMxLUM4WUNJRCI7YjoxO3M6Mjc6IlJITUhOSC1NRFdZWTMtOVBHSURGLVRLWlNTNyI7YjoxO3M6Mjc6IkxaTlVPOC1WM0lWMTgtUjRURk5GLVk4SlRNQSI7YjoxO3M6Mjc6IlBFUFZYNi1BVFozRUktUzgwNkNPLUpJRzJSSiI7YjoxO3M6Mjc6IkdTT0xLRy1aUFFLVVQtWlA3WllCLUhSUEtDMCI7YjoxO3M6Mjc6IlBTUkJRUS1ZRURZVUotSUdVWkZZLTBIR09VUCI7YjoxO3M6Mjc6IkVQRTlMWi1LSU1ENFotMkJOSFo1LUNEVVdXMSI7YjoxO3M6Mjc6IklaUEZTWS1FTVVDVE4tTzczS0JMLU9FSkFMTiI7YjoxO3M6Mjc6IlBSRUNCMC1CMFBXV0ctUllKUEJILTI1U1pPVSI7YjoxO3M6Mjc6IjVENlpTRy1HWlpTVlktR0ZVRFNNLU5VQjlTRSI7YjoxO3M6Mjc6IlNMVlRNTy1RQkFEMEwtVzJGWDNKLUdWSUZRTCI7YjoxO3M6Mjc6IktSQVlNUC1RUUJFMUMtQktIVVBZLUY3U0hVQSI7YjoxO3M6Mjc6IkxST0NHRC1SRVFLT08tNUozWkVaLU1WWUhEVSI7YjoxO3M6Mjc6IkNRQ0VTTi1STDJVQkotQ1I1U0VJLVdBUFVRWCI7YjoxO3M6Mjc6IjBDWldOSC1EQUJHV0ItRlFTUlAyLUs5UlNHSiI7YjoxO3M6Mjc6Ik1BRVFKRy1PRVBKODgtNUdQSVkyLUI5ODNaRiI7YjoxO3M6Mjc6IlRGVUZJNy1UUE9VNTAtNVNCSjNDLUJZRVlYSCI7YjoxO3M6Mjc6IkhIR1pZNi1DVElMNUstQk9OVkNILTk1WU5BVCI7YjoxO3M6Mjc6IjlFODJLRy04RTBaTUMtODNCV0RBLVY5TVhIQiI7YjoxO3M6Mjc6IkEyOVpCVy1USENDSDEtTFlQTVRJLU01RFBaUiI7YjoxO3M6Mjc6Ikg4SEdBWS1HVVQ3VlQtTE41NDlWLUpTTzVBSiI7YjoxO3M6Mjc6IjlPS0JGSC1KTkxRQ0wtTlVER1c5LUROV0s3VyI7YjoxO3M6Mjc6IllXR1VTVy1KR1hXQkItVDVNOTYxLUtPUlNINCI7YjoxO3M6Mjc6IkhVWUJINi1DUU1MQVMtTTdWTkpULUpVQ1QwMiI7YjoxO3M6Mjc6IkI0MElMUC1GSjVCVFctNUxIMThTLTgyVjFXTCI7YjoxO3M6Mjc6IjdXRjhQVC1URU9JT1ctSVc5NlVSLVI2R1BCNSI7YjoxO3M6Mjc6IkU1U0VEWi01TUNLN1AtS1JRT1hQLVBTQVZONiI7YjoxO3M6Mjc6Ilg2RU1JUy1TTThXSEwtSTJURE5RLVdNV1VPVCI7YjoxO3M6Mjc6Ik9UMzFDTi1BWUFISkYtRUcwUDZPLUJBOVNXWCI7YjoxO3M6Mjc6IloxQVdDQi0xUzZNQVYtQkVJS1ZHLUlETUNUUyI7YjoxO3M6Mjc6IkdNWlVaWC1XR1VJR1MtRlJPSDBLLTJRRzYwTyI7YjoxO3M6Mjc6IlVETVRORi1LUTNRVlgtRUJKNlFOLVhZNlA0RSI7YjoxO3M6Mjc6Ik5HUE1HNS00VFpaQ0UtRUlJMUVQLUZVNFlVQyI7YjoxO3M6Mjc6IjI4VUlaRC00SEdBTlctUFVTVUVRLUxRVFhSMCI7YjoxO3M6Mjc6IkJRV1lMVi1QSkJBNU0tSEdWTVZKLVZOTkdQTyI7YjoxO3M6Mjc6IkNaUklFTi01Vk1LRUQtNkxPTU01LVpPWUE4NiI7YjoxO3M6Mjc6IjNNVVhQMC1KR1pISVUtVEJMWENaLTdYSUJBVyI7YjoxO3M6Mjc6Ik02TElGRi1SWElGMVAtSFE2VVFCLTQ2STRDTSI7YjoxO3M6Mjc6IkNFWUpURS1ORkFWU1ctQUNQR1VJLVVTUlpTOSI7YjoxO3M6Mjc6IjdaT0pZQi1HOE5VNVAtRVlFNlVBLUFDRjJTRyI7YjoxO3M6Mjc6IlhSTEhSTS1PT01JUEYtVVQ4UDdLLVJFNkgzVCI7YjoxO3M6Mjc6IkpOS1NHQS1XQ0VJV00tR05JV1JNLVZMUDY4NSI7YjoxO3M6Mjc6IlgwV0dFVi1WSUNFS0UtTkRPQkpSLUxLUFFTTiI7YjoxO3M6Mjc6Ik5BQzFEOS1QQlJXTEctOTlZU1lCLVJVQ09XSSI7YjoxO3M6Mjc6IllXV1FGTi1RSlVMQlYtRlVUNlBQLUFYTlRFUyI7YjoxO3M6Mjc6IkhQVlVURC1XVTk3VEotTU1VUk1aLUZLOE1TVSI7YjoxO3M6Mjc6IkdQOFRSVC1aU1JENUUtVURBVVRMLVU4NlBZUiI7YjoxO3M6Mjc6IkdVWVdXRi0wRDE0WDktNUNCVVNaLVZHWVlOSSI7YjoxO3M6Mjc6Ik5MTUlUNC1ONlE3RTUtNkZLWTRFLThMWTFLMSI7YjoxO3M6Mjc6IllCSUVNUy1LSDNPUFUtVlFSUVJHLVlSOFY0RiI7YjoxO3M6Mjc6IlBDRkZYVi1SUUJXWTctODU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlIVjJRQS1BV0JXWTctMzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlNEOERIVy1RSEJXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNHUFdNSC1WUUJXWTctNzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRYUUpOWS1QNkJXWTctNzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IlJEUjhWTC01TUJXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IktZOUVDVy1ZN0JXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlJTRDdNVS1MM0JXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6Iko0QUZLRC1HWkJXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ijc0UTdNSi1KVEJXWTctMzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJVRENRQS1OWkJXWTctNjVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjdMNzJXSy1MR0JXWTctMjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJVTUE4WC1VWUJXWTctNzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjdHVVUzOC1aM0JXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5RS0FVSC0yTEJXWTctNDU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjdRNExVNC1LQkJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJKOTNBQy1VMzhXODctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IjhMQ1Q1Ni1IWEJXWTctMzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IlpaQ0ZOUC1QNkJXWTctNzU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjkzVUY1OC1FV0JXWTctQjVZODY5LU5EVFRETiI7YjoxO3M6Mjc6IjlXSjgySy1VUUJXWTctNDU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZVRTU5NS00QTlXMjctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IjhHRlM1Qi04NTlXNjctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkJYWTJUTi0zTUJXWTctNTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZWTlFRSC1HSEJXWTctODU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjQ0VVM4RS1UUEJXWTctNDUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlE4UEZNSi0zMkJXWTctMjVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IlE2SE1NNS1XTEJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjhZWFZKNi02UEJXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5YVUFRSy1BVkJXWTctODUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlFEMlQ2US1GQUJXWTctMjU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZQWEdaVC1FRUJXWTctOTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IldVRFhMRC1SRkJXWTctODU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlpQQ001RC1DQUJXWTctMzU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZEOFpQMy1DQ0JXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlM3TTJQTS0zNEJXWTctQjVZODM5LU5EVFRETiI7YjoxO3M6Mjc6IlJCM0czNy1ZVEJXWTctMzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IlRZVVg1Ti1CVEJXWTctOTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ijk5SzhKVS1EOEJXWTctQjVZODY5LU5EVFRETiI7YjoxO3M6Mjc6IllGMktBNC1LVkJXWTctMzU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlI2R1dZQS1KU0JXWTctNzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkVQR1VKVi1DRUJXWTctNjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IktWSllLQi1ZOUJXWTctNzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlpTNjQySy01V0JXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZSSERZTC1NM0JXWTctNTUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkhYVjMyWC1IUUJXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjI5Q0gzVy1OREJXWTctQjVZOEI5LVlETlRUTiI7YjoxO3M6Mjc6IkZITjRLUC02SEJXWTctMjU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZQNVZGVy1aWDJXQTctWjU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRUNDRRSi1FMkJXWTctQTVaODI5LU5EVFRETiI7YjoxO3M6Mjc6Ilg0WE45Mi0zTEJXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRNRURUSi1TR0JXWTctNDU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkE4VzNYRi1VR0JXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhGNEY2VS1KN0JXWTctQTVaODQ5LU5EVFRETiI7YjoxO3M6Mjc6IjlXWEc0TS1OUkJXWTctNjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhXNkE3Vy0zVUJXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkhDTUc3Qy1VSEJXWTctMzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlMzWlhXVi1NVjJXQjctWTU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhQR1FQSi1BTUJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkozWlQ4Uy1HOUJXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlpBQlBCRi1XSkJXWTctNTU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkczTE5MUC1YRkJXWTctNTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkVONUdSTi1MWkJXWTctNjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlJMSzc1Qi00V0JXWTctMjU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ilk5QkhMSi1WSkJXWTctNjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IlA2U04yQy1CWUJXWTctNDVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjNRNFZTRC1UOEJXWTctNDUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IllaV0RQVi04R0JXWTctOTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkdaRDNIMi1ESEJXWTctQjVZODY5LU5EVFRETiI7YjoxO3M6Mjc6IlNCU0o5WC1SWUJXWTctODU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5CNjJQVy1ZUkJXWTctNjVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjI5Q1JDRS1XV0JXWTctNDVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IlozSDdBOC0yNThXNzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IllaNEg3My0zOUJXWTctQjVZODI5LU5EVFRETiI7YjoxO3M6Mjc6IlpMVkVDOS02REJXWTctNDVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjhQVEQyNS1EOEJXWTctQTVaODM5LU5EVFRETiI7YjoxO3M6Mjc6IkQyVTVKVi0yTEJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IllKWE1FUy1QRkJXWTctOTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkNVVzlBTi1FV0JXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJNWkpUOC1UUkJXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IlRFRTQ2TS1NTUJXWTctMzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjZGWFBaVi1IOUJXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjNOOEhRRC1GSkJXWTctMjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlE3UkhUSi03SEJXWTctNDU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlVXSkc2WS1UVUJXWTctOTU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IldCWk5VUi1TQUJXWTctOTU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjdZS1RCRC1ESEJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjZBRlBIRC1RTEJXWTctMzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlFGRVREOC1UUUJXWTctNjVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjJLTVZUNS1XV0JXWTctNzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkVUWkdRTi1MR0JXWTctODVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjQ3M0FVUi1LQkJXWTctQjVZODI5LU5EVFRETiI7YjoxO3M6Mjc6IjZFUzVINy1ZSkJXWTctMzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkJNMlozUy05UkJXWTctMzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZWVVhRWi1aNTJXQjctWTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjVVOEozQS0zSzlXODctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IjlOVU45Ny1BNUJXWTctQjVZODY5LU5EVFRETiI7YjoxO3M6Mjc6IlNITkhFTi01VkJXWTctNTU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkNKWkxISy0zV0JXWTctNTU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkM4REUyUi02VkJXWTctQjVZODM5LU5EVFRETiI7YjoxO3M6Mjc6IkRWUTM5VS1UTEJXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IllFNEgzQi1TQ0JXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkpWUjJLQS1MMkJXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBYNUhHSi1EUEJXWTctNTUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjZXTUhIRi1QS0JXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlQ0WFdUUi1SUDJXQTctWjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZRV1YyOC1ITUJXWTctNTUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkpXNVFHRS03UEJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhIUThYSi03R0JXWTctMzU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ilc3UDdFQi1DQ0JXWTctMjVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjRUVEJIVi05UUJXWTctNTU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IloyQUgyRy1CWEJXWTctMjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkFHM05HNS1RTEJXWTctMjVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkxHMjU4Ui1DUkJXWTctQjVZODg5LU5EVFRETiI7YjoxO3M6Mjc6IktIQUROQy1KM0JXWTctQjVZODc5LU5EVFRETiI7YjoxO3M6Mjc6IlBZQVAzNi1FV0JXWTctNDU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkFYUTNOOC1NTEJXWTctNDU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik41S1JEUi1CWkJXWTctNjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjZKODZRTS00QUJXWTctQTVaOEI5LVlETlRUTiI7YjoxO3M6Mjc6IkdHTkVZWC0zWkJXWTctNzU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ilo3QTdFUS00VkJXWTctMzU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ilo4Q1BWVC1TQ0JXWTctODVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IlpCVDlXQi1ERkJXWTctNTU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlSMllLUi00WUJXWTctNTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRTV1YyVi05RkJXWTctNTUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlRCOVM4Ry1GMkJXWTctQjVZODg5LU5EVFRETiI7YjoxO3M6Mjc6IkRIODJQTC0zWUJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJXRjRWMi1IWUJXWTctNDU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjZQU1E4Si1ONkJXWTctNDVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjVLNFNaRS1MS0JXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjVDTUtMUy0yREJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJTTlFQSC1MQ0JXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlKU1Q2QS1LNEJXWTctMjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkU0TVVUNy0zRUJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjZLUDRRUi1QTUJXWTctNTU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNUVFFXRi00RkJXWTctNTUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlpIRFlOOS0zQUJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ilg2WFUzRC1DVEJXWTctNTU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5HN0RZVy1KWEJXWTctNzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5NNTM1WS1LS0JXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlA0VUhSWS1FUUJXWTctNzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkxZUDJKVS1EUkJXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IksyVjVFVS03UkJXWTctMzU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlgyWUdRQy1HSkJXWTctNTU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlY2Mk04Ry1MNEJXWTctQjVZOEE5LVpETlRUTiI7YjoxO3M6Mjc6IjZLU05IWi1GVkJXWTctNzU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlRBR1NTNS1aN0JXWTctNTU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlhCRldMVC1IWEJXWTctOTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkhaREVQUy1LQkJXWTctNjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlVIS0o5UC1TUUJXWTctNzU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlFLRFlLSi1IV0JXWTctODVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6Iko1UlJZUy1aMkJXWTctNzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlQ3M1o3My1OR0JXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ilk1NjRHSC04TkJXWTctQjVZODM5LU5EVFRETiI7YjoxO3M6Mjc6IkJBNUFFMy1ZSkJXWTctQTVaODY5LU5EVFRETiI7YjoxO3M6Mjc6IkpYM1dKWS02QkJXWTctNTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlVWNVdVQS1QWUJXWTctOTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZVRDI0Mi02SDhXOTctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkhBRURLNC0zRDlXNDctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IlcyUU5SUS1VOEJXWTctNzU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkFRQks0OS1IV0JXWTctMjU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBEM0szRy1ZUEJXWTctMzU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5OOEFEUy1EWkJXWTctNTUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJITFFWSy1HU0JXWTctNjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjdUUkpYWS1SWDJXQTctWjU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBESEFMUy1XVEJXWTctNzU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik01WENHUS01R0JXWTctMzU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNNRFBSSC0yWkJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlUyQzhMVi1BOUJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IllQTUZKUC02N0JXWTctNTUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjU1RTk3WC1HWUJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IldNRzVUSi02WkJXWTctNjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5LQjVKRy1DM0JXWTctQTVaODk5LU5EVFRETiI7YjoxO3M6Mjc6IlU0SlZVVy1aOUJXWTctOTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjNKVkxLTi1ZUUJXWTctNzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkhEV0RTNC02SEJXWTctMzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkVHQlY2Ry1HRUJXWTctMjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkRSREdRTi1NMkJXWTctNDUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlXNTY2OS1KTEJXWTctQTVaODc5LU5EVFRETiI7YjoxO3M6Mjc6IjVQVEc1RS1WV0JXWTctNTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZUUzhQRy1ZQUJXWTctNjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJINkhMRS0zSEJXWTctQTVaODY5LU5EVFRETiI7YjoxO3M6Mjc6IkZXTE5VMi1YUUJXWTctODUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ilc2SEI0QS0yQjlXMzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkRZTFNONC1BVEJXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJCUjlYTC1BREJXWTctMzU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBIWVRBQi1RM0JXWTctNTU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ijk1VUQ0OS1WNEJXWTctQTVaODU5LU5EVFRETiI7YjoxO3M6Mjc6IlVZNjdXTS00U0JXWTctNjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6Iks5NEZLVi0yV0JXWTctMzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5ORzhGVi1BQ0JXWTctMzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkNLUVJaRC1NRkJXWTctNzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkxEQVBONS1YWkJXWTctNjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlE5Qk5ZNC1FVkJXWTctNTUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhTNTRDWi0zTEJXWTctQjVZODY5LU5EVFRETiI7YjoxO3M6Mjc6IlA0WkxWNC1IOUJXWTctNDU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlJGVkhMNi04QUJXWTctMzU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjQ5R0U1Qy1SOTlXNjctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6Ilo4RVNUVC03RkJXWTctNjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlNXVTZZQy02WkJXWTctODUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJBQUVCWi1TWUJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBFNUpOTi01RUJXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlJEOFZRMy1ISkJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkdHMzhFNi1QOTlXNzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IlE4TkNFOC1ESkJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhISk1URS0zS0JXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkRKN05FSi1FRUJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlU1VloyOC00OEJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ijg3WVIyVy03QkJXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJIOVVBUy1OWkJXWTctNjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkhIMzJWQi1URUJXWTctMjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5XUEpCVy1INkJXWTctNjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkE3WjlMNy1NWEJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkY4M0Y3VS1GNDlXNzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6Ik1FVlBVTC1QWjJXQTctWjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5LTVM3Ny1NREJXWTctNDUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNHS0dBUy1YU0JXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlA3RUZYOC1WVEJXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlFBV0E1NS1GVUJXWTctMzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNXRzRGWi0zS0JXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZVM0c0US1OTUJXWTctNTU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlLMkcyQS1GNTdXOTctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkFNS0tZRy01RUJXWTctNDVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IlhESFU1Ti1SWEJXWTctODVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6Ilc5VlhUMy1aWDJXQTctWjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkYyVFg5UC1UVUJXWTctNzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjZWVkM4Vy1QUEJXWTctNzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6Ik5QOEpWSC1BQUJXWTctNDUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkVLS0ZBNy0yUUJXWTctQjVZODQ5LU5EVFRETiI7YjoxO3M6Mjc6IkFDNUs2Ri1CQjlXQTctWjVOOFQ5LUREOVQ4TiI7YjoxO3M6Mjc6IjhVNVE0WC1EWUJXWTctNTUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlYWVRHWC1TSjJXQTctWjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjVSNDZETi1BNzlXNTctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IlBCOFlETS1VNEJXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlpQOVhFNC02S0JXWTctNDU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlNZNUFCWS1WOEJXWTctNjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6Ikc5TEpNNS0zMzlXODctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkxFSEpSWi1FMkJXWTctNDU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik1QVjU5Ni1DQkJXWTctMjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjlaVUtSVS0yS0JXWTctNzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ijg4SzM2Qy1CRjhXMzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IlVLS1BGOC1SNkJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjNQR040Ui1WTUJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjJEM0dXQi1YM0JXWTctQjVZODM5LU5EVFRETiI7YjoxO3M6Mjc6IkZRNVZBWS1CVUJXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlJGQ0dZOC1aWkJXWTctODUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkY3WkFYSC1KMkJXWTctMzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkVXSFUyMi1WTkJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjcyQjJIMi1XUkJXWTctQTVaOEE5LVpETlRUTiI7YjoxO3M6Mjc6IjJWU1M1Qi1ZV0JXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjZQR0VOSi1YOEJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZHM1lUQy1VWkJXWTctOTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkVaRExBUy1UVUJXWTctODVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IlRZUkFVTS1LSkJXWTctOTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkdDVTdQWS1XUEJXWTctODVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6Ilo2TFFVUi1GR0JXWTctNzU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNNTlBUQi01OEJXWTctMjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRDWllXQS1SNUJXWTctNTU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJRTEg2UC1RR0JXWTctNDU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkY3ODdNUC1OUUJXWTctMzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjZWM0E0Ui04UkJXWTctQjVZODY5LU5EVFRETiI7YjoxO3M6Mjc6IkRNR0JZRy0zQUJXWTctMjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlM2REJOUi04Q0JXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRRR0Q3Ny03SDlXNzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IlFWUlQ0RC1YV0JXWTctOTU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IldGTjJNNC1BQUJXWTctQjVZODg5LU5EVFRETiI7YjoxO3M6Mjc6IkdTWEFVNy1YRUJXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkRHN1ZERy1BVkJXWTctMzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlJLSk1UQi1TVEJXWTctODU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlpCMktONC1BS0JXWTctMjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkFCRjJTNy0zVEJXWTctQTVaODU5LU5EVFRETiI7YjoxO3M6Mjc6IkFGSFIyUC1HWUJXWTctNDU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJVNTJBSy1ER0JXWTctQTVaODc5LU5EVFRETiI7YjoxO3M6Mjc6IjlHTE5RWC1DVkJXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkE4WEFYNi00TEJXWTctMjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjdaRkxBVy1WQ0JXWTctNjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjdaQTVVVy0zVEJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkFOSENDOS1FR0JXWTctQjVZODM5LU5EVFRETiI7YjoxO3M6Mjc6IldUWEdNVS1MNUJXWTctODU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlVVjQ5Si1RMkJXWTctMzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IllKM1pTUy1QRUJXWTctODU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjY5VFFNUi1MNUJXWTctNDU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkdOM1paRi1GOUJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IlFVQktQTC1HVEJXWTctNzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IllOVkc5Ti1TRkJXWTctNzU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJFWU0zVC1RS0JXWTctNTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkY5SFlTWS1GS0JXWTctNzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkcySlFDVS01WUJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRWVVUzOS1FUkJXWTctNDU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkdEREhURy1WTkJXWTctNTU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkhaRE5FNC1QUkJXWTctNTU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJKOTU0Si1XNDlXNDctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IjVSQVpQWi1IV0JXWTctODU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ijk5SEJDVi1aQkJXWTctMzU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJINVBWVi1SUUJXWTctNjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlhQQlQ3Ry1RRUJXWTctNjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjVYNFIyNC0yUUJXWTctQTVaODM5LU5EVFRETiI7YjoxO3M6Mjc6IjY1WVhCNi1WRUJXWTctNDVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjVTWFVEVy1DS0JXWTctNzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkxROEhaWS1BS0JXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IllaOThCQi02WEJXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlE5QkpaVC1WREJXWTctNzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjVTTkJWVS0yWUJXWTctNjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IllZQkY0Vi1ISkJXWTctNjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBKUkQ4NC1LQUJXWTctMjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlRZNEI4My1TQkJXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkhGMlMzTS1OS0JXWTctMzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6Ikg4RjY4Qy1IQTlXMzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6Iks1N0I5Vy1ZNkJXWTctMjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkxKV1IzRi0yTUJXWTctNDVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IllFWk1IVC1RUDJXQTctWjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlU2N0JKOC1SREJXWTctMjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkhYUU1aOC1QSkJXWTctODU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjdQVktBMi1YU0JXWTctNTU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBES0tOWi1RTkJXWTctODU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkpBN1c4Sy1VREJXWTctMzU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjI1R1E3Ni1TWEJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlM1NE5GSi1CMkJXWTctQTVaODc5LU5EVFRETiI7YjoxO3M6Mjc6IlI3U0FWNy1ZSEJXWTctNjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IlNOWldKVy1STDJXQjctWTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlXRjhHQy1IRkJXWTctMjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJXWlY1VC1YTEJXWTctOTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlhCMkdUOS1FNEJXWTctQjVZODg5LU5EVFRETiI7YjoxO3M6Mjc6IjgzRVdXRS1TNUJXWTctMzU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhWWTVERS1STUJXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJMRFVSSy00WEJXWTctNTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6Ilo0RDdaWS02MkJXWTctMzU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkdRS1dIUC1BUEJXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IllMNURWSC1ROUJXWTctNTU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJBUVMzWS03S0JXWTctMzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkhOTkZUTC1WWkJXWTctOTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRVTkhFOC00RkJXWTctQjVZODU5LU5EVFRETiI7YjoxO3M6Mjc6IlFSS0tHUy02TkJXWTctNjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IllIRE5BNy1HOUJXWTctMjU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJWTjQ1Vi02Q0JXWTctQjVZODQ5LU5EVFRETiI7YjoxO3M6Mjc6IjI2Qko1Mi1DUDhXMjctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkJSVTlTOS1NTkJXWTctNTU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkxQSEVaWC1OQ0JXWTctODVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6Ik1VWkEzUS1VU0JXWTctODU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRRU0hBUy04UUJXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkhTNVE3Vy1ZVkJXWTctODVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkpQRFRaNC1DN0JXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkczV1pLMy1DUEJXWTctNDU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ikc2UTZVQi1NMkJXWTctQjVZODk5LU5EVFRETiI7YjoxO3M6Mjc6IkZFSzRENS1ONDlXODctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkRSOUdFQi1BWUJXWTctMzU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IktGOVdWTi1NU0JXWTctODVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkZOTDdWOS00TEJXWTctMzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjI0SksyQy1ORzlXODctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IlRINVU5NC1NV0JXWTctNDU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZGUE5EUy1aU0JXWTctOTU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkE0QURYRy1LNUJXWTctQjVZOEI5LVlETlRUTiI7YjoxO3M6Mjc6IjJKSDRGNC1NNDhXNzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkFEUjM2TS1VWUJXWTctNDU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlMzNjlGTS03WEJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkUzWFdKRS1MVkJXWTctNjU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjVNTDJVQy1DWUJXWTctMzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlhTUEFGWC1DTUJXWTctNzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlRSSlVFTi1WSkJXWTctOTUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlE1WFc5OC1TNkJXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZDTkYzUi1DUEJXWTctNDU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZGQVBYVC1XQ0JXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkI0RUxLMi1VUkJXWTctMjU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IllBNlhTNy00M0JXWTctMjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZQNlk5Uy1MV0JXWTctODU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjY3TVBKWC1XNkJXWTctNTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkZOUVU3SC1TOEJXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjdOUVM1Si1XOEJXWTctNDU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNRMzlKNC1LVEJXWTctQjVZODM5LU5EVFRETiI7YjoxO3M6Mjc6IlkzUVBFQy1LS0JXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5aNTk3Ry1HTEJXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNaRkM0TC1CR0JXWTctQjVZODc5LU5EVFRETiI7YjoxO3M6Mjc6Ik5XQTJBRS1ZTUJXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhCN1VBVS1MVkJXWTctNDU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlUyQkdTNi1URUJXWTctMzU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlBTkxHOC04QUJXWTctQTVaODU5LU5EVFRETiI7YjoxO3M6Mjc6IjQyQ1lKTC02NkJXWTctQTVaODQ5LU5EVFRETiI7YjoxO3M6Mjc6IlRONFRZVS03TkJXWTctNzU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRTM0pZTi1SWUJXWTctNzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkRWM0JBUS1VOEJXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlJYUVNDOS00NkJXWTctNDU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IllETVlWSi1GOUJXWTctNzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRIV0IzUS1UMkJXWTctMjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBFRjg3RC1NSkJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkNaNDlXOC1ZVEJXWTctNjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlRCWllBSC1QQ0JXWTctNzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJOSExHTS03WUJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkpBSFhQUi0yQ0JXWTctNDU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik1DNjZRSi1ENUJXWTctQTVaODk5LU5EVFRETiI7YjoxO3M6Mjc6IkcyTks4NC1DUkJXWTctQjVZODI5LU5EVFRETiI7YjoxO3M6Mjc6IldHSERMVC1HWUJXWTctNzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkwzQ1pHSi0yTEJXWTctMjU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRVTERUTS1KQ0JXWTctNTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6Ilc5TVIyTi0yUUJXWTctNDUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNMVlk3Ri1LWkJXWTctNjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlAyWFQ2OC1GVEJXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ikg1NFQ2TC1WRkJXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlNGUzNSSy0zV0JXWTctNTU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkxZWEpRTi1ZQzJXQTctWjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjVaVVFLUi1EQ0JXWTctNjU4OE45LVRERFQ5TiI7YjoxO30=" + base64decoded, _ := base64.StdEncoding.DecodeString(str) + out, _ := gophp.Unserialize([]byte(base64decoded)) + + if mout, ok := out.(map[string]interface{}); ok { + + if _, ok := mout[fdata].(map[string]interface{}); ok { + return true + } + return false + } + + } + + //Check Corporate License + isArticaLicense := GetSocketInfoInt("isArticaLicense") + if isArticaLicense == 1 { + return true + } + corp, _ := os.Open("/etc/artica-postfix/settings/Daemons/CORP_LICENSE") + + defer corp.Close() + + scannerCorp := bufio.NewScanner(corp) + + for scannerCorp.Scan() { + fdata := strings.TrimSpace(scannerCorp.Text()) + if len(fdata) == 0 { + return false + } + + if fdata == "VFJVRQ==" { + return true + } + return false + + } + + return false +} diff --git a/handlers/loggin.go b/handlers/loggin.go new file mode 100755 index 0000000..adc5a39 --- /dev/null +++ b/handlers/loggin.go @@ -0,0 +1,68 @@ +package handlers + +import ( + "fmt" + "github.com/leekchan/timeutil" + "github.com/op/go-logging" + "math" + "os" + "strconv" + "time" +) + +var logstats = logging.MustGetLogger("ksrn-stats") + +func IsInt(s string) bool { + _, err := strconv.Atoi(s) + return err == nil +} + +func TimeTrack(start time.Time) string { + //elapsed := time.Since(start) + //log.Printf("%s took %dms", name, elapsed.Nanoseconds()/1000) + return fmt.Sprintf("took %d μs", time.Since(start).Microseconds()) +} + +func GetTimeDelta(delta time.Duration, format int) string { + if delta == 0 { + delta = 1 + } + d := time.Minute * delta + deltaSeconds := float64(d / time.Second) //delta time in seconds + t := time.Now() + s := daySeconds(t) // seconds + ms := t.Nanosecond() / 1000 //Microseconds + r := math.Floor((float64(s)+deltaSeconds/2)/deltaSeconds) * deltaSeconds //rounding + rs := int(r) //rounding in seconds + o := rs - s + td := timeutil.Timedelta{Days: 0, Seconds: time.Duration(o), Microseconds: time.Duration(-ms)} + result := t.Add(td.Duration()) + var str string + if format == 1 { + str = timeutil.Strftime(&result, "%Y%m%d%H%M") + } + if format == 2 { + str = timeutil.Strftime(&result, "%Y-%m-%d %H:%M:%S") + } + + return str +} + +func daySeconds(t time.Time) int { + year, month, day := t.Date() + t2 := time.Date(year, month, day, 0, 0, 0, 0, t.Location()) + return int(t.Sub(t2).Seconds()) +} + +func Logfile(filename, data string) { + f, err := os.OpenFile(filename, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) + if err != nil { + logstats.Fatal(err) + } + defer f.Close() + backend := logging.NewLogBackend(f, "", 0) + logging.SetBackend(backend) + logstats.Info(data) + //mylog.SetOutput(f) + //mylog.Println(data) +} diff --git a/handlers/tokens.go b/handlers/tokens.go new file mode 100755 index 0000000..2e8d650 --- /dev/null +++ b/handlers/tokens.go @@ -0,0 +1,94 @@ +package handlers + +import ( + "bytes" + "errors" + "log" + "os" + "strconv" +) + +func GetSocketInfoInt(token string) int { + + if _, err := os.Stat("/etc/artica-postfix/settings/Daemons/" + token); errors.Is(err, os.ErrNotExist) { + if isDebug { + log.Printf("Token %s dont exist %s", token, err) + } + return 0 + } + tk, err := os.ReadFile("/etc/artica-postfix/settings/Daemons/" + token) + if err != nil { + if isDebug { + log.Printf("Failed read file %s %s %s", token, tk, err) + } + return 0 + } + tk = bytes.TrimSuffix(tk, []byte("\n")) + tk = bytes.TrimSpace(tk) + tkint, err := strconv.Atoi(string(tk)) + if err == nil { + if isDebug { + log.Printf("Init converted file %s val %s => %d", token, tk, tkint) + } + return tkint + } else { + if isDebug { + log.Printf("Failed to convert to init token %s => %d", token, tkint) + } + return 0 + } + + return 0 +} + +func GetSocketInfoBool(token string) bool { + if _, err := os.Stat("/etc/artica-postfix/settings/Daemons/" + token); errors.Is(err, os.ErrNotExist) { + if isDebug { + log.Printf("Token %s dont exist %s", token, err) + } + return false + } + tk, err := os.ReadFile("/etc/artica-postfix/settings/Daemons/" + token) + if err != nil { + if isDebug { + log.Printf("Failed read file %s %s %s", token, tk, err) + } + return false + } + tk = bytes.TrimSuffix(tk, []byte("\n")) + tk = bytes.TrimSpace(tk) + boolValue, err := strconv.ParseBool(string(tk)) + if err == nil { + if isDebug { + log.Printf("Bool converted file %s val %s => %t", token, tk, boolValue) + } + return boolValue + } else { + if isDebug { + log.Printf("Failed to convert to bool token %s => %s", token, err) + } + return false + } + + return false +} + +func GetSocketInfoString(token string) string { + if _, err := os.Stat("/etc/artica-postfix/settings/Daemons/" + token); errors.Is(err, os.ErrNotExist) { + if isDebug { + log.Printf("Token %s dont exist %s", token, err) + } + return "" + } + tk, err := os.ReadFile("/etc/artica-postfix/settings/Daemons/" + token) + if err != nil { + if isDebug { + log.Printf("Failed read file %s %s %s", token, tk, err) + } + return "" + } + if isDebug { + log.Printf("Token converted to string correctly %s val %s", token, tk) + } + return string(tk) +} diff --git a/server/.idea/.gitignore b/server/.idea/.gitignore new file mode 100755 index 0000000..1c2fda5 --- /dev/null +++ b/server/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/server/.idea/deployment.xml b/server/.idea/deployment.xml new file mode 100755 index 0000000..498c995 --- /dev/null +++ b/server/.idea/deployment.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/server/.idea/modules.xml b/server/.idea/modules.xml new file mode 100755 index 0000000..239ce8b --- /dev/null +++ b/server/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/server/.idea/server.iml b/server/.idea/server.iml new file mode 100755 index 0000000..338a266 --- /dev/null +++ b/server/.idea/server.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/server/.idea/sshConfigs.xml b/server/.idea/sshConfigs.xml new file mode 100755 index 0000000..45fa650 --- /dev/null +++ b/server/.idea/sshConfigs.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/server/.idea/vcs.xml b/server/.idea/vcs.xml new file mode 100755 index 0000000..6d397df --- /dev/null +++ b/server/.idea/vcs.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/server/.idea/webServers.xml b/server/.idea/webServers.xml new file mode 100755 index 0000000..7456008 --- /dev/null +++ b/server/.idea/webServers.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/server/bin/go-shield-server b/server/bin/go-shield-server new file mode 100755 index 0000000..2ee92e9 Binary files /dev/null and b/server/bin/go-shield-server differ diff --git a/server/categorization/categorization.go b/server/categorization/categorization.go new file mode 100755 index 0000000..705e864 --- /dev/null +++ b/server/categorization/categorization.go @@ -0,0 +1,7399 @@ +package categorization + +import ( + "bufio" + "context" + "crypto/aes" + "crypto/cipher" + "crypto/md5" + b64 "encoding/base64" + "encoding/hex" + "errors" + "fmt" + "github.com/d3mondev/resolvermt" + "github.com/go-redis/redis/v8" + "github.com/techoner/gophp" + "io" + "log" + "net" + "net/netip" + "os" + "regexp" + "server/internal" + "sort" + "strconv" + "strings" + "time" +) + +var ctx = context.Background() + +type Categorie struct { + ID int + Name string +} + +var ( + SelfLocalWhiteBlack = make(map[string]bool) + SelfKSRNCategoryWhite int + isDebugCategorization bool + SelfDns1 = "8.8.8.8" + SelfDns2 = "" + SelfTrackersDst []string + SelfWhitelistDst []string + SelfWhitelistDstrx []string + SelfWhitelistSrc []string + SelfWhitelistArp []string + SelfBlacklistDst []string + SelfSrnWhite []string + SelfAdvertBase []string + SelfMac string + SelfCacheTime int + SelfStripaddr string + SelfKsrnDisableGoogleAdServices bool + SelfCategorieName string +) + +var ( + defs_internal = []string{"169.254.0.0/16"} + defs_ovh = []string{ + "147.135.0.0/16", + "103.5.12.0/22", + "107.189.64.0/18", + "135.148.0.0/17", + "137.74.0.0/16", + "139.99.0.0/17", + "139.99.128.0/17", + "142.4.192.0/19", + "142.44.128.0/17", + "144.2.32.0/19", + "144.217.0.0/16", + "145.239.0.0/16", + "146.59.0.0/16", + "146.59.0.0/17", + "147.135.0.0/17", + "147.135.128.0/17", + "149.202.0.0/16", + "149.56.0.0/16", + "151.80.0.0/16", + "158.69.0.0/16", + "164.132.0.0/16", + "79.137.56.0/24", + "91.121.0.0/16", + "91.134.0.0/16", + "92.222.0.0/16", + "94.23.0.0/16", + "109.190.0.0/16", + "137.74.0.0/16", + "144.217.0.0/16", + "145.239.0.0/16", + "147.135.0.0/17", + "147.135.128.0/17", + "149.56.0.0/16", + "149.202.0.0/16", + "176.31.0.0/16", + "178.32.0.0/16", + "178.33.0.0/16", + "151.80.0.0/16", + "158.69.0.0/16", + "164.132.0.0/16", + "167.114.0.0/17", + "167.114.128.0/18", + "167.114.192.0/19", + "167.114.192.0/19", + "167.114.224.0/19", + "217.182.0.0/16", + "5.135.0.0/16", + "54.36.0.0/16", + "54.37.0.0/16", + "54.38.0.0/16", + "54.39.0.0/16", + "54.75.0.0/16", + "51.68.0.0/16", + "51.77.0.0/16", + "51.83.0.0/16", + "51.89.0.0/16", + "51.91.0.0/16", + "51.178.0.0/16", + "51.210.0.0/16", + "51.254.0.0/16", + "51.255.0.0/16", + "76.223.0.0/16", + "213.32.0.0/16", + "213.251.155.0/24", + "188.165.0.0/16", + "46.105.0.0/16", + "193.70.85.0/24", + "198.50.0.0/16", + "103.5.12.0/22", + "107.189.64.0/18", + "135.125.0.0/17", + "135.125.128.0/17", + "135.148.0.0/17", + "135.148.128.0/17", + "137.74.0.0/16", + "139.99.0.0/17", + "139.99.128.0/17", + "141.94.0.0/16", + "141.95.0.0/17", + "141.95.128.0/17", + "142.4.192.0/19", + "142.44.128.0/17", + "144.217.0.0/16", + "145.239.0.0/16", + "146.59.0.0/16", + "146.59.0.0/17", + "147.135.0.0/17", + "213.186.33.0/24", + "51.195.0.0/16", + } + defs_microsoft = []string{ + "40.64.0.0/16", + "40.65.0.0/16", + "40.66.0.0/16", + "40.67.0.0/16", + "40.68.0.0/16", + "40.69.0.0/16", + "40.70.0.0/16", + "40.71.0.0/16", + "40.72.0.0/16", + "40.73.0.0/16", + "40.74.0.0/16", + "40.75.0.0/16", + "40.76.0.0/16", + "40.77.0.0/16", + "40.78.0.0/16", + "40.79.0.0/16", + "40.80.0.0/16", + "40.81.0.0/16", + "40.82.0.0/16", + "40.83.0.0/16", + "40.84.0.0/16", + "40.85.0.0/16", + "40.86.0.0/16", + "40.87.0.0/16", + "40.88.0.0/16", + "40.89.0.0/16", + "40.90.0.0/16", + "40.91.0.0/16", + "40.92.0.0/16", + "40.93.0.0/16", + "40.94.0.0/16", + "40.95.0.0/16", + "40.96.0.0/16", + "40.97.0.0/16", + "40.98.0.0/16", + "40.99.0.0/16", + "40.100.0.0/16", + "40.101.0.0/16", + "40.102.0.0/16", + "40.103.0.0/16", + "40.104.0.0/16", + "40.105.0.0/16", + "40.106.0.0/16", + "40.107.0.0/16", + "40.108.0.0/16", + "40.109.0.0/16", + "40.110.0.0/16", + "40.111.0.0/16", + "40.112.0.0/16", + "40.113.0.0/16", + "40.114.0.0/16", + "40.115.0.0/16", + "40.116.0.0/16", + "40.117.0.0/16", + "40.118.0.0/16", + "40.119.0.0/16", + "40.120.0.0/16", + "40.121.0.0/16", + "40.122.0.0/16", + "40.123.0.0/16", + "40.124.0.0/16", + "51.4.0.0/16", + "51.5.0.0/16", + "51.6.0.0/16", + "51.7.0.0/16", + "51.8.0.0/16", + "51.9.0.0/16", + "51.10.0.0/16", + "51.11.0.0/16", + "51.12.0.0/16", + "51.13.0.0/16", + "51.104.0.0/16", + "51.105.0.0/16", + "51.122.0.0/16", + "51.123.0.0/16", + "51.124.0.0/16", + "51.125.0.0/16", + "51.126.0.0/16", + "51.127.0.0/16", + "51.128.0.0/16", + "51.129.0.0/16", + "51.130.0.0/16", + "51.131.0.0/16", + "51.132.0.0/16", + "51.133.0.0/16", + "51.134.0.0/16", + "51.135.0.0/16", + "51.136.0.0/16", + "51.137.0.0/16", + "51.138.0.0/16", + "51.139.0.0/16", + "51.140.0.0/16", + "51.141.0.0/16", + "51.142.0.0/16", + "51.143.0.0/16", + "51.144.0.0/16", + "51.145.0.0/16", + "52.126.0.0/15", + "65.52.0.0/16", + "65.53.0.0/16", + "65.54.0.0/16", + "65.55.0.0/16", + "66.119.144.0/24", + "104.40.0.0/16", + "104.41.0.0/16", + "104.42.0.0/16", + "104.43.0.0/16", + "104.44.0.0/16", + "104.45.0.0/16", + "104.46.0.0/16", + "104.47.0.0/16", + "104.210.0.0/16", + "104.211.0.0/16", + "104.212.0.0/16", + "104.213.0.0/16", + "104.214.0.0/16", + "104.215.0.0/16", + "167.220.0.0/16", + "168.62.0.0/16", + "191.232.0.0/16", + "191.233.0.0/16", + "191.234.0.0/16", + "191.235.0.0/16", + "191.236.0.0/16", + "191.237.0.0/16", + "191.238.0.0/16", + "191.239.0.0/16", + "204.79.197.0/24", + "207.46.0.0/16", + "13.64.0.0/16", + "13.65.0.0/16", + "13.66.0.0/17", + "13.66.128.0/17", + "13.67.0.0/17", + "13.67.128.0/20", + "13.67.144.0/21", + "13.67.152.0/24", + "13.67.153.0/28", + "13.67.153.32/27", + "13.67.153.64/26", + "13.67.153.128/25", + "13.67.155.0/24", + "13.67.156.0/22", + "13.67.160.0/19", + "13.67.192.0/18", + "13.68.0.0/17", + "13.68.128.0/17", + "13.69.0.0/17", + "13.69.128.0/17", + "13.70.0.0/18", + "13.70.64.0/18", + "13.70.128.0/18", + "13.70.192.0/18", + "13.71.0.0/18", + "13.71.64.0/18", + "13.71.128.0/19", + "13.71.160.0/19", + "13.71.192.0/18", + "13.72.64.0/18", + "13.72.192.0/19", + "13.72.224.0/19", + "13.73.0.0/19", + "13.73.32.0/19", + "13.73.96.0/19", + "13.73.128.0/18", + "13.73.192.0/20", + "13.73.224.0/21", + "13.73.232.0/21", + "13.73.240.0/20", + "13.74.0.0/16", + "13.75.0.0/17", + "13.75.128.0/17", + "13.76.0.0/16", + "13.77.0.0/18", + "13.77.64.0/18", + "13.77.128.0/18", + "13.77.192.0/19", + "13.78.0.0/17", + "13.78.128.0/17", + "13.79.0.0/16", + "13.80.0.0/15", + "13.82.0.0/16", + "13.83.0.0/16", + "13.84.0.0/15", + "13.86.0.0/17", + "13.86.128.0/17", + "13.87.36.128/32", + "13.87.128.0/17", + "13.88.0.0/17", + "13.88.128.0/18", + "13.88.192.0/23", + "13.88.200.0/21", + "13.88.208.0/20", + "13.88.224.0/19", + "13.89.0.0/16", + "13.90.0.0/16", + "13.91.0.0/16", + "13.92.0.0/16", + "13.93.0.0/17", + "13.93.128.0/17", + "13.95.0.0/16", + "13.106.4.128/25", + "13.106.56.0/25", + "20.36.0.0/19", + "20.36.96.0/21", + "20.36.128.0/17", + "20.37.96.0/19", + "20.37.128.0/18", + "20.37.192.0/19", + "20.38.64.0/19", + "20.39.32.0/19", + "20.39.128.0/20", + "20.39.160.0/21", + "20.39.168.0/21", + "20.39.176.0/21", + "20.39.184.0/21", + "20.39.192.0/20", + "20.39.208.0/20", + "20.39.224.0/21", + "20.40.0.0/21", + "20.40.8.0/21", + "20.40.16.0/20", + "20.40.32.0/21", + "20.40.40.0/21", + "20.40.48.0/20", + "20.40.64.0/20", + "20.40.80.0/21", + "20.40.88.0/21", + "20.40.96.0/21", + "20.40.104.0/21", + "20.40.112.0/21", + "20.40.120.0/21", + "20.40.160.0/20", + "20.40.176.0/20", + "20.50.0.0/16", + "20.184.0.0/18", + "20.184.64.0/18", + "20.184.128.0/17", + "20.185.0.0/16", + "20.186.0.0/17", + "20.186.128.0/18", + "20.186.192.0/18", + "20.187.0.0/18", + "20.187.64.0/18", + "20.187.128.0/17", + "20.188.0.0/19", + "20.188.64.0/19", + "20.188.96.0/19", + "20.188.128.0/17", + "20.189.0.0/18", + "20.189.64.0/18", + "20.189.128.0/18", + "20.189.192.0/18", + "20.190.0.0/18", + "20.190.64.0/19", + "20.190.96.0/19", + "20.190.128.0/18", + "20.190.192.0/18", + "20.191.0.0/18", + "20.191.64.0/18", + "20.191.128.0/19", + "20.191.160.0/19", + "20.191.192.0/18", + "23.96.0.0/17", + "40.64.0.0/16", + "40.65.0.0/18", + "40.65.64.0/18", + "40.65.128.0/18", + "40.65.192.0/18", + "40.67.128.0/19", + "40.67.160.0/19", + "40.67.192.0/19", + "40.67.224.0/19", + "40.68.0.0/16", + "40.69.0.0/18", + "40.69.64.0/19", + "40.69.96.0/19", + "40.69.128.0/18", + "40.69.192.0/19", + "40.70.0.0/18", + "40.70.64.0/20", + "40.70.80.0/21", + "40.70.128.0/17", + "40.71.0.0/16", + "40.72.0.0/18", + "40.72.64.0/22", + "40.72.127.0/24", + "40.72.128.0/18", + "40.72.192.0/22", + "40.72.196.0/23", + "40.72.208.0/20", + "40.72.224.0/19", + "40.73.226.0/24", + "40.73.227.0/24", + "40.73.232.0/23", + "40.73.236.0/23", + "40.73.240.0/24", + "40.73.242.0/24", + "40.73.248.0/22", + "40.73.252.0/22", + "40.75.0.0/19", + "40.75.64.0/18", + "40.75.128.0/17", + "40.76.0.0/16", + "40.80.0.0/22", + "40.80.32.0/22", + "40.80.36.0/22", + "40.80.40.0/22", + "40.80.44.0/22", + "40.80.144.0/21", + "40.80.152.0/21", + "40.80.160.0/24", + "40.80.192.0/19", + "40.80.224.0/20", + "40.80.240.0/20", + "40.81.0.0/20", + "40.81.16.0/20", + "40.81.32.0/20", + "40.81.48.0/20", + "40.81.64.0/20", + "40.81.80.0/20", + "40.81.112.0/20", + "40.81.128.0/19", + "40.81.176.0/20", + "40.81.192.0/19", + "40.81.224.0/19", + "40.82.4.0/22", + "40.82.16.0/22", + "40.82.24.0/22", + "40.82.28.0/22", + "40.82.32.0/22", + "40.82.36.0/22", + "40.82.128.0/19", + "40.82.160.0/19", + "40.82.192.0/19", + "40.83.0.0/20", + "40.83.16.0/21", + "40.83.24.0/26", + "40.83.24.64/27", + "40.83.24.128/25", + "40.83.25.0/24", + "40.83.26.0/23", + "40.83.28.0/22", + "40.83.32.0/19", + "40.83.64.0/18", + "40.83.128.0/17", + "40.85.0.0/17", + "40.85.128.0/20", + "40.85.144.0/20", + "40.85.160.0/19", + "40.85.192.0/18", + "40.86.0.0/17", + "40.86.128.0/19", + "40.86.160.0/19", + "40.86.192.0/18", + "40.87.0.0/17", + "40.87.128.0/19", + "40.87.160.0/22", + "40.87.164.0/22", + "40.87.168.0/22", + "40.87.172.0/22", + "40.87.176.0/22", + "40.87.180.0/22", + "40.87.184.0/22", + "40.87.188.0/22", + "40.87.192.0/22", + "40.87.196.0/22", + "40.87.200.0/22", + "40.87.204.0/22", + "40.87.208.0/22", + "40.87.212.0/22", + "40.87.216.0/22", + "40.87.220.0/22", + "40.87.224.0/22", + "40.87.228.0/22", + "40.87.232.0/21", + "40.88.0.0/16", + "40.89.0.0/19", + "40.89.192.0/19", + "40.89.224.0/19", + "40.90.16.0/27", + "40.90.128.0/28", + "40.90.128.16/28", + "40.90.129.192/27", + "40.90.129.224/27", + "40.90.130.0/27", + "40.90.130.64/28", + "40.90.130.80/28", + "40.90.130.96/28", + "40.90.130.160/27", + "40.90.130.192/28", + "40.90.130.208/28", + "40.90.130.224/28", + "40.90.131.0/27", + "40.90.131.32/27", + "40.90.131.64/27", + "40.90.131.96/27", + "40.90.131.128/27", + "40.90.131.160/27", + "40.90.131.192/27", + "40.90.131.224/27", + "40.90.132.48/28", + "40.90.132.64/28", + "40.90.132.96/27", + "40.90.132.128/26", + "40.90.132.192/26", + "40.90.133.0/27", + "40.90.133.32/27", + "40.90.133.64/27", + "40.90.133.96/27", + "40.90.133.128/27", + "40.90.136.0/28", + "40.90.136.16/28", + "40.90.136.32/27", + "40.90.136.160/28", + "40.90.136.176/28", + "40.90.136.224/27", + "40.90.137.0/27", + "40.90.137.64/27", + "40.90.137.96/27", + "40.90.137.128/27", + "40.90.137.160/27", + "40.90.137.192/27", + "40.90.137.224/27", + "40.90.138.0/27", + "40.90.138.32/27", + "40.90.138.64/27", + "40.90.138.96/27", + "40.90.138.128/27", + "40.90.138.160/27", + "40.90.138.192/28", + "40.90.138.208/28", + "40.90.138.224/27", + "40.90.139.0/27", + "40.90.139.32/27", + "40.90.139.64/27", + "40.90.139.96/27", + "40.90.139.128/27", + "40.90.139.160/27", + "40.90.139.192/27", + "40.90.139.224/27", + "40.90.140.0/27", + "40.90.140.32/27", + "40.90.140.64/27", + "40.90.140.96/27", + "40.90.140.128/27", + "40.90.140.160/27", + "40.90.140.192/27", + "40.90.140.224/27", + "40.90.141.0/27", + "40.90.141.32/27", + "40.90.141.64/27", + "40.90.141.96/27", + "40.90.141.128/27", + "40.90.141.160/27", + "40.90.141.192/27", + "40.90.141.224/27", + "40.90.142.0/27", + "40.90.142.128/27", + "40.90.142.160/27", + "40.90.142.192/28", + "40.90.142.208/28", + "40.90.142.224/28", + "40.90.142.240/28", + "40.90.143.0/27", + "40.90.143.96/27", + "40.90.143.160/27", + "40.90.143.192/26", + "40.90.144.0/27", + "40.90.144.32/27", + "40.90.144.64/26", + "40.90.144.128/26", + "40.90.144.192/27", + "40.90.144.224/27", + "40.90.145.0/27", + "40.90.145.32/27", + "40.90.145.64/27", + "40.90.145.96/27", + "40.90.145.128/27", + "40.90.145.160/27", + "40.90.145.192/27", + "40.90.145.224/27", + "40.90.146.0/28", + "40.90.146.16/28", + "40.90.146.32/27", + "40.90.146.64/26", + "40.90.146.128/27", + "40.90.146.160/27", + "40.90.146.224/27", + "40.90.147.0/27", + "40.90.147.32/27", + "40.90.147.64/27", + "40.90.147.96/27", + "40.90.148.0/26", + "40.90.148.64/27", + "40.90.148.96/27", + "40.90.148.128/27", + "40.90.148.160/28", + "40.90.148.176/28", + "40.90.148.192/27", + "40.90.148.224/27", + "40.90.149.96/27", + "40.90.149.128/25", + "40.90.150.0/27", + "40.90.150.32/27", + "40.90.150.128/25", + "40.90.151.0/26", + "40.90.151.96/27", + "40.90.151.128/28", + "40.90.151.160/27", + "40.90.160.0/19", + "40.90.192.0/19", + "40.90.224.0/19", + "40.91.0.0/22", + "40.91.4.0/22", + "40.91.12.16/28", + "40.91.12.48/28", + "40.91.12.64/26", + "40.91.12.128/28", + "40.91.12.160/27", + "40.91.12.208/28", + "40.91.12.240/28", + "40.91.13.64/27", + "40.91.13.96/28", + "40.91.13.128/27", + "40.91.13.240/28", + "40.91.14.0/24", + "40.91.16.0/22", + "40.91.20.0/22", + "40.91.24.0/22", + "40.91.28.0/22", + "40.91.64.0/18", + "40.91.128.0/18", + "40.91.192.0/18", + "40.92.0.0/14", + "40.96.0.0/13", + "40.104.0.0/15", + "40.107.0.0/17", + "40.108.0.0/19", + "40.108.128.0/17", + "40.116.0.0/16", + "40.119.0.0/18", + "40.119.128.0/19", + "40.119.192.0/18", + "40.121.0.0/16", + "40.124.0.0/16", + "40.125.64.0/18", + "40.125.128.0/17", + "40.127.64.0/19", + "40.127.96.0/20", + "40.127.128.0/17", + "42.159.0.0/27", + "42.159.0.144/28", + "42.159.4.0/22", + "42.159.8.0/21", + "42.159.16.0/26", + "42.159.17.0/24", + "42.159.18.0/23", + "42.159.20.0/22", + "42.159.24.0/21", + "42.159.35.128/26", + "42.159.48.0/25", + "42.159.63.240/28", + "42.159.64.0/18", + "42.159.130.0/27", + "42.159.130.32/28", + "42.159.130.144/28", + "42.159.132.0/22", + "42.159.136.0/22", + "42.159.140.0/26", + "42.159.141.0/24", + "42.159.142.0/23", + "42.159.144.0/20", + "42.159.176.0/25", + "42.159.191.240/28", + "42.159.192.0/18", + "51.4.32.0/19", + "51.4.84.0/24", + "51.4.128.0/17", + "51.5.84.0/24", + "51.5.128.0/17", + "51.8.0.0/19", + "51.8.32.0/19", + "51.8.64.0/18", + "51.8.128.0/20", + "51.8.144.0/27", + "51.8.144.64/26", + "51.8.144.128/25", + "51.8.145.0/24", + "51.8.146.0/24", + "51.8.147.0/25", + "51.8.148.0/24", + "51.8.149.0/24", + "51.8.160.0/19", + "51.8.192.0/19", + "51.8.224.0/21", + "51.8.232.0/21", + "51.8.240.0/20", + "51.104.0.0/19", + "51.104.64.0/18", + "51.136.0.0/16", + "51.137.0.0/17", + "51.137.128.0/18", + "51.137.192.0/18", + "51.140.0.0/17", + "51.140.128.0/18", + "51.140.192.0/18", + "51.141.0.0/17", + "51.141.128.0/27", + "51.141.128.32/27", + "51.141.128.64/26", + "51.141.128.128/25", + "51.141.129.64/26", + "51.141.129.128/26", + "51.141.130.0/25", + "51.141.134.0/24", + "51.141.135.0/24", + "51.141.136.0/23", + "51.141.144.0/22", + "51.141.148.0/22", + "51.141.160.0/19", + "51.141.192.0/18", + "51.142.213.184/32", + "51.143.0.0/17", + "51.143.128.0/18", + "51.144.0.0/16", + "51.145.0.0/17", + "51.145.128.0/17", + "52.96.0.0/14", + "52.100.0.0/14", + "52.104.0.0/14", + "52.108.0.0/14", + "52.112.0.0/14", + "52.125.128.0/22", + "52.125.132.0/22", + "52.125.136.0/24", + "52.125.137.0/24", + "52.125.138.0/23", + "52.125.140.0/23", + "52.136.0.0/22", + "52.136.4.0/22", + "52.136.16.0/24", + "52.136.17.0/24", + "52.136.20.0/24", + "52.136.21.0/24", + "52.136.22.0/24", + "52.136.23.0/24", + "52.136.24.0/24", + "52.136.25.0/24", + "52.136.26.0/24", + "52.136.29.0/24", + "52.136.30.0/24", + "52.136.32.0/19", + "52.136.64.0/18", + "52.136.192.0/18", + "52.137.0.0/18", + "52.137.64.0/18", + "52.137.128.0/17", + "52.138.0.0/18", + "52.138.80.0/21", + "52.138.96.0/19", + "52.138.128.0/17", + "52.139.0.0/18", + "52.139.64.0/18", + "52.139.128.0/18", + "52.139.192.0/18", + "52.140.0.0/18", + "52.140.64.0/18", + "52.140.128.0/18", + "52.140.192.0/18", + "52.141.0.0/18", + "52.141.64.0/18", + "52.141.128.0/18", + "52.141.192.0/19", + "52.141.240.0/20", + "52.142.0.0/18", + "52.142.64.0/18", + "52.142.128.0/18", + "52.142.192.0/18", + "52.143.0.0/18", + "52.143.64.0/18", + "52.143.192.0/24", + "52.143.193.0/24", + "52.143.194.0/24", + "52.143.195.0/24", + "52.143.196.0/24", + "52.143.197.0/24", + "52.143.208.0/24", + "52.143.209.0/24", + "52.143.210.0/24", + "52.143.211.0/24", + "52.143.214.0/24", + "52.143.224.0/19", + "52.146.0.0/17", + "52.146.128.0/17", + "52.147.0.0/19", + "52.147.32.0/19", + "52.147.64.0/19", + "52.147.96.0/19", + "52.147.160.0/19", + "52.147.192.0/18", + "52.148.0.0/18", + "52.148.64.0/18", + "52.148.128.0/18", + "52.148.192.0/18", + "52.149.0.0/18", + "52.149.64.0/18", + "52.149.128.0/17", + "52.150.0.0/17", + "52.150.128.0/17", + "52.151.0.0/18", + "52.151.64.0/18", + "52.151.128.0/17", + "52.152.0.0/17", + "52.152.128.0/17", + "52.153.0.0/18", + "52.153.64.0/18", + "52.153.128.0/18", + "52.153.192.0/18", + "52.154.0.0/18", + "52.154.64.0/18", + "52.154.128.0/17", + "52.155.0.0/19", + "52.155.32.0/19", + "52.155.64.0/19", + "52.155.96.0/19", + "52.155.128.0/17", + "52.156.0.0/19", + "52.156.32.0/19", + "52.156.64.0/18", + "52.156.128.0/19", + "52.156.160.0/19", + "52.156.192.0/18", + "52.157.0.0/18", + "52.157.64.0/18", + "52.157.128.0/17", + "52.158.0.0/17", + "52.158.128.0/19", + "52.158.160.0/20", + "52.158.192.0/19", + "52.158.224.0/19", + "52.159.0.0/18", + "52.159.64.0/19", + "52.159.96.0/19", + "52.159.128.0/17", + "52.160.0.0/16", + "52.161.0.0/16", + "52.162.0.0/16", + "52.163.0.0/16", + "52.164.0.0/16", + "52.165.0.0/19", + "52.165.32.0/20", + "52.165.48.0/28", + "52.165.49.0/24", + "52.165.56.0/21", + "52.165.64.0/19", + "52.165.96.0/21", + "52.165.104.0/25", + "52.165.128.0/17", + "52.166.0.0/16", + "52.167.0.0/16", + "52.168.0.0/16", + "52.169.0.0/16", + "52.170.0.0/16", + "52.171.0.0/16", + "52.172.0.0/17", + "52.172.128.0/17", + "52.173.0.0/16", + "52.174.0.0/16", + "52.175.0.0/17", + "52.175.128.0/18", + "52.175.192.0/18", + "52.176.0.0/17", + "52.176.128.0/19", + "52.176.160.0/21", + "52.176.176.0/20", + "52.176.192.0/19", + "52.176.224.0/26", + "52.176.224.64/27", + "52.176.224.96/28", + "52.177.0.0/16", + "52.178.0.0/17", + "52.178.128.0/17", + "52.179.0.0/17", + "52.179.128.0/17", + "52.180.0.0/17", + "52.180.128.0/19", + "52.180.184.0/27", + "52.180.184.32/28", + "52.180.185.0/24", + "52.182.128.0/17", + "52.183.0.0/17", + "52.183.128.0/18", + "52.183.192.0/18", + "52.184.0.0/17", + "52.184.128.0/19", + "52.184.160.0/21", + "52.184.168.0/28", + "52.184.168.80/28", + "52.184.168.96/27", + "52.184.168.128/28", + "52.184.169.0/24", + "52.184.170.0/24", + "52.184.176.0/20", + "52.184.192.0/18", + "52.185.0.0/19", + "52.185.32.0/20", + "52.185.48.0/21", + "52.185.56.0/26", + "52.185.56.64/27", + "52.185.56.96/28", + "52.185.56.128/27", + "52.185.56.160/28", + "52.185.64.0/20", + "52.185.80.0/26", + "52.185.81.0/24", + "52.185.88.0/21", + "52.185.96.0/20", + "52.185.112.0/26", + "52.185.112.96/27", + "52.185.120.0/21", + "52.185.128.0/18", + "52.185.192.0/18", + "52.186.0.0/16", + "52.187.0.0/17", + "52.187.128.0/18", + "52.187.192.0/18", + "52.188.0.0/16", + "52.189.0.0/17", + "52.189.128.0/18", + "52.189.192.0/18", + "52.190.0.0/17", + "52.190.128.0/17", + "52.191.0.0/18", + "52.191.64.0/19", + "52.191.96.0/21", + "52.191.104.0/27", + "52.191.105.0/24", + "52.191.106.0/24", + "52.191.112.0/20", + "52.191.128.0/18", + "52.191.192.0/18", + "52.224.0.0/16", + "52.225.0.0/17", + "52.225.128.0/21", + "52.225.136.0/27", + "52.225.136.32/28", + "52.225.136.64/28", + "52.225.137.0/24", + "52.225.192.0/18", + "52.226.0.0/16", + "52.228.0.0/17", + "52.228.128.0/17", + "52.229.0.0/18", + "52.229.64.0/18", + "52.229.128.0/17", + "52.230.0.0/17", + "52.230.128.0/17", + "52.231.0.0/17", + "52.231.128.0/17", + "52.232.0.0/17", + "52.232.128.0/21", + "52.232.136.0/21", + "52.232.144.0/24", + "52.232.145.0/24", + "52.232.146.0/24", + "52.232.147.0/24", + "52.232.148.0/24", + "52.232.149.0/24", + "52.232.151.0/24", + "52.232.152.0/24", + "52.232.153.0/24", + "52.232.154.0/24", + "52.232.155.0/24", + "52.232.156.0/24", + "52.232.157.0/24", + "52.232.158.0/24", + "52.232.159.0/24", + "52.232.160.0/19", + "52.232.192.0/18", + "52.233.0.0/18", + "52.233.64.0/18", + "52.233.128.0/17", + "52.234.0.0/17", + "52.234.128.0/17", + "52.235.0.0/18", + "52.235.64.0/18", + "52.236.0.0/17", + "52.236.128.0/17", + "52.237.0.0/18", + "52.237.64.0/18", + "52.237.128.0/18", + "52.237.192.0/18", + "52.238.0.0/18", + "52.238.78.88/32", + "52.238.106.116/32", + "52.238.119.141/32", + "52.238.192.0/18", + "52.239.0.0/17", + "52.239.128.0/24", + "52.239.129.0/24", + "52.239.130.0/23", + "52.239.132.0/23", + "52.239.135.64/26", + "52.239.135.128/26", + "52.239.135.192/26", + "52.239.136.0/22", + "52.239.140.0/22", + "52.239.144.0/23", + "52.239.146.0/23", + "52.239.148.0/27", + "52.239.148.64/26", + "52.239.148.128/25", + "52.239.149.0/24", + "52.239.150.0/23", + "52.239.152.0/22", + "52.239.156.0/24", + "52.239.157.0/25", + "52.239.157.128/26", + "52.239.157.192/27", + "52.239.158.0/23", + "52.239.160.0/22", + "52.239.164.0/25", + "52.239.164.128/26", + "52.239.164.192/26", + "52.239.165.0/26", + "52.239.165.160/27", + "52.239.167.0/24", + "52.239.168.0/22", + "52.239.172.0/22", + "52.239.176.128/25", + "52.239.177.32/27", + "52.239.177.64/26", + "52.239.177.128/25", + "52.239.178.0/23", + "52.239.180.0/22", + "52.239.184.0/25", + "52.239.184.160/28", + "52.239.184.192/27", + "52.239.185.32/27", + "52.239.185.64/27", + "52.239.186.0/24", + "52.239.187.0/25", + "52.239.187.128/25", + "52.239.188.0/24", + "52.239.189.0/24", + "52.239.190.0/25", + "52.239.190.128/26", + "52.239.190.192/26", + "52.239.192.0/25", + "52.239.192.160/27", + "52.239.192.192/26", + "52.239.193.0/24", + "52.239.195.0/24", + "52.239.197.0/24", + "52.239.198.0/25", + "52.239.198.160/27", + "52.239.198.192/26", + "52.239.199.0/24", + "52.239.200.0/23", + "52.239.202.0/24", + "52.239.203.0/24", + "52.239.204.0/24", + "52.239.205.0/24", + "52.239.206.0/24", + "52.239.207.0/27", + "52.239.207.32/28", + "52.239.207.64/26", + "52.239.207.128/26", + "52.239.207.192/26", + "52.239.208.0/23", + "52.239.210.0/23", + "52.239.212.0/23", + "52.239.214.0/23", + "52.239.220.0/23", + "52.239.222.0/23", + "52.239.224.0/24", + "52.239.225.0/24", + "52.239.226.0/24", + "52.239.227.0/24", + "52.239.228.0/23", + "52.239.231.0/24", + "52.239.234.0/23", + "52.239.236.0/23", + "52.239.240.0/24", + "52.239.242.0/23", + "52.239.244.0/23", + "52.239.246.0/23", + "52.239.248.0/24", + "52.239.249.0/24", + "52.239.252.0/24", + "52.239.254.0/23", + "52.240.0.0/17", + "52.240.128.0/17", + "52.241.0.0/16", + "52.242.0.0/18", + "52.242.64.0/18", + "52.242.128.0/17", + "52.243.32.0/19", + "52.243.64.0/18", + "52.244.160.207/32", + "52.245.8.0/22", + "52.245.12.0/22", + "52.245.16.0/22", + "52.245.20.0/22", + "52.245.24.0/22", + "52.245.28.0/22", + "52.245.32.0/22", + "52.245.36.0/22", + "52.245.40.0/22", + "52.245.44.0/24", + "52.245.45.0/25", + "52.245.45.128/28", + "52.245.45.160/27", + "52.245.45.192/26", + "52.245.46.0/27", + "52.245.46.48/28", + "52.245.46.64/28", + "52.245.46.112/28", + "52.245.46.128/28", + "52.245.46.160/27", + "52.245.46.192/27", + "52.245.46.224/28", + "52.245.48.0/22", + "52.245.52.0/22", + "52.245.56.0/22", + "52.245.60.0/22", + "52.245.64.0/22", + "52.245.68.0/24", + "52.245.69.32/27", + "52.245.69.64/27", + "52.245.69.96/28", + "52.245.69.144/28", + "52.245.69.160/27", + "52.245.69.192/26", + "52.245.70.0/23", + "52.245.72.0/22", + "52.245.76.0/22", + "52.245.80.0/22", + "52.245.84.0/22", + "52.245.88.0/22", + "52.245.92.0/22", + "52.245.96.0/22", + "52.245.100.0/22", + "52.245.104.0/22", + "52.245.108.0/22", + "52.245.112.0/22", + "52.245.124.0/22", + "52.246.0.0/17", + "52.246.128.0/20", + "52.246.160.0/19", + "52.246.192.0/18", + "52.247.0.0/17", + "52.247.150.191/32", + "52.247.192.0/18", + "52.248.0.0/17", + "52.248.128.0/17", + "52.249.0.0/18", + "52.249.64.0/19", + "52.249.128.0/17", + "52.250.0.0/17", + "52.250.128.0/18", + "52.250.192.0/18", + "52.251.0.0/17", + "52.251.128.0/17", + "52.252.0.0/17", + "52.252.128.0/17", + "52.253.0.0/18", + "52.253.64.0/20", + "52.253.80.0/20", + "52.253.96.0/19", + "52.253.128.0/20", + "52.253.148.0/23", + "52.253.154.0/23", + "52.254.0.0/18", + "52.254.64.0/19", + "52.254.96.0/20", + "52.254.112.0/21", + "52.254.128.0/17", + "52.255.0.0/19", + "52.255.32.0/19", + "52.255.64.0/18", + "52.255.128.0/17", + "64.4.8.0/24", + "64.4.22.128/25", + "64.4.50.128/25", + "64.4.54.0/24", + "65.52.0.0/19", + "65.52.32.0/21", + "65.52.48.0/20", + "65.52.64.0/20", + "65.52.104.0/24", + "65.52.106.16/28", + "65.52.106.32/27", + "65.52.106.64/26", + "65.52.106.128/27", + "65.52.108.0/23", + "65.52.110.0/24", + "65.52.111.0/24", + "65.52.112.0/20", + "65.52.128.0/19", + "65.52.160.0/19", + "65.52.192.0/19", + "65.52.224.0/21", + "65.52.232.0/21", + "65.52.240.0/21", + "65.54.19.128/27", + "65.54.55.160/27", + "65.54.55.224/27", + "65.54.170.128/25", + "65.54.247.128/25", + "70.37.0.0/21", + "70.37.8.0/22", + "70.37.16.0/20", + "70.37.32.0/20", + "70.37.48.0/20", + "70.37.64.0/18", + "70.37.154.128/25", + "70.37.160.0/21", + "94.245.88.0/21", + "94.245.104.0/21", + "94.245.114.1/32", + "94.245.114.2/31", + "94.245.114.4/32", + "94.245.114.33/32", + "94.245.114.34/31", + "94.245.114.36/32", + "94.245.117.53/32", + "94.245.117.96/27", + "94.245.118.0/27", + "94.245.118.65/32", + "94.245.118.66/31", + "94.245.118.68/32", + "94.245.118.97/32", + "94.245.118.98/31", + "94.245.118.100/32", + "94.245.118.129/32", + "94.245.118.130/31", + "94.245.118.132/32", + "94.245.120.64/26", + "94.245.120.128/28", + "94.245.122.0/24", + "94.245.123.144/28", + "94.245.123.176/28", + "104.40.0.0/17", + "104.40.128.0/17", + "104.41.0.0/18", + "104.41.64.0/18", + "104.41.128.0/19", + "104.41.160.0/19", + "104.41.192.0/18", + "104.42.0.0/16", + "104.43.0.0/17", + "104.43.128.0/17", + "104.44.88.0/27", + "104.44.88.32/27", + "104.44.88.64/27", + "104.44.88.96/27", + "104.44.88.128/27", + "104.44.88.160/27", + "104.44.88.192/27", + "104.44.88.224/27", + "104.44.89.0/27", + "104.44.89.32/27", + "104.44.89.64/27", + "104.44.89.96/27", + "104.44.89.128/27", + "104.44.89.160/27", + "104.44.89.192/27", + "104.44.89.224/27", + "104.44.90.0/27", + "104.44.90.32/27", + "104.44.90.64/26", + "104.44.90.128/27", + "104.44.90.160/27", + "104.44.90.192/27", + "104.44.90.224/27", + "104.44.91.0/27", + "104.44.91.32/27", + "104.44.91.64/27", + "104.44.91.96/27", + "104.44.91.128/27", + "104.44.91.160/27", + "104.44.91.192/27", + "104.44.91.224/27", + "104.44.92.0/27", + "104.44.92.32/27", + "104.44.92.64/27", + "104.44.92.96/27", + "104.44.92.128/27", + "104.44.92.160/27", + "104.44.92.192/27", + "104.44.92.224/27", + "104.44.93.0/27", + "104.44.93.32/27", + "104.44.93.64/27", + "104.44.93.96/27", + "104.44.93.128/27", + "104.44.93.160/27", + "104.44.93.192/27", + "104.44.93.224/27", + "104.44.94.0/28", + "104.44.94.16/28", + "104.44.94.32/28", + "104.44.94.48/28", + "104.44.94.64/28", + "104.44.94.80/28", + "104.44.94.96/28", + "104.44.94.112/28", + "104.44.94.128/28", + "104.44.94.144/28", + "104.44.94.160/27", + "104.44.94.192/28", + "104.44.94.208/28", + "104.44.94.224/27", + "104.44.95.0/28", + "104.44.95.16/28", + "104.44.95.32/28", + "104.44.95.48/28", + "104.44.95.64/28", + "104.44.95.80/28", + "104.44.95.96/28", + "104.44.95.112/28", + "104.44.95.128/27", + "104.44.95.160/27", + "104.44.95.192/28", + "104.44.95.224/28", + "104.44.95.240/28", + "104.44.128.0/18", + "104.44.218.128/25", + "104.44.254.128/25", + "104.44.255.0/25", + "104.45.0.0/18", + "104.45.64.0/20", + "104.45.80.0/20", + "104.45.96.0/19", + "104.45.128.0/18", + "104.45.192.0/20", + "104.45.208.0/20", + "104.45.224.0/19", + "104.46.0.0/21", + "104.46.8.0/21", + "104.46.16.0/21", + "104.46.24.0/22", + "104.46.28.0/24", + "104.46.29.0/24", + "104.46.30.0/23", + "104.46.32.0/19", + "104.46.64.0/19", + "104.46.96.0/19", + "104.46.128.0/19", + "104.46.160.0/19", + "104.46.192.0/20", + "104.46.208.0/20", + "104.46.224.0/20", + "104.46.240.0/20", + "104.47.0.0/17", + "104.47.128.0/18", + "104.47.200.0/21", + "104.47.208.0/23", + "104.47.210.0/23", + "104.47.212.0/23", + "104.47.214.0/23", + "104.47.216.64/26", + "104.47.218.0/23", + "104.47.220.0/22", + "104.47.224.0/20", + "104.146.0.0/19", + "104.146.128.0/17", + "104.208.0.0/19", + "104.208.32.0/20", + "104.208.64.0/18", + "104.208.128.0/17", + "104.209.0.0/18", + "104.209.64.0/20", + "104.209.80.0/20", + "104.209.128.0/17", + "104.210.0.0/20", + "104.210.32.0/19", + "104.210.64.0/18", + "104.210.128.0/19", + "104.210.176.0/20", + "104.210.192.0/19", + "104.211.0.0/18", + "104.211.64.0/18", + "104.211.128.0/18", + "104.211.192.0/18", + "104.214.0.0/17", + "104.214.128.0/19", + "104.214.160.0/19", + "104.214.192.0/18", + "104.215.0.0/18", + "104.215.64.0/18", + "104.215.128.0/17", + "111.221.29.0/24", + "111.221.30.0/23", + "111.221.78.0/23", + "111.221.80.0/20", + "111.221.96.0/20", + "111.221.112.0/21", + "131.253.12.8/29", + "131.253.12.16/28", + "131.253.12.36/30", + "131.253.12.40/29", + "131.253.12.48/29", + "131.253.12.56/29", + "131.253.12.64/29", + "131.253.12.72/29", + "131.253.12.96/27", + "131.253.12.128/27", + "131.253.12.160/28", + "131.253.12.176/28", + "131.253.12.192/28", + "131.253.12.208/28", + "131.253.12.224/30", + "131.253.12.228/30", + "131.253.12.248/29", + "131.253.13.0/28", + "131.253.13.16/29", + "131.253.13.24/29", + "131.253.13.32/28", + "131.253.13.48/28", + "131.253.13.64/29", + "131.253.13.72/29", + "131.253.13.80/29", + "131.253.13.88/30", + "131.253.13.96/30", + "131.253.13.100/30", + "131.253.13.104/30", + "131.253.13.108/30", + "131.253.13.112/28", + "131.253.13.128/27", + "131.253.13.160/28", + "131.253.13.176/28", + "131.253.13.192/26", + "131.253.14.4/30", + "131.253.14.8/31", + "131.253.14.16/28", + "131.253.14.32/27", + "131.253.14.64/28", + "131.253.14.80/28", + "131.253.14.96/27", + "131.253.14.128/27", + "131.253.14.160/27", + "131.253.14.192/29", + "131.253.14.208/28", + "131.253.14.224/28", + "131.253.14.248/29", + "131.253.15.8/29", + "131.253.15.16/28", + "131.253.15.32/27", + "131.253.15.64/26", + "131.253.15.128/28", + "131.253.15.144/28", + "131.253.15.160/27", + "131.253.15.192/28", + "131.253.15.208/28", + "131.253.15.224/27", + "131.253.24.0/28", + "131.253.24.16/28", + "131.253.24.32/27", + "131.253.24.64/26", + "131.253.24.128/27", + "131.253.24.160/27", + "131.253.24.192/26", + "131.253.25.0/24", + "131.253.26.0/25", + "131.253.26.128/25", + "131.253.27.0/24", + "131.253.34.0/25", + "131.253.34.128/26", + "131.253.34.224/27", + "131.253.35.0/25", + "131.253.35.128/26", + "131.253.35.192/26", + "131.253.36.128/26", + "131.253.36.192/27", + "131.253.36.224/27", + "131.253.37.0/24", + "131.253.38.0/27", + "131.253.38.32/27", + "131.253.38.64/27", + "131.253.38.96/29", + "131.253.38.104/29", + "131.253.38.112/29", + "131.253.38.128/26", + "131.253.38.192/26", + "131.253.40.0/24", + "131.253.41.0/24", + "137.117.0.0/19", + "137.117.32.0/19", + "137.117.64.0/18", + "137.117.128.0/17", + "137.135.0.0/18", + "137.135.64.0/18", + "137.135.128.0/17", + "138.91.0.0/20", + "138.91.16.0/20", + "138.91.32.0/20", + "138.91.48.0/20", + "138.91.64.0/19", + "138.91.96.0/19", + "138.91.128.0/17", + "139.217.0.0/19", + "139.217.32.0/24", + "139.217.40.0/21", + "139.217.48.0/21", + "139.217.128.0/19", + "139.217.160.0/26", + "139.217.160.64/27", + "139.217.160.128/28", + "139.217.161.0/24", + "139.217.162.0/24", + "139.217.168.0/21", + "139.217.192.0/20", + "139.219.0.0/20", + "139.219.18.0/23", + "139.219.20.0/28", + "139.219.32.0/19", + "139.219.64.0/18", + "139.219.128.0/20", + "139.219.144.0/24", + "139.219.147.0/26", + "139.219.148.0/28", + "139.219.150.0/23", + "139.219.155.0/24", + "139.219.160.0/19", + "139.219.192.0/18", + "150.171.32.0/22", + "150.171.40.0/22", + "168.61.0.0/19", + "168.61.32.0/20", + "168.61.48.0/21", + "168.61.56.0/21", + "168.61.64.0/20", + "168.61.80.0/20", + "168.61.96.0/19", + "168.61.128.0/24", + "168.61.129.0/25", + "168.61.129.128/26", + "168.61.129.208/28", + "168.61.129.224/27", + "168.61.130.64/26", + "168.61.130.128/25", + "168.61.131.0/26", + "168.61.131.128/25", + "168.61.132.0/26", + "168.61.144.0/20", + "168.61.160.0/19", + "168.61.208.0/20", + "168.62.0.0/19", + "168.62.32.0/19", + "168.62.64.0/19", + "168.62.96.0/19", + "168.62.128.0/19", + "168.62.160.0/19", + "168.62.192.0/19", + "168.62.224.0/19", + "168.63.0.0/19", + "168.63.32.0/19", + "168.63.64.0/20", + "168.63.80.0/21", + "168.63.88.0/23", + "168.63.90.0/24", + "168.63.91.0/26", + "168.63.92.0/22", + "168.63.96.0/19", + "168.63.128.0/24", + "168.63.129.0/28", + "168.63.129.32/27", + "168.63.129.64/26", + "168.63.129.128/25", + "168.63.130.0/23", + "168.63.132.0/22", + "168.63.136.0/21", + "168.63.144.0/20", + "168.63.160.0/19", + "168.63.192.0/19", + "168.63.224.0/19", + "191.232.0.0/23", + "191.232.2.128/25", + "191.232.32.0/19", + "191.232.96.0/19", + "191.232.137.0/24", + "191.232.138.0/23", + "191.232.140.0/24", + "191.232.160.0/19", + "191.232.192.0/18", + "191.234.2.0/23", + "191.234.16.0/20", + "191.234.32.0/19", + "191.234.138.0/23", + "191.234.140.0/22", + "191.234.160.0/19", + "191.235.0.0/20", + "191.235.32.0/19", + "191.235.64.0/18", + "191.235.128.0/18", + "191.235.192.0/22", + "191.235.196.0/22", + "191.235.200.0/21", + "191.235.208.0/20", + "191.235.224.0/20", + "191.235.240.0/21", + "191.235.248.0/24", + "191.235.255.0/24", + "191.236.0.0/18", + "191.236.64.0/18", + "191.236.128.0/18", + "191.236.192.0/18", + "191.237.0.0/17", + "191.237.128.0/18", + "191.237.192.0/23", + "191.237.194.0/24", + "191.237.195.0/24", + "191.237.196.0/24", + "191.237.200.0/21", + "191.237.208.0/20", + "191.237.224.0/21", + "191.237.232.0/22", + "191.237.236.0/24", + "191.237.238.0/24", + "191.237.240.0/23", + "191.237.244.0/22", + "191.237.248.0/21", + "191.238.0.0/18", + "191.238.64.0/23", + "191.238.66.0/23", + "191.238.68.0/24", + "191.238.70.0/23", + "191.238.80.0/21", + "191.238.88.0/22", + "191.238.92.0/23", + "191.238.96.0/19", + "191.238.128.0/21", + "191.238.136.0/21", + "191.238.144.0/20", + "191.238.160.0/19", + "191.238.192.0/19", + "191.238.224.0/19", + "191.239.0.0/18", + "191.239.64.0/19", + "191.239.96.0/20", + "191.239.112.0/20", + "191.239.128.0/19", + "191.239.160.0/19", + "191.239.192.0/22", + "191.239.196.0/24", + "191.239.197.0/28", + "191.239.200.0/22", + "191.239.204.0/22", + "191.239.208.0/20", + "191.239.224.0/20", + "191.239.240.0/20", + "193.149.64.0/21", + "193.149.72.0/21", + "193.149.80.0/21", + "193.149.88.0/21", + "199.30.16.0/24", + "199.30.17.0/24", + "199.30.18.0/23", + "199.30.20.0/24", + "199.30.21.0/24", + "199.30.22.0/24", + "199.30.23.0/24", + "199.30.24.0/23", + "199.30.26.0/24", + "199.30.27.0/25", + "199.30.27.144/28", + "199.30.27.160/27", + "199.30.27.192/26", + "199.30.28.0/26", + "199.30.28.64/26", + "199.30.28.128/25", + "199.30.29.0/24", + "199.30.30.0/23", + "204.79.197.215/32", + "204.231.197.0/24", + "206.191.224.0/19", + "207.46.13.0/24", + "207.46.50.128/28", + "207.46.59.64/27", + "207.46.63.64/27", + "207.46.63.128/25", + "207.46.67.160/27", + "207.46.67.192/27", + "207.46.72.0/27", + "207.46.73.250/32", + "207.46.77.224/28", + "207.46.87.0/24", + "207.46.89.16/28", + "207.46.95.32/27", + "207.46.100.0/24", + "207.46.126.0/24", + "207.46.128.0/19", + "207.46.163.0/24", + "207.46.193.192/28", + "207.46.193.224/27", + "207.46.194.0/24", + "207.46.198.128/25", + "207.46.200.96/27", + "207.46.200.176/28", + "207.46.202.128/28", + "207.46.205.0/24", + "207.46.216.54/32", + "207.46.224.0/20", + "207.68.174.0/29", + "207.68.174.24/29", + "207.68.174.32/29", + "207.68.174.40/29", + "207.68.174.48/29", + "207.68.174.56/29", + "207.68.174.64/29", + "207.68.174.80/28", + "207.68.174.96/28", + "207.68.174.112/28", + "207.68.174.128/29", + "207.68.174.136/29", + "207.68.174.144/29", + "207.68.174.152/29", + "207.68.174.160/29", + "207.68.174.168/29", + "207.68.174.176/29", + "207.68.174.184/29", + "207.68.174.192/27", + "207.68.174.248/29", + "209.240.212.0/23", + "213.199.128.0/20", + "213.199.154.0/24", + "213.199.168.0/23", + "213.199.180.32/28", + "213.199.180.96/27", + "13.94.0.0/16", + "13.107.0.0/16", + "131.253.0.0/16", + "213.199.180.128/26", + "213.199.180.192/27", + "213.199.183.0/24", + "216.32.180.0/23", + "51.116.0.0/16", + "52.254.0.0/16", + "52.253.0.0/16", + "91.225.248.0/24", + "20.0.0.0/8", + "23.102.0.0/16", + "40.126.0.0/16", + } + defs_google = []string{ + "168.149.132.0/24", + "34.72.0.0/16", + "34.80.0.0/16", + "34.95.0.0/16", + "34.96.0.0/16", + "34.97.0.0/16", + "34.98.0.0/16", + "34.101.0.0/16", + "34.102.0.0/16", + "34.103.0.0/16", + "34.104.0.0/16", + "34.105.0.0/16", + "34.106.0.0/16", + "34.107.0.0/16", + "34.108.0.0/16", + "34.109.0.0/16", + "34.110.0.0/16", + "34.111.0.0/16", + "34.112.0.0/16", + "34.113.0.0/16", + "34.114.0.0/16", + "34.115.0.0/16", + "34.116.0.0/16", + "34.117.0.0/16", + "34.118.0.0/16", + "34.119.0.0/16", + "34.120.0.0/16", + "34.141.0.0/16", + "35.184.0.0/16", + "104.132.0.0/23", + "104.132.34.0/24", + "104.154.0.0/15", + "104.154.0.0/19", + "104.154.128.0/19", + "104.154.160.0/19", + "104.154.192.0/19", + "104.154.224.0/19", + "104.154.32.0/19", + "104.154.64.0/19", + "104.154.96.0/19", + "104.155.0.0/19", + "104.155.128.0/19", + "104.155.160.0/19", + "104.155.192.0/19", + "104.155.224.0/19", + "104.155.32.0/19", + "104.155.64.0/19", + "104.155.96.0/19", + "104.196.0.0/14", + "104.196.0.0/19", + "104.196.128.0/19", + "104.196.160.0/19", + "104.196.192.0/19", + "104.196.224.0/19", + "104.196.32.0/19", + "104.196.64.0/19", + "104.196.96.0/19", + "104.197.0.0/19", + "104.197.128.0/19", + "104.197.160.0/19", + "104.197.192.0/19", + "104.197.224.0/19", + "104.197.32.0/19", + "104.197.64.0/19", + "104.197.96.0/19", + "104.198.0.0/19", + "104.198.128.0/19", + "104.198.160.0/19", + "104.198.192.0/19", + "104.198.224.0/19", + "104.198.32.0/19", + "104.198.64.0/19", + "104.198.96.0/19", + "104.199.0.0/19", + "104.199.128.0/19", + "104.199.160.0/19", + "104.199.192.0/19", + "104.199.224.0/19", + "104.199.32.0/19", + "104.199.64.0/19", + "104.199.65.0/24", + "104.199.96.0/19", + "107.167.160.0/19", + "107.178.192.0/18", + "108.170.192.0/18", + "108.177.0.0/17", + "108.177.10.0/24", + "108.177.103.0/24", + "108.177.104.0/24", + "108.177.11.0/24", + "108.177.111.0/24", + "108.177.112.0/24", + "108.177.119.0/24", + "108.177.120.0/24", + "108.177.12.0/24", + "108.177.121.0/24", + "108.177.122.0/24", + "108.177.125.0/24", + "108.177.126.0/24", + "108.177.127.0/24", + "108.177.13.0/24", + "108.177.14.0/24", + "108.177.15.0/24", + "108.177.8.0/24", + "108.177.9.0/24", + "108.177.96.0/24", + "108.177.97.0/24", + "108.177.98.0/24", + "108.59.80.0/20", + "130.211.0.0/16", + "136.112.0.0/12", + "142.250.0.0/16", + "146.148.0.0/17", + "162.216.148.0/22", + "162.222.176.0/21", + "172.102.10.0/24", + "172.102.11.0/24", + "172.102.12.0/23", + "172.102.14.0/23", + "172.102.8.0/21", + "172.102.8.0/24", + "172.110.32.0/21", + "172.217.0.0/16", + "172.217.0.0/24", + "172.217.10.0/24", + "172.217.1.0/24", + "172.217.11.0/24", + "172.217.12.0/24", + "172.217.128.0/19", + "172.217.13.0/24", + "172.217.14.0/24", + "172.217.15.0/24", + "172.217.16.0/24", + "172.217.17.0/24", + "172.217.18.0/24", + "172.217.19.0/24", + "172.217.192.0/24", + "172.217.193.0/24", + "172.217.194.0/24", + "172.217.195.0/24", + "172.217.197.0/24", + "172.217.20.0/24", + "172.217.2.0/24", + "172.217.21.0/24", + "172.217.22.0/24", + "172.217.23.0/24", + "172.217.24.0/24", + "172.217.25.0/24", + "172.217.26.0/24", + "172.217.27.0/24", + "172.217.28.0/24", + "172.217.29.0/24", + "172.217.30.0/24", + "172.217.3.0/24", + "172.217.31.0/24", + "172.217.4.0/24", + "172.217.5.0/24", + "172.217.6.0/24", + "172.217.7.0/24", + "172.217.8.0/24", + "172.217.9.0/24", + "172.253.0.0/16", + "173.194.0.0/16", + "173.194.0.0/19", + "173.194.112.0/24", + "173.194.113.0/24", + "173.194.117.0/24", + "173.194.118.0/24", + "173.194.119.0/24", + "173.194.120.0/24", + "173.194.121.0/24", + "173.194.124.0/24", + "173.194.128.0/20", + "173.194.132.0/24", + "173.194.136.0/24", + "173.194.140.0/24", + "173.194.141.0/24", + "173.194.142.0/24", + "173.194.144.0/20", + "173.194.160.0/21", + "173.194.175.0/24", + "173.194.176.0/20", + "173.194.192.0/24", + "173.194.193.0/24", + "173.194.194.0/24", + "173.194.195.0/24", + "173.194.196.0/24", + "173.194.197.0/24", + "173.194.198.0/24", + "173.194.199.0/24", + "173.194.200.0/24", + "173.194.201.0/24", + "173.194.202.0/24", + "173.194.203.0/24", + "173.194.204.0/24", + "173.194.205.0/24", + "173.194.206.0/24", + "173.194.207.0/24", + "173.194.208.0/24", + "173.194.209.0/24", + "173.194.210.0/24", + "173.194.211.0/24", + "173.194.212.0/24", + "173.194.213.0/24", + "173.194.214.0/24", + "173.194.215.0/24", + "173.194.216.0/24", + "173.194.217.0/24", + "173.194.218.0/24", + "173.194.219.0/24", + "173.194.220.0/24", + "173.194.221.0/24", + "173.194.222.0/24", + "173.194.223.0/24", + "173.194.32.0/24", + "173.194.34.0/24", + "173.194.35.0/24", + "173.194.36.0/24", + "173.194.37.0/24", + "173.194.38.0/24", + "173.194.39.0/24", + "173.194.40.0/24", + "173.194.41.0/24", + "173.194.42.0/24", + "173.194.44.0/24", + "173.194.46.0/24", + "173.194.48.0/20", + "173.194.53.0/24", + "173.194.63.0/24", + "173.194.66.0/24", + "173.194.67.0/24", + "173.194.68.0/24", + "173.194.69.0/24", + "173.194.70.0/24", + "173.194.7.0/24", + "173.194.73.0/24", + "173.194.74.0/24", + "173.194.76.0/24", + "173.194.78.0/24", + "173.194.79.0/24", + "173.194.96.0/21", + "173.255.112.0/20", + "185.150.148.0/22", + "185.25.28.0/23", + "192.104.160.0/23", + "192.158.28.0/22", + "192.178.0.0/15", + "199.192.112.0/22", + "199.223.232.0/21", + "207.223.160.0/20", + "208.68.108.0/22", + "208.81.188.0/22", + "209.107.176.0/20", + "209.107.176.0/23", + "209.107.182.0/23", + "209.107.184.0/23", + "209.107.185.0/24", + "209.85.128.0/17", + "209.85.137.0/24", + "209.85.144.0/24", + "209.85.145.0/24", + "209.85.147.0/24", + "209.85.164.0/23", + "209.85.200.0/24", + "209.85.201.0/24", + "209.85.202.0/24", + "209.85.203.0/24", + "209.85.232.0/24", + "209.85.233.0/24", + "209.85.234.0/24", + "209.85.235.0/24", + "216.239.32.0/19", + "216.239.32.0/24", + "216.239.33.0/24", + "216.239.34.0/24", + "216.239.35.0/24", + "216.239.36.0/24", + "216.239.38.0/24", + "216.239.39.0/24", + "216.252.220.0/22", + "216.252.220.0/24", + "216.252.222.0/24", + "216.58.192.0/19", + "216.58.192.0/22", + "216.58.196.0/23", + "216.58.198.0/24", + "216.58.199.0/24", + "216.58.200.0/24", + "216.58.201.0/24", + "216.58.202.0/24", + "216.58.203.0/24", + "216.58.204.0/23", + "216.58.206.0/23", + "216.58.208.0/24", + "216.58.209.0/24", + "216.58.210.0/24", + "216.58.211.0/24", + "216.58.212.0/24", + "216.58.213.0/24", + "216.58.214.0/24", + "216.58.215.0/24", + "216.58.216.0/24", + "216.58.217.0/24", + "216.58.218.0/24", + "216.58.219.0/24", + "216.58.220.0/24", + "216.58.221.0/24", + "216.58.222.0/24", + "216.58.223.0/24", + "216.73.80.0/20", + "23.236.48.0/20", + "23.251.128.0/19", + "34.102.0.0/16", + "35.184.0.0/13", + "35.184.0.0/19", + "35.184.128.0/19", + "35.184.160.0/19", + "35.184.192.0/19", + "35.184.224.0/19", + "35.184.32.0/19", + "35.184.64.0/19", + "35.184.96.0/19", + "35.185.0.0/19", + "35.185.128.0/19", + "35.185.160.0/19", + "35.185.192.0/19", + "35.185.224.0/19", + "35.185.32.0/19", + "35.185.64.0/19", + "35.185.96.0/19", + "35.186.0.0/16", + "35.186.0.0/19", + "35.186.128.0/19", + "35.186.160.0/19", + "35.186.32.0/19", + "35.186.64.0/19", + "35.186.96.0/19", + "35.187.0.0/19", + "35.187.128.0/19", + "35.187.160.0/19", + "35.187.192.0/19", + "35.187.224.0/19", + "35.187.32.0/19", + "35.187.64.0/19", + "35.187.96.0/19", + "35.188.0.0/19", + "35.188.128.0/19", + "35.188.160.0/19", + "35.188.192.0/19", + "35.188.224.0/19", + "35.188.32.0/19", + "35.188.64.0/19", + "35.188.96.0/19", + "35.189.0.0/19", + "35.189.128.0/19", + "35.189.160.0/19", + "35.189.192.0/19", + "35.189.224.0/19", + "35.189.32.0/19", + "35.189.64.0/19", + "35.189.96.0/19", + "35.190.0.0/16", + "35.190.128.0/19", + "35.190.160.0/19", + "35.190.192.0/19", + "35.190.224.0/19", + "35.192.0.0/13", + "35.200.0.0/14", + "35.204.0.0/15", + "35.220.0.0/14", + "35.224.0.0/14", + "35.228.0.0/14", + "35.232.0.0/14", + "35.236.0.0/14", + "35.240.0.0/14", + "35.244.0.0/14", + "64.233.160.0/19", + "64.233.160.0/24", + "64.233.161.0/24", + "64.233.162.0/24", + "64.233.163.0/24", + "64.233.164.0/24", + "64.233.165.0/24", + "64.233.166.0/24", + "64.233.167.0/24", + "64.233.168.0/24", + "64.233.169.0/24", + "64.233.170.0/24", + "64.233.171.0/24", + "64.233.172.0/23", + "64.233.176.0/24", + "64.233.177.0/24", + "64.233.178.0/24", + "64.233.179.0/24", + "64.233.180.0/24", + "64.233.181.0/24", + "64.233.182.0/24", + "64.233.183.0/24", + "64.233.184.0/24", + "64.233.185.0/24", + "64.233.186.0/24", + "64.233.187.0/24", + "64.233.188.0/24", + "64.233.189.0/24", + "64.233.190.0/24", + "64.233.191.0/24", + "66.102.0.0/20", + "66.102.1.0/24", + "66.102.12.0/24", + "66.102.2.0/24", + "66.102.3.0/24", + "66.102.4.0/24", + "66.102.8.0/23", + "66.249.64.0/19", + "66.249.64.0/20", + "66.249.80.0/22", + "66.249.84.0/23", + "66.249.88.0/24", + "70.32.128.0/19", + "70.32.129.0/24", + "70.32.131.0/24", + "70.32.133.0/24", + "70.32.145.0/24", + "70.32.146.0/23", + "70.32.151.0/24", + "72.14.192.0/18", + "74.114.24.0/21", + "74.125.0.0/16", + "74.125.0.0/20", + "74.125.124.0/24", + "74.125.126.0/24", + "74.125.127.0/24", + "74.125.128.0/24", + "74.125.129.0/24", + "74.125.130.0/24", + "74.125.131.0/24", + "74.125.132.0/24", + "74.125.133.0/24", + "74.125.134.0/24", + "74.125.135.0/24", + "74.125.136.0/24", + "74.125.138.0/24", + "74.125.139.0/24", + "74.125.140.0/24", + "74.125.141.0/24", + "74.125.142.0/24", + "74.125.143.0/24", + "74.125.152.0/21", + "74.125.176.0/20", + "74.125.192.0/24", + "74.125.193.0/24", + "74.125.195.0/24", + "74.125.196.0/24", + "74.125.197.0/24", + "74.125.198.0/24", + "74.125.199.0/24", + "74.125.200.0/24", + "74.125.20.0/24", + "74.125.201.0/24", + "74.125.202.0/24", + "74.125.203.0/24", + "74.125.204.0/24", + "74.125.205.0/24", + "74.125.206.0/24", + "74.125.21.0/24", + "74.125.225.0/24", + "74.125.226.0/24", + "74.125.227.0/24", + "74.125.228.0/24", + "74.125.230.0/24", + "74.125.23.0/24", + "74.125.232.0/24", + "74.125.234.0/24", + "74.125.235.0/24", + "74.125.236.0/24", + "74.125.238.0/24", + "74.125.24.0/24", + "74.125.27.0/24", + "74.125.28.0/24", + "74.125.30.0/24", + "74.125.31.0/24", + "74.125.39.0/24", + "74.125.44.0/22", + "74.125.6.0/24", + "74.125.68.0/24", + "74.125.69.0/24", + "74.125.70.0/24", + "74.125.71.0/24", + "74.125.72.0/22", + "8.34.208.0/21", + "8.34.216.0/21", + "8.35.192.0/21", + "8.35.200.0/21", + "8.8.4.0/24", + "8.8.8.0/24", + "89.207.231.0/24", + "173.255.112.0/24", + "173.255.113.0/24", + "173.255.114.0/24", + "173.255.115.0/24", + "173.255.116.0/24", + "173.255.117.0/24", + "173.255.118.0/24", + "173.255.119.0/24", + "173.255.120.0/24", + "173.255.121.0/24", + "173.255.122.0/24", + "173.255.123.0/24", + "173.255.124.0/24", + "173.255.125.0/24", + "173.255.126.0/24", + "173.255.127.0/24", + "162.222.179.0/24", + "35.227.0.0/16", + "35.185.0.0/16", + "35.186.0.0/16", + "35.187.0.0/16", + "35.188.0.0/16", + "35.189.0.0/16", + "35.190.0.0/16", + "35.190.0.0/16", + "35.191.0.0/16", + "35.192.0.0/16", + "35.193.0.0/16", + "35.194.0.0/16", + "35.195.0.0/16", + "35.196.0.0/16", + "35.197.0.0/16", + "35.198.0.0/16", + "35.199.0.0/16", + "35.200.0.0/16", + "35.201.0.0/16", + "35.202.0.0/16", + "35.203.0.0/16", + "35.204.0.0/16", + "35.205.0.0/16", + "35.206.0.0/16", + "35.207.0.0/16", + "35.208.0.0/16", + "35.209.0.0/16", + "35.210.0.0/16", + "35.211.0.0/16", + "35.212.0.0/16", + "35.213.0.0/16", + "35.214.0.0/16", + "35.215.0.0/16", + "35.216.0.0/16", + "35.217.0.0/16", + "35.218.0.0/16", + "35.219.0.0/16", + "35.220.0.0/16", + "35.221.0.0/16", + "35.222.0.0/16", + "35.223.0.0/16", + "35.224.0.0/16", + "35.225.0.0/16", + "35.226.0.0/16", + "35.227.0.0/16", + "35.228.0.0/16", + "35.229.0.0/16", + "35.230.0.0/16", + "35.231.0.0/16", + "35.232.0.0/16", + "35.233.0.0/16", + "35.234.0.0/16", + "35.235.0.0/16", + "35.236.0.0/16", + "35.237.0.0/16", + "35.238.0.0/16", + "35.239.0.0/16", + "35.240.0.0/16", + "35.241.0.0/16", + "35.242.0.0/16", + "35.243.0.0/16", + "35.244.0.0/16", + "35.245.0.0/16", + "35.246.0.0/16", + "35.247.0.0/16", + "104.155.0.0/16", + "104.196.0.0/16", + "104.197.0.0/16", + "104.198.0.0/16", + "104.199.0.0/16", + "64.15.112.0/24", + "64.15.113.0/24", + "64.15.114.0/24", + "64.15.115.0/24", + "64.15.116.0/24", + "64.15.117.0/24", + "64.15.118.0/24", + "64.15.119.0/24", + "64.15.120.0/24", + "64.15.121.0/24", + "64.15.122.0/24", + "64.15.123.0/24", + "64.15.124.0/24", + "64.15.125.0/24", + "64.15.126.0/24", + "64.15.127.0/24", + "216.58.209.0/24", + } + defs_amazon = []string{ + "3.0.0.0/8", + "63.33.0.0/16", + "13.32.0.0/16", + "13.33.0.0/16", + "13.34.0.0/16", + "13.35.0.0/16", + "13.36.0.0/16", + "13.37.0.0/16", + "13.38.0.0/16", + "13.39.0.0/16", + "13.40.0.0/16", + "13.41.0.0/16", + "13.42.0.0/16", + "13.43.0.0/16", + "13.44.0.0/16", + "13.45.0.0/16", + "13.46.0.0/16", + "13.47.0.0/16", + "13.48.0.0/16", + "13.49.0.0/16", + "13.50.0.0/16", + "13.51.0.0/16", + "13.52.0.0/16", + "13.53.0.0/16", + "13.54.0.0/16", + "13.55.0.0/16", + "13.56.0.0/16", + "13.57.0.0/16", + "13.58.0.0/16", + "13.112.0.0/16", + "13.113.0.0/16", + "13.124.0.0/16", + "13.125.0.0/16", + "13.126.0.0/16", + "13.208.0.0/16", + "13.209.0.0/16", + "13.210.0.0/16", + "13.224.0.0/16", + "13.225.0.0/16", + "13.226.0.0/16", + "13.227.0.0/16", + "13.230.0.0/16", + "13.232.0.0/16", + "13.249.0.0/16", + "13.250.0.0/16", + "15.160.0.0/16", + "15.188.0.0/16", + "15.197.0.0/16", + "15.236.0.0/16", + "15.237.0.0/16", + "18.66.0.0/16", + "18.117.0.0/16", + "18.118.0.0/16", + "18.119.0.0/16", + "18.120.0.0/16", + "18.121.0.0/16", + "18.122.0.0/16", + "18.123.0.0/16", + "18.124.0.0/16", + "18.125.0.0/16", + "18.126.0.0/16", + "18.127.0.0/16", + "18.128.0.0/16", + "18.129.0.0/16", + "18.130.0.0/16", + "18.131.0.0/16", + "18.132.0.0/16", + "18.133.0.0/16", + "18.134.0.0/16", + "18.153.0.0/16", + "18.154.0.0/16", + "18.155.0.0/16", + "18.156.0.0/16", + "18.157.0.0/16", + "18.158.0.0/16", + "18.159.0.0/16", + "18.160.0.0/16", + "18.161.0.0/16", + "18.162.0.0/16", + "18.163.0.0/16", + "18.164.0.0/16", + "18.165.0.0/16", + "18.166.0.0/16", + "18.167.0.0/16", + "18.168.0.0/16", + "18.169.0.0/16", + "18.170.0.0/16", + "18.171.0.0/16", + "18.172.0.0/16", + "18.173.0.0/16", + "18.174.0.0/16", + "18.175.0.0/16", + "18.176.0.0/16", + "18.177.0.0/16", + "18.178.0.0/16", + "18.179.0.0/16", + "18.180.0.0/16", + "18.181.0.0/16", + "18.182.0.0/16", + "18.184.0.0/16", + "18.185.0.0/16", + "18.186.0.0/16", + "18.187.0.0/16", + "18.188.0.0/16", + "18.189.0.0/16", + "18.190.0.0/16", + "18.191.0.0/16", + "18.192.0.0/16", + "18.193.0.0/16", + "18.194.0.0/16", + "18.195.0.0/16", + "18.196.0.0/16", + "18.197.0.0/16", + "18.198.0.0/16", + "18.199.0.0/16", + "18.200.0.0/16", + "18.201.0.0/16", + "18.202.0.0/16", + "18.203.0.0/16", + "18.204.0.0/16", + "18.205.0.0/16", + "18.206.0.0/16", + "18.206.0.0/16", + "18.207.0.0/16", + "18.208.0.0/16", + "18.229.0.0/16", + "18.232.0.0/16", + "18.233.0.0/16", + "23.20.0.0/16", + "23.21.0.0/16", + "23.22.0.0/16", + "50.18.0.0/16", + "50.112.0.0/16", + "54.65.0.0/16", + "52.84.0.0/16", + "52.85.0.0/16", + "52.86.0.0/16", + "52.87.0.0/16", + "52.88.0.0/16", + "52.89.0.0/16", + "52.90.0.0/16", + "52.91.0.0/16", + "52.92.0.0/16", + "52.93.0.0/16", + "52.94.0.0/16", + "52.95.0.0/16", + "52.200.0.0/16", + "63.32.0.0/16", + "63.34.0.0/16", + "18.211.0.0/16", + "18.212.0.0/16", + "18.213.0.0/16", + "18.214.0.0/16", + "34.192.0.0/16", + "34.193.0.0/16", + "34.194.0.0/16", + "34.195.0.0/16", + "34.196.0.0/16", + "34.197.0.0/16", + "34.198.0.0/16", + "34.199.0.0/16", + "34.200.0.0/16", + "34.201.0.0/16", + "34.202.0.0/16", + "34.203.0.0/16", + "34.204.0.0/16", + "34.205.0.0/16", + "34.206.0.0/16", + "34.207.0.0/16", + "34.208.0.0/16", + "34.209.0.0/16", + "34.210.0.0/16", + "34.211.0.0/16", + "34.212.0.0/16", + "34.213.0.0/16", + "34.214.0.0/16", + "34.215.0.0/16", + "34.216.0.0/16", + "34.217.0.0/16", + "34.225.0.0/16", + "34.226.0.0/16", + "34.227.0.0/16", + "34.228.0.0/16", + "34.229.0.0/16", + "34.230.0.0/16", + "34.231.0.0/16", + "34.232.0.0/16", + "34.233.0.0/16", + "34.234.0.0/16", + "34.235.0.0/16", + "34.236.0.0/16", + "34.237.0.0/16", + "34.238.0.0/16", + "34.239.0.0/16", + "34.240.0.0/16", + "34.241.0.0/16", + "34.242.0.0/16", + "34.243.0.0/16", + "34.244.0.0/16", + "34.245.0.0/16", + "34.246.0.0/16", + "34.247.0.0/16", + "34.248.0.0/16", + "34.249.0.0/16", + "34.250.0.0/16", + "34.251.0.0/16", + "34.252.0.0/16", + "34.253.0.0/16", + "34.254.0.0/16", + "34.255.0.0/16", + "35.71.0.0/16", + "35.72.0.0/16", + "35.73.0.0/16", + "35.74.0.0/16", + "35.75.0.0/16", + "35.76.0.0/16", + "35.77.0.0/16", + "35.78.0.0/16", + "35.79.0.0/16", + "35.80.0.0/16", + "35.81.0.0/16", + "35.82.0.0/16", + "35.152.0.0/16", + "35.153.0.0/16", + "35.154.0.0/16", + "35.155.0.0/16", + "35.156.0.0/16", + "35.157.0.0/16", + "35.158.0.0/16", + "35.159.0.0/16", + "35.160.0.0/16", + "35.161.0.0/16", + "35.162.0.0/16", + "35.163.0.0/16", + "35.164.0.0/16", + "35.165.0.0/16", + "35.166.0.0/16", + "35.167.0.0/16", + "35.168.0.0/16", + "35.169.0.0/16", + "35.170.0.0/16", + "35.171.0.0/16", + "35.172.0.0/16", + "35.173.0.0/16", + "35.174.0.0/16", + "35.175.0.0/16", + "35.176.0.0/16", + "35.177.0.0/16", + "35.178.0.0/16", + "35.179.0.0/16", + "35.180.0.0/16", + "35.181.0.0/16", + "35.182.0.0/16", + "35.183.0.0/16", + "44.193.0.0/16", + "44.194.0.0/16", + "44.195.0.0/16", + "44.196.0.0/16", + "44.197.0.0/16", + "44.198.0.0/16", + "44.199.0.0/16", + "44.200.0.0/16", + "44.201.0.0/16", + "44.202.0.0/16", + "44.203.0.0/16", + "44.204.0.0/16", + "44.205.0.0/16", + "44.206.0.0/16", + "44.207.0.0/16", + "44.208.0.0/16", + "44.209.0.0/16", + "44.210.0.0/16", + "44.211.0.0/16", + "44.212.0.0/16", + "44.213.0.0/16", + "44.214.0.0/16", + "44.215.0.0/16", + "44.216.0.0/16", + "44.217.0.0/16", + "44.218.0.0/16", + "44.219.0.0/16", + "44.220.0.0/16", + "44.221.0.0/16", + "44.222.0.0/16", + "44.223.0.0/16", + "44.224.0.0/16", + "44.225.0.0/16", + "44.226.0.0/16", + "44.236.0.0/16", + "44.239.0.0/16", + "52.1.0.0/16", + "52.2.0.0/16", + "52.3.0.0/16", + "52.4.0.0/16", + "52.5.0.0/16", + "52.6.0.0/16", + "52.10.0.0/16", + "52.16.0.0/16", + "52.17.0.0/16", + "52.18.0.0/16", + "52.19.0.0/16", + "52.20.0.0/16", + "52.21.0.0/16", + "52.22.0.0/16", + "52.23.0.0/16", + "52.24.0.0/16", + "52.25.0.0/16", + "52.26.0.0/16", + "52.27.0.0/16", + "52.28.0.0/16", + "52.29.0.0/16", + "52.30.0.0/16", + "52.31.0.0/16", + "52.32.0.0/16", + "52.33.0.0/16", + "52.34.0.0/16", + "52.35.0.0/16", + "52.36.0.0/16", + "52.37.0.0/16", + "52.38.0.0/16", + "52.39.0.0/16", + "52.40.0.0/16", + "52.41.0.0/16", + "52.42.0.0/16", + "52.43.0.0/16", + "52.44.0.0/16", + "52.45.0.0/16", + "52.46.0.0/16", + "52.47.0.0/16", + "52.48.0.0/16", + "52.49.0.0/16", + "52.50.0.0/16", + "52.51.0.0/16", + "52.52.0.0/16", + "52.53.0.0/16", + "52.54.0.0/16", + "52.55.0.0/16", + "52.56.0.0/16", + "52.57.0.0/16", + "52.58.0.0/16", + "52.59.0.0/16", + "52.60.0.0/16", + "52.70.0.0/16", + "52.72.0.0/16", + "52.73.0.0/16", + "52.74.0.0/16", + "52.119.0.0/16", + "52.192.0.0/16", + "52.193.0.0/16", + "52.194.0.0/16", + "52.195.0.0/16", + "52.196.0.0/16", + "52.197.0.0/16", + "52.198.0.0/16", + "52.199.0.0/16", + "52.200.0.0/16", + "52.201.0.0/16", + "52.202.0.0/16", + "52.203.0.0/16", + "52.204.0.0/16", + "52.205.0.0/16", + "52.206.0.0/16", + "52.207.0.0/16", + "52.208.0.0/16", + "52.209.0.0/16", + "52.210.0.0/16", + "52.211.0.0/16", + "52.212.0.0/16", + "52.213.0.0/16", + "52.214.0.0/16", + "52.215.0.0/16", + "52.216.0.0/16", + "52.217.0.0/16", + "52.218.0.0/16", + "52.219.0.0/16", + "52.220.0.0/16", + "52.221.0.0/16", + "52.222.0.0/16", + "54.64.0.0/16", + "54.65.0.0/16", + "54.69.0.0/16", + "54.70.0.0/16", + "54.71.0.0/16", + "54.72.0.0/16", + "54.73.0.0/16", + "54.74.0.0/16", + "54.75.0.0/16", + "54.76.0.0/16", + "54.77.0.0/16", + "54.78.0.0/16", + "54.79.0.0/16", + "54.80.0.0/16", + "54.81.0.0/16", + "54.82.0.0/16", + "54.83.0.0/16", + "54.84.0.0/16", + "54.85.0.0/16", + "54.86.0.0/16", + "54.91.0.0/16", + "54.95.0.0/16", + "54.145.0.0/16", + "54.165.0.0/16", + "54.195.0.0/16", + "54.220.0.0/16", + "54.65.0.0/16", + "54.151.0.0/16", + "54.152.0.0/16", + "54.153.0.0/16", + "54.154.0.0/16", + "54.155.0.0/16", + "54.156.0.0/16", + "54.157.0.0/16", + "54.158.0.0/16", + "54.159.0.0/16", + "54.160.0.0/16", + "54.161.0.0/16", + "54.162.0.0/16", + "54.163.0.0/16", + "54.164.0.0/16", + "54.165.0.0/16", + "54.166.0.0/16", + "54.167.0.0/16", + "54.168.0.0/16", + "54.169.0.0/16", + "54.170.0.0/16", + "54.171.0.0/16", + "54.172.0.0/16", + "54.173.0.0/16", + "54.174.0.0/16", + "54.175.0.0/16", + "54.176.0.0/16", + "54.177.0.0/16", + "54.191.0.0/16", + "54.192.0.0/16", + "54.193.0.0/16", + "54.194.0.0/16", + "54.195.0.0/16", + "54.196.0.0/16", + "54.200.0.0/16", + "54.201.0.0/16", + "54.202.0.0/16", + "54.203.0.0/16", + "54.204.0.0/16", + "54.205.0.0/16", + "54.206.0.0/16", + "54.207.0.0/16", + "54.208.0.0/16", + "54.209.0.0/16", + "54.210.0.0/16", + "54.211.0.0/16", + "54.212.0.0/16", + "54.213.0.0/16", + "54.214.0.0/16", + "54.215.0.0/16", + "54.216.0.0/16", + "54.217.0.0/16", + "54.218.0.0/16", + "54.219.0.0/16", + "54.220.0.0/16", + "54.221.0.0/16", + "54.222.0.0/16", + "54.223.0.0/16", + "54.224.0.0/16", + "54.225.0.0/16", + "54.226.0.0/16", + "54.227.0.0/16", + "54.228.0.0/16", + "54.229.0.0/16", + "54.237.0.0/16", + "54.238.0.0/16", + "54.239.0.0/16", + "54.240.0.0/16", + "54.241.0.0/16", + "54.242.0.0/16", + "54.243.0.0/16", + "54.244.0.0/16", + "54.245.0.0/16", + "54.246.0.0/16", + "54.252.0.0/16", + "63.35.0.0/16", + "72.21.195.0/24", + "72.44.45.0/24", + "52.48.0.0/16", + "52.222.0.0/16", + "54.91.0.0/16", + "52.3.0.0/16", + "79.125.21.0/24", + "79.125.22.0/24", + "79.125.23.0/24", + "205.251.0.0/16", + "209.54.177.0/24", + "209.54.178.0/24", + "209.54.179.0/24", + "209.54.180.0/24", + "209.54.181.0/24", + "209.54.182.0/24", + "209.54.183.0/24", + "209.54.184.0/24", + "209.54.185.0/24", + "209.54.186.0/24", + "209.54.187.0/24", + "209.54.188.0/24", + "209.54.189.0/24", + "209.54.190.0/24", + "184.73.0.0/16", + "107.22.0.0/16", + "99.79.0.0/16", + "99.80.0.0/16", + "99.81.0.0/16", + "99.82.0.0/16", + "99.83.0.0/16", + "99.84.0.0/16", + "99.86.0.0/16", + "100.20.0.0/14", + "100.24.0.0/16", + "100.25.0.0/16", + "103.4.9.0/24", + "103.124.134.0/24", + "103.124.135.0/24", + "103.127.75.0/24", + "103.136.10.0/24", + "103.143.45.0/24", + "103.145.182.0/24", + "103.145.192.0/24", + "103.147.71.0/24", + "103.149.112.0/24", + "103.150.161.0/24", + "103.151.192.0/24", + "103.151.193.0/24", + "103.152.248.0/24", + "103.153.47.0/24", + "103.16.101.0/24", + "103.16.59.0/24", + "103.161.77.0/24", + "103.165.160.0/24", + "103.124.134.0/24", + "103.124.135.0/24", + "103.127.75.0/24", + "103.136.10.0/24", + "103.138.231.0/24", + "103.143.45.0/24", + "103.145.192.0/24", + "103.147.71.0/24", + "103.149.112.0/24", + "103.150.161.0/24", + "103.150.47.0/24", + "103.151.192.0/24", + "103.151.193.0/24", + "103.151.24.0/24", + "103.152.248.0/24", + "103.153.47.0/24", + "103.16.101.0/24", + "108.128.0.0/16", + "108.129.0.0/16", + "108.138.0.0/16", + "143.204.0.0/16", + "176.32.98.0/24", + "176.32.101.0/24", + "176.34.0.0/16", + } + defs_digitalocean = []string{ + "103.253.144.0/22", + "104.72.73.0/24", + "104.131.0.0/18", + "104.131.128.0/20", + "104.131.144.0/20", + "104.131.160.0/20", + "104.131.176.0/20", + "104.131.192.0/19", + "104.131.224.0/19", + "104.131.64.0/18", + "104.236.0.0/18", + "104.236.128.0/18", + "104.236.192.0/18", + "104.236.64.0/18", + "104.248.0.0/20", + "104.248.100.0/22", + "104.248.104.0/22", + "104.248.108.0/22", + "104.248.112.0/20", + "104.248.128.0/20", + "104.248.144.0/20", + "138.68.0.0/16", + "138.197.0.0/16", + "139.59.0.0/16", + "68.183.0.0/16", + "107.170.0.0/16", + "142.93.0.0/16", + "146.185.167.0/24", + "159.89.0.0/16", + "159.65.0.0/16", + "159.203.0.0/16", + "167.172.0.0/16", + "188.226.144.0/24", + "198.199.67.0/24", + "198.199.74.0/24", + "198.211.116.0/24", + "206.189.0.0/16", + "104.248.0.0/16", + "174.138.29.0/24", + "162.243.0.0/16", + "165.227.0.0/16", + "167.99.0.0/16", + "45.55.0.0/16", + "46.101.0.0/16", + "104.131.0.0/16", + "104.236.0.0/16", + "178.128.0.0/16", + "192.241.128.0/24", + "192.241.129.0/24", + "192.241.130.0/24", + "192.241.131.0/24", + "192.241.132.0/24", + "192.241.133.0/24", + "192.241.134.0/24", + "192.241.135.0/24", + "192.241.136.0/24", + "192.241.137.0/24", + "192.241.138.0/24", + "192.241.139.0/24", + "192.241.140.0/24", + "192.241.141.0/24", + "192.241.142.0/24", + "192.241.143.0/24", + "192.241.144.0/24", + "192.241.145.0/24", + "192.241.146.0/24", + "192.241.147.0/24", + "192.241.148.0/24", + "192.241.149.0/24", + "192.241.150.0/24", + "192.241.151.0/24", + "192.241.152.0/24", + "192.241.153.0/24", + "192.241.154.0/24", + "192.241.155.0/24", + "192.241.156.0/24", + "192.241.157.0/24", + "192.241.158.0/24", + "192.241.159.0/24", + "192.241.160.0/24", + "192.241.161.0/24", + "192.241.162.0/24", + "192.241.163.0/24", + "192.241.164.0/24", + "192.241.165.0/24", + "192.241.166.0/24", + "192.241.167.0/24", + "192.241.168.0/24", + "192.241.169.0/24", + "192.241.170.0/24", + "192.241.171.0/24", + "192.241.172.0/24", + "192.241.173.0/24", + "192.241.174.0/24", + "192.241.175.0/24", + "192.241.176.0/24", + "192.241.177.0/24", + "192.241.178.0/24", + "192.241.179.0/24", + "192.241.180.0/24", + "192.241.181.0/24", + "192.241.182.0/24", + "192.241.183.0/24", + "192.241.184.0/24", + "192.241.185.0/24", + "192.241.186.0/24", + "192.241.187.0/24", + "192.241.188.0/24", + "192.241.189.0/24", + "192.241.190.0/24", + "192.241.191.0/24", + "192.241.192.0/24", + "192.241.193.0/24", + "192.241.194.0/24", + "192.241.195.0/24", + "192.241.196.0/24", + "192.241.197.0/24", + "192.241.198.0/24", + "192.241.199.0/24", + "192.241.200.0/24", + "192.241.201.0/24", + "192.241.202.0/24", + "192.241.203.0/24", + "192.241.204.0/24", + "192.241.205.0/24", + "192.241.206.0/24", + "192.241.207.0/24", + "192.241.208.0/24", + "192.241.209.0/24", + "192.241.210.0/24", + "192.241.211.0/24", + "192.241.212.0/24", + "192.241.213.0/24", + "192.241.214.0/24", + "192.241.215.0/24", + "192.241.216.0/24", + "192.241.217.0/24", + "192.241.218.0/24", + "192.241.219.0/24", + "192.241.220.0/24", + "192.241.221.0/24", + "192.241.222.0/24", + "192.241.223.0/24", + "192.241.224.0/24", + "192.241.225.0/24", + "192.241.226.0/24", + "192.241.227.0/24", + "192.241.228.0/24", + "192.241.229.0/24", + "192.241.230.0/24", + "192.241.231.0/24", + "192.241.232.0/24", + "192.241.233.0/24", + "192.241.234.0/24", + "192.241.235.0/24", + "192.241.236.0/24", + "192.241.237.0/24", + "192.241.238.0/24", + "192.241.239.0/24", + "192.241.240.0/24", + "192.241.241.0/24", + "192.241.242.0/24", + "192.241.243.0/24", + "192.241.244.0/24", + "192.241.245.0/24", + "192.241.246.0/24", + "192.241.247.0/24", + "192.241.248.0/24", + "192.241.249.0/24", + "192.241.250.0/24", + "192.241.251.0/24", + "192.241.252.0/24", + "192.241.253.0/24", + "192.241.254.0/24", + "192.241.255.0/24", + "174.138.29.0/24", + } + defs_smartadservers = []string{"199.187.192.0/22"} + defs_adjust = []string{ + "185.151.204.0/24", + "185.151.205.0/24", + "185.151.206.0/24", + "185.151.207.0/24", + "185.230.39.0/24", + "185.255.24.0/22", + } + defs_adify_corporation = []string{ + "74.117.196.0/24", + "74.117.197.0/24", + "74.117.198.0/24", + "74.117.199.0/24", + } + defs_indexExchange = []string{ + "185.80.36.0/24", + "185.80.37.0/24", + "185.80.38.0/24", + "185.80.39.0/24", + } + defs_kaspersky = []string{ + "81.19.104.0/24", + "195.122.177.128/25", + "62.67.238.128/25", + "77.74.176.0/24", + "77.74.177.0/24", + "77.74.178.0/24", + "77.74.179.0/24", + "77.74.180.0/24", + "77.74.181.0/24", + "77.74.182.0/24", + "77.74.183.0/24", + "82.202.184.0/24", + "82.202.185.0/24", + "82.202.186.0/24", + "82.202.187.0/24", + "82.202.188.0/24", + "82.202.189.0/24", + "82.202.190.0/24", + "82.202.191.0/24", + "93.159.230.0/24", + } + defs_internet_archive = []string{"207.241.224.0/20", "208.70.24.0/21"} + defs_conviva = []string{ + "199.127.193.0/24", + "199.127.192.0/24", + "199.127.193.0/24", + "199.127.194.0/24", + "199.127.195.0/24", + "8.15.246.0/24", + "8.5.250.0/24", + } + defs_avast = []string{"77.234.43.0/24"} + defs_eulerian = []string{"109.232.192.0/21"} + defs_trendmicro = []string{"150.70.183.0/24"} + defs_automattic = []string{"192.0.77.0/24", "192.0.73.0/24"} + defs_inmotion = []string{ + "192.249.118.0/24", + "104.152.108.0/22", + "104.244.120.0/21", + "104.244.120.0/23", + "104.244.122.0/24", + "104.244.123.0/24", + "104.244.124.0/22", + "104.247.72.0/23", + "104.247.74.0/23", + "144.208.64.0/22", + "144.208.68.0/22", + "173.231.192.0/20", + "173.231.224.0/20", + "173.231.232.0/21", + "173.231.232.0/22", + "173.231.236.0/22", + "173.247.240.0/22", + "173.247.244.0/23", + "173.247.246.0/23", + "173.247.248.0/21", + "192.145.232.0/21", + } + defs_limelight_networks = []string{ + "95.140.239.0/24", + "111.119.0.0/22", + "111.119.11.0/24", + "111.119.16.0/23", + "111.119.20.0/23", + "111.119.22.0/23", + "111.119.24.0/21", + "111.119.4.0/22", + "117.121.248.0/21", + "117.121.248.0/22", + "117.121.248.0/23", + "117.121.250.0/23", + "117.121.254.0/23", + "172.105.130.0/23", + "172.105.132.0/23", + "172.105.140.0/23", + "172.105.142.0/23", + "178.249.104.0/21", + "178.249.105.0/24", + "178.79.192.0/18", + "178.79.196.0/23", + } + defs_sdv_plurimedia = []string{ + "212.95.74.0/24", + "213.225.160.0/19", + "212.95.64.0/19", + "88.151.14.0/24", + } + defs_linkdein = []string{ + "185.63.144.0/24", + "185.63.145.0/24", + "185.63.146.0/24", + "185.63.147.0/24", + } + defs_appnexus = []string{ + "185.33.221.0/24", + "103.43.88.0/24", + "103.43.89.0/24", + "103.43.90.0/23", + "104.254.148.0/22", + "172.83.92.0/24", + "185.33.220.0/22", + "185.83.140.0/22", + "185.89.208.0/22", + "192.190.7.0/24", + "204.13.192.0/21", + "204.13.193.0/24", + "207.237.150.0/24", + "216.252.164.0/23", + "216.252.166.0/24", + "37.252.160.0/21", + "37.252.168.0/21", + "43.250.0.0/22", + "64.208.136.0/22", + "64.208.140.0/24", + "64.208.141.0/24", + } + defs_telegram_messgenger = []string{ + "149.154.160.0/24", + "149.154.161.0/24", + "149.154.162.0/24", + "149.154.163.0/24", + "149.154.164.0/24", + "149.154.165.0/24", + "149.154.166.0/24", + "149.154.167.0/24", + "149.154.168.0/24", + "149.154.169.0/24", + "149.154.170.0/24", + "149.154.171.0/24", + "149.154.172.0/24", + "149.154.173.0/24", + "149.154.174.0/24", + "149.154.175.0/24", + "149.154.160.0/22", + "149.154.164.0/22", + "91.108.4.0/22", + "91.108.56.0/22", + "91.108.8.0/22", + "95.161.64.0/20", + } + defs_remote_control = []string{ + "64.68.120.0/24", + "162.253.7.0/24", + "162.253.2.0/24", + "185.188.32.0/24", + "185.188.33.0/24", + "185.188.34.0/24", + "185.188.35.0/24", + "185.188.36.0/24", + } + defs_monaco_telecom = []string{ + "80.94.98.0/24", + "91.199.109.0/24", + "91.198.207.0/24", + "88.209.64.0/18", + "87.254.224.0/19", + "82.113.0.0/19", + "185.162.120.0/22", + "185.250.4.0/22", + "193.105.1.0/24", + "195.20.192.0/23", + "80.94.96.0/20", + } + defs_controld = []string{"76.76.2.0/24"} + defs_convia_inc = []string{ + "199.127.192.0/24", + "199.127.193.0/24", + "199.127.194.0/24", + "199.127.195.0/24", + "8.15.246.0/24", + "8.5.250.0/24", + } + defs_internap_holding = []string{ + "63.251.0.0/16", + "107.150.146.0/23", + "107.6.104.0/22", + "107.6.64.0/21", + "107.6.72.0/21", + "107.6.80.0/21", + "107.6.88.0/21", + "107.6.88.0/22", + "107.6.92.0/23", + "107.6.92.0/24", + "107.6.93.0/24", + "107.6.96.0/21", + "107.6.96.0/24", + "162.217.100.0/22", + "162.217.96.0/22", + "162.217.96.0/24", + "162.217.98.0/24", + "162.217.99.0/24", + "173.231.128.0/18", + "173.231.176.0/22", + "173.231.180.0/23", + "72.251.241.0/24", + } + defs_salesforce = []string{ + "136.146.0.0/16", + "96.43.144.0/24", + "96.43.145.0/24", + "96.43.146.0/24", + "96.43.147.0/24", + "96.43.148.0/24", + "96.43.149.0/24", + "96.43.150.0/24", + "96.43.151.0/24", + "96.43.152.0/24", + "96.43.153.0/24", + "96.43.154.0/24", + "96.43.155.0/24", + "96.43.156.0/24", + "96.43.157.0/24", + "96.43.158.0/24", + "96.43.159.0/24", + "85.222.128.0/24", + "85.222.129.0/24", + "85.222.130.0/24", + "85.222.131.0/24", + "85.222.132.0/24", + "85.222.133.0/24", + "85.222.134.0/24", + "85.222.135.0/24", + "85.222.136.0/24", + "85.222.137.0/24", + "85.222.138.0/24", + "85.222.139.0/24", + "85.222.140.0/24", + "85.222.141.0/24", + "85.222.142.0/24", + "85.222.143.0/24", + "85.222.144.0/24", + "85.222.145.0/24", + "85.222.146.0/24", + "85.222.147.0/24", + "85.222.148.0/24", + "85.222.149.0/24", + "85.222.150.0/24", + "85.222.151.0/24", + "85.222.152.0/24", + "85.222.153.0/24", + "85.222.154.0/24", + "85.222.155.0/24", + "85.222.156.0/24", + "85.222.157.0/24", + "85.222.158.0/24", + "85.222.159.0/24", + } + defs_adobe = []string{ + "66.235.149.0/24", + "63.140.33.0/24", + "63.140.34.0/24", + "63.140.41.0/24", + "63.140.60.0/24", + "63.140.61.0/24", + "172.82.225.0/24", + "172.82.229.0/24", + "172.82.228.0/24", + "172.82.230.0/24", + "172.82.231.0/24", + "172.82.232.0/24", + "172.82.233.0/24", + "172.82.233.0/24", + "172.82.234.0/24", + "172.82.235.0/24", + "172.82.236.0/24", + "172.82.237.0/24", + "172.82.238.0/24", + "172.82.239.0/24", + "172.82.240.0/24", + "172.82.241.0/24", + "172.82.242.0/24", + "172.82.243.0/24", + "172.82.244.0/24", + "172.82.245.0/24", + "172.82.246.0/24", + "172.82.247.0/24", + "172.82.248.0/24", + "172.82.249.0/24", + "172.82.250.0/24", + "192.147.130.0/24", + "192.243.246.0/24", + } + def_unversity = []string{ + "45.90.132.0/22", + "129.69.0.0/24", + "129.69.0.0/16", + "129.143.0.0/24", + "129.143.0.0/16", + "129.143.87.80/28", + "129.206.0.0/24", + "129.206.0.0/16", + "132.230.0.0/24", + "132.230.0.0/16", + "134.2.0.0/24", + "134.2.0.0/16", + "134.34.0.0/24", + "134.34.0.0/16", + "134.60.0.0/24", + "134.60.0.0/16", + "134.103.0.0/24", + "134.103.0.0/16", + "134.108.0.0/24", + "134.108.0.0/16", + "134.155.0.0/24", + "134.155.0.0/16", + "141.7.0.0/24", + "141.7.0.0/16", + "141.10.0.0/24", + "141.10.0.0/16", + "141.18.0.0/24", + "141.18.0.0/16", + "141.18.0.0/15", + "141.19.0.0/24", + "141.19.0.0/16", + "141.28.0.0/24", + "141.28.0.0/16", + "141.31.0.0/24", + "141.31.0.0/16", + "141.37.0.0/24", + "141.37.0.0/16", + "141.47.0.0/24", + "141.47.0.0/16", + "141.58.0.0/24", + "141.58.0.0/16", + "141.58.0.0/15", + "141.59.0.0/24", + "141.59.0.0/16", + "141.62.0.0/24", + "141.62.0.0/17", + "141.62.0.0/16", + "141.68.0.0/24", + "141.68.0.0/16", + "141.68.0.0/15", + "141.69.0.0/24", + "141.69.0.0/16", + "141.70.0.0/24", + "141.70.0.0/16", + "141.70.128.0/17", + "141.72.0.0/24", + "141.72.0.0/17", + "141.72.0.0/16", + "141.72.128.0/18", + "141.79.0.0/24", + "141.79.0.0/16", + "141.87.0.0/24", + "141.87.0.0/16", + "144.41.0.0/24", + "144.41.0.0/16", + "147.142.0.0/24", + "147.142.0.0/16", + "153.96.83.0/24", + "161.42.0.0/24", + "161.42.0.0/16", + "185.134.84.0/22", + "192.42.143.0/24", + "192.52.0.0/19", + "192.52.32.0/20", + "192.52.48.0/23", + "192.52.50.0/24", + "192.67.189.0/24", + "192.67.208.0/24", + "192.108.35.0/24", + "192.108.36.0/22", + "192.108.40.0/22", + "192.108.44.0/24", + "192.109.76.0/24", + "193.196.0.0/21", + "193.196.0.0/15", + "193.196.9.0/24", + "193.196.13.0/24", + "193.196.16.0/20", + "193.196.64.0/18", + "193.196.129.0/24", + "193.196.132.0/22", + "193.196.136.0/21", + "193.196.144.0/21", + "193.196.152.0/24", + "193.196.154.0/23", + "193.196.156.0/22", + "193.196.160.0/22", + "193.196.165.0/24", + "193.196.166.0/23", + "193.196.168.0/21", + "193.196.176.0/20", + "193.196.192.0/18", + "193.197.0.0/24", + "193.197.4.0/23", + "193.197.8.0/22", + "193.197.20.0/23", + "193.197.28.0/22", + "193.197.32.0/19", + "193.197.64.0/22", + "193.197.68.0/23", + "193.197.70.0/24", + "193.197.80.0/22", + "193.197.85.0/24", + "193.197.86.0/23", + "193.197.94.0/24", + "193.197.120.0/21", + "193.197.130.0/24", + "193.197.132.0/22", + "193.197.136.0/21", + "193.197.149.0/24", + "193.197.152.0/22", + "193.197.157.0/24", + "193.197.160.0/23", + "193.197.168.0/21", + "193.197.180.0/22", + "193.197.200.0/21", + "193.197.212.0/24", + "193.197.224.0/19", + "132.203.0.0/16", + "132.219.137.0/24", + } + def_vodaphone = []string{ + "195.27.0.0/16", + "195.59.0.0/16", + "196.55.215.0/24", + "176.95.132.0/24", + "5.28.194.0/24", + } + def_apple = []string{"17.0.0.0/8"} + def_ionos = []string{ + "104.192.4.0/22", + "104.219.40.0/22", + "104.254.244.0/22", + "108.175.0.0/20", + "162.255.84.0/22", + "185.132.36.0/22", + "185.132.40.0/22", + "192.195.77.0/24", + "195.20.224.0/19", + "198.251.64.0/20", + "198.71.48.0/20", + "212.227.0.0/16", + "212.227.148.0/23", + "212.227.168.0/23", + "212.227.226.0/23", + "212.227.228.0/23", + "217.160.86.0/24", + } + def_fly_io = []string{"213.188.196.0/24"} + def_mach_dilemma = []string{ + "103.196.38.0/24", + "103.196.36.0/24", + "103.196.37.0/24", + "103.196.38.0/24", + "103.196.39.0/24", + "198.72.6.0/24", + "45.127.114.0/24", + "45.127.115.0/24", + } + def_facebook = []string{ + "31.13.65.0/24", + "31.13.83.0/24", + "179.60.192.0/24", + "157.240.0.0/16", + "102.132.100.0/24", + "102.132.101.0/24", + "102.132.96.0/20", + "102.132.96.0/24", + "102.132.99.0/24", + "103.4.96.0/22", + "129.134.0.0/17", + "129.134.25.0/24", + "129.134.26.0/24", + "129.134.27.0/24", + "129.134.28.0/24", + "129.134.29.0/24", + "129.134.30.0/23", + "129.134.30.0/24", + "129.134.31.0/24", + "129.134.64.0/24", + "129.134.65.0/24", + "129.134.66.0/24", + "129.134.67.0/24", + "129.134.68.0/24", + } + def_fastly = []string{ + "185.199.108.0/24", + "185.199.109.0/24", + "185.199.110.0/24", + "185.199.111.0/24", + "199.232.0.0/16", + "151.101.0.0/16", + } + def_bouygues_telecom = []string{"213.44.0.0/16"} + def_rubicon_project = []string{ + "69.173.144.0/24", + "192.203.231.0/24", + "195.122.175.0/24", + "208.185.50.0/24", + "213.19.162.0/24", + "69.173.144.0/24", + "69.173.145.0/24", + "69.173.148.0/22", + "69.173.154.0/23", + "69.173.158.0/24", + "8.43.72.0/22", + } + def_roblox = []string{ + "128.116.121.0/24", + "103.140.28.0/23", + "128.116.0.0/17", + "128.116.0.0/24", + "128.116.1.0/24", + "128.116.100.0/24", + "128.116.101.0/24", + "128.116.102.0/24", + "128.116.105.0/24", + "128.116.11.0/24", + "128.116.112.0/24", + "128.116.113.0/24", + "128.116.114.0/24", + "128.116.115.0/24", + "128.116.116.0/24", + "128.116.117.0/24", + "128.116.118.0/24", + "128.116.119.0/24", + "128.116.120.0/24", + "128.116.121.0/24", + "128.116.122.0/24", + } + def_highwinds_network_group = []string{ + "151.139.128.0/24", + "151.139.130.0/24", + "151.139.254.0/24", + "151.139.255.0/24", + "205.185.208.0/24", + "205.185.216.0/24", + "209.197.2.0/24", + "209.197.3.0/24", + "64.145.64.0/24", + "69.16.174.0/24", + "69.16.175.0/24", + } + def_m247 = []string{ + "102.128.164.0/24", + "102.128.165.0/24", + "102.129.156.0/24", + "102.165.22.0/24", + "102.38.232.0/24", + "103.105.164.0/24", + "103.110.105.0/24", + "103.111.32.0/24", + "103.115.185.0/24", + "103.129.116.0/24", + "103.129.117.0/24", + "103.129.118.0/24", + "103.129.119.0/24", + "103.130.178.0/24", + "103.131.235.0/24", + "193.19.108.0/24", + "194.242.2.0/24", + } + def_canalplus = []string{ + "185.86.252.0/23", + "185.86.253.0/24", + "185.86.254.0/24", + "185.86.255.0/24", + } + def_network_of_data_centers = []string{"81.163.16.0/24"} + def_akamai = []string{ + "2.16.0.0/16", + "2.17.0.0/16", + "2.18.85.0/24", + "2.18.107.0/24", + "2.18.134.0/24", + "2.18.133.0/24", + "2.18.131.0/24", + "2.18.132.0/24", + "2.18.231.0/24", + "2.18.247.0/24", + "2.19.88.0/24", + "2.19.227.0/24", + "2.20.0.0/16", + "2.21.0.0/16", + "2.22.0.0/16", + "2.23.92.0/24", + "23.1.0.0/16", + "23.33.0.0/16", + "23.37.0.0/16", + "23.38.0.0/16", + "23.39.0.0/16", + "23.40.0.0/16", + "23.41.0.0/16", + "23.42.0.0/16", + "23.43.0.0/16", + "23.44.0.0/16", + "23.45.0.0/16", + "23.46.0.0/16", + "23.47.0.0/16", + "23.48.0.0/16", + "23.48.0.0/16", + "23.49.0.0/16", + "23.50.0.0/16", + "23.51.0.0/16", + "23.52.0.0/16", + "23.53.0.0/16", + "23.54.0.0/16", + "23.55.0.0/16", + "23.56.0.0/16", + "23.57.0.0/16", + "23.58.0.0/16", + "23.59.0.0/16", + "23.60.0.0/16", + "23.61.91.0/24", + "23.72.0.0/16", + "23.77.0.0/16", + "23.200.0.0/16", + "23.205.0.0/16", + "23.207.0.0/16", + "23.212.0.0/16", + "23.220.0.0/16", + "23.221.0.0/16", + "23.222.0.0/16", + "23.223.0.0/16", + "23.224.0.0/16", + "104.87.0.0/16", + "104.67.0.0/16", + "23.17.0.0/16", + "88.221.0.0/16", + "96.6.0.0/16", + "103.225.242.0/24", + "103.238.150.0/23", + "103.51.152.0/24", + "103.95.84.0/22", + "104.80.0.0/16", + "104.100.112.0/20", + "104.100.128.0/19", + "104.100.16.0/20", + "104.100.160.0/22", + "104.100.172.0/22", + "104.100.176.0/20", + "104.100.192.0/19", + "104.100.224.0/19", + "104.100.32.0/20", + "104.100.48.0/20", + "104.100.64.0/20", + "104.100.80.0/22", + "104.100.84.0/23", + "104.100.86.0/23", + "104.100.88.0/22", + "104.100.96.0/20", + "104.101.0.0/20", + "104.82.0.0/16", + "104.100.170.0/24", + "104.100.93.0/24", + "104.101.104.0/22", + "104.101.108.0/22", + "104.101.192.0/22", + "104.101.196.0/22", + "104.101.204.0/22", + "104.108.55.0/24", + "104.101.208.0/24", + "104.101.210.0/24", + "104.101.211.0/24", + "104.101.212.0/22", + "104.101.216.0/22", + "104.101.224.0/22", + "104.101.228.0/24", + "104.101.229.0/24", + "104.101.232.0/22", + "104.101.98.0/23", + "104.102.24.0/24", + "104.102.241.0/24", + "104.103.0.0/16", + "104.106.88.0/23", + "104.107.166.0/23", + "104.110.180.0/22", + "104.74.25.0/24", + "104.74.64.0/24", + "104.77.210.0/23", + "104.80.26.0/23", + "104.82.188.0/23", + "104.86.0.0/16", + "104.90.206.0/23", + "104.91.56.0/23", + "104.93.90.0/23", + "104.108.0.0/16", + "184.25.0.0/16", + "184.50.30.0/23", + "184.51.140.0/24", + "184.51.254.0/23", + "184.51.255.0/24", + "184.85.251.0/24", + "193.108.152.0/22", + "193.108.152.0/24", + "193.108.88.0/21", + "195.245.124.0/23", + "195.245.126.0/23", + "84.53.148.0/24", + "92.123.0.0/16", + "95.100.0.0/16", + "95.101.0.0/16", + "69.192.0.0/16", + "104.108.0.0/16", + "104.120.0.0/16", + "104.123.0.0/16", + "104.126.0.0/16", + "184.31.0.0/16", + "172.227.0.0/16", + "72.246.0.0/16", + "84.53.170.0/24", + "84.53.169.0/24", + "96.16.0.0/16", + "173.222.0.0/16", + "92.122.0.0/16", + "184.26.148.0/24", + } + def_yahoo = []string{ + "87.248.100.0/24", + "217.12.13.0/24", + "188.125.66.0/24", + "188.125.64.0/21", + "188.125.66.0/23", + "188.125.68.0/23", + "188.125.72.0/22", + "188.125.72.0/24", + "188.125.73.0/24", + "188.125.76.0/22", + "188.125.80.0/21", + "188.125.80.0/24", + "188.125.82.0/24", + "212.82.100.0/22", + "212.82.100.0/24", + "212.82.101.0/24", + "212.82.104.0/21", + "212.82.106.0/24", + "212.82.108.0/24", + "212.82.109.0/24", + "212.82.96.0/22", + "217.12.12.0/22", + "217.12.15.0/24", + "77.238.180.0/24", + "77.238.181.0/24", + "77.238.182.0/24", + "188.125.64.0/21", + "188.125.66.0/23", + "188.125.68.0/23", + "188.125.72.0/22", + "188.125.72.0/24", + "188.125.73.0/24", + "188.125.76.0/22", + "188.125.80.0/21", + "188.125.80.0/24", + "188.125.82.0/24", + "212.82.100.0/22", + "212.82.100.0/24", + "212.82.101.0/24", + "212.82.104.0/21", + "212.82.106.0/24", + "212.82.108.0/24", + "212.82.109.0/24", + "212.82.96.0/22", + "217.12.12.0/22", + "217.12.15.0/24", + "87.248.112.0/24", + "87.248.114.0/24", + "87.248.115.0/24", + "87.248.113.0/24", + "87.248.116.0/24", + "87.248.117.0/24", + } + def_liquid_web = []string{ + "159.135.0.0/19", + "159.135.32.0/20", + "207.246.240.0/21", + "50.28.96.0/19", + "50.56.148.0/22", + "98.129.229.0/24", + "67.227.186.0/24", + "159.135.48.0/20", + "162.212.134.0/24", + "162.252.104.0/22", + "162.255.68.0/23", + "172.255.59.0/24", + "173.199.128.0/18", + "174.34.225.0/24", + "184.106.55.0/24", + "192.126.88.0/22", + "192.138.16.0/21", + "192.190.220.0/22", + "192.251.32.0/24", + "199.189.224.0/22", + "199.195.118.0/24", + "205.174.24.0/22", + "207.246.248.0/21", + "208.75.148.0/22", + "208.79.232.0/21", + "208.86.152.0/21", + "209.124.89.0/24", + } + def_twitter = []string{ + "199.59.149.0/24", + "69.195.177.0/24", + "104.244.40.0/24", + "104.244.41.0/24", + "104.244.42.0/24", + } + def_quantserve = []string{"95.172.94.0/24"} + def_netflix = []string{ + "23.246.2.0/24", + "23.246.3.0/24", + "23.246.4.0/24", + "23.246.5.0/24", + "23.246.6.0/24", + "23.246.7.0/24", + "23.246.8.0/24", + "23.246.9.0/24", + "23.246.10.0/24", + "23.246.11.0/24", + "23.246.12.0/24", + "23.246.13.0/24", + "23.246.14.0/24", + "23.246.15.0/24", + "23.246.16.0/24", + "23.246.17.0/24", + "23.246.18.0/24", + "23.246.19.0/24", + "23.246.20.0/24", + "23.246.21.0/24", + "23.246.22.0/24", + "23.246.23.0/24", + "23.246.24.0/24", + "23.246.25.0/24", + "23.246.26.0/24", + "23.246.27.0/24", + "23.246.28.0/24", + "23.246.29.0/24", + "23.246.30.0/24", + "23.246.31.0/24", + "23.246.32.0/24", + "23.246.33.0/24", + "23.246.34.0/24", + "23.246.35.0/24", + "23.246.36.0/24", + "23.246.37.0/24", + "23.246.38.0/24", + "23.246.39.0/24", + "23.246.40.0/24", + "23.246.41.0/24", + "23.246.42.0/24", + "23.246.43.0/24", + "23.246.44.0/24", + "23.246.45.0/24", + "23.246.46.0/24", + "23.246.47.0/24", + "23.246.48.0/24", + "23.246.49.0/24", + "23.246.50.0/24", + "23.246.51.0/24", + "23.246.52.0/24", + "23.246.53.0/24", + "23.246.54.0/24", + "23.246.55.0/24", + "23.246.56.0/24", + "23.246.57.0/24", + "23.246.58.0/24", + "23.246.59.0/24", + "23.246.60.0/24", + "23.246.61.0/24", + "23.246.62.0/24", + "23.246.63.0/24", + "45.57.90.0/24", + "45.57.40.0/24", + "45.57.41.0/24", + "45.57.40.0/23", + "45.57.40.0/24", + "45.57.41.0/24", + "45.57.76.0/23", + "45.57.76.0/24", + "45.57.8.0/23", + "45.57.8.0/24", + "45.57.86.0/23", + "45.57.86.0/24", + "45.57.87.0/24", + "45.57.9.0/24", + "45.57.90.0/23", + "45.57.90.0/24", + "45.57.91.0/24", + } + def_llhost = []string{ + "46.148.125.0/24", + "185.36.143.0/24", + "45.155.120.0/24", + "45.155.121.0/24", + "45.85.117.0/24", + "46.148.123.0/24", + "46.148.124.0/24", + "46.148.125.0/24", + "46.148.126.0/24", + "46.148.127.0/24", + "5.101.44.0/24", + "5.181.202.0/24", + "5.181.203.0/24", + "5.188.179.0/24", + "5.188.201.0/24", + "5.188.202.0/24", + "5.189.216.0/24", + "5.189.253.0/24", + "5.189.255.0/24", + "91.243.40.0/24", + } + def_marktplaats = []string{ + "5.255.156.0/24", + "91.211.72.0/24", + "91.195.49.0/24", + "195.78.85.0/24", + } + def_videoplazza = []string{ + "185.28.136.0/24", + "185.28.137.0/24", + "185.28.138.0/24", + "185.28.139.0/24", + } + def_banking = []string{ + "91.135.176.0/24", + "91.135.177.0/24", + "91.135.178.0/24", + "91.135.179.0/24", + "91.135.180.0/24", + "91.135.181.0/24", + "91.135.182.0/24", + "91.135.183.0/24", + "91.135.184.0/24", + "91.135.185.0/24", + "91.135.186.0/24", + "91.135.187.0/24", + "91.135.188.0/24", + "91.135.189.0/24", + "91.135.190.0/24", + "91.135.190.0/24", + "91.135.191.0/24", + "173.0.84.0/24", + "185.60.56.0/22", + "195.93.244.0/24", + "195.93.245.0/24", + "211.249.49.0/24", + "103.6.174.0/24", + "103.6.175.0/24", + "80.70.210.0/24", + "80.70.211.0/24", + "80.70.212.0/24", + "80.70.213.0/24", + "80.70.214.0/24", + "80.70.215.0/24", + "80.70.216.0/24", + "169.36.0.0/16", + "169.37.0.0/16", + "31.210.0.0/24", + "185.148.122.0/24", + "145.226.0.0/18", + "145.226.128.0/18", + "145.226.192.0/18", + "145.226.64.0/18", + "193.56.246.0/24", + "193.57.116.0/22", + "193.57.122.0/23", + "193.57.124.0/23", + "193.57.225.0/24", + } + def_cloudflare = []string{ + "103.21.244.0/24", + "103.22.200.0/23", + "103.22.203.0/24", + "103.81.228.0/24", + "104.16.0.0/12", + "104.16.0.0/20", + "104.16.112.0/20", + "104.16.128.0/20", + "104.16.144.0/20", + "104.16.16.0/20", + "104.16.160.0/20", + "104.16.176.0/20", + "104.16.192.0/20", + "104.16.208.0/20", + "104.16.224.0/20", + "104.16.240.0/20", + "104.16.32.0/20", + "104.16.48.0/20", + "104.17.0.0/16", + "104.18.0.0/16", + "104.27.0.0/16", + "104.31.0.0/16", + "104.23.0.0/16", + "104.24.0.0/16", + "188.114.96.0/24", + "162.159.0.0/16", + "162.247.243.0/24", + "172.65.0.0/16", + "172.67.0.0/16", + "198.41.215.0/24", + "1.0.0.0/24", + "188.114.97.0/24", + } + def_verizon = []string{ + "68.232.35.0/24", + "72.21.81.0/24", + "194.98.0.0/16", + "152.199.0.0/16", + "192.229.133.0/24", + "192.229.220.0/24", + "192.229.221.0/24", + "192.229.222.0/24", + "192.229.223.0/24", + "192.229.233.0/24", + "192.229.182.0/24", + "193.155.127.0/24", + "152.195.0.0/16", + } + def_leaseweb = []string{ + "37.48.82.0/24", + "37.48.99.0/24", + "46.17.0.0/24", + "46.17.3.0/24", + "62.212.64.0/24", + "81.171.0.0/24", + "81.171.1.0/24", + "81.171.2.0/24", + "81.171.3.0/24", + "81.171.4.0/24", + "81.171.5.0/24", + "81.171.21.0/24", + "5.79.91.0/24", + "85.17.0.0/16", + "95.211.0.0/16", + "94.75.236.0/24", + "178.162.219.0/24", + "178.162.220.0/24", + "178.162.221.0/24", + "178.162.222.0/24", + "178.162.223.0/24", + "185.44.23.0/24", + "84.16.253.0/24", + } + defs_hostach = []string{ + "185.213.26.0/24", + "103.167.150.0/24", + "103.173.178.0/24", + "103.73.64.0/23", + "103.73.66.0/24", + "103.73.67.0/24", + "134.195.88.0/23", + "134.195.90.0/24", + "134.195.91.0/24", + "153.92.126.0/24", + "153.92.127.0/24", + "176.126.70.0/24", + "176.126.84.0/24", + "176.126.85.0/24", + "176.126.86.0/24", + "185.175.56.0/24", + "185.175.57.0/24", + "185.175.58.0/24", + "185.175.59.0/24", + "185.197.30.0/24", + } + defs_netcup_gmbh = []string{ + "185.233.107.0/24", + "152.89.104.0/22", + "185.158.212.0/22", + "185.16.60.0/22", + "185.162.248.0/22", + "185.163.116.0/22", + "185.170.112.0/22", + "185.183.156.0/22", + "185.194.140.0/22", + "185.207.104.0/22", + "185.211.220.0/23", + "185.211.222.0/23", + "185.211.223.0/24", + "185.216.176.0/22", + "185.228.136.0/22", + "185.232.68.0/22", + "185.233.104.0/22", + "185.243.8.0/22", + "185.244.192.0/22", + "185.48.228.0/22", + } + def_ab_stract = []string{ + "95.215.19.0/24", + "185.193.126.0/23", + "195.14.20.0/24", + "197.231.220.0/22", + "198.167.192.0/19", + "45.142.140.0/22", + "45.158.116.0/22", + "80.78.16.0/20", + "95.215.16.0/22", + } + def_nessus_gmbh = []string{ + "146.255.56.0/24", + "146.255.56.0/21", + "185.176.152.0/24", + "185.176.153.0/24", + "185.176.154.0/24", + "185.176.155.0/24", + "185.188.75.0/24", + "185.190.49.0/24", + "185.190.50.0/24", + "185.205.80.0/24", + "185.205.81.0/24", + "185.205.82.0/24", + "185.205.83.0/24", + "185.245.228.0/24", + "185.245.229.0/24", + "185.245.230.0/24", + "185.245.231.0/24", + } + freie_netze_muenchen = []string{ + "5.1.66.0/24", + "141.98.138.0/24", + "185.150.99.0/24", + "46.226.127.0/24", + } + def_smile_gie = []string{"185.194.92.0/22"} + def_netactuate = []string{ + "45.54.49.0/24", + "185.40.232.0/24", + "104.225.32.0/24", + "104.225.34.0/24", + "104.225.35.0/24", + "104.225.36.0/24", + "104.225.37.0/24", + "104.225.38.0/24", + "104.225.39.0/24", + "104.225.40.0/24", + "104.225.41.0/24", + "104.225.42.0/24", + "104.225.43.0/24", + "104.225.45.0/24", + "104.225.46.0/24", + "104.225.47.0/24", + "148.163.192.0/24", + "148.163.193.0/24", + "148.163.194.0/24", + "148.163.195.0/24", + "148.163.196.0/24", + "148.163.197.0/24", + } + def_hetzner_online = []string{ + "5.9.0.0/16", + "46.4.0.0/16", + "136.243.0.0/16", + "138.201.0.0/16", + "176.9.0.0/16", + "178.63.0.0/16", + "85.10.192.0/18", + "88.99.0.0/16", + "88.198.0.0/16", + "91.107.128.0/17", + "94.130.0.0/16", + "95.216.0.0/16", + "95.217.0.0/16", + "116.202.0.0/16", + "116.203.0.0/16", + "128.140.0.0/17", + "136.243.0.0/24", + "136.243.0.0/16", + "138.201.0.0/24", + "138.201.0.0/16", + "144.76.0.0/16", + "144.76.0.0/16", + "148.251.0.0/24", + "148.251.0.0/16", + "159.69.0.0/24", + "159.69.0.0/16", + "162.55.0.0/16", + "167.233.0.0/24", + "167.233.0.0/16", + "176.9.0.0/24", + "176.9.0.0/16", + "178.63.0.0/24", + "178.63.0.0/16", + "185.12.64.0/22", + "185.36.144.0/22", + "185.50.120.0/23", + "195.201.0.0/16", + "78.46.0.0/16", + "78.47.0.0/16", + "88.99.0.0/16", + "88.198.0.0/16", + "94.130.0.0/16", + "213.239.192.0/24", + } + def_yandex = []string{ + "77.88.0.0/24", + "77.88.1.0/24", + "77.88.2.0/24", + "77.88.3.0/24", + "77.88.4.0/24", + "77.88.5.0/24", + "77.88.6.0/24", + "77.88.7.0/24", + "77.88.8.0/24", + "77.88.9.0/24", + "77.88.10.0/24", + "77.88.11.0/24", + "77.88.12.0/24", + "77.88.13.0/24", + "77.88.14.0/24", + "77.88.15.0/24", + "77.88.16.0/24", + "77.88.17.0/24", + "77.88.18.0/24", + "77.88.19.0/24", + "77.88.20.0/24", + "77.88.21.0/24", + "77.88.22.0/24", + "77.88.23.0/24", + "77.88.24.0/24", + "77.88.25.0/24", + "77.88.26.0/24", + "77.88.27.0/24", + "77.88.28.0/24", + "77.88.29.0/24", + "77.88.30.0/24", + "77.88.31.0/24", + "77.88.32.0/24", + "77.88.33.0/24", + "77.88.34.0/24", + "77.88.35.0/24", + "77.88.36.0/24", + "77.88.37.0/24", + "77.88.38.0/24", + "77.88.39.0/24", + "77.88.40.0/24", + "77.88.41.0/24", + "77.88.42.0/24", + "77.88.43.0/24", + "77.88.44.0/24", + "77.88.45.0/24", + "77.88.46.0/24", + "77.88.47.0/24", + "77.88.48.0/24", + "77.88.49.0/24", + "77.88.50.0/24", + "77.88.51.0/24", + "77.88.52.0/24", + "77.88.53.0/24", + "77.88.54.0/24", + "77.88.55.0/24", + "77.88.56.0/24", + "77.88.57.0/24", + "77.88.58.0/24", + "77.88.59.0/24", + "77.88.60.0/24", + "77.88.61.0/24", + "77.88.62.0/24", + "178.154.131.0/24", + "93.158.134.0/24", + "213.180.193.0/24", + "100.43.64.0/19", + "141.8.128.0/18", + "178.154.128.0/19", + "178.154.131.0/24", + "178.154.160.0/19", + "185.32.187.0/24", + "199.21.96.0/22", + "199.36.240.0/22", + "213.180.192.0/19", + "213.180.199.0/24", + "37.140.128.0/18", + "37.9.112.0/24", + "37.9.64.0/18", + "37.9.64.0/24", + "37.9.95.0/24", + "45.87.132.0/22", + "5.255.192.0/18", + "5.255.197.0/24", + "5.255.255.0/24", + "5.45.192.0/18", + } + def_citic_telecom = []string{"62.128.100.0/24"} + def_cogent_communication = []string{"130.117.0.0/16", "102.129.145.0/24"} + def_nvidia = []string{"185.136.68.0/24"} + def_vmware = []string{"208.91.0.0/24"} + def_nutannix = []string{"192.146.155.0/24"} + def_xtom = []string{"185.222.222.0/24"} + def_constant_company = []string{ + "45.63.110.0/24", + "207.148.120.0/24", + "104.156.236.0/23", + "104.156.234.0/23", + "104.156.232.0/23", + "104.156.228.0/22", + "103.113.40.0/22", + "144.202.69.0/24", + "144.202.69.0/24", + "45.76.0.0/16", + "136.244.65.0/24", + "136.244.97.0/24", + "104.156.240.0/21", + "104.156.228.0/22", + } + def_nextdns = []string{ + "45.90.28.0/24", + "9.9.9.0/24", + "149.112.112.0/24", + "149.112.149.0/24", + "199.249.255.0/24", + } + def_node4 = []string{ + "109.203.101.0/24", + "109.203.102.0/24", + "109.203.107.0/24", + "109.203.118.0/24", + "109.203.120.0/24", + "109.203.123.0/24", + "109.203.124.0/23", + "109.203.96.0/24", + "109.234.192.0/21", + "109.234.200.0/21", + "109.75.172.0/24", + "148.253.128.0/19", + "148.253.139.0/24", + } + def_nitronet_sp = []string{"79.98.145.0/24"} + def_cloud_nextgen = []string{"185.253.154.0/24"} + def_datacamp = []string{"138.199.36.0/24"} + def_kaspersky = []string{ + "185.85.12.0/24", + "185.85.14.0/24", + "185.85.15.0/24", + "77.74.176.0/24", + "77.74.177.0/24", + "77.74.178.0/23", + "77.74.180.0/24", + "77.74.181.0/24", + "77.74.183.0/24", + "82.202.184.0/24", + "82.202.185.0/24", + "93.159.226.0/24", + "93.159.228.0/23", + "93.159.230.0/23", + } + def_eset = []string{ + "185.94.156.0/24", + "185.94.157.0/24", + "185.94.158.0/24", + "185.94.159.0/24", + "38.90.226.0/24", + "38.90.227.0/24", + "91.228.164.0/24", + "91.228.165.0/24", + "91.228.166.0/24", + "91.228.167.0/24", + } + def_dell = []string{ + "143.166.28.0/24", + "132.237.128.0/23", + "132.237.130.0/23", + "132.237.16.0/22", + "132.237.16.0/23", + "132.237.170.0/24", + "132.237.171.0/24", + "132.237.18.0/23", + "132.237.180.0/24", + "132.237.181.0/24", + "132.237.184.0/24", + "143.166.0.0/16", + "143.166.200.0/21", + "143.166.208.0/21", + "148.9.20.0/23", + "163.244.0.0/16", + "163.244.185.0/24", + "163.244.60.0/24", + "168.159.218.0/24", + "168.159.224.0/24", + } + def_quantil_network = []string{ + "101.79.165.0/24", + "101.79.166.0/24", + "101.79.167.0/24", + "103.75.147.0/24", + "110.164.35.0/24", + "118.107.170.0/24", + "118.107.171.0/24", + "118.107.172.0/24", + "118.107.173.0/24", + "119.31.251.0/24", + "163.171.158.0/24", + } + def_blizzard = []string{ + "24.105.29.024", + "117.52.6.0/24", + "121.254.137.0/24", + "121.254.206.0/23", + "121.254.218.0/24", + "137.221.100.0/22", + "137.221.104.0/22", + "137.221.108.0/24", + "137.221.109.0/24", + "137.221.110.0/24", + "137.221.64.0/19", + "137.221.64.0/24", + "137.221.68.0/24", + "103.198.32.0/24", + "103.198.33.0/24", + "110.45.208.0/24", + "117.52.26.0/23", + } + def_linode_lcc = []string{ + "172.104.0.0/16", + "172.105.0.0/16", + "45.79.0.0/16", + "104.237.152.0/24", + "104.237.153.0/24", + "104.237.154.0/24", + "104.237.155.0/24", + "104.237.156.0/24", + "104.237.157.0/24", + "104.237.158.0/24", + "104.237.159.0/24", + "104.200.24.0/24", + "104.200.25.0/24", + "104.200.26.0/24", + "104.200.27.0/24", + "45.33.0.0/24", + "45.33.1.0/24", + "45.56.116.0/24", + "45.79.0.0/16", + "139.162.0.0/16", + "69.164.192.0/24", + "96.126.109.0/24", + "178.79.180.0/24", + "192.46.236.0/24", + "192.155.88.0/24", + "192.53.175.0/24", + "212.71.236.0/24", + "213.52.128.0/24", + "45.33.2.0/24", + "45.33.3.0/24", + "45.33.4.0/24", + "45.33.5.0/24", + "45.33.6.0/24", + "45.33.7.0/24", + "45.33.8.0/24", + "45.33.9.0/24", + "45.33.10.0/24", + "45.33.11.0/24", + "45.33.12.0/24", + "45.33.13.0/24", + "45.33.14.0/24", + "45.33.15.0/24", + "45.33.16.0/24", + "45.33.17.0/24", + "45.33.18.0/24", + "45.33.19.0/24", + "45.33.20.0/24", + "45.33.21.0/24", + "45.33.22.0/24", + "45.33.23.0/24", + "45.33.24.0/24", + "45.33.25.0/24", + "45.33.26.0/24", + "45.33.27.0/24", + "45.33.28.0/24", + "45.33.29.0/24", + "45.33.30.0/24", + "45.33.31.0/24", + "45.33.32.0/24", + "45.33.33.0/24", + "45.33.34.0/24", + "45.33.35.0/24", + "45.33.36.0/24", + "45.33.37.0/24", + "45.33.38.0/24", + "45.33.39.0/24", + "45.33.40.0/24", + "45.33.41.0/24", + "45.33.42.0/24", + "45.33.43.0/24", + "45.33.44.0/24", + "45.33.45.0/24", + "45.33.46.0/24", + "45.33.47.0/24", + "45.33.48.0/24", + "45.33.49.0/24", + "45.33.50.0/24", + "45.33.51.0/24", + "45.33.52.0/24", + "45.33.53.0/24", + "45.33.54.0/24", + "45.33.55.0/24", + "45.33.56.0/24", + "45.33.57.0/24", + "45.33.58.0/24", + "45.33.59.0/24", + "45.33.60.0/24", + "45.33.61.0/24", + "45.33.62.0/24", + "45.33.63.0/24", + "45.33.64.0/24", + "45.33.65.0/24", + "45.33.66.0/24", + "45.33.67.0/24", + "45.33.68.0/24", + "45.33.69.0/24", + "45.33.70.0/24", + "45.33.71.0/24", + "45.33.72.0/24", + "45.33.73.0/24", + "45.33.74.0/24", + "45.33.75.0/24", + "45.33.76.0/24", + "45.33.77.0/24", + "45.33.78.0/24", + "45.33.79.0/24", + "45.33.80.0/24", + "45.33.81.0/24", + "45.33.82.0/24", + "45.33.83.0/24", + "45.33.84.0/24", + "45.33.85.0/24", + "45.33.86.0/24", + "45.33.87.0/24", + "45.33.88.0/24", + "45.33.89.0/24", + "45.33.90.0/24", + "45.33.91.0/24", + "45.33.92.0/24", + "45.33.93.0/24", + "45.33.94.0/24", + "45.33.95.0/24", + "45.33.96.0/24", + "45.33.97.0/24", + "45.33.98.0/24", + "45.33.99.0/24", + "45.33.100.0/24", + "45.33.101.0/24", + "45.33.102.0/24", + "45.33.103.0/24", + "45.33.104.0/24", + "45.33.105.0/24", + "45.33.106.0/24", + "45.33.107.0/24", + "45.33.108.0/24", + "45.33.109.0/24", + "45.33.110.0/24", + "45.33.111.0/24", + "45.33.112.0/24", + "45.33.113.0/24", + "45.33.114.0/24", + "45.33.115.0/24", + "45.33.116.0/24", + "45.33.117.0/24", + "45.33.118.0/24", + "45.33.119.0/24", + "45.33.120.0/24", + "45.33.121.0/24", + "45.33.122.0/24", + "45.33.123.0/24", + "45.33.124.0/24", + "45.33.125.0/24", + "45.33.126.0/24", + "45.33.127.0/24", + "66.228.61.0/24", + } + def_daniel_cid = []string{ + "185.228.168.0/24", + "185.228.169.0/24", + "185.228.170.0/24", + } + def_hurricane_electric = []string{ + "103.100.138.0/24", + "103.150.253.0/24", + "103.176.58.0/24", + "103.176.59.0/24", + "103.253.24.0/24", + "103.253.25.0/24", + "103.253.26.0/24", + "103.253.27.0/24", + "103.6.216.0/22", + "103.96.214.0/24", + "184.105.148.0/24", + "104.194.4.0/24", + "104.255.240.0/21", + "104.36.120.0/22", + "134.195.36.0/24", + "134.195.37.0/24", + "134.195.38.0/24", + } + def_exion_network = []string{ + "31.3.128.0/23", + "31.3.129.0/24", + "31.3.130.0/23", + "31.3.131.0/24", + "31.3.132.0/23", + "31.3.134.0/23", + "31.3.134.0/24", + "31.3.135.0/24", + } + def_cachenetworks = []string{ + "205.234.175.0/24", + "103.211.254.0/24", + "204.93.142.0/24", + "204.93.143.0/24", + "204.93.146.0/24", + "204.93.150.0/24", + "204.93.230.0/24", + "204.93.231.0/24", + "205.234.175.0/24", + "205.234.216.0/24", + "216.246.100.0/24", + "216.246.104.0/24", + "216.246.118.0/24", + "216.246.119.0/24", + } + def_alibaba = []string{"47.253.0.0/16"} + def_new_relic = []string{ + "162.240.241.0/24", + "162.247.241.0/24", + "162.247.242.0/24", + } + def_mci_communication = []string{"68.232.34.0/24"} + def_wanagain = []string{"62.244.106.0/24", "62.244.103.0/24"} + def_haproxy_technologies = []string{"209.126.36.0/24"} + def_alphalink_sasu = []string{"217.147.199.0/24"} + def_aptum_technologies = []string{"66.155.71.0/24"} + def_shenzhen_tencent = []string{"129.226.0.0/16"} + def_communityrack_org = []string{ + "185.104.19.0/24", + "185.95.216.0/23", + "185.95.218.0/24", + "91.199.218.0/24", + } + def_webnx = []string{ + "100.42.208.0/20", + "100.42.220.0/22", + "104.224.14.0/24", + "104.237.48.0/20", + "104.237.48.0/23", + "104.237.55.0/24", + "107.182.160.0/20", + "107.182.160.0/24", + "107.182.162.0/23", + "108.171.192.0/19", + "108.171.198.0/23", + "108.171.202.0/24", + "108.171.206.0/24", + "108.171.210.0/23", + "108.171.210.0/24", + "108.171.213.0/24", + "108.171.214.0/23", + "108.171.216.0/23", + "114.31.209.0/24", + "136.144.33.0/24", + } + def_index_education = []string{ + "185.173.124.0/22", + "195.191.172.0/23", + "195.191.172.0/24", + "212.114.0.0/20", + "212.114.0.0/21", + "212.114.7.0/24", + "212.114.8.0/21", + "46.33.160.0/19", + "46.33.160.0/24", + "46.33.161.0/24", + "46.33.162.0/24", + "46.33.163.0/24", + "46.33.164.0/24", + "46.33.165.0/24", + "46.33.166.0/24", + "46.33.167.0/24", + "46.33.168.0/24", + "46.33.169.0/24", + "46.33.170.0/24", + "46.33.171.0/24", + } + def_outscale_sasu = []string{ + "148.253.97.0/24", + "148.253.64.0/18", + "148.253.96.0/24", + "148.253.97.0/24", + "171.33.64.0/18", + "185.21.192.0/22", + "185.21.194.0/25", + "185.21.194.128/25", + "185.23.188.0/24", + "217.75.160.0/20", + "46.231.144.0/21", + "5.104.96.0/21", + "80.247.0.0/20", + } + def_serveroid = []string{ + "185.22.60.0/22", + "176.112.192.0/19", + "176.103.133.0/24", + "176.103.132.0/24", + "176.103.128.0/19", + "176.103.130.0/24", + } + def_andrews_arnold = []string{ + "217.169.20.0/24", + "178.238.144.0/20", + "188.191.132.0/22", + "194.4.172.0/22", + "194.60.203.0/24", + "194.70.3.0/24", + } + def_cz_nic_zspo = []string{"185.43.135.0/24"} + def_mpvs_ltd = []string{"45.153.187.0/24"} + def_taiwan_network_information = []string{"101.102.103.0/24", "101.102.101.0/24"} + def_switch = []string{ + "138.131.0.0/16", + "134.21.0.0/16", + "131.152.0.0/16", + "130.92.0.0/16", + "130.82.0.0/16", + "130.59.0.0/16", + "128.178.0.0/15", + "129.129.0.0/16", + "129.194.0.0/15", + "130.125.0.0/16", + "130.223.0.0/16", + } + def_infrastructure_Group_bv = []string{ + "5.2.75.0/24", + "103.251.164.0/22", + "150.129.8.0/22", + "185.255.114.0/24", + "185.31.172.0/22", + "185.31.173.107/32", + "185.31.173.229/32", + "185.31.173.23/32", + "185.31.173.230/32", + "185.31.173.231/32", + "185.31.173.233/32", + "185.31.173.236/32", + "185.31.173.25/32", + "185.31.173.253/32", + "185.31.173.27/32", + "185.31.173.70/32", + "185.31.173.93/32", + "192.76.150.0/24", + "192.76.153.0/24", + "192.76.160.0/24", + "192.76.163.0/24", + } + def_planethoster = []string{ + "146.19.134.0/24", + "146.88.232.0/21", + "185.22.108.0/22", + "185.22.111.0/24", + "185.221.180.0/22", + "199.16.128.0/24", + "199.16.129.0/24", + "199.16.130.0/24", + "199.16.131.0/24", + "199.188.220.0/24", + "199.188.221.0/24", + "199.188.222.0/24", + "199.188.223.0/24", + "199.59.244.0/24", + "199.59.245.0/24", + "199.59.246.0/24", + "199.59.247.0/24", + "209.16.158.0/24", + "85.236.152.0/21", + "85.236.159.0/24", + } + def_amobee_emeea = []string{ + "46.228.164.0/24", + "192.208.200.0/22", + "46.228.160.0/20", + } + def_mediamath = []string{ + "103.229.204.0/24", + "103.229.205.0/24", + "103.229.206.0/24", + "103.229.207.0/24", + "185.29.132.0/24", + "185.29.133.0/24", + "185.29.134.0/23", + "216.200.232.0/24", + "216.200.233.0/24", + "64.125.96.0/24", + "74.121.136.0/24", + "74.121.137.0/24", + "74.121.139.0/24", + "74.121.140.0/24", + "74.121.141.0/24", + "74.121.142.0/24", + "74.121.143.0/24", + } + def_tata_communications = []string{ + "80.231.0.0/16", + "195.219.0.0/16", + "80.231.0.0/16", + "103.16.252.0/22", + "103.21.80.0/24", + "104.105.224.0/20", + "104.105.240.0/20", + "104.106.0.0/22", + "115.108.48.0/20", + "115.112.168.0/23", + "116.0.64.0/19", + "116.0.70.0/24", + "116.0.76.0/24", + "116.0.82.0/24", + "116.0.93.0/24", + "120.29.219.0/24", + "121.244.82.0/24", + "138.104.226.0/24", + "138.104.227.0/24", + "138.104.233.0/24", + "138.104.236.0/24", + "157.189.0.0/16", + "116.0.82.0/24", + "116.0.93.0/24", + } + def_hosthatch = []string{ + "45.91.92.0/24", + "103.167.150.0/24", + "103.167.151.0/24", + "103.173.178.0/24", + "103.73.64.0/23", + "103.73.66.0/24", + "103.73.67.0/24", + "134.195.88.0/23", + "134.195.90.0/24", + "134.195.91.0/24", + "153.92.126.0/24", + "153.92.127.0/24", + "176.126.70.0/24", + "176.126.84.0/24", + "176.126.85.0/24", + "176.126.86.0/24", + "185.175.56.0/24", + "185.175.57.0/24", + "185.175.58.0/24", + "185.175.59.0/24", + "185.197.30.0/24", + } + def_github = []string{ + "140.82.112.0/20", + "140.82.112.0/24", + "140.82.113.0/24", + "140.82.114.0/24", + "140.82.115.0/24", + "140.82.116.0/24", + "140.82.117.0/24", + "140.82.120.0/23", + "140.82.120.0/24", + "140.82.121.0/24", + "140.82.122.0/24", + "140.82.123.0/24", + "140.82.124.0/24", + "140.82.125.0/24", + "140.82.126.0/24", + "143.55.64.0/20", + "143.55.64.0/24", + "143.55.65.0/24", + "192.30.252.0/22", + "192.30.252.0/23", + } + def_freewheel = []string{"154.54.250.0/24"} + def_online_sas = []string{"51.158.0.0/16", "51.15.0.0/16", "51.159.0.0/16"} + def_criteo_sa = []string{ + "178.250.2.0/24", + "178.250.3.0/24", + "178.250.2.0/24", + "178.250.4.0/24", + "178.250.5.0/24", + "178.250.6.0/24", + "178.250.7.0/24", + "178.250.8.0/24", + } + def_canonical_group = []string{"91.189.92.0/24"} + def_iweb_technologies = []string{ + "64.15.159.0/24", + "107.161.64.0/20", + "108.163.128.0/18", + "174.141.228.0/22", + "174.141.232.0/23", + "174.142.0.0/16", + "184.107.0.0/16", + "192.175.96.0/19", + "192.196.223.0/24", + "198.50.96.0/19", + "198.72.96.0/19", + "203.167.7.0/24", + "204.19.134.0/24", + } + def_level3_communication = []string{ + "195.122.177.0/24", + "62.67.0.0/16", + "8.250.157.0/24", + "8.253.93.0/24", + "8.241.0.0/16", + "8.242.0.0/16", + "8.243.0.0/16", + "8.244.0.0/16", + "8.245.0.0/16", + "8.246.0.0/16", + "8.247.0.0/16", + "8.248.0.0/16", + "8.249.0.0/16", + "8.250.0.0/16", + "8.251.0.0/16", + "8.252.0.0/16", + "8.253.93.0/24", + "8.254.93.0/24", + "8.255.93.0/24", + "212.162.49.0/24", + "212.73.221.0/24", + "176.116.117.0/24", + "195.122.177.0/24", + "195.122.169.0/24", + } + def_telia_company = []string{ + "89.233.43.0/24", + "193.45.0.0/16", + "62.115.0.0/16", + "80.239.197.0/24", + "80.239.169.0/24", + "80.239.170.0/24", + "80.239.174.0/24", + "213.155.156.0/24", + } + def_orange = []string{ + "197.29.0.0/16", + "217.108.0.0/16", + "193.251.0.0/16", + "193.252.0.0/16", + "194.2.0.0/16", + "194.250.0.0/16", + "195.25.0.0/16", + "94.124.132.0/24", + "94.124.134.0/24", + "80.10.186.0/24", + "145.242.11.0/24", + "185.63.192.0/24", + "212.234.0.0/16", + "217.109.0.0/16", + "62.161.0.0/16", + "81.252.0.0/16", + "81.255.44.0/24", + "81.52.0.0/16", + "90.82.0.0/16", + "90.83.0.0/16", + "90.84.0.0/16", + "90.85.0.0/16", + "90.86.0.0/16", + "90.87.0.0/16", + "90.88.0.0/16", + "90.89.0.0/16", + "90.90.0.0/16", + "90.91.0.0/16", + "90.92.0.0/16", + "90.93.0.0/16", + "90.94.0.0/16", + "90.95.0.0/16", + "90.96.0.0/16", + "90.97.0.0/16", + "90.98.0.0/16", + "90.99.0.0/16", + "90.100.0.0/16", + "90.101.0.0/16", + "90.102.0.0/16", + "90.103.0.0/16", + "90.104.0.0/16", + "90.105.0.0/16", + "90.106.0.0/16", + "90.107.0.0/16", + "90.108.0.0/16", + "90.109.0.0/16", + "90.110.0.0/16", + "90.111.0.0/16", + "90.112.0.0/16", + "90.113.0.0/16", + "90.114.0.0/16", + "90.115.0.0/16", + "90.116.0.0/16", + "90.117.0.0/16", + "90.118.0.0/16", + "90.119.0.0/16", + "90.120.0.0/16", + "90.121.0.0/16", + "90.122.0.0/16", + "102.219.164.0/22", + "160.156.0.0/14", + "160.156.0.0/15", + "160.156.0.0/16", + "160.156.0.0/17", + "160.156.128.0/17", + "160.157.0.0/16", + "160.157.0.0/17", + "160.157.128.0/17", + "160.158.0.0/15", + "160.158.0.0/16", + "160.158.0.0/17", + "160.158.128.0/17", + "160.159.0.0/16", + "160.159.0.0/17", + "160.159.128.0/17", + "165.50.0.0/15", + "165.50.0.0/16", + "165.50.0.0/17", + "165.50.0.0/18", + } + def_thomas_steen_rasmussen = []string{"91.239.100.0/24"} + def_ntt = []string{"81.19.104.0/24"} + def_box_com = []string{ + "185.235.236.0/24", + "103.116.4.0/24", + "107.152.16.0/20", + "107.152.18.0/24", + "107.152.24.0/23", + "107.152.24.0/24", + "107.152.25.0/24", + "107.152.26.0/23", + "107.152.26.0/24", + "107.152.27.0/24", + "107.152.29.0/24", + "185.235.236.0/22", + "185.235.236.0/24", + "209.249.140.0/24", + "67.218.117.0/24", + "74.112.187.0/24", + } + def_renater = []string{ + "195.83.0.0/16", + "193.54.136.0/24", + "194.199.12.0/24", + "194.199.74.0/24", + "194.199.95.0/24", + "194.199.97.0/24", + "194.199.98.0/24", + "194.254.97.0/24", + "194.57.170.0/24", + "195.83.190.0/24", + "195.83.214.0/24", + "195.83.254.0/24", + "195.83.255.0/24", + } + def_etf1 = []string{ + "193.169.66.0/24", + "185.22.116.0/22", + "193.169.66.0/23", + } + def_g_core_labs = []string{ + "103.22.194.0/24", + "103.22.195.0/24", + "146.185.220.0/23", + "146.185.220.0/24", + "146.185.248.0/24", + "150.107.125.0/24", + "150.107.126.0/24", + "162.213.60.0/24", + "162.213.61.0/24", + "162.213.62.0/24", + "162.213.63.0/24", + "162.216.228.0/22", + "162.216.228.0/24", + "162.216.229.0/24", + "162.216.230.0/24", + "162.216.231.0/24", + "92.38.169.0/24", + } + def_total_uptime = []string{ + "208.95.112.0/24", + "104.153.196.0/24", + "104.153.197.0/24", + "104.153.198.0/24", + "104.153.199.0/24", + "162.252.212.0/24", + "162.252.213.0/24", + "162.252.214.0/24", + "162.252.214.70/32", + "162.252.215.0/24", + "172.98.36.0/24", + "172.98.37.0/24", + "172.98.38.0/24", + "172.98.39.0/24", + "199.38.148.0/24", + "199.38.148.160/28", + "199.38.148.32/27", + "199.38.148.64/27", + "199.38.148.96/27", + "206.166.193.0/24", + "208.95.112.0/24", + } +) + +func InitCategorization(debug bool) { + //log.SetFlags(log.LstdFlags | log.Lshortfile) + //if _slog, err := syslog.New(syslog.LOG_DEBUG, "go-shield-connector-categorization"); err == nil { + // log.SetOutput(_slog) + //} + + SelfKSRNCategoryWhite = internal.GetSocketInfoInt("SelfKSRNCategoryWhite") + SelfCacheTime = internal.GetSocketInfoInt("TheShieldCacheTime") + SelfDns1 = internal.GetSocketInfoString("Go_Shield_Server_Dns1") + SelfDns2 = internal.GetSocketInfoString("Go_Shield_Server_Dns2") + SelfKsrnDisableGoogleAdServices = internal.GetSocketInfoBool("SelfKsrnDisableGoogleAdServices") + if SelfDns1 != "" { + SelfDns1 = strings.TrimSpace(SelfDns1) + } + if SelfDns2 != "" { + SelfDns2 = strings.TrimSpace(SelfDns2) + } + if SelfCacheTime == 0 { + SelfCacheTime = 86400 + } + isDebugCategorization = debug + + if isDebugCategorization { + log.Printf("Loading databases") + } + reloadDBS() +} +func reloadDBS() { + SelfTrackersDst = readListFromPath("/usr/share/artica-postfix/ressources/databases/trackers.txt") + SelfWhitelistDst = readListFromPath("/etc/squid3/acls_whitelist.dstdomain.conf") + SelfWhitelistDstrx = readListFromPath("/etc/squid3/acls_whitelist.dstdom_regex.conf") + SelfWhitelistSrc = readListFromPath("/etc/squid3/acls_whitelist.src.conf") + SelfWhitelistArp = readListFromPath("/etc/squid3/acls_whitelist.arp.conf") + SelfSrnWhite = readListFromPath("/etc/squid3/acl_dstdomain_tempwhite.conf") + SelfAdvertBase = readListFromPath("/usr/share/artica-postfix/ressources/databases/advertising.txt") + SelfBlacklistDst = readListFromPath("/etc/squid3/DomainsBlackLists.acl") +} +func readListFromPath(path string) []string { + var list []string + if isDebugCategorization { + log.Printf("Reading %s list", path) + } + f, err := os.Open(path) + + if err != nil { + if isDebugCategorization { + log.Printf("error reading %s %s: ", path, err) + } + return list + } + + defer f.Close() + + scanner := bufio.NewScanner(f) + + for scanner.Scan() { + list = append(list, scanner.Text()) + } + if err := scanner.Err(); err != nil { + if isDebugCategorization { + log.Printf("error scanning %s %s: ", path, err) + } + return list + } + return list + +} +func GetCategories(w string) (int, string) { + start := time.Now() + if isDebugCategorization { + log.Printf("searching categorie for %s", w) + } + _catID := 0 + _catName := "Unknown" + if strings.HasSuffix(w, ".") { + re := regexp.MustCompile("^(.+?)\\.$") + matches := re.MatchString(w) + if matches { + rs := re.FindStringSubmatch(w) + w = rs[1] + } + } + matches, _ := regexp.MatchString("^[0-9]+\\.[0-9]+$", w) + if matches { + _catID = 0 + _catName = CategoryIntToString(_catID) + return _catID, _catName + } + + if strings.Index(w, ".") < 1 { + _catID = 82 + _catName = CategoryIntToString(_catID) + return _catID, _catName + } + if strings.Index(w, "*") > 0 { + _catID = 82 + _catName = CategoryIntToString(_catID) + return _catID, _catName + } + if w == "192.in-addr.arpa" { + _catID = 82 + _catName = CategoryIntToString(_catID) + return _catID, _catName + } + if w == "10.in-addr.arpa" { + _catID = 82 + _catName = CategoryIntToString(_catID) + return _catID, _catName + } + if w == "172.in-addr.arpa" { + _catID = 82 + _catName = CategoryIntToString(_catID) + return _catID, _catName + } + if w == "176.in-addr.arpa" { + _catID = 82 + _catName = CategoryIntToString(_catID) + return _catID, _catName + } + + if IsArpa(w) { + w = SelfStripaddr + if value, _ := internal.Fetch(w); value != nil { + lparts := strings.Split(*value, ":") + _catID, _ = strconv.Atoi(string(lparts[0])) + _catName = string(lparts[1]) + if len(_catName) == 0 { + if isDebugCategorization { + log.Printf("Gating Categorie Name from category_int_to_string() -> IsArpa") + } + _catName = CategoryIntToString(_catID) + } + if isDebugCategorization { + log.Printf("%s founded in InMemory Cache with category %s (%d) - %s -> IsArpa", w, _catName, _catID, internal.TimeTrack(start)) + } + return _catID, _catName + } + _catID = get_category_by_ip(w) + _catName = CategoryIntToString(_catID) + if _catID > 0 { + internal.Append(w, strconv.Itoa(_catID)+":"+_catName) + } + return _catID, _catName + } + + //1º Check on InMememory Cache + if isDebugCategorization { + log.Printf("Checking InMemory Cache") + } + if value, _ := internal.Fetch(w); value != nil { + + lparts := strings.Split(*value, ":") + _catID, _ = strconv.Atoi(lparts[0]) + _catName = lparts[1] + if len(_catName) == 0 { + if isDebugCategorization { + log.Printf("Gating Categorie Name from category_int_to_string()") + } + _catName = CategoryIntToString(_catID) + } + if isDebugCategorization { + log.Printf("%s founded in InMemory Cache with category %s (%d) - %s", w, _catName, _catID, internal.TimeTrack(start)) + } + return _catID, _catName + } + + //2º Check on Personal Categories + + if _catID == 0 { + if isDebugCategorization { + log.Printf("Checking Personal Categories") + } + if _, err := os.Stat("/etc/squid3/compiled-categorys.db"); errors.Is(err, os.ErrNotExist) { + if isDebugCategorization { + log.Printf("/etc/squid3/compiled-categorys.db not exit: ", err) + } + _catID = 0 + _catName = "Unknown" + } + dat, err := os.ReadFile("/etc/squid3/compiled-categorys.db") + if err != nil { + if isDebugCategorization { + log.Printf("error reading /etc/squid3/compiled-categorys.db: ", err) + } + _catID = 0 + _catName = "Unknown" + } + + out, err := gophp.Unserialize([]byte(dat)) + + if err != nil { + if isDebugCategorization { + log.Printf("error Unserialize /etc/squid3/compiled-categorys.db: ", err) + } + _catID = 0 + _catName = "Unknown" + } + if mout, ok := out.(map[string]interface{}); ok { + + if category, ok := mout[w].(map[string]interface{}); ok { + + cat_name := strings.Replace(category["category_name"].(string), " ", "_", -1) + cat_name = strings.Replace(cat_name, "/", "_", -1) + + _catID, _ = strconv.Atoi(category["category_id"].(string)) + _catName = cat_name + //internal.AppendWithTTL(w, _catID+":"+_catName,1,24*time.Hour) + //internal.Append(w, string(_catID)+":"+_catName, cache.NoExpiration) + internal.Append(w, strconv.Itoa(_catID)+":"+_catName) + if isDebugCategorization { + log.Printf("%s founded in Personal Categories with category %s (%d) - %s", w, _catName, _catID, internal.TimeTrack(start)) + } + return _catID, _catName + //return category["category_id"],category["category_name"] + } + _catID = 0 + _catName = "Unknown" + } + } + + // 3ª Check IP Address + if _catID == 0 { + if checkIPAddressType(w) { + id := get_category_by_ip(w) + if id > 1 { + _catID = id + _catName = CategoryIntToString(_catID) + internal.Append(w, strconv.Itoa(_catID)+":"+_catName) + if isDebugCategorization { + log.Printf("%s founded in get_category_by_ip with category %s (%d) - %s", w, _catName, _catID, internal.TimeTrack(start)) + } + + } else { + if isDebugCategorization { + log.Printf("%s don't return any categorie", w) + } + _catID = 0 + _catName = "Unknown" + } + + } else { + if isDebugCategorization { + log.Printf("%s is not a valid IP", w) + } + _catID = 0 + _catName = "Unknown" + } + + } + + //4º Check on MemCached or Redis + goShieldServerUseLocalCategories := internal.GetSocketInfoInt("TheShieldsUseLocalCats") + if goShieldServerUseLocalCategories == 1 { + if _catID == 0 { + if isDebugCategorization { + log.Printf("Checking Redis") + } + enableCategoriesCache := internal.GetSocketInfoInt("enableCategoriesCache") + categoriesCacheRemote := internal.GetSocketInfoInt("categoriesCacheRemote") + redis_socket := "/var/run/categories-cache/categories-cache.sock" + if categoriesCacheRemote == 1 { + enableCategoriesCache = 1 + } + if enableCategoriesCache == 1 { + categoriesCacheRemoteAddr := strings.TrimSpace(internal.GetSocketInfoString("categoriesCacheRemoteAddr")) + categoriesCacheRemotePort := internal.GetSocketInfoInt("categoriesCacheRemotePort") + if categoriesCacheRemotePort == 0 { + categoriesCacheRemotePort = 2214 + } + if categoriesCacheRemote == 1 { + rdb := redis.NewClient(&redis.Options{ + Addr: categoriesCacheRemoteAddr + ":" + strconv.Itoa(categoriesCacheRemotePort), + Password: "", // no password set + DB: 0, // use default DB + }) + h := md5.New() + io.WriteString(h, w) + hasher := hex.EncodeToString(h.Sum(nil)) + val, err := rdb.Get(ctx, hasher).Result() + if err == redis.Nil { + log.Printf("%s (%s) does not exist in Remote Redis server: ", w, hasher) + } else if err != nil { + if isDebugCategorization { + log.Printf("Error getting data from Remote Redis server: ", err) + } + } else { + _catID, _ = strconv.Atoi(val) + _catName = CategoryIntToString(_catID) + internal.Append(w, strconv.Itoa(_catID)+":"+_catName) + if isDebugCategorization { + log.Printf("%s founded in Remote Redis server with category %s (%d) - %s", w, _catName, _catID, internal.TimeTrack(start)) + } + return _catID, _catName + + } + } else { + rdb := redis.NewClient(&redis.Options{ + Network: "unix", + Addr: redis_socket, + Password: "", + DB: 0, + }) + h := md5.New() + io.WriteString(h, w) + hasher := hex.EncodeToString(h.Sum(nil)) + val, err := rdb.Get(ctx, hasher).Result() + if err == redis.Nil { + log.Printf("%s (%s) does not exist in Local Redis server: ", w, hasher) + } else if err != nil { + if isDebugCategorization { + log.Printf("Error getting dat from Local Redis server: ", err) + } + } else { + _catID, _ = strconv.Atoi(val) + _catName = CategoryIntToString(_catID) + internal.Append(w, strconv.Itoa(_catID)+":"+_catName) + if isDebugCategorization { + log.Printf("%s founded in Local Redis server with category %s (%d) - %s", w, _catName, _catID, internal.TimeTrack(start)) + } + return _catID, _catName + } + } + + } + + } + } + + //5º Check on Array + //5.1ª Custom DB + if _catID == 0 { + if isDebugCategorization { + log.Printf("Checking Inside Custom DB") + } + + f, err := os.Open("/usr/share/artica-postfix/ressources/databases/categories.txt") + + if err != nil { + if isDebugCategorization { + log.Printf("error reading /usr/share/artica-postfix/ressources/databases/categories.txt: ", err) + } + _catID = 0 + _catName = "Unknown" + } + + defer f.Close() + + scanner := bufio.NewScanner(f) + + for scanner.Scan() { + data := strings.Split(scanner.Text(), "/") + if data[0] == "regex" { + match, _ := regexp.MatchString(``+data[1]+``, w) + if match { + _catID, _ = strconv.Atoi(data[2]) + _catName = CategoryIntToString(_catID) + internal.Append(w, strconv.Itoa(_catID)+":"+_catName) + if isDebugCategorization { + log.Printf("%s founded in Custom DB (REGEX) with category %s (%d) - %s", w, _catName, _catID, internal.TimeTrack(start)) + } + break + return _catID, _catName + } + + } else { + if data[1] == w { + _catID, _ = strconv.Atoi(data[2]) + _catName = CategoryIntToString(_catID) + internal.Append(w, strconv.Itoa(_catID)+":"+_catName) + if isDebugCategorization { + log.Printf("%s founded in Custom DB (FIXED) with category %s (%d) - %s", w, _catName, _catID, internal.TimeTrack(start)) + } + break + return _catID, _catName + } + } + } + + if err := scanner.Err(); err != nil { + if isDebugCategorization { + log.Printf("error scanning /usr/share/artica-postfix/ressources/databases/categories.txt: ", err) + } + _catID = 0 + _catName = "Unknown" + } + + } + + //5.2ª Tracker DB + if _catID == 0 { + if isDebugCategorization { + log.Printf("Checking Inside Trackers DB") + } + trackerFound := false + //Try Cache + for _, val := range SelfTrackersDst { // Loop + if val == w { + _catID = 143 + _catName = "Trackers" + trackerFound = true + internal.Append(w, strconv.Itoa(_catID)+":"+_catName) + if isDebugCategorization { + log.Printf("%s founded in Trackers Cache with category %s (%d) - %s", w, _catName, _catID, internal.TimeTrack(start)) + } + break + return _catID, _catName + } + } + if !trackerFound { + //Try File + f, err := os.Open("/usr/share/artica-postfix/ressources/databases/trackers.txt") + + if err != nil { + if isDebugCategorization { + log.Printf("error reading /usr/share/artica-postfix/ressources/databases/trackers.txt: ", err) + } + _catID = 0 + _catName = "Unknown" + } + + defer f.Close() + + scanner := bufio.NewScanner(f) + + for scanner.Scan() { + if scanner.Text() == w { + _catID = 143 + _catName = "Trackers" + internal.Append(w, strconv.Itoa(_catID)+":"+_catName) + if isDebugCategorization { + log.Printf("%s founded in Trackers DB with category %s (%d) - %s", w, _catName, _catID, internal.TimeTrack(start)) + } + break + return _catID, _catName + } + } + + if err := scanner.Err(); err != nil { + if isDebugCategorization { + log.Printf("error scanning /usr/share/artica-postfix/ressources/databases/trackers.txt: ", err) + } + _catID = 0 + _catName = "Unknown" + } + } + + } + //5.3ª Advertising DB + if _catID == 0 { + if isDebugCategorization { + log.Printf("Checking Inside Advertising DB") + } + advertisingFound := false + //Try Cache + for _, val := range SelfAdvertBase { // Loop + if val == w { + _catID = 5 + _catName = "Advertising" + advertisingFound = true + internal.Append(w, strconv.Itoa(_catID)+":"+_catName) + if isDebugCategorization { + log.Printf("%s founded in Advertising Cache with category %s (%d) - %s", w, _catName, _catID, internal.TimeTrack(start)) + } + break + return _catID, _catName + } + } + if !advertisingFound { + //Try File + + f, err := os.Open("/usr/share/artica-postfix/ressources/databases/advertising.txt") + + if err != nil { + if isDebugCategorization { + log.Printf("error reading /usr/share/artica-postfix/ressources/databases/advertising.txt: ", err) + } + _catID = 0 + _catName = "Unknown" + } + + defer f.Close() + + scanner := bufio.NewScanner(f) + + for scanner.Scan() { + if scanner.Text() == w { + _catID = 5 + _catName = "Advertising" + internal.Append(w, strconv.Itoa(_catID)+":"+_catName) + if isDebugCategorization { + log.Printf("%s founded in Advertising DB with category %s (%d) - %s", w, _catName, _catID, internal.TimeTrack(start)) + } + break + return _catID, _catName + } + } + + if err := scanner.Err(); err != nil { + if isDebugCategorization { + log.Printf("error scanning /usr/share/artica-postfix/ressources/databases/advertising.txt: ", err) + } + _catID = 0 + _catName = "Unknown" + } + } + + } + + //6º Check on DNS Cloud Servers + + if _catID == 0 { + if isDebugCategorization { + log.Printf("Artica License is %t", internal.GetArticaLicense()) + } + if internal.GetArticaLicense() { + if isDebugCategorization { + log.Printf("Checking DNS Cloud Servers") + } + //TODO Change DNS System + resolvers := []string{ + SelfDns1, + SelfDns2, + } + url := strings.TrimSuffix(w, "\n") + domains := []string{ + url + ".filter.artica.center", + } + + client := resolvermt.New(resolvers, 3, 1000, 50) + defer client.Close() + results := client.Resolve(domains, resolvermt.TypeTXT) + for _, record := range results { + + s := strings.Split(record.Answer, ":") + cat_name := strings.Replace(s[01], " ", "_", -1) + cat_name = strings.Replace(cat_name, "/", "_", -1) + + _catID, _ = strconv.Atoi(s[0]) + _catName = cat_name + internal.Append(w, strconv.Itoa(_catID)+":"+_catName) + if isDebugCategorization { + log.Printf("%s founded in DNS Cloud Servers with category %s (%d) - %s", w, _catName, _catID, internal.TimeTrack(start)) + } + return _catID, _catName + } + + } + } + return _catID, _catName +} + +func IsArpa(sitename string) bool { + re := regexp.MustCompile("^([0-9]+)\\.([0-9]+)\\.([0-9]+)\\.([0-9]+)\\.in-addr\\.arpa$") + matches := re.MatchString(sitename) + if matches { + rs := re.FindStringSubmatch(sitename) + SelfStripaddr = fmt.Sprintf("%s.%s.%s.%s", rs[4], rs[3], rs[2], rs[1]) + return true + } + return false +} +func AdminWhitelist(pattern string, gethit bool) bool { + pattern = strings.ToLower(pattern) + pattern = strings.TrimSpace(pattern) + if len(pattern) < 3 { + return true + } + skey := fmt.Sprint("isWhite:%s", pattern) + if _, ok := SelfLocalWhiteBlack[skey]; ok { + return SelfLocalWhiteBlack[skey] + } + //TODO confirm get_cached func from python + if val, _ := internal.Fetch(skey); val != nil { + SelfLocalWhiteBlack[skey] = true + return true + + } + + if gethit { + if val, _ := internal.Fetch(skey); val != nil { + SelfLocalWhiteBlack[skey] = true + internal.Append(skey, "1") + return true + } + } + if SelfKSRNCategoryWhite > 0 { + catID, _ := GetCategories(pattern) + if catID == SelfKSRNCategoryWhite { + return true + } + } + if len(SelfWhitelistDst) == 0 { + if parseWhistelistDstrx(pattern) { + internal.Append(skey, "1") + SelfLocalWhiteBlack[skey] = true + return true + } + } + patternPoint := fmt.Sprintf(".%s", pattern) + sort.Strings(SelfWhitelistDst) + i := sort.Search(len(SelfWhitelistDst), + func(i int) bool { return SelfWhitelistDst[i] >= patternPoint }) + if i < len(SelfWhitelistDst) && SelfWhitelistDst[i] == patternPoint { + internal.Append(skey, "1") + SelfLocalWhiteBlack[skey] = true + return true + } + + sort.Strings(SelfWhitelistDst) + x := sort.Search(len(SelfWhitelistDst), + func(x int) bool { return SelfWhitelistDst[x] >= pattern }) + if x < len(SelfWhitelistDst) && SelfWhitelistDst[x] == pattern { + internal.Append(skey, "1") + SelfLocalWhiteBlack[skey] = true + return true + } + for _, srcdom := range SelfWhitelistDst { + srcdom = domainToRegex(srcdom) + if len(srcdom) < 3 { + continue + } + match, _ := regexp.MatchString(fmt.Sprintf("%s$", srcdom), pattern) + if match { + internal.Append(skey, "1") + SelfLocalWhiteBlack[skey] = true + return true + } + } + if parseWhistelistDstrx(pattern) { + internal.Append(skey, "1") + SelfLocalWhiteBlack[skey] = true + return true + } + SelfLocalWhiteBlack[skey] = false + if len(SelfLocalWhiteBlack) > 2500 { + SelfLocalWhiteBlack = map[string]bool{} + } + return false + +} + +func AdminBlacklist(pattern string, gethit bool) bool { + pattern = strings.ToLower(pattern) + pattern = strings.TrimSpace(pattern) + if len(pattern) < 3 { + return true + } + skey := fmt.Sprint("isBlack:%s", pattern) + if _, ok := SelfLocalWhiteBlack[skey]; ok { + return SelfLocalWhiteBlack[skey] + } + if val, _ := internal.Fetch(skey); val != nil { + SelfLocalWhiteBlack[skey] = true + return true + + } + if gethit { + if val, _ := internal.Fetch(skey); val != nil { + SelfLocalWhiteBlack[skey] = true + internal.Append(skey, "1") + return true + + } + } + + if len(SelfBlacklistDst) == 0 { + return false + } + patternPoint := fmt.Sprintf(".%s", pattern) + sort.Strings(SelfBlacklistDst) + i := sort.Search(len(SelfBlacklistDst), + func(i int) bool { return SelfBlacklistDst[i] >= patternPoint }) + if i < len(SelfBlacklistDst) && SelfBlacklistDst[i] == patternPoint { + internal.Append(skey, "1") + SelfLocalWhiteBlack[skey] = true + return true + } + + for _, srcdom := range SelfBlacklistDst { + srcdom = domainToRegex(srcdom) + if len(srcdom) < 3 { + continue + } + match, _ := regexp.MatchString(fmt.Sprintf("%s$", srcdom), pattern) + if match { + internal.Append(skey, "1") + SelfLocalWhiteBlack[skey] = true + return true + } + } + + SelfLocalWhiteBlack[skey] = false + if len(SelfLocalWhiteBlack) > 2500 { + SelfLocalWhiteBlack = map[string]bool{} + } + return false + +} + +func AdminWhitelistMac(mac string) bool { + SelfMac = mac + SelfMac = strings.TrimSpace(SelfMac) + if len(SelfMac) < 3 { + return false + } + if len(SelfWhitelistArp) == 0 { + return false + } + sort.Strings(SelfWhitelistArp) + i := sort.Search(len(SelfWhitelistArp), + func(i int) bool { return SelfWhitelistArp[i] >= SelfMac }) + if i < len(SelfWhitelistArp) && SelfWhitelistArp[i] == SelfMac { + return true + } + return false +} + +func AdminWhitelistSrc(pattern string) bool { + if len(SelfWhitelistSrc) == 0 { + return false + } + pattern = strings.TrimSpace(pattern) + if len(pattern) < 3 { + return false + } + skey := fmt.Sprintf("WHITEDOM:%s", pattern) + //if val, _ := internal.Fetch(skey); val != nil { + // return true + //} + if _, err := internal.Get(skey); err == nil { + return true + } + sort.Strings(SelfWhitelistSrc) + i := sort.Search(len(SelfWhitelistSrc), + func(i int) bool { return SelfWhitelistSrc[i] >= pattern }) + if i < len(SelfWhitelistSrc) && SelfWhitelistSrc[i] == pattern { + return true + } + + for _, cdir := range SelfWhitelistSrc { + cdir = strings.TrimSpace(cdir) + if len(cdir) < 3 { + continue + } + network, err := netip.ParsePrefix(cdir) + if err != nil { + panic(err) + } + ip, err := netip.ParseAddr(pattern) + if err != nil { + panic(err) + } + if network.Contains(ip) { + return true + } + } + return false +} + +func domainToRegex(srcdomain string) string { + srcdomain = strings.TrimSpace(srcdomain) + matches := []string{".*", "(", ")", "[", "]", ".+", "?", "\\", "|"} + sort.Strings(matches) + i := sort.Search(len(matches), + func(i int) bool { return matches[i] >= srcdomain }) + if i < len(matches) && matches[i] == srcdomain { + return srcdomain + } + if len(srcdomain) < 3 { + return "" + } + srcdomain = strings.TrimLeft("^", srcdomain) + srcdomain = strings.TrimLeft(".", srcdomain) + srcdomain = strings.ReplaceAll(srcdomain, ".", "\\.") + srcdomain = strings.ReplaceAll(srcdomain, ";", ".") + srcdomain = strings.ReplaceAll(srcdomain, "*", ".*?") + return fmt.Sprintf("%s$", srcdomain) + +} +func parseWhistelistDstrx(pattern string) bool { + if len(SelfWhitelistDstrx) == 0 { + return false + } + pattern = strings.TrimSpace(pattern) + if len(pattern) < 3 { + return false + } + pattern = strings.ToLower(pattern) + for _, srcdom := range SelfWhitelistDst { + srcdom = strings.TrimSpace(srcdom) + if len(srcdom) < 3 { + continue + } + match, _ := regexp.MatchString(srcdom, pattern) + if match { + return true + } + } + return false + +} + +func CategoryIntToString(category_int int) string { + translate_catz := map[int]string{} + if category_int == 0 { + if isDebugCategorization { + log.Printf("category_int is 0 func category_int_to_string -> if category_int == nil") + } + return "Unknown" + } + + translate_catz[0] = "Unknown" + translate_catz[1] = "Facebook" + translate_catz[2] = "Microsoft" + translate_catz[3] = "Society" + translate_catz[5] = "Advertising" + translate_catz[6] = "Phishtank" + translate_catz[7] = "Ransomwares" + translate_catz[8] = "Shopping" + translate_catz[9] = "Abortion" + translate_catz[10] = "Agressive" + translate_catz[11] = "Alcohol" + translate_catz[12] = "Animals" + translate_catz[13] = "Associations" + translate_catz[14] = "Astrology" + translate_catz[15] = "Audio-video" + translate_catz[16] = "Youtube" + translate_catz[17] = "Google" + translate_catz[18] = "Apple" + translate_catz[19] = "Amazonaws" + translate_catz[20] = "Akamai" + translate_catz[21] = "Yahoo" + translate_catz[22] = "Skype" + translate_catz[23] = "Citrix" + translate_catz[24] = "Bikes" + translate_catz[25] = "Boats" + translate_catz[26] = "Carpool" + translate_catz[27] = "Cars" + translate_catz[28] = "Planes" + translate_catz[29] = "Bicycles" + translate_catz[30] = "Blogs" + translate_catz[31] = "Books" + translate_catz[32] = "Browsers plugins" + translate_catz[33] = "Celebrities" + translate_catz[34] = "Chat" + translate_catz[35] = "Children" + translate_catz[36] = "Cleaning" + translate_catz[37] = "Clothing" + translate_catz[38] = "Converters" + translate_catz[39] = "Cosmetics" + translate_catz[40] = "Culture" + translate_catz[41] = "Dangerous materials" + translate_catz[42] = "Dating" + translate_catz[43] = "Dictionaries" + translate_catz[44] = "Downloads" + translate_catz[45] = "Drugs" + translate_catz[46] = "Dynamic DHCP ISP" + translate_catz[47] = "Electrical appliances" + translate_catz[48] = "Electronic house" + translate_catz[49] = "Filehosting" + translate_catz[50] = "Banking" + translate_catz[51] = "Insurances" + translate_catz[52] = "Moneylending" + translate_catz[53] = "Finance/other" + translate_catz[54] = "Realestate" + translate_catz[55] = "Financial" + translate_catz[56] = "Forums" + translate_catz[57] = "Gambling" + translate_catz[58] = "Games" + translate_catz[59] = "Genealogy" + translate_catz[60] = "Gifts" + translate_catz[62] = "Governments" + translate_catz[63] = "Green" + translate_catz[64] = "Hacking" + translate_catz[65] = "Handicap" + translate_catz[66] = "Health" + translate_catz[67] = "Arts" + translate_catz[68] = "Cooking" + translate_catz[69] = "Hobby Other" + translate_catz[70] = "Pets" + translate_catz[71] = "Paytosurf" + translate_catz[72] = "Terrorism" + translate_catz[73] = "Fishing" + translate_catz[74] = "Hospitals" + translate_catz[75] = "Houseads" + translate_catz[76] = "Housing accessories" + translate_catz[77] = "Housing doityourself" + translate_catz[78] = "Housing builders" + translate_catz[79] = "Humanitarian" + translate_catz[80] = "Images hosting" + translate_catz[81] = "Industry" + translate_catz[82] = "Internal" + translate_catz[83] = "Internet Providers" + translate_catz[85] = "Jobsearch" + translate_catz[86] = "Jobtraining" + translate_catz[87] = "Justice" + translate_catz[88] = "Learning" + translate_catz[89] = "Global White List" + translate_catz[90] = "Luxury" + translate_catz[91] = "Mailing" + translate_catz[92] = "Malwares" + translate_catz[93] = "Mangas" + translate_catz[94] = "Maps" + translate_catz[95] = "Marketingware" + translate_catz[96] = "Medical" + translate_catz[97] = "Mixed adult" + translate_catz[98] = "Smartphones" + translate_catz[99] = "Models" + translate_catz[100] = "Movie and Streaming" + translate_catz[101] = "Music" + translate_catz[102] = "Nature" + translate_catz[103] = "News and press" + translate_catz[104] = "Passwords" + translate_catz[105] = "Phishing" + translate_catz[106] = "Photo" + translate_catz[107] = "Pictures libraries" + translate_catz[108] = "Politic" + translate_catz[109] = "Porn" + translate_catz[111] = "Proxies" + translate_catz[112] = "Reaffected" + translate_catz[113] = "Humor" + translate_catz[114] = "Nightout" + translate_catz[115] = "Schools Educational" + translate_catz[116] = "Sports" + translate_catz[117] = "Get Married" + translate_catz[118] = "Police" + translate_catz[119] = "Travel" + translate_catz[120] = "Wellness" + translate_catz[121] = "Redirector" + translate_catz[122] = "Religion" + translate_catz[123] = "Remote-control" + translate_catz[124] = "Sciences" + translate_catz[125] = "Astronomy" + translate_catz[126] = "Science computing" + translate_catz[127] = "Weather" + translate_catz[128] = "Chemistry" + translate_catz[129] = "Searchengines" + translate_catz[130] = "Sect" + translate_catz[131] = "Sexual Education" + translate_catz[132] = "Lingerie (sex)" + translate_catz[133] = "Smallads" + translate_catz[134] = "Social Networks" + translate_catz[135] = "Spywares" + translate_catz[136] = "SSL certificates" + translate_catz[137] = "Stockexchange" + translate_catz[139] = "Redirector" + translate_catz[140] = "Suspicious" + translate_catz[141] = "Teens" + translate_catz[142] = "Tobacco" + translate_catz[143] = "Trackers" + translate_catz[144] = "Translators" + translate_catz[145] = "Transport" + translate_catz[146] = "Cheater" + translate_catz[147] = "Updatesites" + translate_catz[148] = "Violence" + translate_catz[149] = "Warez" + translate_catz[150] = "Weapons" + translate_catz[151] = "Web applications" + translate_catz[152] = "Webmails" + translate_catz[153] = "Web phones" + translate_catz[154] = "Web plugins" + translate_catz[155] = "Web radio" + translate_catz[156] = "Web TV" + translate_catz[157] = "Wine" + translate_catz[158] = "Womanbrand" + translate_catz[159] = "Horses" + translate_catz[160] = "Meetings" + translate_catz[161] = "Tattooing" + translate_catz[163] = "Literature" + translate_catz[166] = "Advertising" + translate_catz[167] = "Porn" + translate_catz[168] = "Agressive" + translate_catz[169] = "Arjel" + translate_catz[170] = "Religion" + translate_catz[171] = "Astrology" + translate_catz[172] = "Audio-video" + translate_catz[173] = "Banking" + translate_catz[174] = "Bitcoin" + translate_catz[175] = "Blogs" + translate_catz[176] = "Celebrities" + translate_catz[177] = "Chat" + translate_catz[178] = "Children" + translate_catz[179] = "Cleaning" + translate_catz[180] = "Cooking" + translate_catz[181] = "Cryptojacking" + translate_catz[182] = "Dangerous materials" + translate_catz[183] = "Dating" + translate_catz[184] = "D-DOS" + translate_catz[185] = "Dialers" + translate_catz[186] = "Downloads" + translate_catz[187] = "Drugs" + translate_catz[188] = "Schools Educational" + translate_catz[189] = "filehosting" + translate_catz[190] = "Financial" + translate_catz[191] = "Forums" + translate_catz[192] = "Gambling" + translate_catz[193] = "Games" + translate_catz[194] = "Proxies" + translate_catz[195] = "Hacking" + translate_catz[196] = "Jobsearch" + translate_catz[197] = "Sex Lingerie" + translate_catz[198] = "White list" + translate_catz[199] = "Educational White list" + translate_catz[200] = "Malwares" + translate_catz[201] = "Manga" + translate_catz[202] = "Marketingware" + translate_catz[203] = "Mixed Adult" + translate_catz[204] = "Smartphones" + translate_catz[205] = "Phishing" + translate_catz[207] = "Press" + translate_catz[208] = "Redirector" + translate_catz[209] = "Advertising" + translate_catz[210] = "Radio" + translate_catz[211] = "Reaffected" + translate_catz[212] = "Redirector" + translate_catz[213] = "Remote-control" + translate_catz[214] = "Sect" + translate_catz[215] = "Sexual Education" + translate_catz[216] = "Shopping" + translate_catz[217] = "Shorteners" + translate_catz[218] = "Social Networks" + translate_catz[219] = "Special" + translate_catz[220] = "Sports" + translate_catz[221] = "Redirector" + translate_catz[222] = "Redirector" + translate_catz[223] = "Translation" + translate_catz[224] = "Cheater" + translate_catz[225] = "Update" + translate_catz[226] = "Warez" + translate_catz[227] = "Webmail" + translate_catz[228] = "Poneytelecom" + translate_catz[229] = "OVH" + translate_catz[230] = "DigitalOcean" + translate_catz[231] = "Orange SA" + translate_catz[232] = "SoftLayer Technologies" + translate_catz[233] = "Linode" + translate_catz[234] = "Cloudflare" + translate_catz[235] = "cryptomining" + translate_catz[236] = "Hetzner Online" + translate_catz[237] = "DOH DNS" + translate_catz[249] = "DNS Black Listing" + translate_catz[5001] = "lem.adult.porn" + translate_catz[5002] = "lem.notlegal.appz" + translate_catz[5003] = "lem.notlegal.hardware" + translate_catz[5004] = "lem.games.online" + translate_catz[5005] = "lem.notlegal.generic" + translate_catz[5006] = "lem.health.prevention.drugs" + translate_catz[5007] = "lem.gov.justice" + translate_catz[5008] = "lem.gov.health" + translate_catz[5009] = "lem.dating" + translate_catz[5010] = "lem.scam" + translate_catz[5011] = "x.cd06.wl" + translate_catz[5012] = "lem.games.app.apple" + translate_catz[5013] = "lem.games.news" + translate_catz[5014] = "lem.health.prevention.accident" + translate_catz[5015] = "lem.finance.banks" + translate_catz[5016] = "lem.hobby.manga" + translate_catz[5017] = "lem.gamble" + translate_catz[5018] = "lem.games.app.pc" + translate_catz[5019] = "lem.health.risk.drugs" + translate_catz[5020] = "lem.companies.insurance" + translate_catz[5021] = "lem.games.app.android" + translate_catz[5022] = "lem.health.prevention.riskypractice" + translate_catz[5023] = "lem.gov.country.fr" + translate_catz[5024] = "lem.infected" + translate_catz[5025] = "lem.chat" + translate_catz[5026] = "lem.tracker" + translate_catz[5027] = "lem.malware" + translate_catz[5028] = "lem.gov.edu" + translate_catz[5029] = "lem.notlegal.moviez" + translate_catz[5030] = "lem.notlegal.p2p" + translate_catz[5031] = "lem.certificate" + translate_catz[5032] = "lem.search.safe-engines" + translate_catz[5033] = "lem.fake.news" + translate_catz[5034] = "lem.fake.joke" + translate_catz[5035] = "lem.fake.health" + translate_catz[5036] = "lem.notlegal.downloadz" + translate_catz[5037] = "lem.gov.rescue" + translate_catz[5038] = "lem.gov.towns" + translate_catz[5039] = "lem.gov.regions" + translate_catz[5040] = "lem.gov.country" + translate_catz[5041] = "lem.health.prevention.sects" + translate_catz[5042] = "lem.notlegal.extractor" + translate_catz[5043] = "lem.health.risk.sects" + translate_catz[5044] = "lem.gov.police" + translate_catz[5045] = "lem.finance.fr.notlegal" + translate_catz[5046] = "lem.gov.generic" + translate_catz[5047] = "lem.companies.industries" + translate_catz[5048] = "lem.adult.underwears" + translate_catz[5049] = "lem.health.products" + translate_catz[5050] = "lem.network.monitoring" + translate_catz[5051] = "lem.hobby.sport" + translate_catz[5052] = "x.cd06.bl" + translate_catz[5053] = "lem.computing" + translate_catz[5054] = "lem.shop" + translate_catz[5055] = "lem.companies.itservices" + translate_catz[5056] = "lem.computing.pentesting" + translate_catz[5057] = "lem.computing.freedns" + translate_catz[5058] = "lem.adult.sexshop" + translate_catz[5059] = "lem.learning" + translate_catz[5060] = "lem.computing.update" + translate_catz[5061] = "lem.hobby.art" + translate_catz[5062] = "lem.cooking" + translate_catz[5063] = "lem.companies.buildings" + translate_catz[5064] = "lem.hobby.genealogy" + translate_catz[5065] = "lem.hobby.astrology" + translate_catz[5066] = "lem.ads" + translate_catz[5067] = "lem.news.tv" + translate_catz[5068] = "lem.news.mag" + translate_catz[5069] = "lem.computing.webdesign" + translate_catz[5070] = "lem.learning.schools" + translate_catz[5071] = "lem.health.hospitals" + translate_catz[5072] = "lem.hobby.travel" + translate_catz[5073] = "lem.learning.manuals" + translate_catz[5074] = "lem.learning.languages" + translate_catz[5075] = "lem.learning.tools" + translate_catz[5076] = "lem.hobby.animals" + translate_catz[5077] = "lem.hobby.music" + translate_catz[5078] = "lem.hobby.vehicles" + translate_catz[5079] = "lem.health.disease" + translate_catz[5080] = "lem.app.productivity" + translate_catz[5081] = "lem.hobby.books" + translate_catz[5082] = "lem.hobby.photo" + translate_catz[5083] = "lem.sciences" + translate_catz[5084] = "lem.companies.realestate" + translate_catz[5085] = "lem.blogs.design" + translate_catz[5086] = "lem.blogs.geek" + translate_catz[5087] = "lem.socialnet" + translate_catz[5088] = "lem.blogs.persdev" + translate_catz[5089] = "lem.companies.models" + translate_catz[5090] = "lem.politics" + translate_catz[5091] = "lem.blogs" + translate_catz[5092] = "lem.ecology" + translate_catz[5093] = "lem.proxy" + translate_catz[5094] = "lem.phishing" + translate_catz[5095] = "lem.finance.cryptocoins" + translate_catz[5096] = "lem.health.risk" + translate_catz[5097] = "lem.pictures" + translate_catz[5098] = "lem.blogs.celebrity" + translate_catz[5099] = "lem.blogs.fashion" + translate_catz[5100] = "lem.blogs.diy" + translate_catz[5101] = "lem.violence" + translate_catz[5102] = "lem.blogs.history" + translate_catz[5103] = "lem.hobby.nature" + translate_catz[5104] = "lem.notmoderated" + translate_catz[5105] = "lem.blogs.lifestyle" + translate_catz[5106] = "lem.videos" + translate_catz[5107] = "lem.pwned" + translate_catz[5108] = "lem.religious" + translate_catz[5109] = "lem.tattouing" + translate_catz[5110] = "lem.companies.events" + translate_catz[5111] = "lem.anonymous" + translate_catz[5112] = "lem.visio" + translate_catz[5113] = "lem.adult.generic" + translate_catz[5114] = "lem.weapons" + translate_catz[5115] = "lem.job" + translate_catz[5116] = "lem.blogs.lgbt" + translate_catz[5117] = "lem.apple" + translate_catz[5118] = "lem.timeloose" + translate_catz[5119] = "lem.learning.cheat" + translate_catz[5120] = "lem.health.prevention" + translate_catz[5121] = "lem.computing.antivirus" + translate_catz[5122] = "lem.videos.youtube" + translate_catz[5123] = "lem.videos.tv" + translate_catz[5124] = "lem.notused" + translate_catz[5125] = "lem.search.nosafe-engines" + translate_catz[5126] = "lem.meteo" + translate_catz[5127] = "lem.finance.loan" + translate_catz[5128] = "lem.companies.printing" + if value, ok := translate_catz[category_int]; ok { + cat_name := strings.Replace(value, " ", "_", -1) + cat_name = strings.Replace(cat_name, "/", "_", -1) + return cat_name + } else { + return "Unknown" + } +} + +func checkIPAddressType(ip string) bool { + if net.ParseIP(ip) == nil { + if isDebugCategorization { + log.Printf("Invalid IP Address: %s\n", ip) + } + return false + } + for i := 0; i < len(ip); i++ { + switch ip[i] { + case '.': + if isDebugCategorization { + log.Printf("Given IP Address %s is IPV4 type\n", ip) + } + return true + case ':': + if isDebugCategorization { + log.Printf("Given IP Address %s is IPV6 type\n", ip) + } + return true + } + } + return false +} + +func IsPrivateIp(ip string) bool { + if checkIPAddressType(ip) { + ipaddr := net.ParseIP(ip) + return ipaddr.IsPrivate() + } + return false +} + +func get_category_by_ip(ip string) int { + if categorizeIPChecks(ip, defs_google) { + return 17 + + } + if categorizeIPChecks(ip, defs_amazon) { + return 19 + } + if categorizeIPChecks(ip, def_facebook) { + return 1 + } + if categorizeIPChecks(ip, defs_internal) { + return 82 + } + if categorizeIPChecks(ip, defs_ovh) { + return 229 + } + if categorizeIPChecks(ip, defs_microsoft) { + return 2 + } + if categorizeIPChecks(ip, def_apple) { + return 18 + } + if categorizeIPChecks(ip, def_akamai) { + return 20 + } + if categorizeIPChecks(ip, def_freewheel) { + return 156 + } + if categorizeIPChecks(ip, def_yandex) { + return 129 + } + if categorizeIPChecks(ip, defs_smartadservers) { + return 5 + } + if categorizeIPChecks(ip, defs_adjust) { + return 5 + } + if categorizeIPChecks(ip, defs_adify_corporation) { + return 5 + } + if categorizeIPChecks(ip, defs_indexExchange) { + return 5 + } + if categorizeIPChecks(ip, def_marktplaats) { + return 5 + } + if categorizeIPChecks(ip, def_videoplazza) { + return 5 + } + if categorizeIPChecks(ip, def_amobee_emeea) { + return 5 + } + if categorizeIPChecks(ip, def_mediamath) { + return 5 + } + if categorizeIPChecks(ip, defs_appnexus) { + return 5 + } + if categorizeIPChecks(ip, def_rubicon_project) { + return 5 + } + if categorizeIPChecks(ip, defs_eulerian) { + return 5 + } + if categorizeIPChecks(ip, defs_internet_archive) { + return 31 + } + if categorizeIPChecks(ip, def_banking) { + return 50 + } + if categorizeIPChecks(ip, def_roblox) { + return 58 + } + if categorizeIPChecks(ip, def_blizzard) { + return 58 + } + if categorizeIPChecks(ip, defs_digitalocean) { + return 230 + } + if categorizeIPChecks(ip, def_orange) { + return 231 + } + if categorizeIPChecks(ip, def_linode_lcc) { + return 233 + } + if categorizeIPChecks(ip, def_cloudflare) { + return 234 + } + if categorizeIPChecks(ip, defs_controld) { + return 237 + } + if categorizeIPChecks(ip, def_yahoo) { + return 21 + } + if categorizeIPChecks(ip, defs_kaspersky) { + return 36 + } + if categorizeIPChecks(ip, defs_avast) { + return 36 + } + if categorizeIPChecks(ip, defs_trendmicro) { + return 36 + } + if categorizeIPChecks(ip, def_daniel_cid) { + return 36 + } + if categorizeIPChecks(ip, def_box_com) { + return 49 + } + if categorizeIPChecks(ip, defs_linkdein) { + return 134 + } + if categorizeIPChecks(ip, defs_telegram_messgenger) { + return 153 + } + if categorizeIPChecks(ip, def_etf1) { + return 156 + } + if categorizeIPChecks(ip, def_canalplus) { + return 156 + } + if categorizeIPChecks(ip, defs_remote_control) { + return 123 + } + if categorizeIPChecks(ip, def_total_uptime) { + return 83 + } + if categorizeIPChecks(ip, def_cachenetworks) { + return 83 + } + if categorizeIPChecks(ip, def_exion_network) { + return 83 + } + if categorizeIPChecks(ip, def_g_core_labs) { + return 83 + } + if categorizeIPChecks(ip, def_hurricane_electric) { + return 83 + } + if categorizeIPChecks(ip, def_netactuate) { + return 83 + } + if categorizeIPChecks(ip, freie_netze_muenchen) { + return 83 + } + if categorizeIPChecks(ip, def_nessus_gmbh) { + return 83 + } + if categorizeIPChecks(ip, def_ab_stract) { + return 83 + } + if categorizeIPChecks(ip, defs_netcup_gmbh) { + return 83 + } + if categorizeIPChecks(ip, defs_hostach) { + return 83 + } + if categorizeIPChecks(ip, defs_inmotion) { + return 83 + } + if categorizeIPChecks(ip, def_node4) { + return 83 + } + if categorizeIPChecks(ip, defs_limelight_networks) { + return 83 + } + if categorizeIPChecks(ip, def_vodaphone) { + return 83 + } + if categorizeIPChecks(ip, def_webnx) { + return 83 + } + if categorizeIPChecks(ip, def_fastly) { + return 83 + } + if categorizeIPChecks(ip, def_liquid_web) { + return 83 + } + if categorizeIPChecks(ip, def_bouygues_telecom) { + return 83 + } + if categorizeIPChecks(ip, def_verizon) { + return 83 + } + if categorizeIPChecks(ip, def_citic_telecom) { + return 83 + } + if categorizeIPChecks(ip, def_online_sas) { + return 83 + } + if categorizeIPChecks(ip, def_cogent_communication) { + return 83 + } + if categorizeIPChecks(ip, def_xtom) { + return 83 + } + if categorizeIPChecks(ip, def_constant_company) { + return 83 + } + if categorizeIPChecks(ip, def_nitronet_sp) { + return 83 + } + if categorizeIPChecks(ip, def_cloud_nextgen) { + return 83 + } + if categorizeIPChecks(ip, def_quantil_network) { + return 83 + } + if categorizeIPChecks(ip, def_mach_dilemma) { + return 83 + } + if categorizeIPChecks(ip, def_mci_communication) { + return 83 + } + if categorizeIPChecks(ip, def_level3_communication) { + return 83 + } + if categorizeIPChecks(ip, def_iweb_technologies) { + return 83 + } + if categorizeIPChecks(ip, def_telia_company) { + return 83 + } + if categorizeIPChecks(ip, def_tata_communications) { + return 83 + } + if categorizeIPChecks(ip, def_infrastructure_Group_bv) { + return 83 + } + if categorizeIPChecks(ip, def_mpvs_ltd) { + return 83 + } + if categorizeIPChecks(ip, def_taiwan_network_information) { + return 83 + } + if categorizeIPChecks(ip, def_serveroid) { + return 83 + } + if categorizeIPChecks(ip, def_hosthatch) { + return 83 + } + if categorizeIPChecks(ip, def_cz_nic_zspo) { + return 83 + } + if categorizeIPChecks(ip, def_switch) { + return 83 + } + if categorizeIPChecks(ip, def_datacamp) { + return 83 + } + if categorizeIPChecks(ip, def_alphalink_sasu) { + return 83 + } + if categorizeIPChecks(ip, def_aptum_technologies) { + return 83 + } + if categorizeIPChecks(ip, def_andrews_arnold) { + return 83 + } + if categorizeIPChecks(ip, def_highwinds_network_group) { + return 83 + } + if categorizeIPChecks(ip, def_m247) { + return 83 + } + if categorizeIPChecks(ip, def_outscale_sasu) { + return 83 + } + if categorizeIPChecks(ip, def_llhost) { + return 83 + } + if categorizeIPChecks(ip, defs_sdv_plurimedia) { + return 83 + } + if categorizeIPChecks(ip, defs_automattic) { + return 83 + } + if categorizeIPChecks(ip, def_alibaba) { + return 83 + } + if categorizeIPChecks(ip, def_fly_io) { + return 83 + } + if categorizeIPChecks(ip, def_shenzhen_tencent) { + return 83 + } + if categorizeIPChecks(ip, defs_monaco_telecom) { + return 83 + } + if categorizeIPChecks(ip, def_communityrack_org) { + return 83 + } + if categorizeIPChecks(ip, def_wanagain) { + return 83 + } + if categorizeIPChecks(ip, def_planethoster) { + return 83 + } + if categorizeIPChecks(ip, def_ionos) { + return 83 + } + if categorizeIPChecks(ip, defs_internap_holding) { + return 83 + } + if categorizeIPChecks(ip, def_leaseweb) { + return 83 + } + if categorizeIPChecks(ip, def_ntt) { + return 83 + } + if categorizeIPChecks(ip, def_network_of_data_centers) { + return 83 + } + if categorizeIPChecks(ip, def_criteo_sa) { + return 143 + } + if categorizeIPChecks(ip, def_quantserve) { + return 143 + } + if categorizeIPChecks(ip, def_new_relic) { + return 143 + } + if categorizeIPChecks(ip, def_hetzner_online) { + return 236 + } + if categorizeIPChecks(ip, def_nextdns) { + return 237 + } + if categorizeIPChecks(ip, defs_conviva) { + return 100 + } + if categorizeIPChecks(ip, def_netflix) { + return 100 + } + if categorizeIPChecks(ip, defs_convia_inc) { + return 100 + } + if categorizeIPChecks(ip, def_github) { + return 126 + } + if categorizeIPChecks(ip, def_smile_gie) { + return 126 + } + if categorizeIPChecks(ip, def_thomas_steen_rasmussen) { + return 126 + } + if categorizeIPChecks(ip, defs_adobe) { + return 126 + } + if categorizeIPChecks(ip, def_canonical_group) { + return 126 + } + if categorizeIPChecks(ip, def_nvidia) { + return 126 + } + if categorizeIPChecks(ip, def_dell) { + return 126 + } + if categorizeIPChecks(ip, def_nutannix) { + return 126 + } + if categorizeIPChecks(ip, def_vmware) { + return 126 + } + if categorizeIPChecks(ip, def_haproxy_technologies) { + return 126 + } + if categorizeIPChecks(ip, def_twitter) { + return 134 + } + if categorizeIPChecks(ip, defs_salesforce) { + return 151 + } + if categorizeIPChecks(ip, def_unversity) { + return 115 + } + if categorizeIPChecks(ip, def_renater) { + return 115 + } + if categorizeIPChecks(ip, def_index_education) { + return 115 + } + if categorizeIPChecks(ip, def_kaspersky) { + return 147 + } + if categorizeIPChecks(ip, def_eset) { + return 147 + } + return 0 +} + +func categorizeIPChecks(ip string, categories []string) bool { + for _, v := range categories { + + _, ipnetA, err := net.ParseCIDR(v) + ipB := net.ParseIP(ip) + if err != nil { + log.Printf("Bad cidr. Got %v", err) + return false + } + + if ipnetA.Contains(ipB) { + return true + break + } else { + log.Printf("Given IP Address %s not found in catz\n", ip) + } + + } + return false +} + +func FixedWhitelist(url string) bool { + matches := false + if SelfKsrnDisableGoogleAdServices { + if url == "www.googleadservices.com" { + return true + } + if url == "googleadservices.com" { + return true + } + if url == "adservice.google.com" { + return true + } + if url == "www.adservice.google.com" { + return true + } + if url == "www.googletagmanager.com" { + return true + } + if url == "pagead2.googlesyndication.com" { + return true + } + if url == "partner.googleadservices.com" { + return true + } + if url == "tpc.googlesyndication.com" { + return true + } + if url == "www.googletagservices.com" { + return true + } + } + skey := fmt.Sprintf("isWhite:%s", url) + if val, _ := internal.Fetch(skey); val != nil { + return true + } + if url == "suggestqueries.google.com" { + return true + } + if url == "fonts.gstatic.com" { + return true + } + if url == "ip.42.pl" { + return true + } + if url == "discordservers.me" { + return true + } + if url == "disboard.org" { + return true + } + if url == "www.appleiphonecell.com" { + return true + } + if url == "syndication.twitter.com" { + return true + } + if url == "api.eu.amazonalexa.com" { + return true + } + if url == "calendar.google.com" { + return true + } + if url == "www.google.com" { + return true + } + if url == "doh.this.web.id" { + return true + } + + if url == "plex.tv" { + return true + } + if url == "jsonip.com" { + return true + } + if url == "detectportal.firefox.com" { + return true + } + if url == "www.thinkdifferent.us" { + return true + } + if url == "www.airport.us" { + return true + } + if url == "www.itools.info" { + return true + } + if url == "www.ibook.info" { + return true + } + if url == "packages.sury.org" { + return true + } + + if url == "www.netflix.com" { + return true + } + if url == "connectivity-check.ubuntu.com" { + return true + } + if url == "ocsp2.apple.com" { + return true + } + if url == "mesu.apple.com" { + return true + } + if url == "audiocontentdownload.apple.com" { + return true + } + if url == "gateway.icloud.com" { + return true + } + if url == "inappcheck.itunes.apple.com" { + return true + } + if url == "ws.school.apple.com" { + return true + } + + if url == "ocws.officeapps.live.com" { + return true + } + if url == "login.microsoftonline.com" { + return true + } + if url == "go.microsoft.com" { + return true + } + if url == "static-asm.secure.skypeassets.com" { + return true + } + if url == "fpc.msedge.net" { + return true + } + if url == "b-ring.msedge.net" { + return true + } + if url == "outlook.live.com" { + return true + } + + if url == "client.wns.windows.com" { + return true + } + if url == "activity.windows.com" { + return true + } + + if url == "bing.com" { + return true + } + if url == "www.bing.com" { + return true + } + + if url == "api.aps.skype.com" { + return true + } + if url == "config.edge.skype.com" { + return true + } + if url == "people.skype.com" { + return true + } + if url == "consumer.entitlement.skype.com" { + return true + } + if url == "static.asm.skype.com" { + return true + } + if url == "pear.php.net" { + return true + } + + if url == "targetemsecure.blob.core.windows.net" { + return true + } + + if url == "arcus-uswest.amazon.com" { + return true + } + if url == "pollserver.lastpass.com" { + return true + } + if url == "media1.giphy.com" { + return true + } + if url == "media2.giphy.com" { + return true + } + if url == "media3.giphy.com" { + return true + } + + if url == "am3pap006.storage.live.com" { + return true + } + if url == "www.login.live.com" { + return true + } + if url == "skyapi.policies.live.net" { + return true + } + if url == "login.live.com" { + return true + } + if url == "config.teams.microsoft.com" { + return true + } + if url == "outlook.office365.com" { + return true + } + if url == "login.microsoftonline.com" { + return true + } + + //Wordpress... + if url == "i0.wp.com" { + return true + } + + //Microsoft + if url == "c.s-microsoft.com" { + return true + } + + if url == "www.linkedin.com" { + return true + } + if url == "realtime.www.linkedin.com" { + return true + } + + if url == "firefox.settings.services.mozilla.com" { + return true + } + + if url == "www.bookmyname.com" { + return true + } + if url == "www.paypal.com" { + return true + } + if url == "www.paypalobjects.com" { + return true + } + if url == "checkout.paypal.com" { + return true + } + if url == "b.stats.paypal.com" { + return true + } + if url == "dub.stats.paypal.com" { + return true + } + if url == "c6.paypal.com" { + return true + } + + if url == "events.gfe.nvidia.com" { + return true + } + if url == "services.gfe.nvidia.com" { + return true + } + + if url == "alive.github.com" { + return true + } + if url == "api.github.com" { + return true + } + + if url == "cdnjs.cloudflare.com" { + return true + } + if url == "www.reddit.com" { + return true + } + if url == "api.pinterest.com" { + return true + } + if url == "share.yandex.ru" { + return true + } + if url == "domainbigdata.com" { + return true + } + if url == "speeddials.opera.com" { + return true + } + if url == "s1.dmcdn.net" { + return true + } + if url == "nmcheck.gnome.org" { + return true + } + if url == "update.nai.com" { + return true + } + if url == "update.veritas.com" { + return true + } + + if url == "accounts.youtube.com" { + return true + } + + if url == "cros-omahaproxy.appspot.com" { + return true + } + if url == "gweb-gettingstartedguide.appspot.com" { + return true + } + if url == "omahaproxy.appspot.com" { + return true + } + + if url == "doh.post-factum.tk" { + return true + } + if url == "doh.bortzmeyer.fr" { + return true + } + if url == "doh.crypto.sx" { + return true + } + + if url == "a-ring-fallback.msedge.net" { + return true + } + if url == "ocsp.globalsign.com" { + return true + } + matches, _ = regexp.MatchString("(\\.|^)(drupal|articatech|artica)\\.(org|center|net|com)$", url) + if matches { + return true + } + matches, _ = regexp.MatchString("[a-z][0-9]+\\.dualstack\\.[a-z\\-]+-[0-9]+\\.amazonaws\\.com$", url) + if matches { + return true + } + if SelfKsrnDisableGoogleAdServices { + matches, _ = regexp.MatchString("(\\.|^)(adservice\\.google|googleadservices)\\.[a-z]+$'", url) + if matches { + if isDebugCategorization { + log.Printf("[DEBUG]: %s = Forced to PASS", url) + } + return true + } + } + matches, _ = regexp.MatchString("(\\.|^)(1e100\\.net|topsante|codegena|manga-news|googlevideo|netflix|narkive)\\.com$", url) + if matches { + return true + } + + matches, _ = regexp.MatchString("(\\.|^)client[0-9]+\\.google\\.com$", url) + if matches { + return true + } + + matches, _ = regexp.MatchString("(\\.|^)(fbcdn)\\.net$", url) + if matches { + return true + } + + matches, _ = regexp.MatchString("(\\.|^)(nflxvideo|msedge|cguardprotect|office)\\.net$", url) + if matches { + return true + } + + matches, _ = regexp.MatchString("(\\.|^)(phishtank|drupal)\\.org$", url) + if matches { + return true + } + + matches, _ = regexp.MatchString("(\\.|^)(amazon|jetbrains|oracle|ssl-images-amazon)\\.(co\\.jp|com|net|fr|es|pt|pl|uk|com\\.br)$", url) + if matches { + return true + } + + matches, _ = regexp.MatchString("(\\.|^)(appdynamics|opendns|bitdefender|service-now|bechtle|gstatic|sharepoint|thinkdifferent|appleiphonecell|seagate|msftncsi|epicgames|)\\.(fr|com|info|us|net)", url) + if matches { + return true + } + + matches, _ = regexp.MatchString("(\\.|^)ac-(aix-marseille|am|amiens|besancon|bordeaux|caen|clermont|coaching|corse|creteil|dijon|grenoble|guadeloupe|guyane|lille|limoges|lyon|martinique|montpellier|nancy-metz|nantes|nice|normandie|orleans-tours|paris|poitiers|reims|rennes|reunion|rouen|spm|strasbourg|toulouse|versailles)\\.fr$", url) + if matches { + return true + } + + matches, _ = regexp.MatchString("(\\.|^)(ibook\\.info|thinkdifferent\\.us|mozilla\\.net|airport\\.us|playstation\\.net|banquepopulaire\\.fr)$", url) + if matches { + return true + } + matches, _ = regexp.MatchString("(\\.|^)(office365|bing|gr-assets|microsoft|icloud-content|msftconnecttest|kaspersky|firefox|appleiphonecell|samsungcloudsolution|live|apple|icloud|facebook)\\.com$", url) + if matches { + return true + } + + matches, _ = regexp.MatchString("(\\.|^)(sectigo|deepl|stackoverflow|vimeocdn|wordpress|ytimg|teamviewer|mozilla|brave|youtube|facebook|msftncsi|gravatar|messenger\\.live|googlebot)\\.com$", url) + if matches { + return true + } + matches, _ = regexp.MatchString("(\\.|^)(narkive|vorwerk-digital|msn|qwant|starleaf|ipdeny|xboxlive|github|githubapp|kaspersky-labs|githubassets|a2z)\\.com$", url) + if matches { + return true + } + + matches, _ = regexp.MatchString("(\\.|^)(squarespace|jimstatic|parastorage|squarespace-cdn|website-files|webflow|jimcdn|wixstatic)\\.com$", url) + if matches { + return true + } + + matches, _ = regexp.MatchString("(\\.|^)(ecosia|qwant|qwantjunior|edupole)\\.[a-z]+$", url) + if matches { + return true + } + + matches, _ = regexp.MatchString("\\.(corp|home|mail|tld)$", url) + if matches { + return true + } + sort.Strings(SelfSrnWhite) + i := sort.Search(len(SelfSrnWhite), + func(i int) bool { return SelfSrnWhite[i] >= url }) + if i < len(SelfSrnWhite) && SelfSrnWhite[i] == url { + return true + } + return false + +} + +func GetCategoriesCguard(sitename string) int { + var matches bool + var rs []string + var re *regexp.Regexp + if strings.Index(sitename, ".") < 1 { + return 82 + } + if strings.Index(sitename, "*") > 0 { + return 82 + } + squery := fmt.Sprintf("%s.cloud.cguardprotect.net", sitename) + if value, _ := internal.Fetch(squery); value != nil { + data, _ := strconv.Atoi(*value) + SelfCategorieName = CategoryIntToString(data) + if isDebugCategorization { + log.Printf("%s %s [%d] %s", sitename, "CGUARD HIT", data, SelfCategorieName) + } + return data + } + if isDebugCategorization { + log.Printf("Checking Cguard Cloud Servers") + } + //TODO Change DNS System + resolvers := []string{ + SelfDns1, + SelfDns2, + } + url := strings.TrimSuffix(squery, "\n") + domains := []string{ + url, + } + + client := resolvermt.New(resolvers, 3, 1000, 50) + defer client.Close() + results := client.Resolve(domains, resolvermt.TypeTXT) + for _, record := range results { + + re = regexp.MustCompile("([0-9]+):(.+?):([0-9]+)") + matches = re.MatchString(record.Answer) + if matches { + rs = re.FindStringSubmatch(record.Answer) + categoryID, _ := strconv.Atoi(rs[1]) + return categoryID + } + sdata := decryptTxt("2FdJpHFckXau8226fKFyTts3y6Nd7wsa", record.Answer) + if isDebugCategorization { + log.Printf("DECODED TXT [%s]", sdata) + } + re = regexp.MustCompile("([0-9]+):(.+?):([0-9]+)") + matches = re.MatchString(string(sdata)) + if matches { + rs = re.FindStringSubmatch(string(sdata)) + categoryID, _ := strconv.Atoi(rs[1]) + return categoryID + } else { + return 0 + } + } + return 0 +} + +func decryptTxt(k, enc string) string { + sDec, _ := b64.StdEncoding.DecodeString(enc) + ciphertext := []byte(sDec) + + key := []byte(k) + if plaintext, err := decryptCBC(key, ciphertext); err != nil { + panic(err) + } else { + return string(plaintext) + } + +} +func decryptCBC(key, ciphertext []byte) (plaintext []byte, err error) { + var block cipher.Block + + if block, err = aes.NewCipher(key); err != nil { + return + } + + if len(ciphertext) < aes.BlockSize { + log.Printf("ciphertext too short") + return + } + + iv := ciphertext[:aes.BlockSize] + ciphertext = ciphertext[aes.BlockSize:] + + cbc := cipher.NewCBCDecrypter(block, iv) + cbc.CryptBlocks(ciphertext, ciphertext) + + plaintext = ciphertext + + return +} diff --git a/server/go.mod b/server/go.mod new file mode 100755 index 0000000..e83f2b0 --- /dev/null +++ b/server/go.mod @@ -0,0 +1,52 @@ +module server + +go 1.18 + +replace handlers => ../handlers + +replace storage => ../storage + +replace categorization => ../categorization + +replace shields => ../shields + +replace ufdbguard => ../ufdbguard + +replace itchart => ../itchart + +require ( + categorization v0.0.0-00010101000000-000000000000 + github.com/facebookgo/pidfile v0.0.0-20150612191647-f242e2999868 + github.com/fasthttp/router v1.4.6 + github.com/oschwald/geoip2-golang v1.7.0 + github.com/sirupsen/logrus v1.8.1 + github.com/techoner/gophp v0.2.0 + github.com/valyala/fasthttp v1.34.0 + handlers v0.0.0-00010101000000-000000000000 + shields v0.0.0-00010101000000-000000000000 + storage v0.0.0-00010101000000-000000000000 + ufdbguard v0.0.0-00010101000000-000000000000 +) + +require ( + github.com/allegro/bigcache/v3 v3.0.2 // indirect + github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129 // indirect + github.com/andybalholm/brotli v1.0.4 // indirect + github.com/bradfitz/gomemcache v0.0.0-20220106215444-fb4bf637b56d // indirect + github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/d3mondev/resolvermt v0.3.2 // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 // indirect + github.com/go-redis/redis/v8 v8.11.5 // indirect + github.com/klauspost/compress v1.15.0 // indirect + github.com/leekchan/timeutil v0.0.0-20150802142658-28917288c48d // indirect + github.com/miekg/dns v1.1.40 // indirect + github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 // indirect + github.com/oschwald/maxminddb-golang v1.9.0 // indirect + github.com/savsgio/gotils v0.0.0-20211223103454-d0aaa54c5899 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + go.uber.org/ratelimit v0.2.0 // indirect + golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29 // indirect + golang.org/x/net v0.0.0-20220225172249-27dd8689420f // indirect + golang.org/x/sys v0.0.0-20220325203850-36772127a21f // indirect +) diff --git a/server/go.sum b/server/go.sum new file mode 100755 index 0000000..8a0b0a4 --- /dev/null +++ b/server/go.sum @@ -0,0 +1,112 @@ +github.com/allegro/bigcache/v3 v3.0.2 h1:AKZCw+5eAaVyNTBmI2fgyPVJhHkdWder3O9IrprcQfI= +github.com/allegro/bigcache/v3 v3.0.2/go.mod h1:aPyh7jEvrog9zAwx5N7+JUQX5dZTSGpxF1LAR4dr35I= +github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129 h1:MzBOUgng9orim59UnfUTLRjMpd09C5uEVQ6RPGeCaVI= +github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129/go.mod h1:rFgpPQZYZ8vdbc+48xibu8ALc3yeyd64IhHS+PU6Yyg= +github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/bradfitz/gomemcache v0.0.0-20220106215444-fb4bf637b56d h1:pVrfxiGfwelyab6n21ZBkbkmbevaf+WvMIiR7sr97hw= +github.com/bradfitz/gomemcache v0.0.0-20220106215444-fb4bf637b56d/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= +github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/d3mondev/resolvermt v0.3.2 h1:GuvpC6STaEiseETw86GX4HPkBcVqIBcOH1sqpO6qlz4= +github.com/d3mondev/resolvermt v0.3.2/go.mod h1:upm9SiedgEkrJ4YYxfnEPbtWvgxMwNd5oigx6dQLYhE= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 h1:BBso6MBKW8ncyZLv37o+KNyy0HrrHgfnOaGQC2qvN+A= +github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5/go.mod h1:JpoxHjuQauoxiFMl1ie8Xc/7TfLuMZ5eOCONd1sUBHg= +github.com/facebookgo/pidfile v0.0.0-20150612191647-f242e2999868 h1:KZ75X3ZCl6yy4jg9R1ziYoCZFDBRqildm+fGComWU7U= +github.com/facebookgo/pidfile v0.0.0-20150612191647-f242e2999868/go.mod h1:3Hzo46xzfVpIdv4lJw7YBp9fUJ7HpUgbjH1fFDgy4qM= +github.com/fasthttp/router v1.4.6 h1:KfETdHGBnvoBfBHeRe/8TVYz8Bp/mASBVC5UXO9CpZI= +github.com/fasthttp/router v1.4.6/go.mod h1:Iv800u3hYFNuBBcmJNs/VBVpub+JfBihGBp5spSocbw= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= +github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/klauspost/compress v1.14.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.0 h1:xqfchp4whNFxn5A4XFyyYtitiWI8Hy5EW59jEwcyL6U= +github.com/klauspost/compress v1.15.0/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/leekchan/timeutil v0.0.0-20150802142658-28917288c48d h1:2puqoOQwi3Ai1oznMOsFIbifm6kIfJaLLyYzWD4IzTs= +github.com/leekchan/timeutil v0.0.0-20150802142658-28917288c48d/go.mod h1:hO90vCP2x3exaSH58BIAowSKvV+0OsY21TtzuFGHON4= +github.com/miekg/dns v1.1.40 h1:pyyPFfGMnciYUk/mXpKkVmeMQjfXqt3FAJ2hy7tPiLA= +github.com/miekg/dns v1.1.40/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/oschwald/geoip2-golang v1.7.0 h1:JW1r5AKi+vv2ujSxjKthySK3jo8w8oKWPyXsw+Qs/S8= +github.com/oschwald/geoip2-golang v1.7.0/go.mod h1:mdI/C7iK7NVMcIDDtf4bCKMJ7r0o7UwGeCo9eiitCMQ= +github.com/oschwald/maxminddb-golang v1.9.0 h1:tIk4nv6VT9OiPyrnDAfJS1s1xKDQMZOsGojab6EjC1Y= +github.com/oschwald/maxminddb-golang v1.9.0/go.mod h1:TK+s/Z2oZq0rSl4PSeAEoP0bgm82Cp5HyvYbt8K3zLY= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/savsgio/gotils v0.0.0-20211223103454-d0aaa54c5899 h1:Orn7s+r1raRTBKLSc9DmbktTT04sL+vkzsbRD2Q8rOI= +github.com/savsgio/gotils v0.0.0-20211223103454-d0aaa54c5899/go.mod h1:oejLrk1Y/5zOF+c/aHtXqn3TFlzzbAgPWg8zBiAHDas= +github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= +github.com/techoner/gophp v0.2.0 h1:vVFoS2XC/NZariagUOhAGqC8p/Ws8R8ARYpj/9lTIAo= +github.com/techoner/gophp v0.2.0/go.mod h1:NOxB/qoTl4+G82CkQp60T18Az5rOTufCqm83x9i/u7M= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.33.0/go.mod h1:KJRK/MXx0J+yd0c5hlR+s1tIHD72sniU8ZJjl97LIw4= +github.com/valyala/fasthttp v1.34.0 h1:d3AAQJ2DRcxJYHm7OXNXtXt2as1vMDfxeIcFvhmGGm4= +github.com/valyala/fasthttp v1.34.0/go.mod h1:epZA5N+7pY6ZaEKRmstzOuYJx9HI8DI1oaCGZpdH4h0= +github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/ratelimit v0.2.0 h1:UQE2Bgi7p2B85uP5dC2bbRtig0C+OeNRnNEafLjsLPA= +go.uber.org/ratelimit v0.2.0/go.mod h1:YYBV4e4naJvhpitQrWJu1vCpgB7CboMe0qhltKt6mUg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29 h1:tkVvjkPTB7pnW3jnid7kNyAMPVWllTNOf/qKDze4p9o= +golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220111093109-d55c255bac03/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220111092808-5a964db01320/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220325203850-36772127a21f h1:TrmogKRsSOxRMJbLYGrB4SBbW+LJcEllYBLME5Zk5pU= +golang.org/x/sys v0.0.0-20220325203850-36772127a21f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/server/internal/bigcache.go b/server/internal/bigcache.go new file mode 100755 index 0000000..0282d8a --- /dev/null +++ b/server/internal/bigcache.go @@ -0,0 +1,318 @@ +package internal + +import ( + "bufio" + "crypto/md5" + "encoding/hex" + "errors" + "fmt" + "github.com/allegro/bigcache/v3" + "io" + "log" + "os" + "strconv" + "strings" + "time" +) + +var InMemoryCache *bigcache.BigCache + +var ( + SelfLifeWindow time.Duration = 86400 + SelfHardMaxCacheSize int = 2048 + SelfShards = 512 + isDebugBigCache bool +) + +func InitBigcache(debug bool) { + + SelfLifeWindow = time.Duration(GetSocketInfoInt("Go_Shield_Server_Cache_Time")) + SelfHardMaxCacheSize = GetSocketInfoInt("Go_Shield_Server_DB_Size") + isDebugBigCache = debug + SelfShards = GetSocketInfoInt("Go_Shield_Server_DB_Shards") + if SelfLifeWindow == 0 { + SelfLifeWindow = time.Duration(86400) + } + + if SelfHardMaxCacheSize == 0 { + SelfHardMaxCacheSize = 2048 + } + + if SelfShards == 0 { + SelfShards = 1024 + } + + config := bigcache.Config{ + // number of shards (must be a power of 2) + Shards: SelfShards, + + // time after which entry can be evicted + LifeWindow: SelfLifeWindow * time.Second, + + // Interval between removing expired entries (clean up). + // If set to <= 0 then no action is performed. + // Setting to < 1 second is counterproductive — bigcache has a one second resolution. + CleanWindow: 5 * time.Minute, + + // rps * lifeWindow, used only in initial memory allocation + MaxEntriesInWindow: 1000 * 10 * 60, + + // max entry size in bytes, used only in initial memory allocation + MaxEntrySize: 512, + + // prints information about additional memory allocation + Verbose: isDebugBigCache, + + // cache will not allocate more memory than this limit, value in MB + // if value is reached then the oldest entries can be overridden for the new ones + // 0 value means no size limit + HardMaxCacheSize: SelfHardMaxCacheSize, + + // callback fired when the oldest entry is removed because of its expiration time or no space left + // for the new entry, or because delete was called. A bitmask representing the reason will be returned. + // Default value is nil which means no callback and it prevents from unwrapping the oldest entry. + OnRemove: nil, + + // OnRemoveWithReason is a callback fired when the oldest entry is removed because of its expiration time or no space left + // for the new entry, or because delete was called. A constant representing the reason will be passed through. + // Default value is nil which means no callback and it prevents from unwrapping the oldest entry. + // Ignored if OnRemove is specified. + OnRemoveWithReason: nil, + } + InMemoryCache, _ = bigcache.NewBigCache(config) +} +func Md5string(str string) string { + h := md5.New() + io.WriteString(h, str) + hashed := hex.EncodeToString(h.Sum(nil)) + return hashed +} + +func Append(key string, value string) { + InMemoryCache.Append(key, []byte(value)) +} + +func Fetch(key string) (response *string, error error) { + if value, err := InMemoryCache.Get(key); err == nil { + val := string(value) + if val == "" { + err = errors.New("empty val") + if isDebugBigCache { + log.Printf("Unable to Fetch %s due %s", key, err) + } + return nil, err + } + return &val, nil + } else { + if isDebugBigCache { + log.Printf("Unable to Fetch %s due %s", key, err) + } + return nil, err + } + + //return nil +} + +func Increment(key string) { + counter, _ := Fetch(key) + if counter == nil { + val := 0 + val = val + 1 + Append(key, strconv.Itoa(val)) + } else { + val, err := strconv.Atoi(*counter) + if err == nil { + val = val + 1 + Append(key, strconv.Itoa(val)) + } + } + +} + +func Decrement(key string) { + counter, _ := Fetch(key) + val, err := strconv.Atoi(*counter) + if err == nil { + val = val - 1 + if val < 0 { + val = 0 + } + Append(key, strconv.Itoa(val)) + } +} + +func UserAliases(mac string, ipaddr string, ipstrongswan string, isDebugBigCache bool) string { + mac = strings.ToLower(mac) + val := "" + key := "" + if len(mac) > 5 { + key = fmt.Sprintf("%s:alias", mac) + macpath := fmt.Sprintf("/home/artica/UsersMac/Caches/%s", mac) + //val = Get(key, isDebugBigCache) + //if val != "" { + // if val == "NONE" { + // return "" + // } + // sfinl := strings.Split(val, "|") + // if len(sfinl) > 0 { + // return sfinl[0] + // } + // return val + //} + if value, err := InMemoryCache.Get(key); err == nil { + val = string(value) + if val != "" { + if val == "NONE" { + return "" + } + sfinl := strings.Split(val, "|") + if len(sfinl) > 0 { + return sfinl[0] + } + return val + } + } + + if _, err := os.Stat(macpath); !os.IsNotExist(err) { + f, err := os.Open(macpath) + + if err != nil { + if isDebugBigCache { + log.Printf("error reading %s %s", macpath, err) + } + + } + defer f.Close() + scanner := bufio.NewScanner(f) + for scanner.Scan() { + Set(key, scanner.Text(), 600) + sfinl := strings.Split(scanner.Text(), "|") + if len(sfinl) > 0 { + return sfinl[0] + } + return scanner.Text() + } + if err := scanner.Err(); err != nil { + if isDebugBigCache { + log.Printf("error scanning %s %s", macpath, err) + } + } + } + Set(key, "NONE", 600) + if len(ipstrongswan) > 0 { + key = fmt.Sprintf("%s:vpnalias", ipaddr) + //val = Get(key, isDebugBigCache) + // + //if val != "" { + // if val == "NONE" { + // return "" + // } + // return val + //} + if value, err := InMemoryCache.Get(key); err == nil { + val = string(value) + if val != "" { + if val == "NONE" { + return "" + } + return val + } + } + + val = StrongSwanAlias(ipaddr, isDebugBigCache) + if val == "" { + Set(key, "NONE", 150) + return "" + } + Set(key, val, 150) + } + key = fmt.Sprintf("%s:alias", ipaddr) + cachepath := fmt.Sprintf("/home/artica/UsersMac/Caches/%s", ipaddr) + //val = Get(key, isDebugBigCache) + //if val != "" { + // if val == "NONE" { + // return "" + // } + // sfinl := strings.Split(val, "|") + // if len(sfinl) > 0 { + // return sfinl[0] + // } + // return val + //} + + if value, err := InMemoryCache.Get(key); err == nil { + val = string(value) + if val != "" { + if val == "NONE" { + return "" + } + sfinl := strings.Split(val, "|") + if len(sfinl) > 0 { + return sfinl[0] + } + return val + } + } + + if _, err := os.Stat(cachepath); !os.IsNotExist(err) { + f, err := os.Open(cachepath) + + if err != nil { + if isDebugBigCache { + log.Printf("error reading %s %s", cachepath, err) + } + + } + defer f.Close() + scanner := bufio.NewScanner(f) + for scanner.Scan() { + Set(key, scanner.Text(), 600) + sfinl := strings.Split(scanner.Text(), "|") + if len(sfinl) > 0 { + return sfinl[0] + } + return scanner.Text() + } + if err := scanner.Err(); err != nil { + if isDebugBigCache { + log.Printf("error scanning %s %s", cachepath, err) + } + } + } + + } + Set(key, "NONE", 600) + return "" +} + +func StrongSwanAlias(ipaddr string, isDebugBigCache bool) string { + //TODO implement this method + //data := GetSocketInfoString("strongSwanClientsArray") + //out, err := gophp.Unserialize([]byte(data)) + // + //if err != nil { + // if isDebugBigCache { + // log.Printf("error Unserialize strongSwanClientsArray: ", err) + // } + // return "" + //} + //if mout, ok := out.(map[string]interface{}); ok { + // for _, main_index := range mout { + // subarray := main_index.(map[string]interface{}) + // for _, main_index2 := range subarray { + // subarray2 := mout[main_index][main_index2] + // } + // } + //} + return "" +} + +func ShieldsFullCache(username string, ipaddr string, mac string, sitename string, method string) string { + sitename = strings.ToLower(sitename) + username = strings.ToLower(username) + method = strings.ToLower(mac) + PrepareCache := []byte(fmt.Sprintf("%s|%s|%s|%s|%s", username, ipaddr, mac, sitename, method)) + PrepareCache = []byte(Md5string(string(PrepareCache))) + smd5 := fmt.Sprintf("SHIELD.%s", PrepareCache) + return smd5 +} diff --git a/server/internal/handlers.go b/server/internal/handlers.go new file mode 100755 index 0000000..f42c11b --- /dev/null +++ b/server/internal/handlers.go @@ -0,0 +1,253 @@ +package internal + +import ( + "bufio" + "bytes" + "encoding/base64" + "errors" + "fmt" + "github.com/leekchan/timeutil" + "github.com/op/go-logging" + "github.com/techoner/gophp" + "log" + "math" + "os" + "strconv" + "strings" + "time" +) + +var isDebugHandler bool + +func InitHandlers(debug bool) { + isDebugHandler = debug +} + +var logstats = logging.MustGetLogger("ksrn-stats") + +func GetSocketInfoInt(token string) int { + if _, err := os.Stat("/etc/artica-postfix/settings/Daemons/" + token); errors.Is(err, os.ErrNotExist) { + if isDebugHandler { + log.Printf("Token %s dont exist %s", token, err) + } + return 0 + } + tk, err := os.ReadFile("/etc/artica-postfix/settings/Daemons/" + token) + if err != nil { + if isDebugHandler { + log.Printf("Failed read file %s %s %s", token, tk, err) + } + return 0 + } + tk = bytes.TrimSuffix(tk, []byte("\n")) + tk = bytes.TrimSpace(tk) + tkint, err := strconv.Atoi(string(tk)) + if err == nil { + if isDebugHandler { + log.Printf("Init converted file %s val %s => %d", token, tk, tkint) + } + return tkint + } else { + if isDebugHandler { + log.Printf("Failed to convert to init token %s => %d", token, tkint) + } + return 0 + } + + return 0 +} + +func GetSocketInfoBool(token string) bool { + if _, err := os.Stat("/etc/artica-postfix/settings/Daemons/" + token); errors.Is(err, os.ErrNotExist) { + if isDebugHandler { + log.Printf("Token %s dont exist %s", token, err) + } + return false + } + tk, err := os.ReadFile("/etc/artica-postfix/settings/Daemons/" + token) + if err != nil { + if isDebugHandler { + log.Printf("Failed read file %s %s %s", token, tk, err) + } + return false + } + tk = bytes.TrimSuffix(tk, []byte("\n")) + tk = bytes.TrimSpace(tk) + boolValue, err := strconv.ParseBool(string(tk)) + if err == nil { + if isDebugHandler { + log.Printf("Bool converted file %s val %s => %t", token, tk, boolValue) + } + return boolValue + } else { + if isDebugHandler { + log.Printf("Failed to convert to bool token %s => %s", token, err) + } + return false + } + + return false +} + +func GetSocketInfoString(token string) string { + if _, err := os.Stat("/etc/artica-postfix/settings/Daemons/" + token); errors.Is(err, os.ErrNotExist) { + if isDebugHandler { + log.Printf("Token %s dont exist %s", token, err) + } + return "" + } + tk, err := os.ReadFile("/etc/artica-postfix/settings/Daemons/" + token) + if err != nil { + if isDebugHandler { + log.Printf("Failed read file %s %s %s", token, tk, err) + } + return "" + } + if isDebugHandler { + log.Printf("Token converted to string correctly %s val %s", token, tk) + } + return string(tk) +} + +func GetArticaGoldLicense() bool { + //Check Gold License + gold, _ := os.Open("/usr/local/share/artica/.GOLD") + + defer gold.Close() + + scannerGold := bufio.NewScanner(gold) + + for scannerGold.Scan() { + fdata := strings.TrimSpace(scannerGold.Text()) + if len(fdata) == 0 { + return false + } + if fdata == "TRUE" { + return true + } + str := "YTo2MDU6e3M6Mjc6IjJPWlRBWi1INU9HRzItWEQyRFJBLVlNN0lOWSI7YjoxO3M6Mjc6IldVRkhUNi1aT1VYTDktU00xWFFSLU9RTUVVQSI7YjoxO3M6Mjc6IktBRVFFMi1ZRUROUzEtSU5TSU9YLUJYNVdLNCI7YjoxO3M6Mjc6IlBQUEFUSi0ySDlWUkEtQTFMVktGLTlKTVZNMiI7YjoxO3M6Mjc6Ik9PVUk5TS1DN0RFUEEtSEdDRzFELUw2NEhKSSI7YjoxO3M6Mjc6IkNFUExGQi1GTjVMMTMtWFFVM1NBLVVWTEpLSiI7YjoxO3M6Mjc6Ik41NVlIUi1MQUYwQ1QtM0lWSlY5LTM5WllJQyI7YjoxO3M6Mjc6IkIxSklPSy1HWFNMUVMtRUFaMVhHLUxZOFNFUyI7YjoxO3M6Mjc6Ik9IVDZQVS00UElFUFgtOUZDTkJJLTlTREVWRiI7YjoxO3M6Mjc6Ikk5WEE2RC0yTk5BRjItNk1VQ0pPLTU5UFA4TCI7YjoxO3M6Mjc6IkU0TENXWi1WQlRKUVotTkFLWE5TLVNRT1JQMiI7YjoxO3M6Mjc6IlBaWE5LVS1VMkREQ1ktTUZPM0ZVLVFSRzhHTiI7YjoxO3M6Mjc6IlFETDVPRS0yMEhVOVctSlkyV05GLVpFR0JGRiI7YjoxO3M6Mjc6IlRBUk9EQS1TSkdRM0stR1lNRjBULThaSTlPVyI7YjoxO3M6Mjc6IlFBMUJBSy1YRFNWWFItWVUyRDdCLUNYNDdDWSI7YjoxO3M6Mjc6IkUwWlRZTi1PNlJSRkEtVDlNVTlaLUdaOFFBRCI7YjoxO3M6Mjc6IjhUM09OMS0xQTU5Qk0tR1dZRThULVRGR0ZXUyI7YjoxO3M6Mjc6IkZQWFZEMy1ORkMwR1YtVlFJVko5LVlJSFVMSyI7YjoxO3M6Mjc6IkJWUlRTSC1CSVdMVEUtQlJCMFhDLVJIV0RGQiI7YjoxO3M6Mjc6IkwxVlpJMC1VSlRTUU8tT1pFTkFHLVRVUVdPQiI7YjoxO3M6Mjc6IkhaVVFQRS1LV0VPRFctUUlDRE5SLUREV0pYNiI7YjoxO3M6Mjc6IklRRjUyRS1aTUZVOEUtMFdHQzdLLURRMktBQSI7YjoxO3M6Mjc6IjhEU1ZQWi03WTg2RUUtVUgxQTlULTVKSUhLQyI7YjoxO3M6Mjc6IlFRRElLUC1EOE5VSkYtOURGRFpaLUZJUk9QTyI7YjoxO3M6Mjc6IlpaUjg4OC1VRFdHVUgtRDhGTkxaLVNIT0ZHMyI7YjoxO3M6Mjc6IklEUDdTTS1INkJTUEotRlVSUUNMLUhBRjlNNCI7YjoxO3M6Mjc6IlJNR1VCVi1ESlJCTlMtWE1FVDlQLU5ISUlDUyI7YjoxO3M6Mjc6IlZOUFlOVS1RN1ZFWkItME5VOFBULUNaWEJEUCI7YjoxO3M6Mjc6IlBGREk2Uy1PQUVOV1UtNTFaNDFOLTI1TEk5WSI7YjoxO3M6Mjc6IjlLRUlCSC1FUkxIWUQtRkdDWk9VLVRVWEdWWSI7YjoxO3M6Mjc6IjNEOE5INy1IRzNMREktQkdSQU0yLTlGNUw1TiI7YjoxO3M6Mjc6Ikg4SVNVUS04T0dZTjktSUZPVU5OLVpOTVVPVSI7YjoxO3M6Mjc6IlpIVUhIUi00S05MNVotM0lZQVAwLVNCOVJENSI7YjoxO3M6Mjc6IlNWNVNQUi1JOU5VVFAtTkFMRE5JLUJOMkpVTiI7YjoxO3M6Mjc6IktOVU5HNC1OVktXQ04tWVI0WEk5LVZGRjYwRiI7YjoxO3M6Mjc6IllMTEtERi1KT0VYSTAtSUFTQTVaLVk1Q1BFRyI7YjoxO3M6Mjc6IklVWkhCRS1FUUZPUkEtT0xaUUI2LTFCQjNINCI7YjoxO3M6Mjc6Ik4ySzBaTi02SzhLSjAtOUpCRkZWLUY5VVNEVyI7YjoxO3M6Mjc6IlhGOFpROC1PRlpXUVgtV0xRQUZYLVNUVVNXTiI7YjoxO3M6Mjc6IkpTUlo1Vi1FRVBYU1gtMlNIRUhHLU5DOUlITyI7YjoxO3M6Mjc6IkVaUktQVS1FT1FVS0gtU1BTWEIxLVdTS1BQQSI7YjoxO3M6Mjc6IkZQRkUyQS02OUtGNkwtUEdOTFowLUlTMFlJQyI7YjoxO3M6Mjc6IjdCTU5UWC1FRUpWQUwtWUIzM0pLLUtOQlpGMSI7YjoxO3M6Mjc6IkJPOU5JSy1QUUJCNFotRkpLTVE0LVhTSzhERCI7YjoxO3M6Mjc6Ilg2UzZMRC01U1JYWlctUUhBNVFELVNCSDhBWSI7YjoxO3M6Mjc6IkdBVEE0Ui1SWDBJSkItRDFQV0ZFLTJUUDNVUCI7YjoxO3M6Mjc6IkJLMkdaTy1FQ0tXQU8tSFhBWU9RLTZYWUk3NiI7YjoxO3M6Mjc6IlZOVzBJVy1CTUs5VE4tWTkzR0FKLVdQUk1NUyI7YjoxO3M6Mjc6IkxaR0dPMC1COURITVItTTBQUDNCLU1ZRVlIVCI7YjoxO3M6Mjc6IjJVTzVMVC0yNkhXS0stNDVMR0RILU9BVlVWUyI7YjoxO3M6Mjc6Ik81SlAxVS1BRzlNUTQtWjlWRjVCLU1GTEFDUiI7YjoxO3M6Mjc6IjZYRFlDVy1LNFBISUEtNEYwVjVCLThXTVpRUCI7YjoxO3M6Mjc6Ik5UMVFOTC03WlVFTDQtOFBYSVdXLU1EWFRFUiI7YjoxO3M6Mjc6IlFENzhCVS01UklaU04tMTVHTEVCLVZIQVk4SCI7YjoxO3M6Mjc6IlRVSk1LRS1ZQ0hFRUwtRUZMTk1LLVhSVExQVyI7YjoxO3M6Mjc6IldIU0sxTC00VlhSV0YtTElQQ1dNLUFQUlhGUSI7YjoxO3M6Mjc6IkZBM1hQMi1USzgyRFItUFpXWUlELTgwVlA5TSI7YjoxO3M6Mjc6IklDQjZXSC1EU1hNWVEtTzJIMUVaLTVKSFpTViI7YjoxO3M6Mjc6IkhYRDlGRS01WFVBRFItQzROSFRJLUZXTE5aNSI7YjoxO3M6Mjc6IklXRk5FRi1OQUcyUDUtVU0yWFdTLVBFN1RTSyI7YjoxO3M6Mjc6IjE3TFpaQi00NDVYSFMtUElMVlhTLVQ3Nk9CRCI7YjoxO3M6Mjc6Iko2V1JUVy1NWVJOOEgtWFBCVzZNLUdVQ09ZTiI7YjoxO3M6Mjc6IlZCRUtXRi1OM1NEWUEtTjJZMU45LUxVTElOSCI7YjoxO3M6Mjc6IkJQS0RPSC1PRktKOU4tWUpRSE9ZLU1XRVdQWiI7YjoxO3M6Mjc6Ik9CR1o5US1SWUZCUlgtV1FQWEVQLVowRkJGUSI7YjoxO3M6Mjc6IlVZOU9RRS1CTTA0Q0wtVUNYTEhQLTZYQUQ0TiI7YjoxO3M6Mjc6IkFXR1lOUy1VQ1A4SEItQVcxRTJQLU9CR1hMWCI7YjoxO3M6Mjc6IksxQ0U0UC1JUTJGWTEtR1ZIVUJBLTFLTktGNCI7YjoxO3M6Mjc6IkFMU1lIUy1PRjk5TDktR1JWMlYwLVNIMkdaWSI7YjoxO3M6Mjc6IkFZSkM5TC1DT0lKRlItUElFWUpJLVcxVUxFUiI7YjoxO3M6Mjc6IkhXV0hKMS1WREZIUkYtTTJRUU1XLTNUU1ZHVSI7YjoxO3M6Mjc6Ikw5UUhPVS01OTU1OUwtTVhaWVc0LVpLUEpaTiI7YjoxO3M6Mjc6IldXQVhaTS1KM0oyTVEtMlI3SENJLTBDWkpPSyI7YjoxO3M6Mjc6IkRHWU1DMC0wR0dVRkctN0RPQVE0LU1XQ0ZZQyI7YjoxO3M6Mjc6IjlZQUk0Ri1XSUIxMUYtUFBTRENDLVM4N0dEOCI7YjoxO3M6Mjc6IlRIVkZWTS1BS1JXTk4tQkpQME1WLVpQWUVTMCI7YjoxO3M6Mjc6Ik9YRUM1Vi01S1NNRFQtWUpUVTA5LUpRUTcyRiI7YjoxO3M6Mjc6IlU4VFFPVS1ZQjFZM0otVUxSVVNDLVhWSVpCWSI7YjoxO3M6Mjc6IkVRTk9UNC1KS0cySzctRFAzUE5ULTdMUU5STyI7YjoxO3M6Mjc6IlRUVVI2Si1LTzNENDQtSUlXQUE5LVVKS1RNTiI7YjoxO3M6Mjc6IkVBRERUSy1MN0paTlUtWUdKSk1aLThBUDFaTSI7YjoxO3M6Mjc6IlZBUlhSVi05SVNUUTUtQUc0S09CLVgyTkM0QyI7YjoxO3M6Mjc6IlRVREdRMC1XS09TMlMtTEVESFdRLVVOQVdDViI7YjoxO3M6Mjc6IlBKS0c0VC1aUERNSFctV0JDUk9FLUhJSzhWVSI7YjoxO3M6Mjc6IlkyRUhFSi1RQVFRUU0tV1MzQk0yLUxZSFBLSSI7YjoxO3M6Mjc6IkpMRlBaOC1WOUdETkwtVDZJMVg5LUZYWjNZMyI7YjoxO3M6Mjc6IlhHVkNVQy1FTjROSkctMFdaWFVJLVhGSEJCVyI7YjoxO3M6Mjc6IlBEUzFKVS1UTkNXUFAtUU5CQTVMLUI3QktKSSI7YjoxO3M6Mjc6IkFEUDZJRS1XTU5JWUMtTFZSTk5LLTVITVhXTyI7YjoxO3M6Mjc6IkJTT1lNUC1DVDBGWVctSTRNTDVaLVQyQlE4UiI7YjoxO3M6Mjc6IlNBUk9FWi1LSUJUUEctUU5TSTk0LUE4QUNFUiI7YjoxO3M6Mjc6IkhMT1lUUC04VVNVS0stWldZNk1LLUpKOE8yTiI7YjoxO3M6Mjc6Ik80VkFZVy01SlQwSEYtTExVWEhYLVlZQzdKQiI7YjoxO3M6Mjc6IkxQRjNQVy1PNVBCR1UtMFA1RUtOLVhTQ09PWSI7YjoxO3M6Mjc6IlI5UE40Qi1JWFc4RVMtOUJJT0xHLThURFA0UiI7YjoxO3M6Mjc6IjhGVU5DVi1YVlNPMVQtTDNWUUdELUFKUEtQUCI7YjoxO3M6Mjc6IlJFUTJOSi0wWlRXWkwtNk9FUTlJLUpUWUFQRSI7YjoxO3M6Mjc6IkhGU0lBQy1NVElZTFQtWUlGUUlELVVKS1hHMiI7YjoxO3M6Mjc6IkxZQjFXVC1WVzNMNVktUEJMUExJLUdIRUNaUyI7YjoxO3M6Mjc6Ik1JSkdCMS1MTlQyRDItUk0wS0RKLVRaRVFMNyI7YjoxO3M6Mjc6IkJUV0VPTi0zWTNESVctVEdDV1NYLUtPRUhSTCI7YjoxO3M6Mjc6IlRPUEJBSS1QQ0tUUEctN0pSSlVKLUVTQU5HMSI7YjoxO3M6Mjc6IkY0QTNCTS1KTkZPUVktVFhOTUtTLTFMVjlHTiI7YjoxO3M6Mjc6IlM2Uk1QRS1GQ0I2Tk0tUkVDSVoyLTJOSlBNRCI7YjoxO3M6Mjc6IldUSU5YUS1BMVFCS0QtSVVQQ0swLUhTS1dDVyI7YjoxO3M6Mjc6IjJYSUJHMy1TVEJRSjgtTzRVQllYLVlTQ1hHQyI7YjoxO3M6Mjc6Ik4wVVVUNC1DUFgyOUQtT0VNQ0pMLURJOFdPOCI7YjoxO3M6Mjc6IkM5SkJLVS1MSFpXQVQtV0Y0WVhWLTMzNlhNUSI7YjoxO3M6Mjc6IjAyTkFIUS1FWTA3V1YtSk9NVEhULUxKVk1FOSI7YjoxO3M6Mjc6IjBZMUZMMi1NSDZKRUMtSlpDR05ILVpST0VUTiI7YjoxO3M6Mjc6Ikk1Sk5YTi1UQk5ITkstR1JBVDk2LUpRTzZJMSI7YjoxO3M6Mjc6IjU4V0pNTi1US1NUQkotSkdMWkcwLUVPU0NDMyI7YjoxO3M6Mjc6IjhGT0RXTy1SRk5GWDEtSFNLRldYLUZVS05QUCI7YjoxO3M6Mjc6Ik5aQ1pFWi1PRlUzWTItVzYwN0hELVVaUFlGVCI7YjoxO3M6Mjc6IlRBQ0dPSS01VEJQM1ktM1pCUk9PLUdCT1lTUCI7YjoxO3M6Mjc6IlEyUVVSQi1KMERBWUEtMTNWU1lRLTBKMEpVWSI7YjoxO3M6Mjc6IkhYUkNBWS00Q0owVk0tQlJJWVpTLVVWR04wRSI7YjoxO3M6Mjc6IkE4T1ZHNi1QWVNNTEEtTEJSWFZNLUpISTVJOCI7YjoxO3M6Mjc6IkFZOThaRi1WQ1ZEVU8tVjdDREVPLVRTTVZRNyI7YjoxO3M6Mjc6IlJZSkgzWC1IUUMwTU4tWkkyNjBKLUNTSUY2TSI7YjoxO3M6Mjc6IkUxRkNOWC1OV0NSMUQtTFlVNVRGLU8xREJBWCI7YjoxO3M6Mjc6IjRBTVNRVC1YQlowOEYtWU45WkVELTM4UkhIUSI7YjoxO3M6Mjc6Ik9URUZCSy1SSlBLN0wtOEVPRFg0LTlCTVZaMSI7YjoxO3M6Mjc6IkQxOUhYWC1SUEFaWkEtV1dVRUFXLVBTTjhBVyI7YjoxO3M6Mjc6Ik9LT0xLQy05Q0hKTkgtTE1BSEtFLVVISlpTRiI7YjoxO3M6Mjc6IlZXWlpWQy1VS1RaRlAtRU83MFFFLVpHTThDNiI7YjoxO3M6Mjc6IjJBRk4xUy1IREkySU8tSjRGWVhNLVVaMkdMRyI7YjoxO3M6Mjc6IllYRUJFSi1OMEhKVUMtWkJPWllRLVNEOUFXVCI7YjoxO3M6Mjc6IlJTVFlBRS1SUEVJU1MtVE9aQlFPLVBaUFE2QiI7YjoxO3M6Mjc6IjhCQVhGUi1LSVNJQUYtNVFVN0RYLTZPUlBYNCI7YjoxO3M6Mjc6IllWT1hLWi1UQ0EwWFItV0NWUk5YLVVFSVdYWSI7YjoxO3M6Mjc6IjBPQkxSVC1PTExBWkotQTlPMldILVhMQklNTyI7YjoxO3M6Mjc6IkROS1pSQS04MDNLSk4tVVU3WTRYLTg2RUdPNiI7YjoxO3M6Mjc6IkVSUUhZRi1HQkdDTkUtSk5QTEtLLVdWUENCVCI7YjoxO3M6Mjc6IlRHQ0ROSS1aVk1TRDktVzlKQlg0LTYwMEJQTCI7YjoxO3M6Mjc6Ik5FVUxRQi1YUk1VRlAtWEhMRE1JLVlJMFpaSSI7YjoxO3M6Mjc6Ikw1VjcxRy0wSEpUWlMtWUxNOU9OLUFaSExNOSI7YjoxO3M6Mjc6IjVFQ0dNRS1ZTktUQ0ktSkxYR0VILU5WWFJJTSI7YjoxO3M6Mjc6Ik5RQVVUTC1PREtHVTQtRVdQSVcyLUNHRU9YUSI7YjoxO3M6Mjc6IlFOSkRHOC1JRVRTSkotWFUwT1Q3LUJSNVlaRCI7YjoxO3M6Mjc6IlNFRkFIQy1ZUU9EQjAtUVFORUdPLVBTSEdFUyI7YjoxO3M6Mjc6IkxKUjhTUi1CSk1OQUMtWE04V0wzLUNZQ0dGRSI7YjoxO3M6Mjc6IkdPN1JORC1HSkk4RkYtQ1UzMUJQLUpETzdZSiI7YjoxO3M6Mjc6IkxGSkNLQy1USkdKMjAtTDlOSTI3LU9ONFVCSyI7YjoxO3M6Mjc6IkZCV0VCVS1CQ05NUEItQ1RQR0NULVNUUkdPViI7YjoxO3M6Mjc6IkFZVU5TUy1GVFpPQjUtWFJGSzQxLVBGR0ZIVCI7YjoxO3M6Mjc6Ik5MQU40Sy1KWEpEUU4tSU9XMk5ELVExN1JTUCI7YjoxO3M6Mjc6IldCVFhFTC1VTVhMUlotSENLRTdZLVhIMDVDRSI7YjoxO3M6Mjc6IjlIQ1NOMy1GU1M0UVctRElVNUFMLUEzT0dZUiI7YjoxO3M6Mjc6IkRBWEFSWi1UNEJaVVYtUEFNUkpJLVFKUDJPNyI7YjoxO3M6Mjc6IkpYMkNDWS1MNlZGWEEtQUJBS0hQLVpOMVBKQiI7YjoxO3M6Mjc6IktEWVVDTC1WUTJLWjgtM1FQWkhWLUFHV1NaMCI7YjoxO3M6Mjc6IlFYMkxOUi1RRVBHSFgtQ0lIUEdSLVg4WUNVSyI7YjoxO3M6Mjc6IlNLV1Q2TS1JR0FGNUEtTVpFWk1VLVZQU1dJTSI7YjoxO3M6Mjc6IklSQ1hUUC1TWDFCMUotRlhEQVk1LUZQUFJFTSI7YjoxO3M6Mjc6IjRQQ0hMRi1VQk4zSFgtTVNPSlMxLUM4WUNJRCI7YjoxO3M6Mjc6IlJITUhOSC1NRFdZWTMtOVBHSURGLVRLWlNTNyI7YjoxO3M6Mjc6IkxaTlVPOC1WM0lWMTgtUjRURk5GLVk4SlRNQSI7YjoxO3M6Mjc6IlBFUFZYNi1BVFozRUktUzgwNkNPLUpJRzJSSiI7YjoxO3M6Mjc6IkdTT0xLRy1aUFFLVVQtWlA3WllCLUhSUEtDMCI7YjoxO3M6Mjc6IlBTUkJRUS1ZRURZVUotSUdVWkZZLTBIR09VUCI7YjoxO3M6Mjc6IkVQRTlMWi1LSU1ENFotMkJOSFo1LUNEVVdXMSI7YjoxO3M6Mjc6IklaUEZTWS1FTVVDVE4tTzczS0JMLU9FSkFMTiI7YjoxO3M6Mjc6IlBSRUNCMC1CMFBXV0ctUllKUEJILTI1U1pPVSI7YjoxO3M6Mjc6IjVENlpTRy1HWlpTVlktR0ZVRFNNLU5VQjlTRSI7YjoxO3M6Mjc6IlNMVlRNTy1RQkFEMEwtVzJGWDNKLUdWSUZRTCI7YjoxO3M6Mjc6IktSQVlNUC1RUUJFMUMtQktIVVBZLUY3U0hVQSI7YjoxO3M6Mjc6IkxST0NHRC1SRVFLT08tNUozWkVaLU1WWUhEVSI7YjoxO3M6Mjc6IkNRQ0VTTi1STDJVQkotQ1I1U0VJLVdBUFVRWCI7YjoxO3M6Mjc6IjBDWldOSC1EQUJHV0ItRlFTUlAyLUs5UlNHSiI7YjoxO3M6Mjc6Ik1BRVFKRy1PRVBKODgtNUdQSVkyLUI5ODNaRiI7YjoxO3M6Mjc6IlRGVUZJNy1UUE9VNTAtNVNCSjNDLUJZRVlYSCI7YjoxO3M6Mjc6IkhIR1pZNi1DVElMNUstQk9OVkNILTk1WU5BVCI7YjoxO3M6Mjc6IjlFODJLRy04RTBaTUMtODNCV0RBLVY5TVhIQiI7YjoxO3M6Mjc6IkEyOVpCVy1USENDSDEtTFlQTVRJLU01RFBaUiI7YjoxO3M6Mjc6Ikg4SEdBWS1HVVQ3VlQtTE41NDlWLUpTTzVBSiI7YjoxO3M6Mjc6IjlPS0JGSC1KTkxRQ0wtTlVER1c5LUROV0s3VyI7YjoxO3M6Mjc6IllXR1VTVy1KR1hXQkItVDVNOTYxLUtPUlNINCI7YjoxO3M6Mjc6IkhVWUJINi1DUU1MQVMtTTdWTkpULUpVQ1QwMiI7YjoxO3M6Mjc6IkI0MElMUC1GSjVCVFctNUxIMThTLTgyVjFXTCI7YjoxO3M6Mjc6IjdXRjhQVC1URU9JT1ctSVc5NlVSLVI2R1BCNSI7YjoxO3M6Mjc6IkU1U0VEWi01TUNLN1AtS1JRT1hQLVBTQVZONiI7YjoxO3M6Mjc6Ilg2RU1JUy1TTThXSEwtSTJURE5RLVdNV1VPVCI7YjoxO3M6Mjc6Ik9UMzFDTi1BWUFISkYtRUcwUDZPLUJBOVNXWCI7YjoxO3M6Mjc6IloxQVdDQi0xUzZNQVYtQkVJS1ZHLUlETUNUUyI7YjoxO3M6Mjc6IkdNWlVaWC1XR1VJR1MtRlJPSDBLLTJRRzYwTyI7YjoxO3M6Mjc6IlVETVRORi1LUTNRVlgtRUJKNlFOLVhZNlA0RSI7YjoxO3M6Mjc6Ik5HUE1HNS00VFpaQ0UtRUlJMUVQLUZVNFlVQyI7YjoxO3M6Mjc6IjI4VUlaRC00SEdBTlctUFVTVUVRLUxRVFhSMCI7YjoxO3M6Mjc6IkJRV1lMVi1QSkJBNU0tSEdWTVZKLVZOTkdQTyI7YjoxO3M6Mjc6IkNaUklFTi01Vk1LRUQtNkxPTU01LVpPWUE4NiI7YjoxO3M6Mjc6IjNNVVhQMC1KR1pISVUtVEJMWENaLTdYSUJBVyI7YjoxO3M6Mjc6Ik02TElGRi1SWElGMVAtSFE2VVFCLTQ2STRDTSI7YjoxO3M6Mjc6IkNFWUpURS1ORkFWU1ctQUNQR1VJLVVTUlpTOSI7YjoxO3M6Mjc6IjdaT0pZQi1HOE5VNVAtRVlFNlVBLUFDRjJTRyI7YjoxO3M6Mjc6IlhSTEhSTS1PT01JUEYtVVQ4UDdLLVJFNkgzVCI7YjoxO3M6Mjc6IkpOS1NHQS1XQ0VJV00tR05JV1JNLVZMUDY4NSI7YjoxO3M6Mjc6IlgwV0dFVi1WSUNFS0UtTkRPQkpSLUxLUFFTTiI7YjoxO3M6Mjc6Ik5BQzFEOS1QQlJXTEctOTlZU1lCLVJVQ09XSSI7YjoxO3M6Mjc6IllXV1FGTi1RSlVMQlYtRlVUNlBQLUFYTlRFUyI7YjoxO3M6Mjc6IkhQVlVURC1XVTk3VEotTU1VUk1aLUZLOE1TVSI7YjoxO3M6Mjc6IkdQOFRSVC1aU1JENUUtVURBVVRMLVU4NlBZUiI7YjoxO3M6Mjc6IkdVWVdXRi0wRDE0WDktNUNCVVNaLVZHWVlOSSI7YjoxO3M6Mjc6Ik5MTUlUNC1ONlE3RTUtNkZLWTRFLThMWTFLMSI7YjoxO3M6Mjc6IllCSUVNUy1LSDNPUFUtVlFSUVJHLVlSOFY0RiI7YjoxO3M6Mjc6IlBDRkZYVi1SUUJXWTctODU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlIVjJRQS1BV0JXWTctMzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlNEOERIVy1RSEJXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNHUFdNSC1WUUJXWTctNzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRYUUpOWS1QNkJXWTctNzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IlJEUjhWTC01TUJXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IktZOUVDVy1ZN0JXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlJTRDdNVS1MM0JXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6Iko0QUZLRC1HWkJXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ijc0UTdNSi1KVEJXWTctMzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJVRENRQS1OWkJXWTctNjVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjdMNzJXSy1MR0JXWTctMjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJVTUE4WC1VWUJXWTctNzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjdHVVUzOC1aM0JXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5RS0FVSC0yTEJXWTctNDU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjdRNExVNC1LQkJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJKOTNBQy1VMzhXODctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IjhMQ1Q1Ni1IWEJXWTctMzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IlpaQ0ZOUC1QNkJXWTctNzU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjkzVUY1OC1FV0JXWTctQjVZODY5LU5EVFRETiI7YjoxO3M6Mjc6IjlXSjgySy1VUUJXWTctNDU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZVRTU5NS00QTlXMjctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IjhHRlM1Qi04NTlXNjctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkJYWTJUTi0zTUJXWTctNTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZWTlFRSC1HSEJXWTctODU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjQ0VVM4RS1UUEJXWTctNDUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlE4UEZNSi0zMkJXWTctMjVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IlE2SE1NNS1XTEJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjhZWFZKNi02UEJXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5YVUFRSy1BVkJXWTctODUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlFEMlQ2US1GQUJXWTctMjU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZQWEdaVC1FRUJXWTctOTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IldVRFhMRC1SRkJXWTctODU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlpQQ001RC1DQUJXWTctMzU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZEOFpQMy1DQ0JXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlM3TTJQTS0zNEJXWTctQjVZODM5LU5EVFRETiI7YjoxO3M6Mjc6IlJCM0czNy1ZVEJXWTctMzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IlRZVVg1Ti1CVEJXWTctOTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ijk5SzhKVS1EOEJXWTctQjVZODY5LU5EVFRETiI7YjoxO3M6Mjc6IllGMktBNC1LVkJXWTctMzU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlI2R1dZQS1KU0JXWTctNzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkVQR1VKVi1DRUJXWTctNjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IktWSllLQi1ZOUJXWTctNzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlpTNjQySy01V0JXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZSSERZTC1NM0JXWTctNTUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkhYVjMyWC1IUUJXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjI5Q0gzVy1OREJXWTctQjVZOEI5LVlETlRUTiI7YjoxO3M6Mjc6IkZITjRLUC02SEJXWTctMjU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZQNVZGVy1aWDJXQTctWjU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRUNDRRSi1FMkJXWTctQTVaODI5LU5EVFRETiI7YjoxO3M6Mjc6Ilg0WE45Mi0zTEJXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRNRURUSi1TR0JXWTctNDU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkE4VzNYRi1VR0JXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhGNEY2VS1KN0JXWTctQTVaODQ5LU5EVFRETiI7YjoxO3M6Mjc6IjlXWEc0TS1OUkJXWTctNjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhXNkE3Vy0zVUJXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkhDTUc3Qy1VSEJXWTctMzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlMzWlhXVi1NVjJXQjctWTU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhQR1FQSi1BTUJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkozWlQ4Uy1HOUJXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlpBQlBCRi1XSkJXWTctNTU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkczTE5MUC1YRkJXWTctNTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkVONUdSTi1MWkJXWTctNjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlJMSzc1Qi00V0JXWTctMjU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ilk5QkhMSi1WSkJXWTctNjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IlA2U04yQy1CWUJXWTctNDVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjNRNFZTRC1UOEJXWTctNDUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IllaV0RQVi04R0JXWTctOTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkdaRDNIMi1ESEJXWTctQjVZODY5LU5EVFRETiI7YjoxO3M6Mjc6IlNCU0o5WC1SWUJXWTctODU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5CNjJQVy1ZUkJXWTctNjVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjI5Q1JDRS1XV0JXWTctNDVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IlozSDdBOC0yNThXNzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IllaNEg3My0zOUJXWTctQjVZODI5LU5EVFRETiI7YjoxO3M6Mjc6IlpMVkVDOS02REJXWTctNDVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjhQVEQyNS1EOEJXWTctQTVaODM5LU5EVFRETiI7YjoxO3M6Mjc6IkQyVTVKVi0yTEJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IllKWE1FUy1QRkJXWTctOTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkNVVzlBTi1FV0JXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJNWkpUOC1UUkJXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IlRFRTQ2TS1NTUJXWTctMzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjZGWFBaVi1IOUJXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjNOOEhRRC1GSkJXWTctMjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlE3UkhUSi03SEJXWTctNDU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlVXSkc2WS1UVUJXWTctOTU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IldCWk5VUi1TQUJXWTctOTU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjdZS1RCRC1ESEJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjZBRlBIRC1RTEJXWTctMzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlFGRVREOC1UUUJXWTctNjVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjJLTVZUNS1XV0JXWTctNzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkVUWkdRTi1MR0JXWTctODVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjQ3M0FVUi1LQkJXWTctQjVZODI5LU5EVFRETiI7YjoxO3M6Mjc6IjZFUzVINy1ZSkJXWTctMzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkJNMlozUy05UkJXWTctMzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZWVVhRWi1aNTJXQjctWTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjVVOEozQS0zSzlXODctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IjlOVU45Ny1BNUJXWTctQjVZODY5LU5EVFRETiI7YjoxO3M6Mjc6IlNITkhFTi01VkJXWTctNTU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkNKWkxISy0zV0JXWTctNTU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkM4REUyUi02VkJXWTctQjVZODM5LU5EVFRETiI7YjoxO3M6Mjc6IkRWUTM5VS1UTEJXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IllFNEgzQi1TQ0JXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkpWUjJLQS1MMkJXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBYNUhHSi1EUEJXWTctNTUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjZXTUhIRi1QS0JXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlQ0WFdUUi1SUDJXQTctWjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZRV1YyOC1ITUJXWTctNTUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkpXNVFHRS03UEJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhIUThYSi03R0JXWTctMzU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ilc3UDdFQi1DQ0JXWTctMjVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjRUVEJIVi05UUJXWTctNTU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IloyQUgyRy1CWEJXWTctMjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkFHM05HNS1RTEJXWTctMjVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkxHMjU4Ui1DUkJXWTctQjVZODg5LU5EVFRETiI7YjoxO3M6Mjc6IktIQUROQy1KM0JXWTctQjVZODc5LU5EVFRETiI7YjoxO3M6Mjc6IlBZQVAzNi1FV0JXWTctNDU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkFYUTNOOC1NTEJXWTctNDU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik41S1JEUi1CWkJXWTctNjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjZKODZRTS00QUJXWTctQTVaOEI5LVlETlRUTiI7YjoxO3M6Mjc6IkdHTkVZWC0zWkJXWTctNzU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ilo3QTdFUS00VkJXWTctMzU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ilo4Q1BWVC1TQ0JXWTctODVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IlpCVDlXQi1ERkJXWTctNTU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlSMllLUi00WUJXWTctNTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRTV1YyVi05RkJXWTctNTUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlRCOVM4Ry1GMkJXWTctQjVZODg5LU5EVFRETiI7YjoxO3M6Mjc6IkRIODJQTC0zWUJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJXRjRWMi1IWUJXWTctNDU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjZQU1E4Si1ONkJXWTctNDVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjVLNFNaRS1MS0JXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjVDTUtMUy0yREJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJTTlFQSC1MQ0JXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlKU1Q2QS1LNEJXWTctMjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkU0TVVUNy0zRUJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjZLUDRRUi1QTUJXWTctNTU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNUVFFXRi00RkJXWTctNTUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlpIRFlOOS0zQUJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ilg2WFUzRC1DVEJXWTctNTU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5HN0RZVy1KWEJXWTctNzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5NNTM1WS1LS0JXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlA0VUhSWS1FUUJXWTctNzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkxZUDJKVS1EUkJXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IksyVjVFVS03UkJXWTctMzU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlgyWUdRQy1HSkJXWTctNTU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlY2Mk04Ry1MNEJXWTctQjVZOEE5LVpETlRUTiI7YjoxO3M6Mjc6IjZLU05IWi1GVkJXWTctNzU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlRBR1NTNS1aN0JXWTctNTU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlhCRldMVC1IWEJXWTctOTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkhaREVQUy1LQkJXWTctNjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlVIS0o5UC1TUUJXWTctNzU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlFLRFlLSi1IV0JXWTctODVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6Iko1UlJZUy1aMkJXWTctNzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlQ3M1o3My1OR0JXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ilk1NjRHSC04TkJXWTctQjVZODM5LU5EVFRETiI7YjoxO3M6Mjc6IkJBNUFFMy1ZSkJXWTctQTVaODY5LU5EVFRETiI7YjoxO3M6Mjc6IkpYM1dKWS02QkJXWTctNTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlVWNVdVQS1QWUJXWTctOTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZVRDI0Mi02SDhXOTctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkhBRURLNC0zRDlXNDctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IlcyUU5SUS1VOEJXWTctNzU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkFRQks0OS1IV0JXWTctMjU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBEM0szRy1ZUEJXWTctMzU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5OOEFEUy1EWkJXWTctNTUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJITFFWSy1HU0JXWTctNjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjdUUkpYWS1SWDJXQTctWjU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBESEFMUy1XVEJXWTctNzU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik01WENHUS01R0JXWTctMzU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNNRFBSSC0yWkJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlUyQzhMVi1BOUJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IllQTUZKUC02N0JXWTctNTUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjU1RTk3WC1HWUJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IldNRzVUSi02WkJXWTctNjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5LQjVKRy1DM0JXWTctQTVaODk5LU5EVFRETiI7YjoxO3M6Mjc6IlU0SlZVVy1aOUJXWTctOTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjNKVkxLTi1ZUUJXWTctNzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkhEV0RTNC02SEJXWTctMzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkVHQlY2Ry1HRUJXWTctMjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkRSREdRTi1NMkJXWTctNDUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlXNTY2OS1KTEJXWTctQTVaODc5LU5EVFRETiI7YjoxO3M6Mjc6IjVQVEc1RS1WV0JXWTctNTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZUUzhQRy1ZQUJXWTctNjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJINkhMRS0zSEJXWTctQTVaODY5LU5EVFRETiI7YjoxO3M6Mjc6IkZXTE5VMi1YUUJXWTctODUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ilc2SEI0QS0yQjlXMzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkRZTFNONC1BVEJXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJCUjlYTC1BREJXWTctMzU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBIWVRBQi1RM0JXWTctNTU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ijk1VUQ0OS1WNEJXWTctQTVaODU5LU5EVFRETiI7YjoxO3M6Mjc6IlVZNjdXTS00U0JXWTctNjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6Iks5NEZLVi0yV0JXWTctMzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5ORzhGVi1BQ0JXWTctMzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkNLUVJaRC1NRkJXWTctNzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkxEQVBONS1YWkJXWTctNjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlE5Qk5ZNC1FVkJXWTctNTUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhTNTRDWi0zTEJXWTctQjVZODY5LU5EVFRETiI7YjoxO3M6Mjc6IlA0WkxWNC1IOUJXWTctNDU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlJGVkhMNi04QUJXWTctMzU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjQ5R0U1Qy1SOTlXNjctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6Ilo4RVNUVC03RkJXWTctNjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlNXVTZZQy02WkJXWTctODUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJBQUVCWi1TWUJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBFNUpOTi01RUJXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlJEOFZRMy1ISkJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkdHMzhFNi1QOTlXNzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IlE4TkNFOC1ESkJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhISk1URS0zS0JXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkRKN05FSi1FRUJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlU1VloyOC00OEJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ijg3WVIyVy03QkJXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJIOVVBUy1OWkJXWTctNjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkhIMzJWQi1URUJXWTctMjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5XUEpCVy1INkJXWTctNjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkE3WjlMNy1NWEJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkY4M0Y3VS1GNDlXNzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6Ik1FVlBVTC1QWjJXQTctWjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5LTVM3Ny1NREJXWTctNDUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNHS0dBUy1YU0JXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlA3RUZYOC1WVEJXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlFBV0E1NS1GVUJXWTctMzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNXRzRGWi0zS0JXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZVM0c0US1OTUJXWTctNTU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlLMkcyQS1GNTdXOTctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkFNS0tZRy01RUJXWTctNDVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IlhESFU1Ti1SWEJXWTctODVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6Ilc5VlhUMy1aWDJXQTctWjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkYyVFg5UC1UVUJXWTctNzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjZWVkM4Vy1QUEJXWTctNzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6Ik5QOEpWSC1BQUJXWTctNDUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkVLS0ZBNy0yUUJXWTctQjVZODQ5LU5EVFRETiI7YjoxO3M6Mjc6IkFDNUs2Ri1CQjlXQTctWjVOOFQ5LUREOVQ4TiI7YjoxO3M6Mjc6IjhVNVE0WC1EWUJXWTctNTUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlYWVRHWC1TSjJXQTctWjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjVSNDZETi1BNzlXNTctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IlBCOFlETS1VNEJXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlpQOVhFNC02S0JXWTctNDU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlNZNUFCWS1WOEJXWTctNjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6Ikc5TEpNNS0zMzlXODctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkxFSEpSWi1FMkJXWTctNDU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik1QVjU5Ni1DQkJXWTctMjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjlaVUtSVS0yS0JXWTctNzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ijg4SzM2Qy1CRjhXMzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IlVLS1BGOC1SNkJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjNQR040Ui1WTUJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjJEM0dXQi1YM0JXWTctQjVZODM5LU5EVFRETiI7YjoxO3M6Mjc6IkZRNVZBWS1CVUJXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlJGQ0dZOC1aWkJXWTctODUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkY3WkFYSC1KMkJXWTctMzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkVXSFUyMi1WTkJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjcyQjJIMi1XUkJXWTctQTVaOEE5LVpETlRUTiI7YjoxO3M6Mjc6IjJWU1M1Qi1ZV0JXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjZQR0VOSi1YOEJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZHM1lUQy1VWkJXWTctOTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkVaRExBUy1UVUJXWTctODVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IlRZUkFVTS1LSkJXWTctOTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkdDVTdQWS1XUEJXWTctODVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6Ilo2TFFVUi1GR0JXWTctNzU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNNTlBUQi01OEJXWTctMjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRDWllXQS1SNUJXWTctNTU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJRTEg2UC1RR0JXWTctNDU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkY3ODdNUC1OUUJXWTctMzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjZWM0E0Ui04UkJXWTctQjVZODY5LU5EVFRETiI7YjoxO3M6Mjc6IkRNR0JZRy0zQUJXWTctMjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlM2REJOUi04Q0JXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRRR0Q3Ny03SDlXNzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IlFWUlQ0RC1YV0JXWTctOTU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IldGTjJNNC1BQUJXWTctQjVZODg5LU5EVFRETiI7YjoxO3M6Mjc6IkdTWEFVNy1YRUJXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkRHN1ZERy1BVkJXWTctMzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlJLSk1UQi1TVEJXWTctODU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlpCMktONC1BS0JXWTctMjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkFCRjJTNy0zVEJXWTctQTVaODU5LU5EVFRETiI7YjoxO3M6Mjc6IkFGSFIyUC1HWUJXWTctNDU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJVNTJBSy1ER0JXWTctQTVaODc5LU5EVFRETiI7YjoxO3M6Mjc6IjlHTE5RWC1DVkJXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkE4WEFYNi00TEJXWTctMjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjdaRkxBVy1WQ0JXWTctNjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjdaQTVVVy0zVEJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkFOSENDOS1FR0JXWTctQjVZODM5LU5EVFRETiI7YjoxO3M6Mjc6IldUWEdNVS1MNUJXWTctODU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlVVjQ5Si1RMkJXWTctMzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IllKM1pTUy1QRUJXWTctODU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjY5VFFNUi1MNUJXWTctNDU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkdOM1paRi1GOUJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IlFVQktQTC1HVEJXWTctNzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IllOVkc5Ti1TRkJXWTctNzU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJFWU0zVC1RS0JXWTctNTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkY5SFlTWS1GS0JXWTctNzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkcySlFDVS01WUJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRWVVUzOS1FUkJXWTctNDU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkdEREhURy1WTkJXWTctNTU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkhaRE5FNC1QUkJXWTctNTU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJKOTU0Si1XNDlXNDctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IjVSQVpQWi1IV0JXWTctODU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ijk5SEJDVi1aQkJXWTctMzU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJINVBWVi1SUUJXWTctNjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlhQQlQ3Ry1RRUJXWTctNjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjVYNFIyNC0yUUJXWTctQTVaODM5LU5EVFRETiI7YjoxO3M6Mjc6IjY1WVhCNi1WRUJXWTctNDVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjVTWFVEVy1DS0JXWTctNzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkxROEhaWS1BS0JXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IllaOThCQi02WEJXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlE5QkpaVC1WREJXWTctNzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjVTTkJWVS0yWUJXWTctNjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IllZQkY0Vi1ISkJXWTctNjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBKUkQ4NC1LQUJXWTctMjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlRZNEI4My1TQkJXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkhGMlMzTS1OS0JXWTctMzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6Ikg4RjY4Qy1IQTlXMzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6Iks1N0I5Vy1ZNkJXWTctMjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkxKV1IzRi0yTUJXWTctNDVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IllFWk1IVC1RUDJXQTctWjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlU2N0JKOC1SREJXWTctMjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkhYUU1aOC1QSkJXWTctODU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjdQVktBMi1YU0JXWTctNTU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBES0tOWi1RTkJXWTctODU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkpBN1c4Sy1VREJXWTctMzU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjI1R1E3Ni1TWEJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlM1NE5GSi1CMkJXWTctQTVaODc5LU5EVFRETiI7YjoxO3M6Mjc6IlI3U0FWNy1ZSEJXWTctNjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IlNOWldKVy1STDJXQjctWTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlXRjhHQy1IRkJXWTctMjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJXWlY1VC1YTEJXWTctOTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlhCMkdUOS1FNEJXWTctQjVZODg5LU5EVFRETiI7YjoxO3M6Mjc6IjgzRVdXRS1TNUJXWTctMzU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhWWTVERS1STUJXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJMRFVSSy00WEJXWTctNTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6Ilo0RDdaWS02MkJXWTctMzU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkdRS1dIUC1BUEJXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IllMNURWSC1ROUJXWTctNTU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJBUVMzWS03S0JXWTctMzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkhOTkZUTC1WWkJXWTctOTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRVTkhFOC00RkJXWTctQjVZODU5LU5EVFRETiI7YjoxO3M6Mjc6IlFSS0tHUy02TkJXWTctNjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IllIRE5BNy1HOUJXWTctMjU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJWTjQ1Vi02Q0JXWTctQjVZODQ5LU5EVFRETiI7YjoxO3M6Mjc6IjI2Qko1Mi1DUDhXMjctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkJSVTlTOS1NTkJXWTctNTU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkxQSEVaWC1OQ0JXWTctODVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6Ik1VWkEzUS1VU0JXWTctODU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRRU0hBUy04UUJXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkhTNVE3Vy1ZVkJXWTctODVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkpQRFRaNC1DN0JXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkczV1pLMy1DUEJXWTctNDU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ikc2UTZVQi1NMkJXWTctQjVZODk5LU5EVFRETiI7YjoxO3M6Mjc6IkZFSzRENS1ONDlXODctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkRSOUdFQi1BWUJXWTctMzU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IktGOVdWTi1NU0JXWTctODVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkZOTDdWOS00TEJXWTctMzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjI0SksyQy1ORzlXODctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IlRINVU5NC1NV0JXWTctNDU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZGUE5EUy1aU0JXWTctOTU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkE0QURYRy1LNUJXWTctQjVZOEI5LVlETlRUTiI7YjoxO3M6Mjc6IjJKSDRGNC1NNDhXNzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkFEUjM2TS1VWUJXWTctNDU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlMzNjlGTS03WEJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkUzWFdKRS1MVkJXWTctNjU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjVNTDJVQy1DWUJXWTctMzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlhTUEFGWC1DTUJXWTctNzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlRSSlVFTi1WSkJXWTctOTUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlE1WFc5OC1TNkJXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZDTkYzUi1DUEJXWTctNDU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZGQVBYVC1XQ0JXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkI0RUxLMi1VUkJXWTctMjU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IllBNlhTNy00M0JXWTctMjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZQNlk5Uy1MV0JXWTctODU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjY3TVBKWC1XNkJXWTctNTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkZOUVU3SC1TOEJXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjdOUVM1Si1XOEJXWTctNDU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNRMzlKNC1LVEJXWTctQjVZODM5LU5EVFRETiI7YjoxO3M6Mjc6IlkzUVBFQy1LS0JXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5aNTk3Ry1HTEJXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNaRkM0TC1CR0JXWTctQjVZODc5LU5EVFRETiI7YjoxO3M6Mjc6Ik5XQTJBRS1ZTUJXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhCN1VBVS1MVkJXWTctNDU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlUyQkdTNi1URUJXWTctMzU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlBTkxHOC04QUJXWTctQTVaODU5LU5EVFRETiI7YjoxO3M6Mjc6IjQyQ1lKTC02NkJXWTctQTVaODQ5LU5EVFRETiI7YjoxO3M6Mjc6IlRONFRZVS03TkJXWTctNzU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRTM0pZTi1SWUJXWTctNzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkRWM0JBUS1VOEJXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlJYUVNDOS00NkJXWTctNDU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IllETVlWSi1GOUJXWTctNzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRIV0IzUS1UMkJXWTctMjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBFRjg3RC1NSkJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkNaNDlXOC1ZVEJXWTctNjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlRCWllBSC1QQ0JXWTctNzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJOSExHTS03WUJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkpBSFhQUi0yQ0JXWTctNDU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik1DNjZRSi1ENUJXWTctQTVaODk5LU5EVFRETiI7YjoxO3M6Mjc6IkcyTks4NC1DUkJXWTctQjVZODI5LU5EVFRETiI7YjoxO3M6Mjc6IldHSERMVC1HWUJXWTctNzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkwzQ1pHSi0yTEJXWTctMjU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRVTERUTS1KQ0JXWTctNTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6Ilc5TVIyTi0yUUJXWTctNDUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNMVlk3Ri1LWkJXWTctNjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlAyWFQ2OC1GVEJXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ikg1NFQ2TC1WRkJXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlNGUzNSSy0zV0JXWTctNTU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkxZWEpRTi1ZQzJXQTctWjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjVaVVFLUi1EQ0JXWTctNjU4OE45LVRERFQ5TiI7YjoxO30=" + base64decoded, _ := base64.StdEncoding.DecodeString(str) + out, _ := gophp.Unserialize([]byte(base64decoded)) + + if mout, ok := out.(map[string]interface{}); ok { + + if _, ok := mout[fdata].(map[string]interface{}); ok { + return true + } + return false + } + } + return false +} + +func GetArticaLicense() bool { + //Check Gold License + gold, _ := os.Open("/usr/local/share/artica/.GOLD") + + defer gold.Close() + + scannerGold := bufio.NewScanner(gold) + + for scannerGold.Scan() { + fdata := strings.TrimSpace(scannerGold.Text()) + if len(fdata) == 0 { + return false + } + if fdata == "TRUE" { + return true + } + str := "YTo2MDU6e3M6Mjc6IjJPWlRBWi1INU9HRzItWEQyRFJBLVlNN0lOWSI7YjoxO3M6Mjc6IldVRkhUNi1aT1VYTDktU00xWFFSLU9RTUVVQSI7YjoxO3M6Mjc6IktBRVFFMi1ZRUROUzEtSU5TSU9YLUJYNVdLNCI7YjoxO3M6Mjc6IlBQUEFUSi0ySDlWUkEtQTFMVktGLTlKTVZNMiI7YjoxO3M6Mjc6Ik9PVUk5TS1DN0RFUEEtSEdDRzFELUw2NEhKSSI7YjoxO3M6Mjc6IkNFUExGQi1GTjVMMTMtWFFVM1NBLVVWTEpLSiI7YjoxO3M6Mjc6Ik41NVlIUi1MQUYwQ1QtM0lWSlY5LTM5WllJQyI7YjoxO3M6Mjc6IkIxSklPSy1HWFNMUVMtRUFaMVhHLUxZOFNFUyI7YjoxO3M6Mjc6Ik9IVDZQVS00UElFUFgtOUZDTkJJLTlTREVWRiI7YjoxO3M6Mjc6Ikk5WEE2RC0yTk5BRjItNk1VQ0pPLTU5UFA4TCI7YjoxO3M6Mjc6IkU0TENXWi1WQlRKUVotTkFLWE5TLVNRT1JQMiI7YjoxO3M6Mjc6IlBaWE5LVS1VMkREQ1ktTUZPM0ZVLVFSRzhHTiI7YjoxO3M6Mjc6IlFETDVPRS0yMEhVOVctSlkyV05GLVpFR0JGRiI7YjoxO3M6Mjc6IlRBUk9EQS1TSkdRM0stR1lNRjBULThaSTlPVyI7YjoxO3M6Mjc6IlFBMUJBSy1YRFNWWFItWVUyRDdCLUNYNDdDWSI7YjoxO3M6Mjc6IkUwWlRZTi1PNlJSRkEtVDlNVTlaLUdaOFFBRCI7YjoxO3M6Mjc6IjhUM09OMS0xQTU5Qk0tR1dZRThULVRGR0ZXUyI7YjoxO3M6Mjc6IkZQWFZEMy1ORkMwR1YtVlFJVko5LVlJSFVMSyI7YjoxO3M6Mjc6IkJWUlRTSC1CSVdMVEUtQlJCMFhDLVJIV0RGQiI7YjoxO3M6Mjc6IkwxVlpJMC1VSlRTUU8tT1pFTkFHLVRVUVdPQiI7YjoxO3M6Mjc6IkhaVVFQRS1LV0VPRFctUUlDRE5SLUREV0pYNiI7YjoxO3M6Mjc6IklRRjUyRS1aTUZVOEUtMFdHQzdLLURRMktBQSI7YjoxO3M6Mjc6IjhEU1ZQWi03WTg2RUUtVUgxQTlULTVKSUhLQyI7YjoxO3M6Mjc6IlFRRElLUC1EOE5VSkYtOURGRFpaLUZJUk9QTyI7YjoxO3M6Mjc6IlpaUjg4OC1VRFdHVUgtRDhGTkxaLVNIT0ZHMyI7YjoxO3M6Mjc6IklEUDdTTS1INkJTUEotRlVSUUNMLUhBRjlNNCI7YjoxO3M6Mjc6IlJNR1VCVi1ESlJCTlMtWE1FVDlQLU5ISUlDUyI7YjoxO3M6Mjc6IlZOUFlOVS1RN1ZFWkItME5VOFBULUNaWEJEUCI7YjoxO3M6Mjc6IlBGREk2Uy1PQUVOV1UtNTFaNDFOLTI1TEk5WSI7YjoxO3M6Mjc6IjlLRUlCSC1FUkxIWUQtRkdDWk9VLVRVWEdWWSI7YjoxO3M6Mjc6IjNEOE5INy1IRzNMREktQkdSQU0yLTlGNUw1TiI7YjoxO3M6Mjc6Ikg4SVNVUS04T0dZTjktSUZPVU5OLVpOTVVPVSI7YjoxO3M6Mjc6IlpIVUhIUi00S05MNVotM0lZQVAwLVNCOVJENSI7YjoxO3M6Mjc6IlNWNVNQUi1JOU5VVFAtTkFMRE5JLUJOMkpVTiI7YjoxO3M6Mjc6IktOVU5HNC1OVktXQ04tWVI0WEk5LVZGRjYwRiI7YjoxO3M6Mjc6IllMTEtERi1KT0VYSTAtSUFTQTVaLVk1Q1BFRyI7YjoxO3M6Mjc6IklVWkhCRS1FUUZPUkEtT0xaUUI2LTFCQjNINCI7YjoxO3M6Mjc6Ik4ySzBaTi02SzhLSjAtOUpCRkZWLUY5VVNEVyI7YjoxO3M6Mjc6IlhGOFpROC1PRlpXUVgtV0xRQUZYLVNUVVNXTiI7YjoxO3M6Mjc6IkpTUlo1Vi1FRVBYU1gtMlNIRUhHLU5DOUlITyI7YjoxO3M6Mjc6IkVaUktQVS1FT1FVS0gtU1BTWEIxLVdTS1BQQSI7YjoxO3M6Mjc6IkZQRkUyQS02OUtGNkwtUEdOTFowLUlTMFlJQyI7YjoxO3M6Mjc6IjdCTU5UWC1FRUpWQUwtWUIzM0pLLUtOQlpGMSI7YjoxO3M6Mjc6IkJPOU5JSy1QUUJCNFotRkpLTVE0LVhTSzhERCI7YjoxO3M6Mjc6Ilg2UzZMRC01U1JYWlctUUhBNVFELVNCSDhBWSI7YjoxO3M6Mjc6IkdBVEE0Ui1SWDBJSkItRDFQV0ZFLTJUUDNVUCI7YjoxO3M6Mjc6IkJLMkdaTy1FQ0tXQU8tSFhBWU9RLTZYWUk3NiI7YjoxO3M6Mjc6IlZOVzBJVy1CTUs5VE4tWTkzR0FKLVdQUk1NUyI7YjoxO3M6Mjc6IkxaR0dPMC1COURITVItTTBQUDNCLU1ZRVlIVCI7YjoxO3M6Mjc6IjJVTzVMVC0yNkhXS0stNDVMR0RILU9BVlVWUyI7YjoxO3M6Mjc6Ik81SlAxVS1BRzlNUTQtWjlWRjVCLU1GTEFDUiI7YjoxO3M6Mjc6IjZYRFlDVy1LNFBISUEtNEYwVjVCLThXTVpRUCI7YjoxO3M6Mjc6Ik5UMVFOTC03WlVFTDQtOFBYSVdXLU1EWFRFUiI7YjoxO3M6Mjc6IlFENzhCVS01UklaU04tMTVHTEVCLVZIQVk4SCI7YjoxO3M6Mjc6IlRVSk1LRS1ZQ0hFRUwtRUZMTk1LLVhSVExQVyI7YjoxO3M6Mjc6IldIU0sxTC00VlhSV0YtTElQQ1dNLUFQUlhGUSI7YjoxO3M6Mjc6IkZBM1hQMi1USzgyRFItUFpXWUlELTgwVlA5TSI7YjoxO3M6Mjc6IklDQjZXSC1EU1hNWVEtTzJIMUVaLTVKSFpTViI7YjoxO3M6Mjc6IkhYRDlGRS01WFVBRFItQzROSFRJLUZXTE5aNSI7YjoxO3M6Mjc6IklXRk5FRi1OQUcyUDUtVU0yWFdTLVBFN1RTSyI7YjoxO3M6Mjc6IjE3TFpaQi00NDVYSFMtUElMVlhTLVQ3Nk9CRCI7YjoxO3M6Mjc6Iko2V1JUVy1NWVJOOEgtWFBCVzZNLUdVQ09ZTiI7YjoxO3M6Mjc6IlZCRUtXRi1OM1NEWUEtTjJZMU45LUxVTElOSCI7YjoxO3M6Mjc6IkJQS0RPSC1PRktKOU4tWUpRSE9ZLU1XRVdQWiI7YjoxO3M6Mjc6Ik9CR1o5US1SWUZCUlgtV1FQWEVQLVowRkJGUSI7YjoxO3M6Mjc6IlVZOU9RRS1CTTA0Q0wtVUNYTEhQLTZYQUQ0TiI7YjoxO3M6Mjc6IkFXR1lOUy1VQ1A4SEItQVcxRTJQLU9CR1hMWCI7YjoxO3M6Mjc6IksxQ0U0UC1JUTJGWTEtR1ZIVUJBLTFLTktGNCI7YjoxO3M6Mjc6IkFMU1lIUy1PRjk5TDktR1JWMlYwLVNIMkdaWSI7YjoxO3M6Mjc6IkFZSkM5TC1DT0lKRlItUElFWUpJLVcxVUxFUiI7YjoxO3M6Mjc6IkhXV0hKMS1WREZIUkYtTTJRUU1XLTNUU1ZHVSI7YjoxO3M6Mjc6Ikw5UUhPVS01OTU1OUwtTVhaWVc0LVpLUEpaTiI7YjoxO3M6Mjc6IldXQVhaTS1KM0oyTVEtMlI3SENJLTBDWkpPSyI7YjoxO3M6Mjc6IkRHWU1DMC0wR0dVRkctN0RPQVE0LU1XQ0ZZQyI7YjoxO3M6Mjc6IjlZQUk0Ri1XSUIxMUYtUFBTRENDLVM4N0dEOCI7YjoxO3M6Mjc6IlRIVkZWTS1BS1JXTk4tQkpQME1WLVpQWUVTMCI7YjoxO3M6Mjc6Ik9YRUM1Vi01S1NNRFQtWUpUVTA5LUpRUTcyRiI7YjoxO3M6Mjc6IlU4VFFPVS1ZQjFZM0otVUxSVVNDLVhWSVpCWSI7YjoxO3M6Mjc6IkVRTk9UNC1KS0cySzctRFAzUE5ULTdMUU5STyI7YjoxO3M6Mjc6IlRUVVI2Si1LTzNENDQtSUlXQUE5LVVKS1RNTiI7YjoxO3M6Mjc6IkVBRERUSy1MN0paTlUtWUdKSk1aLThBUDFaTSI7YjoxO3M6Mjc6IlZBUlhSVi05SVNUUTUtQUc0S09CLVgyTkM0QyI7YjoxO3M6Mjc6IlRVREdRMC1XS09TMlMtTEVESFdRLVVOQVdDViI7YjoxO3M6Mjc6IlBKS0c0VC1aUERNSFctV0JDUk9FLUhJSzhWVSI7YjoxO3M6Mjc6IlkyRUhFSi1RQVFRUU0tV1MzQk0yLUxZSFBLSSI7YjoxO3M6Mjc6IkpMRlBaOC1WOUdETkwtVDZJMVg5LUZYWjNZMyI7YjoxO3M6Mjc6IlhHVkNVQy1FTjROSkctMFdaWFVJLVhGSEJCVyI7YjoxO3M6Mjc6IlBEUzFKVS1UTkNXUFAtUU5CQTVMLUI3QktKSSI7YjoxO3M6Mjc6IkFEUDZJRS1XTU5JWUMtTFZSTk5LLTVITVhXTyI7YjoxO3M6Mjc6IkJTT1lNUC1DVDBGWVctSTRNTDVaLVQyQlE4UiI7YjoxO3M6Mjc6IlNBUk9FWi1LSUJUUEctUU5TSTk0LUE4QUNFUiI7YjoxO3M6Mjc6IkhMT1lUUC04VVNVS0stWldZNk1LLUpKOE8yTiI7YjoxO3M6Mjc6Ik80VkFZVy01SlQwSEYtTExVWEhYLVlZQzdKQiI7YjoxO3M6Mjc6IkxQRjNQVy1PNVBCR1UtMFA1RUtOLVhTQ09PWSI7YjoxO3M6Mjc6IlI5UE40Qi1JWFc4RVMtOUJJT0xHLThURFA0UiI7YjoxO3M6Mjc6IjhGVU5DVi1YVlNPMVQtTDNWUUdELUFKUEtQUCI7YjoxO3M6Mjc6IlJFUTJOSi0wWlRXWkwtNk9FUTlJLUpUWUFQRSI7YjoxO3M6Mjc6IkhGU0lBQy1NVElZTFQtWUlGUUlELVVKS1hHMiI7YjoxO3M6Mjc6IkxZQjFXVC1WVzNMNVktUEJMUExJLUdIRUNaUyI7YjoxO3M6Mjc6Ik1JSkdCMS1MTlQyRDItUk0wS0RKLVRaRVFMNyI7YjoxO3M6Mjc6IkJUV0VPTi0zWTNESVctVEdDV1NYLUtPRUhSTCI7YjoxO3M6Mjc6IlRPUEJBSS1QQ0tUUEctN0pSSlVKLUVTQU5HMSI7YjoxO3M6Mjc6IkY0QTNCTS1KTkZPUVktVFhOTUtTLTFMVjlHTiI7YjoxO3M6Mjc6IlM2Uk1QRS1GQ0I2Tk0tUkVDSVoyLTJOSlBNRCI7YjoxO3M6Mjc6IldUSU5YUS1BMVFCS0QtSVVQQ0swLUhTS1dDVyI7YjoxO3M6Mjc6IjJYSUJHMy1TVEJRSjgtTzRVQllYLVlTQ1hHQyI7YjoxO3M6Mjc6Ik4wVVVUNC1DUFgyOUQtT0VNQ0pMLURJOFdPOCI7YjoxO3M6Mjc6IkM5SkJLVS1MSFpXQVQtV0Y0WVhWLTMzNlhNUSI7YjoxO3M6Mjc6IjAyTkFIUS1FWTA3V1YtSk9NVEhULUxKVk1FOSI7YjoxO3M6Mjc6IjBZMUZMMi1NSDZKRUMtSlpDR05ILVpST0VUTiI7YjoxO3M6Mjc6Ikk1Sk5YTi1UQk5ITkstR1JBVDk2LUpRTzZJMSI7YjoxO3M6Mjc6IjU4V0pNTi1US1NUQkotSkdMWkcwLUVPU0NDMyI7YjoxO3M6Mjc6IjhGT0RXTy1SRk5GWDEtSFNLRldYLUZVS05QUCI7YjoxO3M6Mjc6Ik5aQ1pFWi1PRlUzWTItVzYwN0hELVVaUFlGVCI7YjoxO3M6Mjc6IlRBQ0dPSS01VEJQM1ktM1pCUk9PLUdCT1lTUCI7YjoxO3M6Mjc6IlEyUVVSQi1KMERBWUEtMTNWU1lRLTBKMEpVWSI7YjoxO3M6Mjc6IkhYUkNBWS00Q0owVk0tQlJJWVpTLVVWR04wRSI7YjoxO3M6Mjc6IkE4T1ZHNi1QWVNNTEEtTEJSWFZNLUpISTVJOCI7YjoxO3M6Mjc6IkFZOThaRi1WQ1ZEVU8tVjdDREVPLVRTTVZRNyI7YjoxO3M6Mjc6IlJZSkgzWC1IUUMwTU4tWkkyNjBKLUNTSUY2TSI7YjoxO3M6Mjc6IkUxRkNOWC1OV0NSMUQtTFlVNVRGLU8xREJBWCI7YjoxO3M6Mjc6IjRBTVNRVC1YQlowOEYtWU45WkVELTM4UkhIUSI7YjoxO3M6Mjc6Ik9URUZCSy1SSlBLN0wtOEVPRFg0LTlCTVZaMSI7YjoxO3M6Mjc6IkQxOUhYWC1SUEFaWkEtV1dVRUFXLVBTTjhBVyI7YjoxO3M6Mjc6Ik9LT0xLQy05Q0hKTkgtTE1BSEtFLVVISlpTRiI7YjoxO3M6Mjc6IlZXWlpWQy1VS1RaRlAtRU83MFFFLVpHTThDNiI7YjoxO3M6Mjc6IjJBRk4xUy1IREkySU8tSjRGWVhNLVVaMkdMRyI7YjoxO3M6Mjc6IllYRUJFSi1OMEhKVUMtWkJPWllRLVNEOUFXVCI7YjoxO3M6Mjc6IlJTVFlBRS1SUEVJU1MtVE9aQlFPLVBaUFE2QiI7YjoxO3M6Mjc6IjhCQVhGUi1LSVNJQUYtNVFVN0RYLTZPUlBYNCI7YjoxO3M6Mjc6IllWT1hLWi1UQ0EwWFItV0NWUk5YLVVFSVdYWSI7YjoxO3M6Mjc6IjBPQkxSVC1PTExBWkotQTlPMldILVhMQklNTyI7YjoxO3M6Mjc6IkROS1pSQS04MDNLSk4tVVU3WTRYLTg2RUdPNiI7YjoxO3M6Mjc6IkVSUUhZRi1HQkdDTkUtSk5QTEtLLVdWUENCVCI7YjoxO3M6Mjc6IlRHQ0ROSS1aVk1TRDktVzlKQlg0LTYwMEJQTCI7YjoxO3M6Mjc6Ik5FVUxRQi1YUk1VRlAtWEhMRE1JLVlJMFpaSSI7YjoxO3M6Mjc6Ikw1VjcxRy0wSEpUWlMtWUxNOU9OLUFaSExNOSI7YjoxO3M6Mjc6IjVFQ0dNRS1ZTktUQ0ktSkxYR0VILU5WWFJJTSI7YjoxO3M6Mjc6Ik5RQVVUTC1PREtHVTQtRVdQSVcyLUNHRU9YUSI7YjoxO3M6Mjc6IlFOSkRHOC1JRVRTSkotWFUwT1Q3LUJSNVlaRCI7YjoxO3M6Mjc6IlNFRkFIQy1ZUU9EQjAtUVFORUdPLVBTSEdFUyI7YjoxO3M6Mjc6IkxKUjhTUi1CSk1OQUMtWE04V0wzLUNZQ0dGRSI7YjoxO3M6Mjc6IkdPN1JORC1HSkk4RkYtQ1UzMUJQLUpETzdZSiI7YjoxO3M6Mjc6IkxGSkNLQy1USkdKMjAtTDlOSTI3LU9ONFVCSyI7YjoxO3M6Mjc6IkZCV0VCVS1CQ05NUEItQ1RQR0NULVNUUkdPViI7YjoxO3M6Mjc6IkFZVU5TUy1GVFpPQjUtWFJGSzQxLVBGR0ZIVCI7YjoxO3M6Mjc6Ik5MQU40Sy1KWEpEUU4tSU9XMk5ELVExN1JTUCI7YjoxO3M6Mjc6IldCVFhFTC1VTVhMUlotSENLRTdZLVhIMDVDRSI7YjoxO3M6Mjc6IjlIQ1NOMy1GU1M0UVctRElVNUFMLUEzT0dZUiI7YjoxO3M6Mjc6IkRBWEFSWi1UNEJaVVYtUEFNUkpJLVFKUDJPNyI7YjoxO3M6Mjc6IkpYMkNDWS1MNlZGWEEtQUJBS0hQLVpOMVBKQiI7YjoxO3M6Mjc6IktEWVVDTC1WUTJLWjgtM1FQWkhWLUFHV1NaMCI7YjoxO3M6Mjc6IlFYMkxOUi1RRVBHSFgtQ0lIUEdSLVg4WUNVSyI7YjoxO3M6Mjc6IlNLV1Q2TS1JR0FGNUEtTVpFWk1VLVZQU1dJTSI7YjoxO3M6Mjc6IklSQ1hUUC1TWDFCMUotRlhEQVk1LUZQUFJFTSI7YjoxO3M6Mjc6IjRQQ0hMRi1VQk4zSFgtTVNPSlMxLUM4WUNJRCI7YjoxO3M6Mjc6IlJITUhOSC1NRFdZWTMtOVBHSURGLVRLWlNTNyI7YjoxO3M6Mjc6IkxaTlVPOC1WM0lWMTgtUjRURk5GLVk4SlRNQSI7YjoxO3M6Mjc6IlBFUFZYNi1BVFozRUktUzgwNkNPLUpJRzJSSiI7YjoxO3M6Mjc6IkdTT0xLRy1aUFFLVVQtWlA3WllCLUhSUEtDMCI7YjoxO3M6Mjc6IlBTUkJRUS1ZRURZVUotSUdVWkZZLTBIR09VUCI7YjoxO3M6Mjc6IkVQRTlMWi1LSU1ENFotMkJOSFo1LUNEVVdXMSI7YjoxO3M6Mjc6IklaUEZTWS1FTVVDVE4tTzczS0JMLU9FSkFMTiI7YjoxO3M6Mjc6IlBSRUNCMC1CMFBXV0ctUllKUEJILTI1U1pPVSI7YjoxO3M6Mjc6IjVENlpTRy1HWlpTVlktR0ZVRFNNLU5VQjlTRSI7YjoxO3M6Mjc6IlNMVlRNTy1RQkFEMEwtVzJGWDNKLUdWSUZRTCI7YjoxO3M6Mjc6IktSQVlNUC1RUUJFMUMtQktIVVBZLUY3U0hVQSI7YjoxO3M6Mjc6IkxST0NHRC1SRVFLT08tNUozWkVaLU1WWUhEVSI7YjoxO3M6Mjc6IkNRQ0VTTi1STDJVQkotQ1I1U0VJLVdBUFVRWCI7YjoxO3M6Mjc6IjBDWldOSC1EQUJHV0ItRlFTUlAyLUs5UlNHSiI7YjoxO3M6Mjc6Ik1BRVFKRy1PRVBKODgtNUdQSVkyLUI5ODNaRiI7YjoxO3M6Mjc6IlRGVUZJNy1UUE9VNTAtNVNCSjNDLUJZRVlYSCI7YjoxO3M6Mjc6IkhIR1pZNi1DVElMNUstQk9OVkNILTk1WU5BVCI7YjoxO3M6Mjc6IjlFODJLRy04RTBaTUMtODNCV0RBLVY5TVhIQiI7YjoxO3M6Mjc6IkEyOVpCVy1USENDSDEtTFlQTVRJLU01RFBaUiI7YjoxO3M6Mjc6Ikg4SEdBWS1HVVQ3VlQtTE41NDlWLUpTTzVBSiI7YjoxO3M6Mjc6IjlPS0JGSC1KTkxRQ0wtTlVER1c5LUROV0s3VyI7YjoxO3M6Mjc6IllXR1VTVy1KR1hXQkItVDVNOTYxLUtPUlNINCI7YjoxO3M6Mjc6IkhVWUJINi1DUU1MQVMtTTdWTkpULUpVQ1QwMiI7YjoxO3M6Mjc6IkI0MElMUC1GSjVCVFctNUxIMThTLTgyVjFXTCI7YjoxO3M6Mjc6IjdXRjhQVC1URU9JT1ctSVc5NlVSLVI2R1BCNSI7YjoxO3M6Mjc6IkU1U0VEWi01TUNLN1AtS1JRT1hQLVBTQVZONiI7YjoxO3M6Mjc6Ilg2RU1JUy1TTThXSEwtSTJURE5RLVdNV1VPVCI7YjoxO3M6Mjc6Ik9UMzFDTi1BWUFISkYtRUcwUDZPLUJBOVNXWCI7YjoxO3M6Mjc6IloxQVdDQi0xUzZNQVYtQkVJS1ZHLUlETUNUUyI7YjoxO3M6Mjc6IkdNWlVaWC1XR1VJR1MtRlJPSDBLLTJRRzYwTyI7YjoxO3M6Mjc6IlVETVRORi1LUTNRVlgtRUJKNlFOLVhZNlA0RSI7YjoxO3M6Mjc6Ik5HUE1HNS00VFpaQ0UtRUlJMUVQLUZVNFlVQyI7YjoxO3M6Mjc6IjI4VUlaRC00SEdBTlctUFVTVUVRLUxRVFhSMCI7YjoxO3M6Mjc6IkJRV1lMVi1QSkJBNU0tSEdWTVZKLVZOTkdQTyI7YjoxO3M6Mjc6IkNaUklFTi01Vk1LRUQtNkxPTU01LVpPWUE4NiI7YjoxO3M6Mjc6IjNNVVhQMC1KR1pISVUtVEJMWENaLTdYSUJBVyI7YjoxO3M6Mjc6Ik02TElGRi1SWElGMVAtSFE2VVFCLTQ2STRDTSI7YjoxO3M6Mjc6IkNFWUpURS1ORkFWU1ctQUNQR1VJLVVTUlpTOSI7YjoxO3M6Mjc6IjdaT0pZQi1HOE5VNVAtRVlFNlVBLUFDRjJTRyI7YjoxO3M6Mjc6IlhSTEhSTS1PT01JUEYtVVQ4UDdLLVJFNkgzVCI7YjoxO3M6Mjc6IkpOS1NHQS1XQ0VJV00tR05JV1JNLVZMUDY4NSI7YjoxO3M6Mjc6IlgwV0dFVi1WSUNFS0UtTkRPQkpSLUxLUFFTTiI7YjoxO3M6Mjc6Ik5BQzFEOS1QQlJXTEctOTlZU1lCLVJVQ09XSSI7YjoxO3M6Mjc6IllXV1FGTi1RSlVMQlYtRlVUNlBQLUFYTlRFUyI7YjoxO3M6Mjc6IkhQVlVURC1XVTk3VEotTU1VUk1aLUZLOE1TVSI7YjoxO3M6Mjc6IkdQOFRSVC1aU1JENUUtVURBVVRMLVU4NlBZUiI7YjoxO3M6Mjc6IkdVWVdXRi0wRDE0WDktNUNCVVNaLVZHWVlOSSI7YjoxO3M6Mjc6Ik5MTUlUNC1ONlE3RTUtNkZLWTRFLThMWTFLMSI7YjoxO3M6Mjc6IllCSUVNUy1LSDNPUFUtVlFSUVJHLVlSOFY0RiI7YjoxO3M6Mjc6IlBDRkZYVi1SUUJXWTctODU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlIVjJRQS1BV0JXWTctMzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlNEOERIVy1RSEJXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNHUFdNSC1WUUJXWTctNzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRYUUpOWS1QNkJXWTctNzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IlJEUjhWTC01TUJXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IktZOUVDVy1ZN0JXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlJTRDdNVS1MM0JXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6Iko0QUZLRC1HWkJXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ijc0UTdNSi1KVEJXWTctMzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJVRENRQS1OWkJXWTctNjVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjdMNzJXSy1MR0JXWTctMjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJVTUE4WC1VWUJXWTctNzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjdHVVUzOC1aM0JXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5RS0FVSC0yTEJXWTctNDU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjdRNExVNC1LQkJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJKOTNBQy1VMzhXODctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IjhMQ1Q1Ni1IWEJXWTctMzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IlpaQ0ZOUC1QNkJXWTctNzU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjkzVUY1OC1FV0JXWTctQjVZODY5LU5EVFRETiI7YjoxO3M6Mjc6IjlXSjgySy1VUUJXWTctNDU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZVRTU5NS00QTlXMjctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IjhHRlM1Qi04NTlXNjctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkJYWTJUTi0zTUJXWTctNTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZWTlFRSC1HSEJXWTctODU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjQ0VVM4RS1UUEJXWTctNDUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlE4UEZNSi0zMkJXWTctMjVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IlE2SE1NNS1XTEJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjhZWFZKNi02UEJXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5YVUFRSy1BVkJXWTctODUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlFEMlQ2US1GQUJXWTctMjU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZQWEdaVC1FRUJXWTctOTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IldVRFhMRC1SRkJXWTctODU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlpQQ001RC1DQUJXWTctMzU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZEOFpQMy1DQ0JXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlM3TTJQTS0zNEJXWTctQjVZODM5LU5EVFRETiI7YjoxO3M6Mjc6IlJCM0czNy1ZVEJXWTctMzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IlRZVVg1Ti1CVEJXWTctOTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ijk5SzhKVS1EOEJXWTctQjVZODY5LU5EVFRETiI7YjoxO3M6Mjc6IllGMktBNC1LVkJXWTctMzU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlI2R1dZQS1KU0JXWTctNzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkVQR1VKVi1DRUJXWTctNjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IktWSllLQi1ZOUJXWTctNzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlpTNjQySy01V0JXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZSSERZTC1NM0JXWTctNTUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkhYVjMyWC1IUUJXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjI5Q0gzVy1OREJXWTctQjVZOEI5LVlETlRUTiI7YjoxO3M6Mjc6IkZITjRLUC02SEJXWTctMjU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZQNVZGVy1aWDJXQTctWjU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRUNDRRSi1FMkJXWTctQTVaODI5LU5EVFRETiI7YjoxO3M6Mjc6Ilg0WE45Mi0zTEJXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRNRURUSi1TR0JXWTctNDU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkE4VzNYRi1VR0JXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhGNEY2VS1KN0JXWTctQTVaODQ5LU5EVFRETiI7YjoxO3M6Mjc6IjlXWEc0TS1OUkJXWTctNjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhXNkE3Vy0zVUJXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkhDTUc3Qy1VSEJXWTctMzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlMzWlhXVi1NVjJXQjctWTU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhQR1FQSi1BTUJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkozWlQ4Uy1HOUJXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlpBQlBCRi1XSkJXWTctNTU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkczTE5MUC1YRkJXWTctNTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkVONUdSTi1MWkJXWTctNjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlJMSzc1Qi00V0JXWTctMjU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ilk5QkhMSi1WSkJXWTctNjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IlA2U04yQy1CWUJXWTctNDVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjNRNFZTRC1UOEJXWTctNDUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IllaV0RQVi04R0JXWTctOTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkdaRDNIMi1ESEJXWTctQjVZODY5LU5EVFRETiI7YjoxO3M6Mjc6IlNCU0o5WC1SWUJXWTctODU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5CNjJQVy1ZUkJXWTctNjVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjI5Q1JDRS1XV0JXWTctNDVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IlozSDdBOC0yNThXNzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IllaNEg3My0zOUJXWTctQjVZODI5LU5EVFRETiI7YjoxO3M6Mjc6IlpMVkVDOS02REJXWTctNDVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjhQVEQyNS1EOEJXWTctQTVaODM5LU5EVFRETiI7YjoxO3M6Mjc6IkQyVTVKVi0yTEJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IllKWE1FUy1QRkJXWTctOTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkNVVzlBTi1FV0JXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJNWkpUOC1UUkJXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IlRFRTQ2TS1NTUJXWTctMzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjZGWFBaVi1IOUJXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjNOOEhRRC1GSkJXWTctMjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlE3UkhUSi03SEJXWTctNDU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlVXSkc2WS1UVUJXWTctOTU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IldCWk5VUi1TQUJXWTctOTU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjdZS1RCRC1ESEJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjZBRlBIRC1RTEJXWTctMzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlFGRVREOC1UUUJXWTctNjVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjJLTVZUNS1XV0JXWTctNzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkVUWkdRTi1MR0JXWTctODVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjQ3M0FVUi1LQkJXWTctQjVZODI5LU5EVFRETiI7YjoxO3M6Mjc6IjZFUzVINy1ZSkJXWTctMzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkJNMlozUy05UkJXWTctMzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZWVVhRWi1aNTJXQjctWTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjVVOEozQS0zSzlXODctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IjlOVU45Ny1BNUJXWTctQjVZODY5LU5EVFRETiI7YjoxO3M6Mjc6IlNITkhFTi01VkJXWTctNTU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkNKWkxISy0zV0JXWTctNTU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkM4REUyUi02VkJXWTctQjVZODM5LU5EVFRETiI7YjoxO3M6Mjc6IkRWUTM5VS1UTEJXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IllFNEgzQi1TQ0JXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkpWUjJLQS1MMkJXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBYNUhHSi1EUEJXWTctNTUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjZXTUhIRi1QS0JXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlQ0WFdUUi1SUDJXQTctWjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZRV1YyOC1ITUJXWTctNTUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkpXNVFHRS03UEJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhIUThYSi03R0JXWTctMzU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ilc3UDdFQi1DQ0JXWTctMjVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjRUVEJIVi05UUJXWTctNTU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IloyQUgyRy1CWEJXWTctMjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkFHM05HNS1RTEJXWTctMjVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkxHMjU4Ui1DUkJXWTctQjVZODg5LU5EVFRETiI7YjoxO3M6Mjc6IktIQUROQy1KM0JXWTctQjVZODc5LU5EVFRETiI7YjoxO3M6Mjc6IlBZQVAzNi1FV0JXWTctNDU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkFYUTNOOC1NTEJXWTctNDU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik41S1JEUi1CWkJXWTctNjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjZKODZRTS00QUJXWTctQTVaOEI5LVlETlRUTiI7YjoxO3M6Mjc6IkdHTkVZWC0zWkJXWTctNzU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ilo3QTdFUS00VkJXWTctMzU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ilo4Q1BWVC1TQ0JXWTctODVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IlpCVDlXQi1ERkJXWTctNTU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlSMllLUi00WUJXWTctNTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRTV1YyVi05RkJXWTctNTUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlRCOVM4Ry1GMkJXWTctQjVZODg5LU5EVFRETiI7YjoxO3M6Mjc6IkRIODJQTC0zWUJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJXRjRWMi1IWUJXWTctNDU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjZQU1E4Si1ONkJXWTctNDVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjVLNFNaRS1MS0JXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjVDTUtMUy0yREJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJTTlFQSC1MQ0JXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlKU1Q2QS1LNEJXWTctMjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkU0TVVUNy0zRUJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjZLUDRRUi1QTUJXWTctNTU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNUVFFXRi00RkJXWTctNTUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlpIRFlOOS0zQUJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ilg2WFUzRC1DVEJXWTctNTU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5HN0RZVy1KWEJXWTctNzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5NNTM1WS1LS0JXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlA0VUhSWS1FUUJXWTctNzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkxZUDJKVS1EUkJXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IksyVjVFVS03UkJXWTctMzU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlgyWUdRQy1HSkJXWTctNTU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlY2Mk04Ry1MNEJXWTctQjVZOEE5LVpETlRUTiI7YjoxO3M6Mjc6IjZLU05IWi1GVkJXWTctNzU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlRBR1NTNS1aN0JXWTctNTU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlhCRldMVC1IWEJXWTctOTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkhaREVQUy1LQkJXWTctNjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlVIS0o5UC1TUUJXWTctNzU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlFLRFlLSi1IV0JXWTctODVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6Iko1UlJZUy1aMkJXWTctNzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlQ3M1o3My1OR0JXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ilk1NjRHSC04TkJXWTctQjVZODM5LU5EVFRETiI7YjoxO3M6Mjc6IkJBNUFFMy1ZSkJXWTctQTVaODY5LU5EVFRETiI7YjoxO3M6Mjc6IkpYM1dKWS02QkJXWTctNTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlVWNVdVQS1QWUJXWTctOTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZVRDI0Mi02SDhXOTctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkhBRURLNC0zRDlXNDctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IlcyUU5SUS1VOEJXWTctNzU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkFRQks0OS1IV0JXWTctMjU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBEM0szRy1ZUEJXWTctMzU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5OOEFEUy1EWkJXWTctNTUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJITFFWSy1HU0JXWTctNjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjdUUkpYWS1SWDJXQTctWjU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBESEFMUy1XVEJXWTctNzU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik01WENHUS01R0JXWTctMzU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNNRFBSSC0yWkJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlUyQzhMVi1BOUJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IllQTUZKUC02N0JXWTctNTUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjU1RTk3WC1HWUJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IldNRzVUSi02WkJXWTctNjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5LQjVKRy1DM0JXWTctQTVaODk5LU5EVFRETiI7YjoxO3M6Mjc6IlU0SlZVVy1aOUJXWTctOTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjNKVkxLTi1ZUUJXWTctNzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkhEV0RTNC02SEJXWTctMzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkVHQlY2Ry1HRUJXWTctMjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkRSREdRTi1NMkJXWTctNDUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlXNTY2OS1KTEJXWTctQTVaODc5LU5EVFRETiI7YjoxO3M6Mjc6IjVQVEc1RS1WV0JXWTctNTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZUUzhQRy1ZQUJXWTctNjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJINkhMRS0zSEJXWTctQTVaODY5LU5EVFRETiI7YjoxO3M6Mjc6IkZXTE5VMi1YUUJXWTctODUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ilc2SEI0QS0yQjlXMzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkRZTFNONC1BVEJXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJCUjlYTC1BREJXWTctMzU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBIWVRBQi1RM0JXWTctNTU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ijk1VUQ0OS1WNEJXWTctQTVaODU5LU5EVFRETiI7YjoxO3M6Mjc6IlVZNjdXTS00U0JXWTctNjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6Iks5NEZLVi0yV0JXWTctMzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5ORzhGVi1BQ0JXWTctMzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkNLUVJaRC1NRkJXWTctNzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkxEQVBONS1YWkJXWTctNjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlE5Qk5ZNC1FVkJXWTctNTUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhTNTRDWi0zTEJXWTctQjVZODY5LU5EVFRETiI7YjoxO3M6Mjc6IlA0WkxWNC1IOUJXWTctNDU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlJGVkhMNi04QUJXWTctMzU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjQ5R0U1Qy1SOTlXNjctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6Ilo4RVNUVC03RkJXWTctNjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlNXVTZZQy02WkJXWTctODUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJBQUVCWi1TWUJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBFNUpOTi01RUJXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlJEOFZRMy1ISkJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkdHMzhFNi1QOTlXNzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IlE4TkNFOC1ESkJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhISk1URS0zS0JXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkRKN05FSi1FRUJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlU1VloyOC00OEJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ijg3WVIyVy03QkJXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJIOVVBUy1OWkJXWTctNjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkhIMzJWQi1URUJXWTctMjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5XUEpCVy1INkJXWTctNjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkE3WjlMNy1NWEJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkY4M0Y3VS1GNDlXNzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6Ik1FVlBVTC1QWjJXQTctWjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5LTVM3Ny1NREJXWTctNDUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNHS0dBUy1YU0JXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlA3RUZYOC1WVEJXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlFBV0E1NS1GVUJXWTctMzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNXRzRGWi0zS0JXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZVM0c0US1OTUJXWTctNTU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlLMkcyQS1GNTdXOTctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkFNS0tZRy01RUJXWTctNDVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IlhESFU1Ti1SWEJXWTctODVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6Ilc5VlhUMy1aWDJXQTctWjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkYyVFg5UC1UVUJXWTctNzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjZWVkM4Vy1QUEJXWTctNzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6Ik5QOEpWSC1BQUJXWTctNDUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkVLS0ZBNy0yUUJXWTctQjVZODQ5LU5EVFRETiI7YjoxO3M6Mjc6IkFDNUs2Ri1CQjlXQTctWjVOOFQ5LUREOVQ4TiI7YjoxO3M6Mjc6IjhVNVE0WC1EWUJXWTctNTUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlYWVRHWC1TSjJXQTctWjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjVSNDZETi1BNzlXNTctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IlBCOFlETS1VNEJXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlpQOVhFNC02S0JXWTctNDU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlNZNUFCWS1WOEJXWTctNjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6Ikc5TEpNNS0zMzlXODctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkxFSEpSWi1FMkJXWTctNDU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik1QVjU5Ni1DQkJXWTctMjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjlaVUtSVS0yS0JXWTctNzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6Ijg4SzM2Qy1CRjhXMzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IlVLS1BGOC1SNkJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjNQR040Ui1WTUJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjJEM0dXQi1YM0JXWTctQjVZODM5LU5EVFRETiI7YjoxO3M6Mjc6IkZRNVZBWS1CVUJXWTctNjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlJGQ0dZOC1aWkJXWTctODUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkY3WkFYSC1KMkJXWTctMzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkVXSFUyMi1WTkJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjcyQjJIMi1XUkJXWTctQTVaOEE5LVpETlRUTiI7YjoxO3M6Mjc6IjJWU1M1Qi1ZV0JXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjZQR0VOSi1YOEJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZHM1lUQy1VWkJXWTctOTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkVaRExBUy1UVUJXWTctODVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IlRZUkFVTS1LSkJXWTctOTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkdDVTdQWS1XUEJXWTctODVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6Ilo2TFFVUi1GR0JXWTctNzU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNNTlBUQi01OEJXWTctMjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRDWllXQS1SNUJXWTctNTU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJRTEg2UC1RR0JXWTctNDU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkY3ODdNUC1OUUJXWTctMzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjZWM0E0Ui04UkJXWTctQjVZODY5LU5EVFRETiI7YjoxO3M6Mjc6IkRNR0JZRy0zQUJXWTctMjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlM2REJOUi04Q0JXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRRR0Q3Ny03SDlXNzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IlFWUlQ0RC1YV0JXWTctOTU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IldGTjJNNC1BQUJXWTctQjVZODg5LU5EVFRETiI7YjoxO3M6Mjc6IkdTWEFVNy1YRUJXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkRHN1ZERy1BVkJXWTctMzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlJLSk1UQi1TVEJXWTctODU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlpCMktONC1BS0JXWTctMjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkFCRjJTNy0zVEJXWTctQTVaODU5LU5EVFRETiI7YjoxO3M6Mjc6IkFGSFIyUC1HWUJXWTctNDU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJVNTJBSy1ER0JXWTctQTVaODc5LU5EVFRETiI7YjoxO3M6Mjc6IjlHTE5RWC1DVkJXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkE4WEFYNi00TEJXWTctMjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjdaRkxBVy1WQ0JXWTctNjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjdaQTVVVy0zVEJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkFOSENDOS1FR0JXWTctQjVZODM5LU5EVFRETiI7YjoxO3M6Mjc6IldUWEdNVS1MNUJXWTctODU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlVVjQ5Si1RMkJXWTctMzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IllKM1pTUy1QRUJXWTctODU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjY5VFFNUi1MNUJXWTctNDU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkdOM1paRi1GOUJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IlFVQktQTC1HVEJXWTctNzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IllOVkc5Ti1TRkJXWTctNzU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJFWU0zVC1RS0JXWTctNTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkY5SFlTWS1GS0JXWTctNzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkcySlFDVS01WUJXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRWVVUzOS1FUkJXWTctNDU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkdEREhURy1WTkJXWTctNTU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkhaRE5FNC1QUkJXWTctNTU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJKOTU0Si1XNDlXNDctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IjVSQVpQWi1IV0JXWTctODU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ijk5SEJDVi1aQkJXWTctMzU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJINVBWVi1SUUJXWTctNjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlhQQlQ3Ry1RRUJXWTctNjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjVYNFIyNC0yUUJXWTctQTVaODM5LU5EVFRETiI7YjoxO3M6Mjc6IjY1WVhCNi1WRUJXWTctNDVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IjVTWFVEVy1DS0JXWTctNzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkxROEhaWS1BS0JXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IllaOThCQi02WEJXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlE5QkpaVC1WREJXWTctNzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjVTTkJWVS0yWUJXWTctNjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IllZQkY0Vi1ISkJXWTctNjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBKUkQ4NC1LQUJXWTctMjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlRZNEI4My1TQkJXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkhGMlMzTS1OS0JXWTctMzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6Ikg4RjY4Qy1IQTlXMzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6Iks1N0I5Vy1ZNkJXWTctMjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkxKV1IzRi0yTUJXWTctNDVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IllFWk1IVC1RUDJXQTctWjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlU2N0JKOC1SREJXWTctMjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkhYUU1aOC1QSkJXWTctODU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjdQVktBMi1YU0JXWTctNTU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBES0tOWi1RTkJXWTctODU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkpBN1c4Sy1VREJXWTctMzU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjI1R1E3Ni1TWEJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlM1NE5GSi1CMkJXWTctQTVaODc5LU5EVFRETiI7YjoxO3M6Mjc6IlI3U0FWNy1ZSEJXWTctNjVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IlNOWldKVy1STDJXQjctWTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlXRjhHQy1IRkJXWTctMjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJXWlY1VC1YTEJXWTctOTU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlhCMkdUOS1FNEJXWTctQjVZODg5LU5EVFRETiI7YjoxO3M6Mjc6IjgzRVdXRS1TNUJXWTctMzU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhWWTVERS1STUJXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJMRFVSSy00WEJXWTctNTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6Ilo0RDdaWS02MkJXWTctMzU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkdRS1dIUC1BUEJXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IllMNURWSC1ROUJXWTctNTU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJBUVMzWS03S0JXWTctMzVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkhOTkZUTC1WWkJXWTctOTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRVTkhFOC00RkJXWTctQjVZODU5LU5EVFRETiI7YjoxO3M6Mjc6IlFSS0tHUy02TkJXWTctNjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IllIRE5BNy1HOUJXWTctMjU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjJWTjQ1Vi02Q0JXWTctQjVZODQ5LU5EVFRETiI7YjoxO3M6Mjc6IjI2Qko1Mi1DUDhXMjctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkJSVTlTOS1NTkJXWTctNTU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkxQSEVaWC1OQ0JXWTctODVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6Ik1VWkEzUS1VU0JXWTctODU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRRU0hBUy04UUJXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkhTNVE3Vy1ZVkJXWTctODVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkpQRFRaNC1DN0JXWTctNDU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkczV1pLMy1DUEJXWTctNDU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ikc2UTZVQi1NMkJXWTctQjVZODk5LU5EVFRETiI7YjoxO3M6Mjc6IkZFSzRENS1ONDlXODctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkRSOUdFQi1BWUJXWTctMzU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IktGOVdWTi1NU0JXWTctODVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkZOTDdWOS00TEJXWTctMzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IjI0SksyQy1ORzlXODctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IlRINVU5NC1NV0JXWTctNDU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZGUE5EUy1aU0JXWTctOTU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkE0QURYRy1LNUJXWTctQjVZOEI5LVlETlRUTiI7YjoxO3M6Mjc6IjJKSDRGNC1NNDhXNzctTjVUOEQ5LTlEOFQ1TiI7YjoxO3M6Mjc6IkFEUjM2TS1VWUJXWTctNDU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlMzNjlGTS03WEJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkUzWFdKRS1MVkJXWTctNjU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjVNTDJVQy1DWUJXWTctMzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlhTUEFGWC1DTUJXWTctNzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlRSSlVFTi1WSkJXWTctOTUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlE1WFc5OC1TNkJXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZDTkYzUi1DUEJXWTctNDU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkZGQVBYVC1XQ0JXWTctNzVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkI0RUxLMi1VUkJXWTctMjU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IllBNlhTNy00M0JXWTctMjU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlZQNlk5Uy1MV0JXWTctODU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjY3TVBKWC1XNkJXWTctNTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6IkZOUVU3SC1TOEJXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjdOUVM1Si1XOEJXWTctNDU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNRMzlKNC1LVEJXWTctQjVZODM5LU5EVFRETiI7YjoxO3M6Mjc6IlkzUVBFQy1LS0JXWTctNTU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik5aNTk3Ry1HTEJXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNaRkM0TC1CR0JXWTctQjVZODc5LU5EVFRETiI7YjoxO3M6Mjc6Ik5XQTJBRS1ZTUJXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjhCN1VBVS1MVkJXWTctNDU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlUyQkdTNi1URUJXWTctMzU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjlBTkxHOC04QUJXWTctQTVaODU5LU5EVFRETiI7YjoxO3M6Mjc6IjQyQ1lKTC02NkJXWTctQTVaODQ5LU5EVFRETiI7YjoxO3M6Mjc6IlRONFRZVS03TkJXWTctNzU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRTM0pZTi1SWUJXWTctNzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkRWM0JBUS1VOEJXWTctMzUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlJYUVNDOS00NkJXWTctNDU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6IllETVlWSi1GOUJXWTctNzU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRIV0IzUS1UMkJXWTctMjU0OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlBFRjg3RC1NSkJXWTctMjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkNaNDlXOC1ZVEJXWTctNjUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IlRCWllBSC1QQ0JXWTctNzUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IkJOSExHTS03WUJXWTctNTVCOFk5LU5EVFRETiI7YjoxO3M6Mjc6IkpBSFhQUi0yQ0JXWTctNDU1OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ik1DNjZRSi1ENUJXWTctQTVaODk5LU5EVFRETiI7YjoxO3M6Mjc6IkcyTks4NC1DUkJXWTctQjVZODI5LU5EVFRETiI7YjoxO3M6Mjc6IldHSERMVC1HWUJXWTctNzU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkwzQ1pHSi0yTEJXWTctMjU5OE45LVRERFQ5TiI7YjoxO3M6Mjc6IjRVTERUTS1KQ0JXWTctNTVBOFo5LU5EVFRETiI7YjoxO3M6Mjc6Ilc5TVIyTi0yUUJXWTctNDUzOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjNMVlk3Ri1LWkJXWTctNjU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlAyWFQ2OC1GVEJXWTctNDU3OE45LVRERFQ5TiI7YjoxO3M6Mjc6Ikg1NFQ2TC1WRkJXWTctMjU4OE45LVRERFQ5TiI7YjoxO3M6Mjc6IlNGUzNSSy0zV0JXWTctNTU2OE45LVRERFQ5TiI7YjoxO3M6Mjc6IkxZWEpRTi1ZQzJXQTctWjUyOE45LVRERFQ5TiI7YjoxO3M6Mjc6IjVaVVFLUi1EQ0JXWTctNjU4OE45LVRERFQ5TiI7YjoxO30=" + base64decoded, _ := base64.StdEncoding.DecodeString(str) + out, _ := gophp.Unserialize([]byte(base64decoded)) + + if mout, ok := out.(map[string]interface{}); ok { + + if _, ok := mout[fdata].(map[string]interface{}); ok { + return true + } + return false + } + + } + + //Check Corporate License + isArticaLicense := GetSocketInfoInt("isArticaLicense") + if isArticaLicense == 1 { + return true + } + corp, _ := os.Open("/etc/artica-postfix/settings/Daemons/CORP_LICENSE") + + defer corp.Close() + + scannerCorp := bufio.NewScanner(corp) + + for scannerCorp.Scan() { + fdata := strings.TrimSpace(scannerCorp.Text()) + if len(fdata) == 0 { + return false + } + + if fdata == "VFJVRQ==" { + return true + } + return false + + } + + return false +} + +func IsInt(s string) bool { + _, err := strconv.Atoi(s) + return err == nil +} + +func TimeTrack(start time.Time) string { + //elapsed := time.Since(start) + //log.Printf("%s took %dms", name, elapsed.Nanoseconds()/1000) + return fmt.Sprintf("took %d μs", time.Since(start).Microseconds()) +} + +func GetTimeDelta(delta time.Duration, format int) string { + if delta == 0 { + delta = 1 + } + d := time.Minute * delta + deltaSeconds := float64(d / time.Second) //delta time in seconds + t := time.Now() + s := daySeconds(t) // seconds + ms := t.Nanosecond() / 1000 //Microseconds + r := math.Floor((float64(s)+deltaSeconds/2)/deltaSeconds) * deltaSeconds //rounding + rs := int(r) //rounding in seconds + o := rs - s + td := timeutil.Timedelta{Days: 0, Seconds: time.Duration(o), Microseconds: time.Duration(-ms)} + result := t.Add(td.Duration()) + var str string + if format == 1 { + str = timeutil.Strftime(&result, "%Y%m%d%H%M") + } + if format == 2 { + str = timeutil.Strftime(&result, "%Y-%m-%d %H:%M:%S") + } + + return str +} + +func daySeconds(t time.Time) int { + year, month, day := t.Date() + t2 := time.Date(year, month, day, 0, 0, 0, 0, t.Location()) + return int(t.Sub(t2).Seconds()) +} + +func Logfile(filename, data string) { + f, err := os.OpenFile(filename, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) + if err != nil { + logstats.Fatal(err) + } + defer f.Close() + backend := logging.NewLogBackend(f, "", 0) + logging.SetBackend(backend) + logstats.Info(data) + //mylog.SetOutput(f) + //mylog.Println(data) +} diff --git a/server/internal/memcached.go b/server/internal/memcached.go new file mode 100755 index 0000000..79a169e --- /dev/null +++ b/server/internal/memcached.go @@ -0,0 +1,122 @@ +package internal + +import ( + "context" + "errors" + "github.com/bradfitz/gomemcache/memcache" + "github.com/go-redis/redis/v8" + "log" + "time" +) + +var isDebugMemcached bool +var MC = memcache.New("/var/run/memcached.sock") +var ctxRedis = context.Background() +var rdb *redis.Client + +func InitMemcached(debug bool) { + isDebugMemcached = debug +} + +func Get(key string) (response string, err error) { + log.Printf("Memcached GET %s", key) + val, err := MC.Get(key) + if err != nil { + if isDebugMemcached { + log.Printf("Memcached Get->Error: %s", err) + } + return "", err + } + if string(val.Value) == "" { + if isDebugMemcached { + log.Printf("Memcached Get->Error: %s", errors.New("empty value")) + } + return "", errors.New("empty value") + } + value := string(val.Value) + return value, nil +} + +func Set(key string, value string, ttl int32) { + log.Printf("Memcached SET %s", key) + err := MC.Set(&memcache.Item{Key: key, Value: []byte(value), Expiration: ttl}) + if err != nil { + if isDebugMemcached { + log.Printf("Memcached Get->Error: %s", err) + } + //panic(err) + } +} + +func Inc(key string, value string) { + if isDebugMemcached { + log.Printf("Memcached Inc %s", key) + } + + _, err := Get(key) + if err != nil { + Set(key, "1", 36000) + } else { + MC.Increment(key, 1) + } +} + +func redisConnect() bool { + rdb = redis.NewClient(&redis.Options{ + Addr: "127.0.0.1:6123", + Password: "", // no password set + DB: 0, // use default DB + }) + + err := rdb.Set(ctxRedis, "key", "value", 0).Err() + if err != nil { + + if isDebugMemcached { + log.Printf("Failed to connect to redis server %s", err) + } + return false + } + return true + +} + +func RedisGet(key string) string { + if !redisConnect() { + if isDebugMemcached { + log.Printf("Failed to connect to redis server") + } + return "" + } + val, err := rdb.Get(ctxRedis, key).Result() + if err == redis.Nil { + if isDebugMemcached { + log.Printf("key %s does not exist", key) + } + return "" + } else if err != nil { + if isDebugMemcached { + log.Printf("erro getting key %s => %s", key, err) + } + return "" + } else { + return val + } + return "" +} + +func RedisSet(key string, val string, ttl time.Duration) bool { + if !redisConnect() { + if isDebugMemcached { + log.Printf("Failed to connect to redis server") + } + return false + } + err := rdb.Set(ctxRedis, key, val, ttl).Err() + if err != nil { + if isDebugMemcached { + log.Printf("erro setting key %s => %s", key, err) + } + return false + } + return true +} diff --git a/server/itchart/intchart.go b/server/itchart/intchart.go new file mode 100755 index 0000000..cc80b2a --- /dev/null +++ b/server/itchart/intchart.go @@ -0,0 +1,182 @@ +//package itchart +// +//import ( +// "encoding/base64" +// "fmt" +// "github.com/techoner/gophp" +// "log" +// "net/netip" +// "server/internal" +// "strconv" +// "strings" +//) +// +//var ( +// isDebugITChart bool +// SelfITChartMessage string +// SelfITChartSitename string +// SelfITChartRedirectPage string +// SelfNetworksExcludeLine string +//) +// +//func IntITChart(debug bool) { +// isDebugITChart = debug +// SelfITChartRedirectPage = internal.GetSocketInfoString("ITChartRedirectURL") +// SelfITChartRedirectPage = strings.ToLower(SelfITChartRedirectPage) +// SelfNetworksExcludeLine = internal.GetSocketInfoString("ITChartNetworkExclude") +//} +// +//func ChartThis(ipaddr, mac, username, protocol, sitename string) bool { +// SelfITChartSitename = sitename +// if strings.Index(SelfITChartRedirectPage, sitename) > -1 { +// if isDebugITChart { +// log.Printf("%s: [DEBUG]: <%s> is the redirected page, no sense to block it", ipaddr, sitename) +// } +// return false +// } +// if protocol == "CONNECT" { +// if isDebugITChart { +// log.Printf("%s: %s: [DEBUG] [%s] method excluded, PASS", ipaddr, sitename, protocol) +// } +// return false +// } +// if isNetExcluded(SelfNetworksExcludeLine, ipaddr, mac) { +// log.Printf("%s: [DEBUG] isNetExcluded report True, PASS", ipaddr) +// return false +// } +// keyAccount := findKeyAccount(username, ipaddr, mac) +// if isDebugITChart { +// log.Printf("%s: [DEBUG] [%s]: username=%s ipaddr=%s mac=%s sitename=%s method=%s ->get_itcharts_ids()", sitename, keyAccount, username, ipaddr, mac, sitename, protocol) +// } +// +// itChartIDs := getITChartIDs() +// if len(itChartIDs) == 0 { +// if isDebugITChart { +// log.Printf("%s: [DEBUG] [%s] PASS: No IT Chart available in configuration", sitename, keyAccount) +// } +// return false +// } +// for id, _ := range itChartIDs { +// keyMem := fmt.Sprintf("%s|%s", keyAccount, id) +// keyAD := fmt.Sprintf("itchart.activedirtectory.%s", id) +// keyToError := base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%s|%s|%s|%s", keyAccount, id, protocol, sitename))) +// timestamp, _ := strconv.Atoi(internal.RedisGet(keyMem)) +// if timestamp > 0 { +// continue +// } +// if len(username) > 0 { +// adFilters := internal.RedisGet(keyAD) +// if len(adFilters) > 0 { +// if isDebugITChart { +// log.Printf("%s: [DEBUG] Checking ITCharter AD filters [%s] = %s", keyAccount, keyAD, len(adFilters)) +// } +// } +// +// } +// +// } +// return false +//} +// +//func getITChartIDs() map[string]bool { +// //TODO finish it +// results := map[string]bool{} +// data, _ := base64.StdEncoding.DecodeString(internal.RedisGet("itcharts.ids")) +// if len(data) < 3 { +// if isDebugITChart { +// log.Printf("%s: [DEBUG]: get_itcharts_ids no more data [SKIP]", SelfITChartSitename) +// } +// return results +// } +// out, err := gophp.Unserialize([]byte(data)) +// if err != nil { +// if isDebugITChart { +// log.Printf("error Unserialize itcharts.ids: ", err) +// } +// return results +// } +// if mout, ok := out.(map[string]interface{}); ok { +// for x, data := range mout { +// results[x] = data.(bool) +// } +// } else { +// if isDebugITChart { +// log.Printf("%s: [DEBUG] ERROR <%s>", SelfITChartSitename, err) +// } +// return results +// } +// if isDebugITChart { +// log.Printf("%s: [DEBUG]: get_itcharts_ids array of %d items", SelfITChartSitename, len(results)) +// } +// return results +//} +// +//func findKeyAccount(username, ipaddr, mac string) string { +// if username == "-" { +// username = "" +// } +// if ipaddr == "-" { +// ipaddr = "" +// } +// if ipaddr == "127.0.0.1" { +// ipaddr = "" +// } +// if mac == "-" { +// mac = "" +// } +// if mac == "00:00:00:00:00:00" { +// mac = "" +// } +// if len(username) > 3 { +// return username +// } +// if len(mac) > 3 { +// return mac +// } +// if len(ipaddr) > 3 { +// return ipaddr +// } +// return "" +//} +// +//func isNetExcluded(network, ipaddr, mac string) bool { +// if network == "" { +// if isDebugITChart { +// log.Printf("%s: [DEBUG]: isNetExcluded None, aborting", SelfITChartSitename) +// } +// return false +// } +// if len(network) < 3 { +// if isDebugITChart { +// log.Printf("%s: [DEBUG]: isNetExcluded Not configured, aborting", SelfITChartSitename) +// } +// return false +// } +// net := strings.Split(network, "\n") +// for _, cdir := range net { +// if isDebugITChart { +// log.Printf("%s: [DEBUG]: isNetExcluded checking %s against %s %s", SelfITChartSitename, cdir, ipaddr, mac) +// } +// if mac == cdir { +// return true +// } +// if ipaddr == cdir { +// return true +// } +// network, err := netip.ParsePrefix(cdir) +// if err != nil { +// panic(err) +// } +// ip, err := netip.ParseAddr(ipaddr) +// if err != nil { +// panic(err) +// } +// if network.Contains(ip) { +// if isDebugITChart { +// log.Printf("%s: [DEBUG]: isNetExcluded checking %s matches %s", SelfITChartSitename, cdir, ipaddr) +// } +// return true +// } +// } +// return false +//} diff --git a/server/main.go b/server/main.go new file mode 100755 index 0000000..36ca2a7 --- /dev/null +++ b/server/main.go @@ -0,0 +1,1468 @@ +package main + +import ( + "categorization" + b64 "encoding/base64" + "encoding/json" + _ "expvar" + "fmt" + "github.com/facebookgo/pidfile" + "github.com/fasthttp/router" + "github.com/oschwald/geoip2-golang" + "github.com/techoner/gophp" + "github.com/valyala/fasthttp" + "handlers" + + "github.com/sirupsen/logrus" + "log" + "log/syslog" + "net" + urlparse "net/url" + "os" + "regexp" + "runtime/debug" + "shields" + "storage" + "strconv" + "strings" + "time" + "ufdbguard" +) + +var ( + addr = "127.0.0.1" + port int = 3333 + //CONN_TYPE = "tcp" + version = "1.0.11" + + strContentType = []byte("Content-Type") + strApplicationJSON = []byte("application/json") + isDebug bool = false + timeOut int = 5 + Selfsitename string + SelfSourceline string + SelfSquidUrgency bool + SelfKsrnEmergency bool + SelfEnableUfdbGuard bool + SelfExternalAclFirstRequest int + SelfTokenOutput string + SelfProtocol string + SelfVirtualUser string + SelfMac string + SelfLocalCache map[string]string + SelfmethodProto string + SelfUsername string + Selfipaddr string + SelfShieldMac string + SelfShieldipaddr string + SelfShieldUsername string + SelfVirtualUserCache map[string]string + SelfEnableStrongswanServer int + SelfEnableITChart bool + SelfWebfilterRuleName string + Selfcategory int + SelfcategoryName string + SelfWebPages []interface{} + SelfMaxItemsInMemory int + SelfprepareDataText []byte + SelfKSRNOnlyCategorization = true + SelfCacheTime int + SelfResolvedHosts map[string]bool +) + +func init() { + // create pid file + pidfile.SetPidfilePath("/var/run/go-shield-server.pid") + + err_pid := pidfile.Write() + if err_pid != nil { + panic("Could not write pid file") + } + log.SetFlags(log.LstdFlags | log.Lshortfile) + //log.SetOutput(os.Stderr) // it's default + if _slog, err := syslog.New(syslog.LOG_DEBUG, "go-shield-server"); err == nil { + log.SetOutput(_slog) + } +} + +func main() { + f, err := os.OpenFile("/var/log/go-shield/server-stack.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) + + logrus.SetOutput(f) + defer func() { + if r := recover(); r != nil { + logrus.Errorf("Panic: %v,\n%s", r, debug.Stack()) + os.Exit(1) + } + }() + isDebug = handlers.GetSocketInfoBool("Go_Shield_Server_Debug") + + categorization.DebugCategorization = isDebug + handlers.DebugHandlers = isDebug + storage.DebugStorage = isDebug + + addr = handlers.GetSocketInfoString("Go_Shield_Server_Addr") + port = handlers.GetSocketInfoInt("Go_Shield_Server_Port") + + timeOut = handlers.GetSocketInfoInt("Go_Shield_Connector_TimeOut") + SelfSquidUrgency = handlers.GetSocketInfoBool("SquidUrgency") + SelfEnableUfdbGuard = handlers.GetSocketInfoBool("EnableUfdbGuard") + SelfKsrnEmergency = handlers.GetSocketInfoBool("KSRNEmergency") + SelfExternalAclFirstRequest = handlers.GetSocketInfoInt("ExternalAclFirstRequest") + SelfEnableStrongswanServer = handlers.GetSocketInfoInt("EnableStrongswanServer") + SelfEnableITChart = handlers.GetSocketInfoBool("EnableITChart") + SelfTokenOutput = "OK" + SelfProtocol = "GET" + + SelfMaxItemsInMemory = handlers.GetSocketInfoInt("TheShieldMaxItemsInMemory") + SelfKSRNOnlyCategorization = handlers.GetSocketInfoBool("KSRNOnlyCategorization") + WebErrorPagesCompiled := handlers.GetSocketInfoString("WebErrorPagesCompiled") + SelfCacheTime = handlers.GetSocketInfoInt("TheShieldServiceCacheTime") + if SelfEnableUfdbGuard { + ufdbguard.DebugUfdbguard = isDebug + } + + if SelfEnableITChart { + //itchart.DebugITChart = isDebug + } + + shields.DebugShields = isDebug + + SelfVirtualUserCache = make(map[string]string) + if addr == "" { + addr = "127.0.0.1" + } + if port == 0 { + port = 3333 + } + if SelfCacheTime == 0 { + SelfCacheTime = 84600 + } + if timeOut == 0 { + timeOut = 5 + } + out, err := gophp.Unserialize([]byte(WebErrorPagesCompiled)) + + if err != nil { + if isDebug { + log.Printf("[BUILD_PAGE]: Loading Client Engine Web error pages failed to unserialize: ", err) + } + } + SelfWebPages = out.([]interface{}) + + log.Printf("Starting Go Shield Server => addr=%s port=%d debug=%t ", addr, port, isDebug) + + /*TCP*/ + //l, err := net.Listen(CONN_TYPE, addr+":"+port) + //if err != nil { + // log.Printf("Error listening:", err.Error()) + // os.Exit(1) + //} + //// Close the listener when the application closes. + //defer l.Close() + //log.Printf("Listening on " + addr + ":" + port) + /*FASTHTTP*/ + //log.Printf("Try connect to ListenAndServe: %s %d", addr, port) + //h := requestHandler + //h = fasthttp.CompressHandler(h) + r := router.New() + r.GET("/get-categories/{website}", getCategories) + r.GET("/get-version", getVersion) + r.GET("/category/{website}/{ids}", category) + r.GET("/geo/{source-ip}/{iso-code}", geo) + r.GET("/db/stats", dbStats) + r.GET("/db/flush", dbFlush) + r.GET("/db/capacity", dbCapacity) + r.GET("/db/len", dbLen) + r.GET("/external-acl-first/{line}", processRequest) + if err := fasthttp.ListenAndServe(addr+":"+strconv.Itoa(port), r.Handler); err != nil { + log.Fatalf("Error in ListenAndServe: %s", err) + } +} + +/*FASTHTTP*/ +func getVersion(ctx *fasthttp.RequestCtx) { + ctx.Response.Header.SetCanonical(strContentType, strApplicationJSON) + ctx.Response.SetStatusCode(200) + response := map[string]string{"version": version} + if err := json.NewEncoder(ctx).Encode(response); err != nil { + log.Fatal(err) + } +} + +func getCategories(ctx *fasthttp.RequestCtx) { + catid, catname := categorization.GetCategories(ctx.UserValue("website").(string)) + ctx.Response.Header.SetCanonical(strContentType, strApplicationJSON) + ctx.Response.SetStatusCode(200) + response := map[string]string{"category_id": strconv.Itoa(catid), "category_name": catname} + if err := json.NewEncoder(ctx).Encode(response); err != nil { + log.Fatal(err) + } +} + +func category(ctx *fasthttp.RequestCtx) { + catid, _ := categorization.GetCategories(ctx.UserValue("website").(string)) + //ctx.Response.Header.SetCanonical(strContentType, strApplicationJSON) + ctx.Response.SetStatusCode(200) + if catid == 0 { + ctx.WriteString("FALSE") + } + split := strings.Split(ctx.UserValue("ids").(string), "-") + results := false + for _, line := range split { + matches, _ := strconv.Atoi(line) + if catid == matches { + results = true + ctx.WriteString("TRUE") + break + + } + } + if !results { + ctx.WriteString("FALSE") + + } +} +func dbStats(ctx *fasthttp.RequestCtx) { + ctx.Response.SetStatusCode(200) + ctx.Response.Header.SetCanonical(strContentType, strApplicationJSON) + stats, _ := json.Marshal(storage.InMemoryCache.Stats()) + ctx.Write(stats) + // defer conn.Close() + // stats, _ := json.Marshal(InMemoryCache.Stats()) + // conn.Write(stats) +} + +func dbFlush(ctx *fasthttp.RequestCtx) { + ctx.Response.SetStatusCode(200) + storage.InMemoryCache.Reset() + ctx.WriteString("OK") + +} + +func dbLen(ctx *fasthttp.RequestCtx) { + ctx.Response.SetStatusCode(200) + ctx.Response.Header.SetCanonical(strContentType, strApplicationJSON) + stats, _ := json.Marshal(storage.InMemoryCache.Len()) + ctx.Write(stats) + // defer conn.Close() + // stats, _ := json.Marshal(InMemoryCache.Stats()) + // conn.Write(stats) +} + +func dbCapacity(ctx *fasthttp.RequestCtx) { + ctx.Response.SetStatusCode(200) + ctx.Response.Header.SetCanonical(strContentType, strApplicationJSON) + stats, _ := json.Marshal(storage.InMemoryCache.Capacity()) + ctx.Write(stats) + // defer conn.Close() + // stats, _ := json.Marshal(InMemoryCache.Stats()) + // conn.Write(stats) +} + +func geo(ctx *fasthttp.RequestCtx) { + ctx.Response.SetStatusCode(200) + db, err := geoip2.Open("/usr/local/share/GeoIP/GeoLite2-City.mmdb") + if err != nil { + ctx.WriteString(err.Error()) + return + } + defer db.Close() + // If you are using strings that may be invalid, check that ip is not nil + ip := net.ParseIP(ctx.UserValue("source-ip").(string)) + record, err := db.City(ip) + if err != nil { + ctx.WriteString(err.Error()) + return + } + + //ctx.Response.Header.SetCanonical(strContentType, strApplicationJSON) + + split := strings.Split(ctx.UserValue("iso-code").(string), "-") + results := false + for _, line := range split { + if line == record.Country.IsoCode { + results = true + ctx.WriteString("TRUE") + break + + } + } + if !results { + ctx.WriteString("FALSE") + + } +} + +func processRequest(ctx *fasthttp.RequestCtx) { + //f, err := os.OpenFile("/var/log/go-shield/server-stack.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) + // + //logrus.SetOutput(f) + defer func() { + if r := recover(); r != nil { + log.Printf("Panic: %v,\n%s", r, debug.Stack()) + os.Exit(1) + } + }() + start := time.Now() + request := ctx.UserValue("line").(string) + + decode, _ := b64.URLEncoding.DecodeString(request) + line := string(decode) + Selfsitename = "" + SelfSourceline = line + lparts := strings.Split(strings.TrimRight(line, "\n"), " ") + id := lparts[0] + if isDebug { + log.Printf("Receive <%s>", line) + } + if strings.Index(line, "webfilter:%20pass") > 10 { + if isDebug { + log.Printf("WEBFILTER = PASS") + } + ctx.Response.SetStatusCode(200) + ctx.WriteString(id + " OK\n") + return + } + if strings.Index(line, "/squid-internal-dynamic/") > 10 { + if isDebug { + log.Printf("INTERNAL-DYNAMIC = PASS") + } + ctx.Response.SetStatusCode(200) + ctx.WriteString(id + " OK\n") + return + } + if strings.Index(line, "/squid-internal-mgr/") > 10 { + if isDebug { + log.Printf("INTERNAL-DYNAMIC = PASS") + } + ctx.Response.SetStatusCode(200) + ctx.WriteString(id + " OK\n") + return + } + if strings.Index(line, "cache_object:/") > 0 { + if isDebug { + log.Printf("INTERNAL-DYNAMIC = PASS") + } + ctx.Response.SetStatusCode(200) + ctx.WriteString(id + " OK\n") + return + } + SelfTokenOutput = "OK" + parseArray := parseLine(line) + if len(parseArray) == 0 { + if isDebug { + log.Printf("Error parseLine array exception, arry is empty ") + } + ctx.Response.SetStatusCode(200) + ctx.WriteString(fmt.Sprintf("%s OK %s first=ERROR\n", id, SelfTokenOutput)) + return + } + logPrefix := "" + //CountOfRows := len(parseArray) + aclType, _ := strconv.Atoi(parseArray["acl"]) + if aclType == 1 { + SelfTokenOutput = "OK" + } + var tokens []string + //Sni := "" + //UserCert := "" + //categoryOrder := true + //tokenscategoryAdded := false + //Rblpass := false + categoryName := "" + category := 0 + method := "GET" + choose := "" + url := "" + results := "" + var blockit bool + var white bool + _ = white + //SaveCache := false + var action string + SelfVirtualUser = "" + var countryCode string + var itChart string + _ = itChart + var itChartInfo string + var errorMsg string + _ = itChartInfo + SelfMac = "" + xForward := "" + sitename := "" + clientHostname := "" + //ITChartInfo := "" + //CacheMessage := "MISS" + var cachedService int + _ = cachedService + proxyPort := 3128 + proxyIP := "127.0.0.1" + var logQuery []string + countOfInternalCache := len(SelfLocalCache) + logQuery = append(logQuery, "Items in array: "+strconv.Itoa(countOfInternalCache)) + //WebfilteringFound := false + //WebfilteringChecked := false + asACL := 0 + askToShields := true //Todo Set askToShields + modeBack := false + SelfmethodProto = "" + SelfUsername = parseArray["username"] + ipaddr := parseArray["ipaddr"] + if _, ok := parseArray["mac"]; ok { + SelfMac = parseArray["mac"] + } + if _, ok := parseArray["forwardedfor"]; ok { + xForward = parseArray["forwardedfor"] + } + //if _, ok := parseArray["sni"]; ok { + // Sni = parseArray["sni"] + //} + if _, ok := parseArray["hostname"]; ok { + clientHostname = parseArray["hostname"] + } + if _, ok := parseArray["domain"]; ok { + sitename = parseArray["domain"] + } + if _, ok := parseArray["acl"]; ok { + asACL, _ = strconv.Atoi(parseArray["acl"]) + } + if _, ok := parseArray["proto"]; ok { + method = parseArray["proto"] + } + url = parseArray["url"] + proxyPort, _ = strconv.Atoi(parseArray["myport"]) + proxyIP = parseArray["myip"] + if len(sitename) == 0 { + if len(url) > 0 { + sitename = url + } + } + u, _ := urlparse.Parse(sitename) + sitename = u.Host + if len(sitename) == 0 { + sitename = u.Path + } + if sitename[0:4] == "www." { + sitename = sitename[4:] + } + sitename = strings.ToLower(sitename) + + proxyUrl := url + //Sourceurl := url + //urlDomain := sitename + clientIp := ipaddr + Selfipaddr = ipaddr + clientMac := SelfMac + SelfVirtualUser = virtualUsers() + + Selfsitename = sitename + SelfmethodProto = method + if SelfMac == "00:00:00:00:00:00" { + SelfMac = "" + } + logPrefix = fmt.Sprintf("%s %s %s %s %s", sitename, method, SelfMac, Selfipaddr, SelfUsername) + logQuery = append(logQuery, logPrefix) + shields.SelfShieldIpaddr = Selfipaddr + shields.SelfShieldMac = SelfMac + shields.SelfShieldUsername = SelfUsername + log.Printf("Executing shields.CountUsers()") + shields.CountUsers() + if len(SelfVirtualUser) > 0 { + SelfUsername = SelfVirtualUser + } + if xForward == "-" { + xForward = "" + } + if len(xForward) > 0 { + ipaddr = xForward + } + //TODO check if make sense + //if len(SelfUsername) < 3 { + // if len(UserCert) > 2 { + // SelfUsername = UserCert + // } + //} + if Selfsitename == "127.0.0.1" { + ctx.Response.SetStatusCode(200) + ctx.WriteString(fmt.Sprintf("%s OK %s first=NONE\n", id, SelfTokenOutput)) + return + } + if SelfSquidUrgency { + if isDebug { + log.Printf("WARNING... Emergency Enabled") + } + ctx.Response.SetStatusCode(200) + ctx.WriteString(fmt.Sprintf("%s OK %s first=EMERGENCY webfilter=pass\n", id, SelfTokenOutput)) + + return + } + if asACL == 0 { + modeBack = true + askToShields = false + } + + if modeBack { + if isDebug { + log.Printf("%s [DEBUG]: [BACK_MODE] Web-Filtering:%t | ItCharter:%t", Selfsitename, SelfEnableUfdbGuard, SelfEnableITChart) + } + if strings.Index(SelfSourceline, "shieldsblock:%20yes") > 10 { + SelfWebfilterRuleName = strconv.Itoa(0) + Selfcategory = 999999999 + SelfcategoryName = "theshields" + re := regexp.MustCompile("cinfo:([0-9]+)-(.+?);") + matches := re.MatchString(SelfSourceline) + rs := re.FindStringSubmatch(SelfSourceline) + if matches { + Selfcategory, _ = strconv.Atoi(rs[1]) + SelfcategoryName = rs[2] + } + redirect := buildErrorPage() + ctx.Response.SetStatusCode(200) + ctx.WriteString(fmt.Sprintf("%s OK %s %s\n", id, SelfTokenOutput, redirect)) + return + } + if SelfEnableUfdbGuard { + ufdbGuardClientLine := ufdbGuardClient(id, line, proxyUrl, Selfsitename, clientIp, clientHostname, clientMac, proxyIP, proxyPort) + //WebfilteringChecked = true + if isDebug { + log.Printf("%s [DEBUG] return <%s>", Selfsitename, ufdbGuardClientLine) + } + if len(ufdbGuardClientLine) > 0 { + log.Printf("%s [DEBUG] return <%s>", Selfsitename, ufdbGuardClientLine) + ctx.Response.SetStatusCode(200) + ctx.WriteString(ufdbGuardClientLine) + return + } + tokens = append(tokens, "webfilter=pass") + } + //if SelfEnableITChart { + // if isDebug { + // log.Printf("%s [DEBUG][ITCHART] Ask to itchart_client()", Selfsitename) + // } + // itChartLine := itChartClient(id) + // if len(itChartLine) > 0 { + // if isDebug { + // log.Printf("%s [DEBUG][ITCHART] return <%s>", Selfsitename, itChartLine) + // } + // ctx.Response.SetStatusCode(200) + // ctx.WriteString(itChartLine) + // return + // } + // tokens = append(tokens, "itchart=PASS") + //} + } + if isWhitelist(Selfsitename, SelfMac, Selfipaddr) { + if isDebug { + log.Printf("%s: %s[%s] WHITELISTED", Selfsitename, Selfipaddr, SelfMac) + } + category, categoryName = categorization.GetCategories(Selfsitename) + tokens = append(tokens, fmt.Sprintf("category=%d category-name=%s clog=cinfo:%d-%s; ", category, categoryName, category, categoryName)) + tokens = append(tokens, "srn=WHITE rblpass=yes webfilter=pass") + SelfTokenOutput = strings.Join(tokens, " ") + ctx.Response.SetStatusCode(200) + ctx.WriteString(fmt.Sprintf("%s OK %s \n", id, SelfTokenOutput)) + return + } + if isBlacklisted(Selfsitename) { + if isDebug { + log.Printf("%s: %s[%s] BLACKLISTED", Selfsitename, Selfipaddr, SelfMac) + } + category, categoryName = categorization.GetCategories(Selfsitename) + tokens = append(tokens, fmt.Sprintf("category=%d category-name=%s clog=cinfo:%d-%s; ", category, categoryName, category, categoryName)) + tokens = append(tokens, "srn=BLACK shieldsblock=yes") + SelfTokenOutput = strings.Join(tokens, " ") + ctx.Response.SetStatusCode(200) + ctx.WriteString(fmt.Sprintf("%s OK %s \n", id, SelfTokenOutput)) + return + } + choose = findKeyAccount() + prepareData := make(map[string]string) + prepareData["ACTION"] = "THESHIELDS" + prepareData["choose"] = choose + prepareData["USERNAME"] = SelfUsername + prepareData["ipaddr"] = ipaddr + prepareData["mac"] = SelfMac + prepareData["sitename"] = Selfsitename + prepareData["method"] = method + prepareData["LOG_QUERY"] = "0" + if SelfExternalAclFirstRequest == 1 { + logQuery = append(logQuery, "Log-query: Yes") + prepareData["LOG_QUERY"] = "1" + } + //TODO Check if make sense to keep + //SelfprepareDataText, _ = gophp.Serialize(prepareData) + //TODO Check if make sense to keep smd5 + smd5 := storage.ShieldsFullCache(SelfUsername, ipaddr, SelfMac, Selfsitename, method) + if _, ok := SelfLocalCache[smd5]; ok { + if isDebug { + log.Printf("%s: HIT [%s] Client-array", Selfsitename, smd5) + } + results = SelfLocalCache[smd5] + } + + if results == "" { + if value, _ := storage.Fetch(smd5); value != nil { + results = string(*value) + if results != "" { + if isDebug { + log.Printf("%s HIT [%s] Client-memcache", Selfsitename, smd5) + } + SelfLocalCache[smd5] = results + } + } + } + if results != "" { + askToShields = false + logQuery = append(logQuery, "Client sock time: -") + } + log.Printf("RESULTS ARE %s and TOKEN IS %t", results, SelfKSRNOnlyCategorization) + if results == "" { + if isDebug { + log.Printf("%s MISS ARRAY [%v] KSRNOnlyCategorization=%t", Selfsitename, smd5, SelfKSRNOnlyCategorization) + } + if SelfKSRNOnlyCategorization { + if len(SelfUsername) < 2 { + if len(SelfVirtualUser) > 0 { + SelfUsername = SelfVirtualUser + choose = findKeyAccount() + } + } + if len(SelfUsername) > 1 { + tokens = append(tokens, fmt.Sprintf("user=%s", urlparse.QueryEscape(SelfUsername))) + } + category, categoryName = categorization.GetCategories(sitename) + tokens = append(tokens, fmt.Sprintf("category=%d category-name=%s clog=cinfo:%d-%s; ", category, categoryName, category, categoryName)) + + SelfTokenOutput = strings.Join(tokens, " ") + elapsed := time.Since(start).Microseconds() + log.Printf("FINISH PARSING - took %d μs", elapsed) + ctx.Response.SetStatusCode(200) + ctx.WriteString(fmt.Sprintf("%s OK %s\n", id, SelfTokenOutput)) + return + } + } + if isDebug { + log.Printf("[DEBUG]:ASK_TO_SHIELDS [%t] MODE_BACK [%t]", askToShields, modeBack) + } + if askToShields { + results = processTheShields() + } + if len(results) < 5 { + if isDebug { + log.Printf("%s ERROR LEN ARRAY", logPrefix) + } + ctx.Response.SetStatusCode(200) + ctx.WriteString(fmt.Sprintf("%s OK %s first=ERROR\n", id, SelfTokenOutput)) + return + } + //TODO check SaveCache + if isDebug { + log.Printf("%s [DEBUG]: Receive [%s]", sitename, results) + } + out, err := gophp.Unserialize([]byte(results)) + if err != nil { + if isDebug { + log.Printf("%s: [ERROR]: Unserialize error", sitename) + } + ctx.Response.SetStatusCode(200) + ctx.WriteString(fmt.Sprintf("%s OK %s first=ERROR\n", id, SelfTokenOutput)) + return + } + + resultsArray := out.(map[string]interface{}) + if resultsArray["error"] != nil { + errorMsg = resultsArray["error"].(string) + } + + if category == 0 { + category = resultsArray["categoy_id"].(int) + } + if len(categoryName) == 0 { + if resultsArray["categoy_name"] != nil { + categoryName = resultsArray["categoy_name"].(string) + } + } + if resultsArray["ACTION"] != nil { + action = resultsArray["ACTION"].(string) + } + if resultsArray["VIRTUAL_USER"] != nil { + SelfVirtualUser = resultsArray["VIRTUAL_USER"].(string) + } + if resultsArray["COUNTRY_CODE"] != nil { + countryCode = resultsArray["COUNTRY_CODE"].(string) + } + + if _, ok := resultsArray["ITCHART"]; ok { + itChart = resultsArray["ITCHART"].(string) + } + if _, ok := resultsArray["ITCHART_INFO"]; ok { + itChartInfo = resultsArray["ITCHART_INFO"].(string) + } + if _, ok := resultsArray["CACHED_SERVICE"]; ok { + cachedService = resultsArray["CACHED_SERVICE"].(int) + } + + if _, ok := resultsArray["CACHED_TIME"]; ok { + logQuery = append(logQuery, fmt.Sprintf("Service cached time: %d", resultsArray["CACHED_TIME"].(int))) + } + if _, ok := resultsArray["SHIELD_TIMES"]; ok { + logQuery = append(logQuery, fmt.Sprintf("Time details: %d", resultsArray["SHIELD_TIMES"].(int))) + } + if _, ok := resultsArray["SHIELD_DURATION"]; ok { + logQuery = append(logQuery, fmt.Sprintf("The Shield duration: %d", resultsArray["SHIELD_DURATION"].(int))) + } + if _, ok := resultsArray["TOTAL_DURATION"]; ok { + logQuery = append(logQuery, fmt.Sprintf("The Shield Total: %d", resultsArray["TOTAL_DURATION"].(int))) + } + + if action == "WHITELIST" { + tokens = append(tokens, "srn=WHITE rblpass=yes") + white = true + } + blockit = true + if isDebug { + log.Printf("%s The Shield, Answering [ -%s- ] [%s]", sitename, errorMsg, action) + } + if action == "WHITELIST" { + tokens = append(tokens, "srn=WHITE rblpass=yes") + blockit = false + } + if action == "PASS" { + tokens = append(tokens, "srn=PASS") + blockit = false + } + if action == "WHITE" { + tokens = append(tokens, "srn=WHITE rblpass=yes") + blockit = false + } + if len(action) == 0 { + if isDebug { + log.Printf("%s The Shield, ERROR OCCURED NO ACTION %s %s", sitename, errorMsg, action) + } + tokens = append(tokens, "srn=ERROR") + blockit = false + } + if blockit { + if isDebug { + log.Printf("%s The Shield, BLOCK [ -%s- ] [%s]", sitename, errorMsg, action) + } + tokens = append(tokens, "shieldsblock=yes") + tokens = append(tokens, fmt.Sprintf("TheShields:%s", action)) + Selfcategory = category + } + if category > 0 { + categoryName = strings.Replace(categoryName, " ", "_", -1) + categoryName = strings.Replace(categoryName, "/", "_", -1) + tokens = append(tokens, fmt.Sprintf("category=%d category-name=%s clog=cinfo:%d-%s;", category, categoryName, category, categoryName)) + logQuery = append(logQuery, fmt.Sprintf("Category: %s", categoryName)) + } else { + tokens = append(tokens, "category=0 category-name=Unknown clog=cinfo:0-unknown;") + logQuery = append(logQuery, "Category: Unknown") + } + if isDebug { + log.Printf("[DEBUG]: [%s]:", sitename) + } + if len(SelfUsername) < 2 { + if SelfVirtualUser == "" { + SelfVirtualUser = "" + } + if len(SelfVirtualUser) > 0 { + SelfUsername = SelfVirtualUser + choose = findKeyAccount() + } + } + if len(SelfUsername) > 1 { + tokens = append(tokens, fmt.Sprintf("user=%s", urlparse.QueryEscape(SelfUsername))) + } + if len(countryCode) > 0 { + tokens = append(tokens, fmt.Sprintf("fromgeo=%s", countryCode)) + } + if blockit { + SelfTokenOutput = strings.Join(tokens, ", ") + if isDebug { + log.Printf("%s: [DEBUG]: [DENIED]: FINAL[%s] (processing %s)", sitename, SelfTokenOutput, handlers.TimeTrack(start)) + } + ctx.Response.SetStatusCode(200) + ctx.WriteString(fmt.Sprintf("%s OK %s\n", id, SelfTokenOutput)) + return + } + if isDebug { + log.Printf("[DEBUG]: [%s]: self.TOKEN_OUPUT [%s]", sitename, SelfTokenOutput) + } + SelfTokenOutput = strings.Join(tokens, ", ") + if isDebug { + log.Printf("%s: [DEBUG] FINAL[%s] (processing %s)", sitename, SelfTokenOutput, handlers.TimeTrack(start)) + } + ctx.Response.SetStatusCode(200) + ctx.WriteString(fmt.Sprintf("%s OK %s\n", id, SelfTokenOutput)) + return + //ctx.Response.SetStatusCode(200) + //ctx.WriteString(id + " OK first=ERROR\n") + + ////OLD OLD OLD //// + +} + +//func itChartClient(id string) string { +// if !SelfEnableITChart { +// if isDebug { +// log.Printf("%s: [DEBUG][ITCHART] return NONE", Selfsitename) +// } +// +// return "" +// } +// itChartRedirectURL := handlers.GetSocketInfoString("ITChartRedirectURL") +// if len(itChartRedirectURL) == 0 { +// if isDebug { +// log.Printf("%s: [DEBUG][ITCHART] return NONE", Selfsitename) +// log.Printf("[ERROR]: Redirect URL is not set, please add the redirect URL in configuration") +// } +// return "" +// } +// itChartRedirectURLArray := handlers.GetSocketInfoString("ITChartRedirectURLArray") +// if len(itChartRedirectURLArray) == 0 { +// if isDebug { +// log.Printf("%s: [DEBUG][ITCHART] return NONE", Selfsitename) +// log.Printf("[ERROR]: Redirect URL Array is not set, please add the redirect URL in configuration") +// } +// return "" +// } +// if isDebug { +// log.Printf("%s [ITCHART]: %s %s %s %s", Selfsitename, Selfipaddr, SelfMac, SelfUsername, SelfProtocol) +// } +// //TODO Check if make sense keep unserialzation +// if !itchart.ChartThis(Selfipaddr, SelfMac, SelfUsername, SelfProtocol, Selfsitename) { +// if isDebug { +// log.Printf("%s: [DEBUG][ITCHART] return NONE", Selfsitename) +// } +// return "" +// } +// var proto []string +// proto = append(proto, fmt.Sprintf("%d OK status=302", id)) +// proto = append(proto, fmt.Sprintf("url=%s?Token=%s", itChartRedirectURL, itchart.SelfITChartMessage)) +// proto = append(proto, "itchart=ASK\n") +// return strings.Join(proto, " ") +// +//} + +func processTheShields() string { + SelfResolvedHosts = make(map[string]bool) + actionPass := []string{"WHITELIST", "PASS", "WHITE", "ERROR"} + if isDebug { + log.Printf("%s: [DEBUG]: [THE_SHIELD] Ask To the shield", Selfsitename) + } + category := 0 + var categoryName string + var host string + action := "PASS" + ksrnPorn := shields.SelfKsrnPorn + disableAdvert := shields.SelfDisableAdvert + HatredAndDiscrimination := shields.SelfHatredAndDiscrimination + category, categoryName = categorization.GetCategories(Selfsitename) + if category > 0 { + if isDebug { + log.Printf("%s: [DEBUG]: [THE_SHIELD] Fix category answering [%d]", Selfsitename, category) + } + badCatz := []int{6, 7, 10, 72, 92, 105, 111, 135, 132, 109, 5, 143} + hatred := []int{130, 148, 149, 150, 140} + sPorn := []int{109, 132} + advert := []int{5, 143} + SelfResolvedHosts[Selfsitename] = true + + for _, val := range sPorn { // Loop + if val == category { + if ksrnPorn { + action = "ARTICA" + } + break + } + } + for _, val := range advert { // Loop + if val == category { + if !disableAdvert { + action = "ARTICA" + } + break + } + } + for _, val := range hatred { // Loop + if val == category { + if HatredAndDiscrimination { + action = "ARTICA" + } + break + } + } + for _, val := range badCatz { // Loop + if val == category { + action = "ARTICA" + break + } + } + if isDebug { + log.Printf("%s: [DEBUG]: [THE_SHIELD] Shield result Scanner=%s", Selfsitename, action) + } + } + if _, ok := SelfResolvedHosts[Selfsitename]; ok { + // the key 'elliot' exists within the map + if SelfResolvedHosts[Selfsitename] { + host = "1" + } + if !SelfResolvedHosts[Selfsitename] { + if isDebug { + log.Printf("%s: [ERROR]: Unable to resolv host", Selfsitename) + } + if category == 0 { + category = 112 + categoryName = categorization.CategoryIntToString(112) + } + resultsArray := make(map[string]interface{}) + resultsArray["error"] = "UNKNOWN_HOST" + resultsArray["categoy_id"] = category + resultsArray["categoy_name"] = categoryName + resultsArray["ACTION"] = "PASS" + resultsArray["TOTAL_DURATION"] = 0 + resultsArray["VIRTUAL_USER"] = SelfVirtualUser + resultsArray["COUNTRY_CODE"] = "" + resultsArray["HOSTIP"] = "" + Selfcategory = category + SelfcategoryName = categoryName + results, _ := gophp.Serialize(resultsArray) + return string(results) + } + } + + if host == "" { + host = shields.GetHost(Selfsitename) + if isDebug { + log.Printf("%s: [DEBUG]: [THE_SHIELD] IP:<%s>", Selfsitename, host) + } + } + if host == "" { + SelfResolvedHosts[Selfsitename] = false + if isDebug { + log.Printf("%s: [ERROR]: Unable to resolv host", Selfsitename) + } + if category == 0 { + category = 112 + categoryName = categorization.CategoryIntToString(112) + } + resultsArray := make(map[string]interface{}) + resultsArray["error"] = "UNKNOWN_HOST" + resultsArray["categoy_id"] = category + resultsArray["categoy_name"] = categoryName + resultsArray["ACTION"] = "PASS" + resultsArray["TOTAL_DURATION"] = 0 + resultsArray["VIRTUAL_USER"] = SelfVirtualUser + resultsArray["COUNTRY_CODE"] = "" + resultsArray["HOSTIP"] = "" + Selfcategory = category + SelfcategoryName = categoryName + results, _ := gophp.Serialize(resultsArray) + return string(results) + } + SelfResolvedHosts[Selfsitename] = true + if len(SelfResolvedHosts) > 5000 { + SelfResolvedHosts = make(map[string]bool) + } + shields.SelfShieldIpaddr = Selfipaddr + shields.SelfShieldUsername = SelfUsername + shields.SelfShieldMac = SelfMac + log.Printf("SHILDS OPERATE CAT %d", category) + if category == 0 { + log.Printf("SHILDS OPERATE") + shields.Operate(Selfsitename) + category = shields.SelfCategory + action = shields.SelfAction + categoryName = categorization.CategoryIntToString(category) + } + resultsArray := make(map[string]interface{}) + resultsArray["error"] = shields.SelfError + resultsArray["categoy_id"] = category + resultsArray["categoy_name"] = categoryName + resultsArray["ACTION"] = action + resultsArray["TOTAL_DURATION"] = 0 + resultsArray["VIRTUAL_USER"] = SelfVirtualUser + resultsArray["COUNTRY_CODE"] = "" + resultsArray["HOSTIP"] = host + Selfcategory = category + if isDebug { + log.Printf("%s: [DEBUG]: [LOCAL] ACTION=%s ERROR=%s", Selfsitename, action, shields.SelfError) + } + SelfcategoryName = categoryName + for _, val := range actionPass { // Loop + if val != action { + go shields.WriteStats(category, Selfsitename, action, 0) + if isDebug { + log.Printf("[THREAT_DETECTED]: site=%s addr=%s self.USERNAME=%s mac=%s category=%d/%s scanner=%s", Selfsitename, Selfipaddr, SelfUsername, SelfMac, category, categoryName, action) + } + //break + } + } + if isDebug { + log.Printf("Serializeing Results") + } + results, _ := gophp.Serialize(resultsArray) + if isDebug { + log.Printf("[SHIELDS RETURN]: results=%s", results) + } + return string(results) + +} + +func findKeyAccount() string { + if SelfUsername == "-" { + SelfUsername = "" + } + if Selfipaddr == "-" { + Selfipaddr = "" + } + if Selfipaddr == "127.0.0.1" { + Selfipaddr = "" + } + if SelfMac == "-" { + SelfMac = "" + } + if SelfMac == "00:00:00:00:00:00" { + SelfMac = "" + } + if len(SelfUsername) > 3 { + return SelfUsername + } + if len(SelfMac) > 3 { + return SelfMac + } + if len(Selfipaddr) > 3 { + return Selfipaddr + } + return "" +} + +func isBlacklisted(sitename string) bool { + if len(sitename) < 3 { + return false + } + if categorization.AdminBlacklist(sitename, true) { + return true + } + return false +} + +func isWhitelist(sitename string, mac string, ipaddr string) bool { + if sitename == "" { + return false + } + if mac == "" { + return false + } + if ipaddr == "" { + return false + } + if len(sitename) > 3 { + scache := fmt.Sprintf("DOMWHITE:%s", sitename) + sf := getCacheItem(scache) + if sf != "" { + return true + } + if categorization.AdminWhitelist(sitename, true) { + saveCachedItem(scache, "1") + return true + } + } + if len(mac) > 3 { + if categorization.AdminWhitelistMac(mac) { + return true + } + } + if len(ipaddr) > 3 { + if categorization.AdminWhitelistSrc(ipaddr) { + return true + } + } + return false +} + +func saveCachedItem(smd5 string, sValue string) bool { + smd5 = fmt.Sprintf("SHIELD.serv.%s", smd5) + SelfLocalCache[smd5] = sValue + if len(SelfLocalCache) > SelfMaxItemsInMemory { + SelfLocalCache = map[string]string{} + } + storage.Append(smd5, sValue) + return true + +} + +func getCacheItem(md5 string) string { + //TODO Check if LocalCache Array is correct + if _, ok := SelfLocalCache[md5]; ok { + return SelfLocalCache[md5] + } + md5 = fmt.Sprintf("SHIELD.serv.%s", md5) + + if val, err := storage.Fetch(md5); val != nil { + if len(*val) < 5 { + return "" + } + return *val + + } else { + if isDebug { + log.Printf("Error Getting MD5 from memcache: %s", err) + } + //panic(err) + } + return "" +} + +func buildErrorPage() string { + //ufdb := &ufdbguard.UFDBDefaultVars{} + var tokens []string + sitename := Selfsitename + category := 0 + categoryName := "" + ruleID := 0 + protocol := SelfProtocol + http := "http" + var protocolID int + if SelfEnableUfdbGuard { + category = Selfcategory + categoryName = SelfcategoryName + } + ruleID = ufdbguard.SelfRuleID + + if category == 0 { + re := regexp.MustCompile("cinfo:([0-9]+)-(.+?);") + matches := re.MatchString(SelfSourceline) + rs := re.FindStringSubmatch(SelfSourceline) + if matches { + Selfcategory, _ = strconv.Atoi(rs[1]) + SelfcategoryName = rs[2] + } + } + + if protocol == "CONNECT" { + protocolID = 1 + http = "https" + } + if protocol == "GET" { + protocolID = 2 + } + if protocol == "POST" { + protocolID = 3 + } + + srcUrl := urlparse.QueryEscape(fmt.Sprintf("%s://%s", http, Selfsitename)) + parameters := fmt.Sprintf("rule-id=%d&clientaddr=%s&clientname=%s&clientgroup=%s&targetgroup=%d&url=%s", ruleID, Selfipaddr, SelfUsername, SelfWebfilterRuleName, category, srcUrl) + lenOfRules := len(SelfWebPages) + finalredirectCode := 302 + finalredirectType := 0 + finalredirectKey := "url" + finalredirecturl := "http://articatech.net/block.html" + var ufdbgParameters string + if SelfEnableUfdbGuard { + ufdbgParameters = ufdbguard.SelfFinalRedirectUrl + } + if isDebug { + log.Printf("%s [DEBUG]: [BUILD_PAGE] final parameters <%s>", sitename, ufdbgParameters) + } + matched := false + parsed := "" + if lenOfRules > 0 { + for _, data := range SelfWebPages { + + for k, v := range data.(map[string]interface{}) { + + rCategory := 0 + rRuleID := 0 + rRedirectType := 0 + rUrl := "" + rParsed := "" + rProto := 0 + if k == "category" { + rCategory = v.(int) + } + if k == "ruleid" { + rRuleID = v.(int) + } + if k == "redirtype" { + rRedirectType = v.(int) + } + if k == "PARSED" { + if v.(map[string]interface{})["path"] == nil { + rParsed = "" + } else { + rParsed = v.(map[string]interface{})["path"].(string) + } + + } + if k == "url" { + rUrl = v.(string) + } + if k == "protocol" { + rProto = v.(int) + } + if isDebug { + var slogs []string + slogs = append(slogs, fmt.Sprintf("Rule[%d]/%d", rRuleID, ruleID)) + slogs = append(slogs, fmt.Sprintf("protocol[%d]/%d", rProto, protocolID)) + slogs = append(slogs, fmt.Sprintf("category[%d]/%d", rCategory, category)) + slogs = append(slogs, fmt.Sprintf("redirect[%s] type[%d]", rUrl, rRedirectType)) + SlogsText := strings.Join(slogs, ", ") + log.Printf("%s [BUILD_PAGE]: index:%s must match %s", sitename, k, SlogsText) + } + if rRuleID == 0 { + if rCategory == 0 { + if rProto == 0 { + if isDebug { + log.Printf("%s [BUILD_PAGE]: !MATCHES! Detected url <%s>", sitename, rUrl) + } + finalredirecturl = rUrl + finalredirectType = rRedirectType + parsed = rParsed + matched = true + break + } + if rProto == protocolID { + if isDebug { + log.Printf("%s [BUILD_PAGE]: !MATCHES! Detected url <%s>", sitename, rUrl) + } + finalredirecturl = rUrl + finalredirectType = rRedirectType + parsed = rParsed + matched = true + break + } + } + } + if rRuleID == ruleID { + if rCategory == 0 { + if rProto == 0 { + if isDebug { + log.Printf("%s [BUILD_PAGE]: !MATCHES! Detected url <%s>", sitename, rUrl) + } + finalredirecturl = rUrl + finalredirectType = rRedirectType + parsed = rParsed + matched = true + break + } + if rProto == protocolID { + if isDebug { + log.Printf("%s [BUILD_PAGE]: !MATCHES! Detected url <%s>", sitename, rUrl) + } + finalredirecturl = rUrl + finalredirectType = rRedirectType + parsed = rParsed + matched = true + break + } + } + if rCategory == category { + if rProto == 0 { + if isDebug { + log.Printf("%s [BUILD_PAGE]: !MATCHES! Detected url <%s>", sitename, rUrl) + } + finalredirecturl = rUrl + finalredirectType = rRedirectType + parsed = rParsed + matched = true + break + } + if rProto == protocolID { + if isDebug { + log.Printf("%s [BUILD_PAGE]: !MATCHES! Detected url <%s>", sitename, rUrl) + } + finalredirecturl = rUrl + finalredirectType = rRedirectType + parsed = rParsed + matched = true + break + } + } + } else { + if isDebug { + log.Printf("%s [BUILD_PAGE]: False for %d is not %d", sitename, rRuleID, ruleID) + } + } + } + } + } + if isDebug { + log.Printf("parsed (%s)", parsed) + if !matched { + log.Printf("%s [BUILD_PAGE]: NO_MATCHES!! rule[%d] category[%d] Proto[%d] (%s)", sitename, ruleID, category, protocolID, protocol) + } + } + if finalredirectType == 0 { + finalredirectCode = 302 + } + if finalredirectType == 1 { + finalredirectCode = 301 + } + re := regexp.MustCompile("^(http|https:)") + matches := re.MatchString(finalredirecturl) + if matches { + finalredirecturl = fmt.Sprintf("%s?%s", finalredirecturl, parameters) + } + tmpStr := fmt.Sprintf("status=%d %s=%s", finalredirectCode, finalredirectKey, finalredirecturl) + if finalredirectType == 2 { + tmpStr = fmt.Sprintf("rewrite-url=%s", finalredirecturl) + } + if finalredirectType == 2 { + tmpStr = fmt.Sprintf("status=%d %s=%s", 302, "url", "http://artica.me") + } + if len(tmpStr) > 3 { + tokens = append(tokens, tmpStr) + } + tokens = append(tokens, fmt.Sprintf("category=%d category-name=%s clog=cinfo:%d-%s;", category, categoryName, category, categoryName)) + if SelfEnableUfdbGuard { + tokens = append(tokens, ufdbguard.SelfWebfilteringToken) + } + final := strings.Join(tokens, " ") + return final +} + +func virtualUsers() string { + ipStrongSwan := "" + if strings.Index(SelfSourceline, "user:%20") > 10 { + re := regexp.MustCompile("user:%20(.+?)%0D%0A") + matches := re.MatchString(SelfSourceline) + if matches { + rs := re.FindStringSubmatch(SelfSourceline) + SelfUsername = rs[1] + return SelfUsername + } + } + Key := fmt.Sprintf("%s.%s", SelfMac, Selfipaddr) + if len(SelfVirtualUserCache) > 5000 { + SelfVirtualUserCache = map[string]string{} + } + if _, ok := SelfVirtualUserCache[Key]; ok { + return SelfVirtualUserCache[Key] + } + if SelfEnableStrongswanServer == 1 { + ipStrongSwan = Selfipaddr + } + sresult := storage.UserAliases(SelfMac, Selfipaddr, ipStrongSwan, isDebug) + if sresult == "" { + SelfVirtualUserCache[Key] = "" + } + SelfVirtualUserCache[Key] = sresult + return sresult + +} +func parseLine(line string) map[string]string { + + results := map[string]string{} + lparts := strings.Split(strings.TrimRight(line, "\n"), " ") + if isDebug { + log.Printf("Parsing entity <%s>", lparts[1]) + } + if lparts[1] == "MacToUid_acl" { + return parseLineAcl(line) + } + results["acl"] = strconv.Itoa(0) + results["url"] = strings.TrimSpace(lparts[1]) + iphost := strings.Split(lparts[2], "/") + results["ipaddr"] = iphost[0] + results["hostname"] = iphost[1] + results["username"] = strings.TrimSpace(lparts[3]) + if isDebug { + log.Printf("[WEBFILTERING] - - - parseLine - - - PROTO <%s>", strings.TrimSpace(lparts[4])) + } + results["proto"] = strings.TrimSpace(lparts[4]) + SelfProtocol = results["proto"] + for _, lines := range lparts { + if strings.Index(lines, "=") > 2 { + chop := strings.Split(lines, "=") + results[chop[0]] = chop[1] + } + } + return results + +} +func parseLineAcl(line string) map[string]string { + results := map[string]string{} + lparts := strings.Split(strings.TrimRight(line, "\n"), " ") + results["acl"] = strconv.Itoa(1) + results["username"] = strings.TrimSpace(lparts[2]) + results["ipaddr"] = strings.TrimSpace(lparts[3]) + results["mac"] = strings.TrimSpace(lparts[4]) + results["forwardedfor"] = strings.TrimSpace(lparts[5]) + xForward := strings.TrimSpace(lparts[5]) + results["domain"] = strings.TrimSpace(lparts[6]) + results["sni"] = strings.TrimSpace(lparts[7]) + ssni := strings.TrimSpace(lparts[7]) + //user_cert := strings.TrimSpace(lparts[8]) + //notes := strings.TrimSpace(lparts[9]) + //server_ip := strings.TrimSpace(lparts[10]) + //server_fqdn := strings.TrimSpace(lparts[11]) + results["proto"] = strings.TrimSpace(lparts[12]) + SelfProtocol = results["proto"] + if len(xForward) > 3 { + results["ipaddr"] = xForward + } + if len(ssni) > 3 { + results["domain"] = ssni + } + results["myport"] = strconv.Itoa(3128) + results["myip"] = "127.0.0.1" + results["hostname"] = "" + results["url"] = strings.TrimSpace(lparts[6]) + + return results +} + +func ufdbGuardClient(id string, line string, proxyUrl string, sitename string, clientIp string, clientHostname string, clientMac string, proxyIP string, proxyPort int) string { + isBreak := false + if strings.Index(line, "srn=WHITE") > 10 { + isBreak = true + } + if strings.Index(line, "rblpass=yes") > 10 { + isBreak = true + } + if strings.Index(line, "webfilter=pass") > 10 { + isBreak = true + } + category := 0 + categoryName := "" + //var LogText string + if isBreak { + if isDebug { + log.Printf("%s [WEBFILTERING] Breakable!", sitename) + } + return "" + } + if isDebug { + log.Printf("%s [WEBFILTERING] rules with %s [%s] user=%s", sitename, proxyUrl, sitename, SelfUsername) + } + //LogText = fmt.Sprintf("sitename=\"%s\" src=\"%s\" host=\"%s\" user=\"%s\" mac=\"%s\" proxy=\"%s:%d\"", sitename, clientIp, clientHostname, SelfUsername, clientMac, proxyIP, proxyPort) + if ufdbguard.Process(proxyUrl, sitename, clientIp, clientHostname, SelfUsername, clientMac, proxyIP, proxyPort) { + if ufdbguard.SelfInactiveService { + //LogText = "" + if isDebug { + log.Printf("%s [WEBFILTERING] INACTIVE SERVICE!", sitename) + return "" + } + + } + SelfWebfilterRuleName = ufdbguard.SelfWebfilterRuleName + if ufdbguard.SelfCategory == 0 { + category, categoryName = categorization.GetCategories(sitename) + } + if category == 0 { + category = ufdbguard.SelfCategory + categoryName = ufdbguard.SelfCategoryName + } + Selfcategory = category + SelfcategoryName = categoryName + redirect := buildErrorPage() + if isDebug { + log.Printf("%s [WEBFILTERING] OUT OF <%s>", sitename, fmt.Sprintf("%s %s %s \n", id, SelfTokenOutput, redirect)) + } + return fmt.Sprintf("%s %s %s \n", id, SelfTokenOutput, redirect) + } + return "" +} diff --git a/server/shields/shields.go b/server/shields/shields.go new file mode 100755 index 0000000..d73289a --- /dev/null +++ b/server/shields/shields.go @@ -0,0 +1,836 @@ +package shields + +import ( + "fmt" + "github.com/d3mondev/resolvermt" + "github.com/techoner/gophp" + "log" + "reflect" + "regexp" + "server/categorization" + "server/internal" + "strconv" + "strings" + "time" + "unicode" +) + +var ( + SelfKsrnPorn bool + SelfDisableAdvert bool + SelfHatredAndDiscrimination bool + isDebugShields bool + SelfShieldIpaddr string + SelfShieldUsername string + SelfShieldMac string + SelfError string + SelfCategory int + SelfCategoryName string + SelfAction string + SelfSitename string + SelfStartTime time.Time + SelfLocalCache map[string]string + SelfKsrnLicense bool + SelfKsrnEnable bool + SelfQueryIPAddr bool + SelfKSRNEmergency bool + SelfTheShieldLogsQueries bool + SelfDurationText string + SelfHit int + SelfLocalCacheCount int + SelfTheShieldsCguard bool +) + +func InitShileds(debub bool) { + SelfKsrnPorn = internal.GetSocketInfoBool("KsrnPornEnable") + SelfDisableAdvert = internal.GetSocketInfoBool("KsrnDisableAdverstising") + SelfHatredAndDiscrimination = internal.GetSocketInfoBool("KsrnHatredEnable") + isDebugShields = debub + SelfKsrnEnable = internal.GetSocketInfoBool("KSRNEnable") + SelfQueryIPAddr = internal.GetSocketInfoBool("KsrnQueryIPAddr") + SelfKSRNEmergency = internal.GetSocketInfoBool("KSRNEmergency") + SelfKsrnLicense = internal.GetSocketInfoBool("KSRN_LICENSE") + SelfTheShieldsCguard = internal.GetSocketInfoBool("TheShieldsCguard") + SelfLocalCache = make(map[string]string) + if internal.GetArticaGoldLicense() { + SelfKsrnLicense = true + } + if isDebugShields { + SelfTheShieldLogsQueries = true + } +} + +//TODO Change DNS System +func GetHost(sitename string) string { + resolvers := []string{ + categorization.SelfDns1, + categorization.SelfDns2, + } + url := strings.TrimSuffix(sitename, "\n") + domains := []string{ + url, + } + + client := resolvermt.New(resolvers, 3, 1000, 50) + defer client.Close() + results := client.Resolve(domains, resolvermt.TypeA) + + for _, record := range results { + if isDebugShields { + log.Printf("%s: * * * HOST Resolution: [%s] * * *", sitename, record.Answer) + } + return record.Answer + } + return "" +} + +func Operate(sitename string) bool { + log.Printf("THE SHIELDS DEBUG MODE IS %t", isDebugShields) + SelfStartTime = time.Now() + SelfError = "" + SelfCategory = 0 + SelfAction = "" + SelfSitename = sitename + if categorization.IsArpa(sitename) { + SelfSitename = categorization.SelfStripaddr + if categorization.IsPrivateIp(SelfSitename) { + SelfCategory = 82 + SelfCategoryName = categorization.CategoryIntToString(SelfCategory) + return false + } + } + fullCache := fmt.Sprint("SRNRESULTS:%s", sitename) + scacheKey := fmt.Sprint("SRN_CACHE_WHITE:%s", sitename) + //internal.Increment("KSRN_REQUESTS") + internal.Inc("KSRN_REQUESTS", "1") + if isDebugShields { + log.Printf("* * * * * * * * * * * * * * * * O P E R A T E * * * * * * * * * * * * *") + log.Printf("%s ANALYZE...", sitename) + } + memWhite := getCached(sitename) + if memWhite != "" { + SelfError = "" + SelfAction = "WHITELIST" + localCategories(sitename) + SelfCategory, _ = categorization.GetCategories(sitename) + if isDebugShields { + log.Printf("%s [DEBUG]: PASS HIT whitelisted (Cache), aborting %s ", sitename, internal.TimeTrack(SelfStartTime)) + + } + return false + } + if categorization.AdminWhitelist(sitename, false) { + if isDebugShields { + log.Printf("%s: [DEBUG] MISS whitelisted, aborting", sitename) + + } + setCache(scacheKey, "1") + SelfError = "" + SelfAction = "WHITELIST" + localCategories(sitename) + if SelfCategory == 0 { + SelfCategory, _ = categorization.GetCategories(sitename) + } + if isDebugShields { + log.Printf("%s: [DEBUG] MISS whitelisted, aborting %s", sitename, internal.TimeTrack(SelfStartTime)) + + } + return true + } + if !SelfKsrnLicense { + SelfError = "LICENSE_ERROR" + SelfAction = "PASS" + localCategories(sitename) + if isDebugShields { + log.Printf("%s: [ERROR]: Not a valid license %s", sitename, internal.TimeTrack(SelfStartTime)) + } + return false + } + if !SelfKsrnEnable { + SelfError = "DISABLED" + SelfAction = "PASS" + localCategories(sitename) + if isDebugShields { + log.Printf("%s: [ERROR]: Module is Disabled %s", sitename, internal.TimeTrack(SelfStartTime)) + } + return false + } + + if !SelfQueryIPAddr { + matches, _ := regexp.MatchString("^[0-9\\.]+$", sitename) + if matches { + SelfError = "IPADDR" + SelfAction = "PASS" + localCategories(sitename) + if isDebugShields { + log.Printf("%s: [DEBUG]: is an IP Address %s", sitename, internal.TimeTrack(SelfStartTime)) + } + return false + } + } + + if SelfKSRNEmergency { + SelfError = "EMERGENCY" + SelfAction = "PASS" + localCategories(sitename) + if isDebugShields { + log.Printf("%s: [DEBUG]: WARNING... Emergency Enabled %s", sitename, internal.TimeTrack(SelfStartTime)) + } + return false + } + + if categorization.FixedWhitelist(sitename) { + //internal.Append(scacheKey, "1") + setCache(scacheKey, "1") + SelfError = "" + SelfAction = "PASS" + localCategories(sitename) + if SelfCategory == 0 { + SelfCategory, _ = categorization.GetCategories(sitename) + } + if isDebugShields { + log.Printf("%s: [DEBUG]: MISS whitelisted, aborting %s", sitename, internal.TimeTrack(SelfStartTime)) + } + return true + } + + resultIP := getCached(fullCache) + if resultIP != "" { + if isDebugShields { + log.Printf("%s: [DEBUG]: get_cache(%s) HIT = %s", sitename, fullCache, internal.TimeTrack(SelfStartTime)) + } + } + SelfHit = 0 + if resultIP == "" { + category := localCategories(sitename) + if isDebugShields { + log.Printf("%s MISS Local category=[%d] %s", sitename, category, internal.TimeTrack(SelfStartTime)) + } + if category > 0 { + resultIP = fmt.Sprintf("127.12.%s.1", sitename) + setCache(fullCache, resultIP) + results := understandIP(resultIP) + runStats(sitename) + if isDebugShields { + log.Printf("%s ENGINE=%s category[%d] %s %s after The Shields Query", sitename, SelfAction, SelfCategory, results, internal.TimeTrack(SelfStartTime)) + } + } + if isDebugShields { + log.Printf("%s IP=%s", sitename, resultIP) + } + if resultIP == "" { + resultIP = theShieldQuery(sitename) + if isDebugShields { + log.Printf("%s CLOUD --> the_shield_query(%s) = %s", sitename, sitename, resultIP) + } + } + if resultIP == "" { + SelfAction = "PASS" + if isDebugShields { + log.Printf("%s result_ip is None", sitename) + } + return false + } + if isDebugShields { + log.Printf("%s theshield.operate HIT [%s]", sitename, resultIP) + } + setCache(fullCache, resultIP) + } else { + SelfHit = 1 + if isDebugShields { + log.Printf("%s theshield.operate HIT [%s]", sitename, resultIP) + } + } + statTime := time.Now() + _ = understandIP(resultIP) + runStats(sitename) + if isDebugShields { + log.Printf("FINAL:%s", internal.TimeTrack(statTime)) + } + return true +} + +func theShieldQuery(sitename string) string { + statTime := time.Now() + if SelfTheShieldsCguard { + if isDebugShields { + log.Printf("[DEBUG]: --> query_cguard(%s)", sitename) + } + increaseStatsLine() + resultIP := queryCguard(sitename) + if resultIP != nil { + return *resultIP + } + } + encodedPart := encryptUpper(sitename) + searchQuery := fmt.Sprintf("%s.%s", encodedPart, "crdf.artica.center") + if isDebugShields { + log.Printf("[DNS]: %s --> %s %s", sitename, searchQuery, "[QUERY]") + } + increaseStatsLine() + //TODO Change DNS System + resolvers := []string{ + categorization.SelfDns1, + categorization.SelfDns2, + } + url := strings.TrimSuffix(searchQuery, "\n") + domains := []string{ + url, + } + + client := resolvermt.New(resolvers, 3, 1000, 50) + defer client.Close() + results := client.Resolve(domains, resolvermt.TypeA) + for _, record := range results { + if isDebugShields { + log.Printf("DNS %s category=%s MISS shield.query_cloud %s", sitename, record.Answer, internal.TimeTrack(statTime)) + } + return record.Answer + + } + return "" +} + +func encryptUpper(plaintext string) string { + shift := 3 + encryption := "" + text := plaintext + text = strings.ToUpper(text) + text = strings.ReplaceAll(text, ".", "chr2") + //fmt.Println(text) + for _, c := range text { + if unicode.IsUpper(c) { + //c_unicode := int(c) + c_index := int(c) - int('A') + new_index := (c_index + shift) % 26 + new_unicode := new_index + int('A') + new_character := rune(new_unicode) + //fmt.Printf("%c\n", new_character) + encryption = encryption + string(new_character) + } else { + encryption += string(c) + } + + } + return strings.ToLower(encryption) +} + +func queryCguard(sitename string) *string { + key := fmt.Sprintf("query_cguard:%s", sitename) + detects := []int{5026, 5066, 5113, 5001, 5058, 5048, 5035, 5096, 5019, 5043, 5045, 5017, 5010, 5002, 5036, 5042, 5005, 5003, 5029, 5030, 5024, 5027, 5107, 5111, 5093, 5033, 5104, 5101, 5114} + category := getCached(key) + if category != "" { + if isDebugShields { + log.Printf("DNS %s category=%s HIT shield.query_cguard", sitename, category) + } + categoryID, _ := strconv.Atoi(category) + if categoryID == 0 { + return nil + } + for _, val := range detects { // Loop + if val == categoryID { + + break + result := fmt.Sprintf("127.96.0.%s", category) + return &result + } + } + return nil + } + categoryID := categorization.GetCategoriesCguard(sitename) + if isDebugShields { + log.Printf("DNS %s category=%d MISS shield.query_cguard", sitename, categoryID) + } + setCache(key, string(categoryID)) + if categoryID == 0 { + return nil + } + for _, val := range detects { // Loop + if val == categoryID { + break + result := fmt.Sprintf("127.96.0.%s", category) + return &result + } + } + if isDebugShields { + log.Printf("[DEBUG]: --> %s < == %s", sitename, "SKIP") + } + return nil + +} + +func increaseStatsLine() { + statsKey := fmt.Sprintf("SRNSTATSLINE:%s", internal.GetTimeDelta(10, 1)) + //internal.Increment(statsKey) + internal.Inc(statsKey, "1") + +} +func runStats(sitename string) bool { + delta := internal.GetTimeDelta(10, 1) + time10mn := internal.GetTimeDelta(10, 2) + if SelfAction == "REAFFECTED" { + return true + } + if SelfAction == "PASS" { + return true + } + if SelfCategory == 0 || SelfCategoryName == "" { + SelfCategory, SelfCategoryName = categorization.GetCategories(sitename) + } + SelfShieldUsername = "" + SelfShieldMac = "" + duration := time.Since(SelfStartTime).Milliseconds() + filename := fmt.Sprintf("/var/log/squid/%s.ksrn", delta) + msg := fmt.Sprintf("%s|%s|%s|%s|%d|%s|%s|%d", time10mn, SelfShieldUsername, SelfShieldIpaddr, SelfShieldMac, SelfCategory, sitename, SelfAction, duration) + internal.Logfile(filename, msg) + internal.Inc("KSRN_DETECTED", "1") + if isDebugShields { + log.Printf("[DETECTED]: From %s [%s] (%s) category: %s (%s) to website %s", SelfShieldUsername, SelfShieldIpaddr, SelfShieldMac, SelfCategoryName, SelfAction, sitename) + } + return true +} + +func understandIP(ip string) bool { + sitename := SelfSitename + var matches bool + var rs []string + var re *regexp.Regexp + if isDebugShields { + log.Printf("%s [%s]: Check Porn ?: %t", sitename, ip, SelfKsrnPorn) + } + re = regexp.MustCompile("^127\\.96\\.0\\.([0-9]+)") + matches = re.MatchString(ip) + if matches { + if isDebugShields { + log.Printf("%s: [DEBUG] [%s] CGuard detected", sitename, ip) + } + rs = re.FindStringSubmatch(ip) + sporn := []int{5113, 5001, 5058, 5048} + shaines := []int{5033, 5104, 5101, 5114} + resultCat, _ := strconv.Atoi(rs[1]) + if SelfDisableAdvert { + if resultCat == 5026 || resultCat == 5066 { + if isDebugShields { + log.Printf("%s: [DEBUG] [%d] Exclude (Privacy Shield disabled)", sitename, resultCat) + } + SelfAction = "PASS" + return true + } + } + if !SelfKsrnPorn { + for _, val := range sporn { // Loop + if val == resultCat { + SelfAction = "PASS" + if isDebugShields { + log.Printf("%s: [DEBUG] [%d] Exclude (Porn Shield disabled)", sitename, resultCat) + } + break + return true + } + } + } + if !SelfHatredAndDiscrimination { + for _, val := range shaines { // Loop + if val == resultCat { + SelfAction = "PASS" + if isDebugShields { + log.Printf("%s: [DEBUG] [%d] Exclude (Hate and discrimination)", sitename, resultCat) + } + break + return true + } + } + } + SelfAction = "CGUARD" + return true + } + re = regexp.MustCompile("127\\.12\\.([0-9]+)\\.1") + matches = re.MatchString(ip) + if matches { + SelfAction = "PASS" + badCarz := []int{6, 7, 10, 72, 92, 105, 111, 135, 132, 109, 5, 143} + hatred := []int{130, 148, 149, 150, 140} + rs = re.FindStringSubmatch(ip) + resultCat, _ := strconv.Atoi(rs[1]) + if SelfCategory == 0 { + SelfCategory, SelfCategoryName = categorization.GetCategories(sitename) + if isDebugShields { + log.Printf("%s category==0 ??? with [%s] retreive it ! -> %d", sitename, ip, SelfCategory) + } + } + if isDebugShields { + log.Printf("%s [%d]: ARTICA", sitename, resultCat) + } + if SelfCategory > 0 { + if !SelfKsrnPorn { + if resultCat == 109 || resultCat == 132 { + if isDebugShields { + log.Printf("%s [%d]: ARTICA PORN EXCLUDE", sitename, resultCat) + } + SelfAction = "PASS" + if isDebugShields { + log.Printf("%s: [DEBUG] [%d] Exclude (Porn Shield disabled)", sitename, resultCat) + } + return true + } + } + if SelfDisableAdvert { + if resultCat == 5 || resultCat == 143 { + if isDebugShields { + log.Printf("%s: [DEBUG] [%d] Exclude (Privacy Shield disabled)", sitename, resultCat) + } + SelfAction = "PASS" + return true + } + } + if !SelfHatredAndDiscrimination { + for _, val := range hatred { // Loop + if val == resultCat { + SelfAction = "PASS" + if isDebugShields { + log.Printf("%s: [DEBUG] [%d] Exclude (Hate and discrimination)", sitename, resultCat) + } + break + return true + } + } + } + for _, val := range badCarz { // Loop + if val == resultCat { + SelfAction = "ARTICA" + if isDebugShields { + log.Printf("%s [%d]: ARTICA DETECTED", sitename, resultCat) + } + break + return true + } + } + } + return true + } + + if ip == "127.10.1.0" { + SelfCategory = 92 + SelfAction = "MALWAREURL_MALWARES" + return true + } + + if ip == "127.10.2.0" { + SelfCategory = 105 + SelfAction = "MALWAREURL_PHISHING" + return true + } + re = regexp.MustCompile("127\\.10\\.1\\.([0-9]+)") + matches = re.MatchString(ip) + if matches { + rs = re.FindStringSubmatch(ip) + SelfCategory, _ = strconv.Atoi(rs[1]) + SelfAction = "CLOUDFLARE" + return true + } + + re = regexp.MustCompile("127\\.10\\.2\\.([0-9]+)") + matches = re.MatchString(ip) + if matches { + rs = re.FindStringSubmatch(ip) + SelfCategory, _ = strconv.Atoi(rs[1]) + SelfAction = "CLOUDFLARE" + return true + } + + if ip == "127.3.1.0" { + SelfCategory, _ = strconv.Atoi(rs[1]) + SelfAction = "CLOUDFLARE" + return true + } + if ip == "127.3.2.0" { + SelfCategory, _ = strconv.Atoi(rs[1]) + SelfAction = "CLOUDFLARE" + return true + } + re = regexp.MustCompile("127\\.3\\.1\\.([0-9]+)") + matches = re.MatchString(ip) + if matches { + rs = re.FindStringSubmatch(ip) + SelfCategory, _ = strconv.Atoi(rs[1]) + SelfAction = "CLOUDFLARE" + return true + } + re = regexp.MustCompile("127\\.3\\.2\\.([0-9]+)") + matches = re.MatchString(ip) + if matches { + rs = re.FindStringSubmatch(ip) + SelfCategory, _ = strconv.Atoi(rs[1]) + SelfAction = "REAFFECTED" + return true + } + if ip == "127.4.0.0" { + SelfCategory = 92 + SelfAction = "GENERIC" + return true + } + re = regexp.MustCompile("127\\.4\\.0\\.([0-9]+)") + matches = re.MatchString(ip) + if matches { + rs = re.FindStringSubmatch(ip) + SelfCategory, _ = strconv.Atoi(rs[1]) + SelfAction = "GENERIC" + return true + } + if ip == "127.2.0.0" { + SelfCategory = 92 + SelfAction = "GOOGLE" + return true + } + + re = regexp.MustCompile("127\\.2\\.0\\.([0-9]+)") + matches = re.MatchString(ip) + if matches { + rs = re.FindStringSubmatch(ip) + SelfCategory, _ = strconv.Atoi(rs[1]) + SelfAction = "GOOGLE" + return true + } + + re = regexp.MustCompile("^127\\.254\\.0\\.([0-9]+)$") + matches = re.MatchString(ip) + if matches { + rs = re.FindStringSubmatch(ip) + SelfCategory, _ = strconv.Atoi(rs[1]) + SelfAction = "KASPERSKY" + return true + } + if ip == "127.5.0.0" { + if SelfDisableAdvert { + SelfCategory = 5 + SelfAction = "PASS" + return true + } + SelfCategory = 5 + SelfAction = "ADGUARD" + return true + } + re = regexp.MustCompile("^127\\.5\\.0\\.([0-9]+)$") + matches = re.MatchString(ip) + if matches { + rs = re.FindStringSubmatch(ip) + category, _ := strconv.Atoi(rs[1]) + if SelfDisableAdvert { + if category == 5 || category == 143 { + SelfCategory = 5 + SelfAction = "PASS" + return true + } + } + SelfCategory = category + SelfAction = "ADGUARD" + return true + } + if ip == "127.253.0.0" { + SelfCategory = 92 + SelfAction = "QUAD9" + return true + } + re = regexp.MustCompile("^127\\.253\\.0\\.([0-9]+)$") + matches = re.MatchString(ip) + if matches { + rs = re.FindStringSubmatch(ip) + SelfCategory, _ = strconv.Atoi(rs[1]) + SelfAction = "ADGUARD" + return true + } + re = regexp.MustCompile("^0\\.0\\.0\\.([0-9]+)$") + matches = re.MatchString(ip) + if matches { + rs = re.FindStringSubmatch(ip) + SelfCategory, _ = strconv.Atoi(rs[1]) + SelfAction = "PASS" + return true + } + SelfAction = "PASS" + return false +} + +func getCached(domain string) string { + if _, ok := SelfLocalCache[domain]; ok { + return SelfLocalCache[domain] + } + smd5 := fmt.Sprint("SHIELD.class.%s", internal.Md5string(domain)) + if val, _ := internal.Fetch(smd5); val != nil { + str := *val + return str + } + return "" +} + +func setCache(domain string, category string) { + SelfLocalCache[domain] = category + SelfLocalCacheCount = SelfLocalCacheCount + 1 + smd5 := fmt.Sprintf("SHIELD.class.%s", internal.Md5string(domain)) + internal.Append(smd5, category) + if SelfLocalCacheCount > 1500 { + SelfLocalCache = make(map[string]string) + SelfLocalCacheCount = 0 + } +} + +func localCategories(sitename string) int { + if len(sitename) == 0 { + return 0 + } + category, _ := categorization.GetCategories(sitename) + SelfCategory = category + if SelfCategory == 0 { + return 0 + } + return SelfCategory + //TODO Confirm rest of func +} + +func WriteStats(category int, sitename string, provider string, duration int) { + delta := internal.GetTimeDelta(10, 1) + time10mn := internal.GetTimeDelta(10, 2) + filename := fmt.Sprintf("/var/log/squid/%s.ksrn", delta) + msg := fmt.Sprintf("%s|%s|%s|%s|%d|%s|%s|%d", time10mn, SelfShieldUsername, SelfShieldIpaddr, SelfShieldMac, category, sitename, provider, duration) + internal.Logfile(filename, msg) +} + +func CountUsers() { + if len(SelfShieldIpaddr) == 0 { + if isDebugShields { + log.Printf("SelfShieldIpaddr null") + } + return + } + if SelfShieldIpaddr == "127.0.0.1" { + log.Printf("SelfShieldUsername is 127.0.0.1") + return + } + + time10min := internal.GetTimeDelta(10, 2) + time10min = strings.ReplaceAll(time10min, " ", "_") + results := map[string]map[string]int{} + //results["IPADDR"] = map[string]int{} + //results["mac"] = map[string]int{} + //results["username"] = map[string]int{} + skey := fmt.Sprintf("CountUsers.%s", time10min) + if isDebugShields { + log.Printf("%s [CountUsers]: %s", time10min, skey) + } + var cc int + if val, err := internal.Get(skey); err == nil { + mount, err := gophp.Unserialize([]byte(val)) + if err != nil { + if isDebugShields { + log.Printf("[CountUsers]: Failed to unserialize: ", err) + results = make(map[string]map[string]int) + } + } + log.Printf("Array is %v", mount) + if dataList, ok := mount.(map[string]interface{}); ok { + for x, data := range dataList { + if reflect.ValueOf(data).Len() == 0 { + continue + } + for k, v := range data.(map[string]interface{}) { + if x == "IPADDR" { + if _, ok := results["IPADDR"]; !ok { + if isDebugShields { + log.Printf("%s [CountUsers]: creating IPADDR key", time10min) + } + results["IPADDR"] = map[string]int{} + } + } + + if x == "mac" { + if _, ok := results["mac"]; !ok { + if isDebugShields { + log.Printf("%s [CountUsers]: creating Mac key", time10min) + } + results["mac"] = map[string]int{} + } + } + if x == "username" { + if _, ok := results["username"]; !ok { + if isDebugShields { + log.Printf("%s [CountUsers]: creating Username key", time10min) + } + results["username"] = map[string]int{} + } + } + results[x][k] = v.(int) + } + } + } else { + log.Printf("[CountUsers]: Failed to map Array: ", err) + results = make(map[string]map[string]int) + } + + } else { + results = make(map[string]map[string]int) + } + if _, ok := results["IPADDR"]; !ok { + if isDebugShields { + log.Printf("%s [CountUsers]: creating IPADDR key", time10min) + } + results["IPADDR"] = map[string]int{} + } + + if _, ok := results["IPADDR"][SelfShieldIpaddr]; !ok { + cc = 1 + results["IPADDR"][SelfShieldIpaddr] = cc + } else { + cc = results["IPADDR"][SelfShieldIpaddr] + cc = cc + 1 + results["IPADDR"][SelfShieldIpaddr] = cc + } + if isDebugShields { + log.Printf("%s [CountUsers]: ipaddr=%s count=%d", time10min, SelfShieldIpaddr, cc) + } + + if len(SelfShieldUsername) > 1 { + if _, ok := results["username"]; !ok { + if isDebugShields { + log.Printf("%s [CountUsers]: creating Username key", time10min) + } + results["username"] = map[string]int{} + } + if _, ok := results["username"][SelfShieldUsername]; !ok { + cc = 1 + results["username"][SelfShieldUsername] = cc + } else { + cc = results["username"][SelfShieldUsername] + cc = cc + 1 + results["username"][SelfShieldUsername] = cc + } + if isDebugShields { + log.Printf("%s [CountUsers]: username=%s count=%d", time10min, SelfShieldUsername, cc) + } + } + + if len(SelfShieldMac) > 0 { + if _, ok := results["mac"]; !ok { + if isDebugShields { + log.Printf("%s [CountUsers]: creating Mac key", time10min) + } + results["mac"] = map[string]int{} + } + if _, ok := results["mac"][SelfShieldMac]; !ok { + cc = 1 + results["mac"][SelfShieldMac] = cc + } else { + cc = results["mac"][SelfShieldMac] + cc = cc + 1 + results["mac"][SelfShieldMac] = cc + } + if isDebugShields { + log.Printf("%s [CountUsers]: mac=%s count=%d", time10min, SelfShieldMac, cc) + } + } + out, _ := gophp.Serialize(results) + internal.Set(skey, string(out), 3600) + if isDebugShields { + log.Printf("%s [CountUsers]: %s SAVED SUCCESS", time10min, skey) + } + +} diff --git a/server/ufdbguard/ufdbguard.go b/server/ufdbguard/ufdbguard.go new file mode 100755 index 0000000..87b73cf --- /dev/null +++ b/server/ufdbguard/ufdbguard.go @@ -0,0 +1,578 @@ +package ufdbguard + +import ( + "bufio" + "encoding/binary" + "errors" + "fmt" + "log" + "net" + "net/url" + "os" + "regexp" + "server/categorization" + "server/internal" + "strconv" + "strings" + "time" +) + +var ( + isDebugUfdbguard bool + SelfUfdbGuardMaxUrisize int + SelfFinalRedirdectCode int + SelfFinalRedirectUrl string + SelfRedirectKey string + SelfProxyProto string + SelfClientMac string + SelfMimik bool + SelfWebfilterRuleName string + SelfIsSSNI bool + SelfRemoteIP string + SelfRemotePort int + SelfUseRemoteUfdbguardService bool + SelfSquidGuardRedirectHTTPCode int + SelfSquidGuardWebUseExternalUri int + SelfSquidGuardWebExternalUri string + SelfSquidGuardWebExternalUriSSL string + SelfHttps bool + SelfUfdbGuardWebFilteringCacheTime int + SelfCached bool + SelfInactiveService bool + SelfUfdbgclientSockTimeOut time.Duration + SelfCategory int + SelfWebfilteringToken string + SelfRuleID int + SelfCategoryName string + SelfToken string +) + +func InitUfdbguard(debug bool) { + //Self := &UFDBDefaultVars{} + //log.SetFlags(log.LstdFlags | log.Lshortfile) + //if _slog, err := syslog.New(syslog.LOG_DEBUG, "go-shield-connector-ufdb"); err == nil { + // log.SetOutput(_slog) + //} + SelfRemoteIP = internal.GetSocketInfoString("PythonUfdbServer") + SelfRemotePort = internal.GetSocketInfoInt("PythonUfdbPort") + SelfUseRemoteUfdbguardService = internal.GetSocketInfoBool("UseRemoteUfdbguardService") + SelfSquidGuardRedirectHTTPCode = internal.GetSocketInfoInt("SquidGuardRedirectHTTPCode") + SelfUfdbGuardMaxUrisize = internal.GetSocketInfoInt("UfdbGuardMaxUrisize") + SelfSquidGuardWebUseExternalUri = internal.GetSocketInfoInt("SquidGuardWebUseExternalUri") + SelfSquidGuardWebExternalUri = internal.GetSocketInfoString("SquidGuardWebExternalUri") + SelfSquidGuardWebExternalUriSSL = internal.GetSocketInfoString("SquidGuardWebExternalUriSSL") + SelfUfdbGuardWebFilteringCacheTime = internal.GetSocketInfoInt("UfdbGuardWebFilteringCacheTime") + SelfUfdbgclientSockTimeOut = time.Duration(internal.GetSocketInfoInt("UfdbgclientSockTimeOut")) * time.Second + if SelfUfdbgclientSockTimeOut == 0 { + SelfUfdbgclientSockTimeOut = time.Duration(120) * time.Second + } + if SelfUfdbGuardWebFilteringCacheTime == 0 { + SelfUfdbGuardWebFilteringCacheTime = 300 + } + if SelfSquidGuardRedirectHTTPCode < 300 { + SelfSquidGuardRedirectHTTPCode = 302 + } + if SelfUfdbGuardMaxUrisize == 0 { + SelfUfdbGuardMaxUrisize = 640 + } + + isDebugUfdbguard = debug + + isBumped() + if !SelfUseRemoteUfdbguardService { + checkLocalConfig() + if SelfRemoteIP == "all" { + if isDebugUfdbguard { + log.Printf("[UFDB_CLASS]: Warning, unable to found the remote TCP Addr config, assume 127.0.0.1") + } + SelfRemoteIP = "127.0.0.1" + } + if len(SelfRemoteIP) == 0 { + if isDebugUfdbguard { + log.Printf("[UFDB_CLASS]: Warning, unable to found the remote TCP Addr config, assume 127.0.0.1") + } + SelfRemoteIP = "127.0.0.1" + } + if SelfRemotePort == 0 { + if isDebugUfdbguard { + log.Printf("[UFDB_CLASS]: Warning, unable to found the remote port config, assume 3977 port") + } + SelfRemotePort = 3977 + } + } + if SelfRemotePort > 0 { + if isDebugUfdbguard { + log.Printf("[UFDB_CLASS]: Redirect Code..............: %d", SelfSquidGuardRedirectHTTPCode) + log.Printf("[UFDB_CLASS]: Connect to.................: ufdb://%s:%d", SelfRemoteIP, SelfRemotePort) + log.Printf("[UFDB_CLASS]: SelfSquidGuardWebUseExternalUri: %d", SelfSquidGuardWebUseExternalUri) + log.Printf("[UFDB_CLASS]: SelfSquidGuardWebExternalUri...: %s", SelfSquidGuardWebExternalUri) + log.Printf("[UFDB_CLASS]: SelfSquidGuardWebExternalUriSSL: %s", SelfSquidGuardWebExternalUriSSL) + log.Printf("[UFDB_CLASS]: Listen port: %s:%d", SelfRemoteIP, SelfRemotePort) + if SelfMimik { + log.Printf("[UFDB_CLASS]:MIMIK = %t", SelfMimik) + } + } + } + +} +func isBumped() { + if _, err := os.Stat("/etc/squid3/listen_ports.conf"); errors.Is(err, os.ErrNotExist) { + if isDebugUfdbguard { + log.Printf("/etc/squid3/listen_ports.conf not exit: ", err) + } + return + } + f, err := os.Open("/etc/squid3/listen_ports.conf") + + if err != nil { + if isDebugUfdbguard { + log.Printf("error reading /etc/squid3/listen_ports.conf: ", err) + } + return + } + + defer f.Close() + scanner := bufio.NewScanner(f) + for scanner.Scan() { + reSSLBump := regexp.MustCompile("^http_port.*?ssl-bump") + if reSSLBump.MatchString(scanner.Text()) { + if isDebugUfdbguard { + log.Printf("[UFDB_CLASS]:MIMIK Found SSL port in proxy configuration") + } + SelfMimik = true + return + } + if isDebugUfdbguard { + log.Printf("[UFDB_CLASS]:MIMIK * not * Found SSL port in proxy configuration") + } + + } + if err := scanner.Err(); err != nil { + if isDebugUfdbguard { + log.Printf("error scanning /etc/squid3/listen_ports.conf: ", err) + } + return + } +} +func checkLocalConfig() { + if _, err := os.Stat("/etc/squid3/ufdbGuard.conf"); errors.Is(err, os.ErrNotExist) { + if isDebugUfdbguard { + log.Printf("/etc/squid3/ufdbGuard.conf not exit: ", err) + } + return + } + f, err := os.Open("/etc/squid3/ufdbGuard.conf") + + if err != nil { + if isDebugUfdbguard { + log.Printf("error reading /etc/squid3/ufdbGuard.conf: ", err) + } + return + } + + defer f.Close() + scanner := bufio.NewScanner(f) + for scanner.Scan() { + reInterface := regexp.MustCompile("^interface\\s+(.+)") + if reInterface.MatchString(scanner.Text()) { + rs := reInterface.FindStringSubmatch(scanner.Text()) + if isDebugUfdbguard { + log.Printf("[UFDB_CLASS]: Found Interface %s in ufdbGuard.conf", rs[1]) + } + SelfRemoteIP = rs[1] + if SelfRemoteIP == "all" { + SelfRemoteIP = "127.0.0.1" + } + } + rePort := regexp.MustCompile("^port\\s+([0-9]+)") + if rePort.MatchString(scanner.Text()) { + rs := rePort.FindStringSubmatch(scanner.Text()) + if isDebugUfdbguard { + log.Printf("[UFDB_CLASS]: Found Port %s in ufdbGuard.conf", rs[1]) + } + SelfRemotePort, _ = strconv.Atoi(rs[1]) + } + + } + if err := scanner.Err(); err != nil { + if isDebugUfdbguard { + log.Printf("error scanning /etc/squid3/ufdbGuard.conf: ", err) + } + return + } + +} +func Process(proxyUrl string, urlDomain string, clientIp string, clientHostname string, username string, clientMacAddr string, proxyIP string, proxyPort int) bool { + if isDebugUfdbguard { + log.Printf("Starting UFDB Process") + } + sourceUrl := proxyUrl + categoryName := "Unknown" + toUfdbCdir := "" + toUfdb := "" + proto := "" + cdirToCheck := "" + SelfCategoryName = categoryName + SelfToken = "" + var Tokens []string + if len(username) == 0 { + username = "-" + } + if len(clientHostname) == 0 { + clientHostname = "-" + } + if len(proxyIP) == 0 { + proxyIP = "127.0.0.1" + } + if proxyPort == 0 { + proxyPort = 3128 + } + + matches, _ := regexp.MatchString("\\/ufdbguard\\.php\\?rule-id=[0-9]+", proxyUrl) + if matches { + if isDebugUfdbguard { + log.Printf("[UFDB_CLASS]: [CLIENT]: Loop to Web-filtering error page") + } + return false + } + + if checkIPAddressType(urlDomain, isDebugUfdbguard) { + re := regexp.MustCompile("^([0-9]+)\\.([0-9]+)\\.([0-9]+)\\.([0-9]+)") + if re.MatchString(urlDomain) { + rs := re.FindStringSubmatch(urlDomain) + cdirToCheck := rs[1] + "." + rs[2] + "." + rs[3] + ".cdir" + toUfdbCdir = fmt.Sprintf("http://%s %s/%s %s GET myip=%s myport=%s\n", cdirToCheck, clientIp, clientHostname, username, proxyIP, strconv.Itoa(proxyPort)) + } + ip2LongDomain := binary.BigEndian.Uint32(net.ParseIP(urlDomain)[12:16]) + newDomain := strconv.FormatUint(uint64(ip2LongDomain), 10) + ".addr" + proxyUrl = strings.ReplaceAll(proxyUrl, urlDomain, newDomain) + if isDebugUfdbguard { + log.Printf("[UFDB_CLASS]: [CLIENT] replace [' + %s + '] to [' + %s + ']:", urlDomain, newDomain) + } + SelfProxyProto = "GET" + } + proxyUrl = strings.ReplaceAll(proxyUrl, "https", "http") + proxyUrl = strings.ReplaceAll(proxyUrl, ":443", "") + if strings.Index(proxyUrl, "http://") == -1 { + proto = "http://" + } + if SelfUfdbGuardMaxUrisize == 0 { + SelfUfdbGuardMaxUrisize = 640 + } + if len(proxyUrl) > SelfUfdbGuardMaxUrisize { + if isDebugUfdbguard { + log.Printf("[UFDB_CLASS]: [CLIENT] ALERT!...: URL %s exceed %d bytes, cut it!", urlDomain, SelfUfdbGuardMaxUrisize) + } + proxyUrl = proxyUrl[0:SelfUfdbGuardMaxUrisize] + "..." + } + if len(toUfdbCdir) > 0 { + if isDebugUfdbguard { + log.Printf("[UFDB_CLASS]: [CLIENT] Pass to Web-Filtering service (CDIR)") + } + SelfClientMac = clientMacAddr + if sendToUfdb(toUfdbCdir, sourceUrl, clientIp, username, cdirToCheck) { + categoryName = "Unknown" + finalRedirdectCode := SelfFinalRedirdectCode + finalRedirectUrl := SelfFinalRedirectUrl + finalRedirectKey := SelfRedirectKey + category := SelfCategory + if category > 0 { + categoryName = categorization.CategoryIntToString(category) + SelfCategoryName = categoryName + } + if isDebugUfdbguard { + log.Printf("[UFDB_CLASS]: SelfCategory %d Name: %s", category, categoryName) + log.Printf("[UFDB_CLASS]: [CLIENT] CATEGORY=%d", SelfCategory) + } + ap1 := fmt.Sprintf("status=%s %s=%s", finalRedirdectCode, finalRedirectKey, finalRedirectUrl) + Tokens = append(Tokens, ap1) + Tokens = append(Tokens, "shieldsblock=yes") + Tokens = append(Tokens, SelfWebfilteringToken) + ap2 := fmt.Sprintf("category=%s category-name=%s clog=cinfo:%s-%s;", strconv.Itoa(category), categoryName, strconv.Itoa(category), categoryName) + Tokens = append(Tokens, ap2) + SelfToken = strings.Join(Tokens, " ") + return true + + } + if isDebugUfdbguard { + log.Printf("[UFDB_CLASS]: FATAL! Exception while requesting CDIR to Web-Filtering Engine service") + } + return false + } + toUfdb = fmt.Sprintf("%s%s %s/%s %s GET myip=%s myport=%s\n", proto, proxyUrl, clientIp, clientHostname, username, proxyIP, strconv.Itoa(proxyPort)) + + if sendToUfdb(toUfdb, sourceUrl, clientIp, username, clientHostname) { + category := SelfCategory + if category > 0 { + categoryName = categorization.CategoryIntToString(category) + SelfCategoryName = categoryName + } + if isDebugUfdbguard { + log.Printf("[UFDB_CLASS]: SelfCategory %d Name: %s", category, categoryName) + } + return true + } + if isDebugUfdbguard { + log.Printf("[UFDB_CLASS]: FATAL! Exception while requesting Web-Filtering Engine service") + } + return false +} + +func sendToUfdb(query string, sourceUrl string, clientIp string, uid string, hostname string) bool { + if isDebugUfdbguard { + log.Printf("Starting SentToUfdb") + } + connected := false + redirection := "" + key := "url" + categoryFound := "" + SelfRuleID = 0 + SelfWebfilterRuleName = "" + response := "" + var matches bool + + matches, _ = regexp.MatchString("\\s+CONNECT\\s+", query) + if matches { + connected = true + } + if SelfProxyProto == "CONNECT" { + connected = true + } + matches, _ = regexp.MatchString("^([0-9\\.]+)$", hostname) + if !matches { + SelfIsSSNI = true + } + //To Improve Later + if SelfMimik { + if SelfHttps { + if !SelfIsSSNI { + if isDebugUfdbguard { + log.Printf("[UFDB_CLASS]: %s: MIMIK but SNI not set, return false", hostname) + log.Printf("[UFDB_CLASS]: OK: PASS") + return false + } + } + } + } + if connected { + if SelfMimik { + matches, _ = regexp.MatchString("^(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|0?[0-9]?[0-9])\\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|0?[0-9]?[0-9])\\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|0?[0-9]?[0-9])\\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|0?[0-9]?[0-9])$", hostname) + if matches { + if isDebugUfdbguard { + log.Printf("[UFDB_CLASS]: [%s]:IPv4 Connect received, but mimiked proxy, waiting bumped session..", hostname) + log.Printf("[UFDB_CLASS]: OK: PASS") + } + return false + } + matches, _ = regexp.MatchString("^(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|0?[0-9]?[0-9])\\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|0?[0-9]?[0-9])\\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|0?[0-9]?[0-9])\\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|0?[0-9]?[0-9])$", hostname) + if matches { + if isDebugUfdbguard { + log.Printf("[UFDB_CLASS]: [%s]:IPv6 Connect received, but mimiked proxy, waiting bumped session..", hostname) + log.Printf("[UFDB_CLASS]: OK: PASS") + } + return false + } + } + } + if isDebugUfdbguard { + log.Printf("[UFDB_CLASS][222]: query: [%s]", strings.TrimSpace(query)) + } + SelfCached = false + md5query := internal.Md5string("UFDBCACHE_" + strings.TrimSpace(query)) + if SelfUfdbGuardWebFilteringCacheTime > 1 { + //val, err := internal.MC.Get(md5query) + //if err != nil { + // if isDebugUfdbguard { + // log.Printf("Error Getting MD5 from memcache: %s", err) + // } + // panic(err) + //} + //if val != nil { + // SelfCached = true + // response = string(val.Value) + // + //} + if val, err := internal.Fetch(md5query); val != nil { + SelfCached = true + response = *val + } else { + if isDebugUfdbguard { + log.Printf("Error Getting MD5 from in memory cache: %s", err) + } + } + } + + if !SelfCached { + + response = sendSocket(query) + if isDebugUfdbguard { + log.Printf("####### RESPONSE FROM UFDB WITH VAL %s##############", response) + } + } else { + if isDebugUfdbguard { + log.Printf("####### RESPONSE FROM CACHE WITH VAL %s##############", response) + } + } + if isDebugUfdbguard { + log.Printf("[UFDB_CLASS][360]: response: %s", response) + } + if SelfInactiveService { + return false + } + if response == "OK" { + if isDebugUfdbguard { + log.Printf("[UFDB_CLASS]: OK: PASS") + } + if !SelfCached { + if SelfUfdbGuardWebFilteringCacheTime > 1 { + //internal.MC.Set(&memcache.Item{key: md5query, Value: []byte(response), Expiration: int32(SelfUfdbGuardWebFilteringCacheTime)}) + internal.Append(md5query, response) + } + } + return false + } + if len(response) == 0 { + if isDebugUfdbguard { + log.Printf("[UFDB_CLASS][238]: UNKNOWN: \"PASS\"") + } + return false + } + if !SelfCached { + if SelfUfdbGuardWebFilteringCacheTime > 1 { + //internal.MC.Set(&memcache.Item{key: md5query, Value: []byte(response), Expiration: int32(SelfUfdbGuardWebFilteringCacheTime)}) + internal.Append(md5query, response) + } + } + re := regexp.MustCompile("rewrite-url=\"(.*?)\"") + matches = re.MatchString(response) + key = "rewrite" + rs := re.FindStringSubmatch(response) + if !matches { + re2 := regexp.MustCompile("url=\"(.*?)\"") + matches = re2.MatchString(response) + key = "url" + rs = re2.FindStringSubmatch(response) + } + if matches { + redirection = rs[1] + + } + if len(redirection) == 0 { + redirection = response + } + redirection = strings.ReplaceAll(redirection, "??", "?") + if isDebugUfdbguard { + log.Printf("[UFDB_CLASS][297]: redirection = %s (299)", redirection) + } + RedirectionSource := redirection + re3 := regexp.MustCompile("rule-id=([0-9]+).*?targetgroup=(.+?)&") + matches = re3.MatchString(RedirectionSource) + if matches { + rs = re3.FindStringSubmatch(RedirectionSource) + categoryFound = rs[2] + categoryFound = strings.ReplaceAll(categoryFound, "P", "") + SelfRuleID, _ = strconv.Atoi(rs[1]) + } + re4 := regexp.MustCompile("clientgroup=(.+?)&") + matches = re4.MatchString(RedirectionSource) + if matches { + rs = re4.FindStringSubmatch(RedirectionSource) + SelfWebfilterRuleName = rs[1] + } + if isDebugUfdbguard { + log.Printf("[UFDB_CLASS]: categoryFound = %s ruleid=%d", categoryFound, SelfRuleID) + } + + if strings.Index(redirection, "=%a") > 0 { + redirection = strings.ReplaceAll(redirection, "clientaddr=%a", "clientaddr="+clientIp) + } + + if strings.Index(redirection, "=%i") > 0 { + redirection = strings.ReplaceAll(redirection, "clientuser=%i", "clientuser="+uid) + } + + if strings.Index(redirection, "=%u") > 0 { + redirection = strings.ReplaceAll(redirection, "url=%u", "url="+url.PathEscape(sourceUrl)) + } + if isDebugUfdbguard { + log.Printf("[UFDB_CLASS]: redirection %s", redirection) + } + + redirection = strings.ReplaceAll(redirection, "\"", "") + SelfFinalRedirectUrl = redirection + SelfRedirectKey = key + SelfCategory, _ = strconv.Atoi(categoryFound) + SelfWebfilteringToken = fmt.Sprintf("webfiltering=block,%s,%s srcurl=\"%s\"", strconv.Itoa(SelfRuleID), categoryFound, url.PathEscape(sourceUrl)) + return true +} + +func sendSocket(query string) string { + SelfInactiveService = false + response := "" + if SelfRemotePort == 0 { + if isDebugUfdbguard { + log.Printf("[UFDB_CLASS]: Configuration Error, no port set... Aborting!") + } + return "" + } + if isDebugUfdbguard { + log.Printf("[UFDB_CLASS]: Send to service %s", query) + } + + d := net.Dialer{Timeout: SelfUfdbgclientSockTimeOut} + conn, err := d.Dial("tcp", SelfRemoteIP+":"+strconv.Itoa(SelfRemotePort)) + if err != nil { + + if isDebugUfdbguard { + log.Printf("[UFDB_CLASS]: Connection Error: Unable to connect to %s %d ERROR: %s", SelfRemoteIP, SelfRemotePort, err) + } + return "" + } + fmt.Fprintf(conn, query+"\n") + message, errB := bufio.NewReader(conn).ReadString('\n') + if errB != nil { + if isDebugUfdbguard { + log.Printf("[UFDB_CLASS]: Connection Error: Unable to receive data from %s %d ERROR: %s", SelfRemoteIP, SelfRemotePort, errB) + } + return "" + } + response = strings.TrimSpace(message) + if isDebugUfdbguard { + log.Printf("[UFDB_CLASS]: RESPONSE: %s", response) + } + if strings.Index(response, "?loading-database=yes") == 0 { + SelfInactiveService = true + } + if strings.Index(response, "?fatalerror=yes") == 0 { + SelfInactiveService = true + } + if SelfInactiveService { + if isDebugUfdbguard { + log.Printf("[UFDB_CLASS]:FATAL Error Load-database or Web-Filtering error!!") + } + } + return response +} +func checkIPAddressType(ip string, isDebugUfdbguard bool) bool { + if net.ParseIP(ip) == nil { + if isDebugUfdbguard { + log.Printf("Invalid IP Address: %s\n", ip) + } + return false + } + for i := 0; i < len(ip); i++ { + switch ip[i] { + case '.': + if isDebugUfdbguard { + log.Printf("Given IP Address %s is IPV4 type\n", ip) + } + return true + case ':': + if isDebugUfdbguard { + log.Printf("Given IP Address %s is IPV6 type\n", ip) + } + return true + } + } + return false +}